LINUX.ORG.RU

Распаковать Accept-Encoding: deflate архив в linux

 , ,


0

2

Приветствую. При заходе на сайт браузер клиента отправляет заголовок с параметром Accept-Encoding, в котором браузер указывает типы кодирования, которые он может распаковать. Кодирование используется для того, чтобы отправлять сжатый архив, а не текстовую html страницу. Стандартный параметр для современных браузеров: «Accept-Encoding: gzip, deflate, br».

Как распаковать файл, который получен при загрузке с заголовком «Accept-Encoding: deflate»? Чтобы можно было прочитать html страницу с сервера? Вроде бы это zlib архив, но с помощью zlib-flate не получается распаковать. Я уже изучил другие способы Accept-Encoding: gzip, br. Эти способы кодирования легко распаковываются с помощью gunzip и brotli

Если подскажите сервис для быстрого обмена файлов, залью пример, который получен с сервера.

Добавлю такие файлы отдаются с серверов: Microsoft-IIS/8.5



Последнее исправление: dimagra (всего исправлений: 1)

Тебе для чего, на каком языке? Сырой DEFLATE не что-то сверхсекретное, у него много реализаций. В Python есть zlib.decompress(). Разок разжать через шелл — в твоём openssl может быть openssl zlib -d.

t184256 ★★★★★
()
Последнее исправление: t184256 (всего исправлений: 1)
Ответ на: комментарий от t184256

На самом деле мне на любом языке, который есть на Centos 7, лучше всего на php. Я перепробовал уже очень много вариатов и ничего не работает. Записал в файл deflate.dat

zlib-flate -uncompress < deflate.dat  > page.html 
flate: inflate: data: incorrect header check

unpigz -c deflate.dat
unpigz: skipping: deflate.dat is not compressed

openssl zlib -d < deflate.dat > page.html
140264494790544:error:29065064:lib(41):BIO_ZLIB_READ:zlib inflate error:c_zlib.c:548:zlib error:data error

unzip deflate.dat
Archive:  deflate.dat
  End-of-central-directory signature not found.  Either this file is not
  a zipfile, or it constitutes one disk of a multi-part archive.  In the
  latter case the central directory and zipfile comment will be found on
  the last disk(s) of this archive.
unzip:  cannot find zipfile directory in one of deflate.dat or
        deflate.dat.zip, and cannot find deflate.dat.ZIP, period.


python3 -c "import zlib,sys; sys.stdout.buffer.write(zlib.decompress(sys.stdin.buffer.read()))" < deflate.dat > outfile.html
Traceback (most recent call last):
  File "<string>", line 1, in <module>
zlib.error: Error -3 while decompressing data: incorrect header check

7za x deflate.dat
Extracting archive: deflate.dat
ERROR: deflate.dat
Can not open the file as archive
Can't open as archive: 1
Files: 0
Size:       0
Compressed: 0

единственное, что у меня получилось, это:

curl  -H "Accept-Encoding: deflate"  --compressed    https://SITE/

Вот curl каким-то образом распаковывает. Но мне нужно именно с помощью линукса распаковать Забыл уточнить, сервер на котором отдается такое сжатие Microsoft-IIS/10.0. В заголовке отдает:

Server: Microsoft-IIS/10.0
Cache-Control: no-cache, no-store, must-revalidate
Content-Encoding: deflate
X-Frame-Options: SAMEORIGIN
X-UA-Compatible: IE=Edge
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
dimagra
() автор топика
Последнее исправление: dimagra (всего исправлений: 1)
Ответ на: комментарий от t184256

Вот так запакованный архив:

curl  -H "Accept-Encoding: deflate"  -o deflate.dat   https://SITE/

А вот так, нормальная html страница. curl как-то умеет подобное распаковывать

curl  -H "Accept-Encoding: deflate"  --compressed -o deflate.dat   https://SITE/

А если вот так, могу распаковать через gunzip

curl  -H "Accept-Encoding: gzip"  -o deflate.dat   https://SITE/
dimagra
() автор топика
Последнее исправление: dimagra (всего исправлений: 1)
Ответ на: комментарий от dimagra

Я не знаю что это, может это даже и валидный беззаголовочный RFC1951-DEFLATE, но это точно не DEFLATE в определении HTTP

https://www.rfc-editor.org/rfc/rfc7230#section-4.2.2:

 4.2.2.  Deflate Coding

   The "deflate" coding is a "zlib" data format [RFC1950] containing a
   "deflate" compressed data stream [RFC1951] that uses a combination of
   the Lempel-Ziv (LZ77) compression algorithm and Huffman coding.
$ file deflate.dat
deflate.dat: data
$ hexdump -C deflate.dat | head -n 2                                       ~/tmp
00000000  dc bd 69 93 1b 49 72 20  fa f9 8d d9 fc 87 54 b5  |..i..Ir ......T.|
00000010  71 c9 9a 06 c0 44 e2 ac  82 48 a9 af 91 7a 6d 5a  |q....D...H...zmZ|

0xdc это не может быть zlib header, потому что

https://www.rfc-editor.org/rfc/rfc1950#section-2.2:

   2.2. Data format

      A zlib stream has the following structure:

           0   1
         +---+---+
         |CMF|FLG|   (more-->)
        +---+---+

      CINFO (Compression info)
         For CM = 8, CINFO is the base-2 logarithm of the LZ77 window
         size, minus eight (CINFO=7 indicates a 32K window size). Values
         of CINFO above 7 are not allowed in this version of the
         specification.  CINFO is not defined in this specification for
         CM not equal to 8.

Возвращаясь к https://www.rfc-editor.org/rfc/rfc7230#section-4.2.2:

      Note: Some non-conformant implementations send the "deflate"
      compressed data without the zlib wrapper.

=> иди жалуйся в Microsoft

t184256 ★★★★★
()
Ответ на: комментарий от dimagra

попробовал unar/bsdtar/ncompress/7z - ничего не вышло
так что у меня только одно предложение - качаем исходники curl, распаковываем их, даём команду grep -ir compressed curl-7.85.0 смотрим выхлоп и начинаем копать

d00fy ★★★
()
Ответ на: комментарий от Tanger

Спасибо! А то я уже собрался исходники curl разбирать, как советовали выше.

cat deflate.dat | (printf "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x00" ; cat - ) | gzip -dc >page.html

gzip: stdin: unexpected end of file

gzip все равно жалуется на правильность данных, но страница распаковывается. Непонятно, почему microsoft до сих пор использует этот древний вид сжатия, ведь есть обычный gzip и новый br

dimagra
() автор топика