С месяц тому назад обнаружил что
моя утилита которая уже года два по расписанию периодически запускается на сервере и качает файлы из интернета - перестала получать файлы.
Оказалось - изменилась структура страницы.
Поправил утилиту - опять файлы стали скачиваться. С 8/03. А с 24/03 - опять облом.
Оказалось что поменялась кодировка на UTF-8 и включилось сжатие gZip.
HTTP/1.1 200 OK
...
Content-Type: text/html; charset=UTF-8
...
Content-Encoding: gzip
Connection: close
Вырезал из полученных данных сжатую часть и принялся декодировать.
Честный gZip обломался - "неожиданный конец файла".
gZip -l ... показывает что внутри почти 500МБ файл сжат до 5000 Байт
compressed uncompressed ratio uncompressed_name
5708 436207711 100.0% txtgz.txt
WinRar и 7Zip показываю тоже самое но молча правильно распаковывают !
Встроенный hb_Zip - не распаковал.
Пришлось делать вызов внешней программы.
WinRar консольный работает только с .rar .
Остался 7Zip. Его и дожимал.
Получилось так.
txt := oSock:Get(cPage)
...
pos1:=hb_at(CRLF+CRLF, txt, 0) //конец http headers
cFileGZ="html.txt.gz"
//сохранить сжатую часть в виде файла
memowrit( cFileGZ, substr(txt,pos1+len(CRLF+CRLF)) )
//распаковать сохраненный файл в другой файл
EXECUTE FILE "7z.exe e html.txt.gz -aoa " WAIT
//загрузить и перекодировать распакованный файл
txt:= HB_UTF8TOSTR(memoread("html.txt"))
И далее уже работавшая разборка html-текста в кодировке 1251.
Утилита заработала. Файлы пошли.
Но удовлетворения нет - не нравится мне вызов другого процесса.
Нет ли чего подходящего чтобы статически примотать к харбор-екзешнику?