# gghget: téléchargement multi-protocole gemini/gopher/http(s)/...
2024-01-21T15:52:23Z

Pour un petit projet, je souhaite pouvoir télécharger en ligne de commande.
Pour ça, wget, curl ou encore ftp sont disponibles.
Cependant, ils ne supportent pas le protocole gemini, cela m'ennuie.

Après un peu de recherche, il s'avère que curl, déjà présent sur ma machine, supporte à peu près tous les protocoles.
=> https://everything.curl.dev/protocols/curl

Restait à trouver comment faire pour gemini.
La commande openssl fait le job, il faut juste virer l'entête avec "sed '1d'" et on est bon :)

Au final, ça donne le script suivant qui permet de préciser si on le souhaite le nom du fichier à écrire.
J'aurais bien laissé vers stdout, mais ça met le bazar quand on récupère des binaires ^^.

```
#!/bin/sh
# gghget : download file grom gemini, gopher or http(s)
# require curl and openssl

usage()
{
	printf "usage: %s 'protocol://url/something' '[output_file]'\n" "$0" 
	exit 1
}

# remove ending "/" if any to get the filename
if [ -z "$2" ]; then
	name="$(printf "$1" | awk -F/ '{sub("/+$", "", $0); print $NF}')"
else
	name="$2"
fi

case "$1" in
	-h|--help|help)
		usage
		;;
	gemini://*)
		# set default port if not specified next to domain in url
		host="$(printf "$1" | awk -F/ '$3 !~ /:[[:digit:]]+/ {$3=$3 ":1965"} END {print $3; exit}')"

		# sed will remove response header
		printf "$1\r\n" |\
			openssl s_client -crlf -quiet  -connect "${host}" 2>/dev/null |\
			sed '1d' \
			> "${name}"
		;;

	*://*)
		curl \
			-L \
			-f \
			-s \
			-m 5 \
			-H "User-Agent:" \
			--compressed \
			"$1" \
			> "${name}"
		;;
	*)
		printf "The URL must start with protocol://\n" 
		;;
esac
```

Voir aussi hurl:
=> https://codemadness.org/hurl.html

---
Une réaction?

Envoyez votre commentaire par mail (anonyme):
=> mailto:bla@bla.si3t.ch?subject=gghget-wget-pour-tous-protocoles

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
=> https://si3t.ch/log/_commentaires_.txt