J'ai un problème très étrange .. J'espère vraiment que quelqu'un a une réponse parce que je ne saurais pas où demander d'autre.Internet Explorer 8 + Deflate
J'écris une application cgi en C++ qui est exécutée par Apache et produit du code HTML. Je compresse la sortie HTML moi-même - à partir de mon application C++ - puisque mon hébergeur ne supporte pas mod_deflate pour une raison quelconque.
J'ai testé cela avec Firefox 2, Firefox 3, Opera 9, Opera 10, Google Chrome, Safari, IE6, IE7, IE8, même wget .. Il fonctionne avec RIEN sauf IE8.
IE8 dit simplement "Internet Explorer ne peut pas afficher la page Web", sans aucune information. Je sais que c'est à cause de la compression seulement parce que ça marche si je la désactive.
Savez-vous ce que je fais mal?
J'utilise zlib pour compresser, et le code exact est:
/* 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;
}
ok, c'est bizarre. Si j'envoie "gzip" comme encodage de contenu, cela fonctionne sur IE8, mais sur n'importe quel autre navigateur ..: Erreur de codage de contenu La page que vous essayez d'afficher ne peut pas être affichée car elle utilise une forme invalide ou non supportée compression. –
Après plus d'essais .. Si j'envoie le codage de contenu comme gzip (ce n'est pas! C'est deflate) cela fonctionne sur Internet Explorer seulement n'importe quelle version, y compris ie8 alors qu'il ne fonctionne pas sur n'importe quel autre navigateur. Si j'envoie deflate, le bon, il fonctionne sur n'importe quel navigateur y compris IE6 et IE7 mais pas sur IE8 <. < –
On dirait qu'il est temps d'effectuer une détection d'agent utilisateur.Oui, c'est un hack moche, mais dans mon expérience limitée le développement web en est plein. –