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>
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
Posta un commento