PHP: CURL – Upload di un file in POST, dietro proxy.

PHPRecentemente mi sono trovato a dovere simulare il comportamendo di un browser interagendo con un web server in PHP. L’obiettivo dello script PHP che si stava facendo era quello di simulare il caricamento in POST di un documento. L’obiettivo è facilmente raggiungibile in PHP tramite le librerie CURL. Cercando su internet si trovano numerosi esempi da cui se ne deduce che l’uso-tipo è il seguente:


/* L'url a cui inviare il POST */
$request_url = "http://www.ciccio.com/upload.php";

/* Indico a CURL quale sia il file da inviare:
 * nel form c'è un <input type="file" name="FileUP" /> */
$post_params['FileUP'] = "@/home/io/TestPdf2.pdf";

/* Nel Form ho un qualsivoglia altro parametro da passare
 * in post */
$post_params['AltroParametro'] = "Ezekiel";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $request_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_params);
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
$result = curl_exec($ch);
curl_close($ch);

Il trucco sta nello specificare con la @ davanti il nome del file da inviare: in questo modo CURL capisce che parliamo di un file e si regola di conseguenza. Tutto ha funzionato bene fino a che non ho provato ad eseguire lo stesso codice da dietro SQUID in modalità trasparente, che ha iniziato a rispondermi “Invalid request”. Dopo ore ed ore di tentativi (inutili), ho scoperto che il punto è molto semplice: CURL utilizza un’intestazione HTTP non supportata da Squid, la “Expect: 100-continue”. Per impedire questo comportamento è sufficiente aggiungere un’opzione:

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));

E tutto magicamente funzionerà.

FreeBSD Ports: installazioni tramite proxy http

Al fine di superare eventuali blocchi topologici, o semplicemente per ottimizzare l’utilizzo della connessione ad internet è possibile specificare le impostazioni relative ad un server Proxy HTTP ed FTP da usarsi durante le operazioni di compilazione dei Ports.

La cosa è piuttosto semplice: i ports scaricano ogni pacchetto utilizzando l’utility di sistema fetch la quale referenzia due variabili di ambiente per leggere le impostazioni relative ai proxy:

  • HTTP_PROXY
  • FTP_PROXY

Per far si, quindi, che i ports utilizzino il proxy in fase di installazione del software basterà modificare il file RC del proprio profilo (ad esempio .cshrc per l’utente root) aggiungendo le seguenti righe:

setenv HTTP_PROXY http://192.168.1.200:3128/
setenv FTP_PROXY http://192.168.1.200:3128/

Al fine di risolvere alcuni problemi di compatibilità con alcuni software di scuola linux (ad esempio wget) può essere utile specificare le stesse variabili anche in lower-case:

setenv http_proxy http://192.168.1.200:3128/
setenv ftp_proxy http://192.168.1.200:3128/

Da notare, inoltre, che è molto importante specificare le impostazioni del proxy con la sintassi http://utente:password@host:porta/ al fine di specificare che il proxy che si sta utilizzando è di tipo HTTP (ad esempio nel caso di SQUID). Discorso diverso invece qualora si stia utilizzando un ftp-gateway, in tal caso l’impostazione del FTP_PROXY dovrà seguire l’apposita sintassi.