Я делаю HTTP-запрос POST к удаленному сервису, который требует, чтобы тело сообщения было «дефлировано» (и Content-encoding: deflate
следует отправлять в заголовках). Насколько я понимаю, это кроется в RFC 1950. Какую функцию php я должен использовать, чтобы быть совместимым?
Content-Encoding: deflate
требует представления данных используя структуру zlib (определенную в RFC 1950), с алгоритмом сжатия deflate (определенным в RFC 1951).
Рассматривать
<?php
$str = 'test';
$defl = gzdeflate($str);
echo bin2hex($defl), "\n";
$comp = gzcompress($str);
echo bin2hex($comp), "\n";
?>
Это дает нам:
2b492d2e0100
789c2b492d2e0100045d01c1
Итак gzcompress
Результатом является gzdeflate
буфера предшествует 789c
, который представляется действительным заголовком zlib
0111 | 1000 | 11100 | 0 | 10
CINFO | CM | FCHECK | FDICT | FLEVEL
7=32bit | 8=deflate | | no dict | 2=default algo
и затем 4 байта контрольной суммы. Это то, что мы ищем.
Подвести итог,
gzdeflate
возвращает необработанный дефлированный буфер (RFC 1951)gzcompress
возвращает дефлированный буфер, упакованный в материал zlib (RFC 1950)Content-Encoding: deflate
требует обернутого буфера, то есть использование gzcompress
при отправке дефлированных данных.Обратите внимание на запутанные названия: gzdeflate
является не за Content-Encoding: deflate
а также gzcompress
является не за Content-Encoding: compress
, Пойди разберись!
Других решений пока нет …