IE тоже не всегда принимает deflate
В мае я жаловался на FlashPlayer, что тот не понимает режим сжатия deflate, хотя и декларирует его поддержку в заголовке HTTP-запроса. Оказывается с InternetExplorer та же беда, только у него это зависит от размера: небольшие файлы берет с deflate без проблем, а файлы побольше — нет — просто не показывает страницу, без объяснения причин. Конкретную границу размера я не выяснял, но уже на 200Кб (сжатого) проблема есть. Если заменить deflate на gzip (тот же самый алгоритм сжатия, но немного отличается заголовок — в gzip он на 10 байтов больше, там записывается дата модификации файла и несколько флагов), то берёт файлы любого размера!Подозреваю, что в обоих случаях — IE и Flash — речь идёт о блокировании (вместо исправления) какой-то уязвимости в этих программах. Переполнение буфера скорее всего. Формат имеет неприятную особенность — размер несжатого файла в заголовке не передается, поэтому заранее выделить буфер достаточного для распаковки объема без перерасхода памяти затруднительно. Степень сжатия может различаться на порядки в зависимости от исходных данных, соответственно размер выходного буфера зависит от размера входного файла нелинейно. Если в процессе распаковки видно, что буфер мал, то IE просто отказывается работать с файлом. Вместо того, чтобы выделить буфер побольше (как делаем мы, и как делают все браузеры кроме IE). Конечно, не все серверы выдают весь файл одним сжатым куском. Можно выдавать порциями, сжимая каждую порцию отдельно, формат это позволяет (потому он в заголовке и не пишет размер — отправляющей программе и самой может быть неизвестен окончательный размер, если файл является результатом генерации, а не статической выдачи), и тогда с большей вероятностью все порции влезут в буфер IE, но зато пострадает степень сжатия... C gzip'ом ситуация иная: некоторые серверы хранят статические файлы в виде обычных *.gz-файлов, например *.html.gz, и выдают их при запросе *.html, не распаковывая, а просто подставляя Content-Encoding: gzip в заголовок. И если IE будет капризничать с gzip также как и с deflate, то он перестанет работать с заметным числом сайтов. Поэтому с gzip им пришлось реализовать приёмник честно. Странно, что заодно не сделали то же с deflate — алгоритм-то один, и по идее обработчики (фильтры) должны быть в одном и том же месте кода программы. Но наверное в Microsoft всё не так, и эти фрагменты писались разными программистами в разные годы в разных модулях в разных условиях. А нам за них отдуваться