Tengo un problema muy extraño ... Realmente espero que alguien tenga una respuesta porque no sabría a quién más preguntarle.Internet Explorer 8 + Deflate
Estoy escribiendo una aplicación cgi en C++ que es ejecutada por Apache y emite código HTML. Estoy comprimiendo el resultado HTML yo mismo, desde mi aplicación C++, ya que mi servidor web no admite mod_deflate por algún motivo.
He probado esto con Firefox 2, Firefox 3, Opera 9, Opera 10, Google Chrome, Safari, Internet Explorer 6, Internet Explorer 7, IE8, incluso wget .. Funciona con NADA excepto IE8.
IE8 solo dice "Internet Explorer no puede mostrar la página web", sin ninguna información. Sé que es debido a la compresión solo porque funciona si lo desactivo.
¿Sabes lo que estoy haciendo mal?
utilizo zlib para comprimir, y el código exacto es:
/* Compress it */
int compressed_output_size = content.length() + (content.length() * 0.2) + 16;
char *compressed_output = (char *)Alloc(compressed_output_size);
int compressed_output_length;
Compress(compressed_output, compressed_output_size, (void *)content.c_str(), content.length(), &compressed_output_length);
/* Send the compressed header */
cout << "Content-Encoding: deflate\r\n";
cout << boost::format("Content-Length: %d\r\n") % compressed_output_length;
cgiHeaderContentType("text/html");
cout.write(compressed_output, compressed_output_length);
static void Compress(void *to, size_t to_size, void *from, size_t from_size, int *final_size)
{
int ret;
z_stream stream;
stream.zalloc = Z_NULL;
stream.zfree = Z_NULL;
stream.opaque = Z_NULL;
if ((ret = deflateInit(&stream, CompressionSpeed)) != Z_OK)
COMPRESSION_ERROR("deflateInit() failed: %d", ret);
stream.next_out = (Bytef *)to;
stream.avail_out = (uInt)to_size;
stream.next_in = (Bytef *)from;
stream.avail_in = (uInt)from_size;
if ((ret = deflate(&stream, Z_NO_FLUSH)) != Z_OK)
COMPRESSION_ERROR("deflate() failed: %d", ret);
if (stream.avail_in != 0)
COMPRESSION_ERROR("stream.avail_in is not 0 (it's %d)", stream.avail_in);
if ((ret = deflate(&stream, Z_FINISH)) != Z_STREAM_END)
COMPRESSION_ERROR("deflate() failed: %d", ret);
if ((ret = deflateEnd(&stream)) != Z_OK)
COMPRESSION_ERROR("deflateEnd() failed: %d", ret);
if (final_size)
*final_size = stream.total_out;
return;
}
bien, esto es raro. Si envío "gzip" como codificación de contenido, funciona en IE8, pero en cualquier otro navegador ...: Error de codificación de contenido La página que intenta ver no se puede mostrar porque utiliza una forma no válida o no compatible compresión. –
Después de más intentos ... Si envío la codificación de contenido como gzip (¡no lo es!), Funciona en el explorador de Internet solo en cualquier versión, incluido ie8, mientras que no funciona en ningún otro navegador. Si envío desinflar, el correcto, funciona en cualquier navegador incluyendo ie6 y ie7 pero no en ie8 <. < –
Parece que es hora de realizar la detección de agente de usuario.Sí, es un hack feo, pero en mi limitada experiencia, el desarrollo web está lleno de ellos. –