Un téléchargement FTP via SOCKS avec PycURL
Laissez libcurl gérer les connexions de contrôle et de données passives d'un téléchargement FTP via un proxy SOCKS5.
PycURL expose la prise en charge FTP et SOCKS de libcurl via un seul handle de transfert. Lors d'un téléchargement FTP passif, l'application peut laisser la connexion de contrôle et la connexion de données distincte à cette implémentation.
import pycurl
transfer = pycurl.Curl()
try:
transfer.setopt(pycurl.URL, ftp_url)
transfer.setopt(pycurl.PROXY, "socks5h://proxy.example.net:1080")
transfer.setopt(pycurl.NOPROXY, "")
transfer.setopt(pycurl.WRITEDATA, output)
transfer.setopt(pycurl.CONNECTTIMEOUT, 10)
transfer.setopt(pycurl.TIMEOUT, 60)
transfer.perform()
finally:
transfer.close()
ftp_url est l'URL de la ressource FTP de l'application, et output est un flux de sortie binaire déjà ouvert. Les délais d'attente sont des limites d'exemple à choisir selon la taille de fichier et la connexion attendues. Pour une ressource FTP publique où des intermédiaires publics sont autorisés, la liste de proxys SOCKS5 propose des candidats pour l'URL du proxy ; vérifiez que le nœud choisi autorise à la fois la destination de contrôle et celle des données passives.
socks5h délègue la résolution du nom d'hôte de destination au proxy SOCKS. NOPROXY est explicitement vide afin qu'un réglage d'environnement no_proxy hérité ne contourne pas la route pour ce transfert.
Laissez le FTP actif désactivé : il attend une connexion entrante du serveur et n'est pas disponible avec ce mode proxy. La politique de sortie du proxy doit autoriser le port de contrôle FTP et le port de données passives choisi pour le transfert. Une connexion réussie ne prouve donc pas à elle seule que le fichier peut être téléchargé.
Lorsqu'une authentification est nécessaire, utilisez PROXYUSERNAME et PROXYPASSWORD de PycURL pour l'intermédiaire ; les identifiants du serveur FTP relèvent de la connexion FTP.