Passa ai contenuti principali

Problemi tra mod_deflate, mod_python e Chrome

Ho scritto un filtro in Apache utilizzando mod_python. Il filtro è un outputfilter, quindi lavora sulla pagina che viene restituita da Apache al client. Qualunque cosa venga fatta dal filtro, anche semplicemente restituire la pagina senza variazioni, provoca un errore di caricamento in Chrome che si manifesta come una GET con status "(failed)" nel debugger:


Firefox e IE invece funzionano correttamente.
Sembra che il problema sia legato a una differenza tra quanto dichiarato nell'header Content-Length e la dimensione reale del contenuto che viene restituito al client. Nella configurazione del mio VirtualHost viene attivata la compressione dei dati tramite questa istruzione:

AddOutputFilterByType DEFLATE text/html text/plain text/xml ...

La soluzione al problema consiste nel disattivare la compressione per i file sui quali il filtro è attivato. Nel mio caso si tratta solo di index.html, quindi per ottenere il risultato voluto occorre aggiungere un SetEnv nella configurazione di index.html:

PythonPath "sys.path+['/srv/testhandler/cgi-bin']"
PythonOutputFilter testhandler::test_filter TESTFILTER
<Files "index.html">
     SetEnv no-gzip dont-vary
     SetOutputFilter TESTFILTER
</Files>

Non mi è comunque chiaro come mai in questo caso il valore di Content-Length non sia gestito correttamente da Apache; il motivo più plausibile è che la sequenza in cui vengono applicati i filtri non sia corretta, anche se stampando il contenuto della pagina in un file di log mostra che il mio filtro riceve il contenuto non compresso, quindi apparentemente passa prima del DEFLATE.

Commenti

Post popolari in questo blog

Nuovo sito "Creare programmando" con una sezione per la didattica

Ho organizzato i miei tutorial, fatti con Scratch o altri linguaggi, in un nuovo sito che si chiama "Creare programmando" e che dovrebbe rendere più agevole lo scarico degli stessi. Questo sito contiene anche una sezione dedicata alla didattica tramite il computer in cui voglio raccogliere idee e tutorial che possono trovare applicazione nelle scuole oltre che nei CoderDojo, magari semplicemente perché forniscono degli spunti agli insegnanti sugli argomenti che si possono sviluppare (nel vero senso della parola) tramite il computer. Ho inaugurato la sezione didattica con un nuovo tutorial in Scratch dedicato alle regioni italiane. Cliccate qui per andarlo a vedere.

Un tutorial software per allenarsi all'uso dei sensori hardware

Durante l'ultima sessione di CoderDojo MXP abbiamo proposto ai ragazzi un tutorial che ha lo scopo di impratichirli nei ragionamenti che si rendono necessari quanto ci si trova a dover impostare la traiettoria di una macchinina utilizzando solo un sensore in grado di rilevare il colore della traccia visibile sul pavimento (in scala di grigi). Non avendo (ancora) a disposizione macchinine e sensori "reali" abbiamo iniziato a simulare la situazione disegnando una pista con Scratch utilizzando quattro diversi colori. Il compito dei ragazzi era di riuscire a fare in modo che lo sprite dell'automobilina seguisse la pista senza uscire di strada: le correzioni alla traiettoria avvenivano utilizzando il blocco "sta toccando il colore..." come se ci fosse un sensore in grado di vedere il colore della traccia sotto all'automobile. E se ne sono viste di tutti i colori perché il compito non era facile. Alla fine, per stimolare un po' di competizione tr

Sed: caratteri speciali che si possono usare nel lato destro delle sostituzioni

Il titolo è lungo, ma serve semplicemente per dire che nelle sostituzioni tramite la sed , ovvero quelle realizzate con il comando s/// , è possibile utilizzare alcune sequenze di escape oltre ai soliti backreference dei gruppi "catturati" con le parentesi nell'espressione regolare di sinistra. Nella parte destra dell'espressione (cioè quella dopo la seconda barra /) si possono usare: - \L per trasformare in minuscolo tutto  quello che segue (la L sta per "lowercase"); - \l (è una elle minuscola) per trasformare in minuscolo solo il carattere seguente; - \U per trasformare in maiuscolo tutto  quello che segue (la U sta per "uppercase"); - \u per traformare in maiuscolo solo il carattere seguente; - \E per marcare la fine della trasformazione dei caratteri. Gli "operatori" \L e \U agiscono fino alla fine dell'espressione (delimitata dalla barra / finale) oppure fino alla \E successiva. Quindi, per esempio, per trasformare sol