PycURL espone il supporto FTP e SOCKS di libcurl tramite un unico handle di trasferimento. In un download FTP passivo, l'applicazione può lasciare sia la connessione di controllo sia la connessione dati separata a quell'implementazione.

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 è l'URL della risorsa FTP dell'applicazione, e output è un flusso di output binario già aperto. I timeout sono limiti di esempio da scegliere in base alla dimensione del file e alla connessione previste. Per una risorsa FTP pubblica in cui sono ammessi intermediari pubblici, la lista di proxy SOCKS5 offre candidati per l'URL del proxy; verificate che il nodo scelto consenta sia la destinazione di controllo sia quella dei dati passivi.

socks5h delega la risoluzione del nome host di destinazione al proxy SOCKS. NOPROXY è esplicitamente vuoto affinché un'impostazione d'ambiente no_proxy ereditata non aggiri il percorso per questo trasferimento.

Lasciate disattivato l'FTP attivo: attende una connessione in ingresso dal server e non è disponibile con questa modalità proxy. La politica in uscita del proxy deve consentire la porta di controllo FTP e la porta dati passiva scelta per il trasferimento. Un login riuscito, quindi, non basta a dimostrare che il file possa essere scaricato.

Quando serve l'autenticazione, usate PROXYUSERNAME e PROXYPASSWORD di PycURL per l'intermediario; le credenziali del server FTP appartengono alla connessione FTP.

Articoli correlati