Баг/фича работы HTTP запроса (Загружать только header)?

Hartwell

Client
Регистрация
25.09.2014
Сообщения
194
Благодарностей
117
Баллы
43
Здравствуйте, встала задача опросить список урл на свойство content-type и content-lenght. Дополнить в локальный storage измененные или новые файлы (mirror).
С самой задачей проблем никаких нету упаси господи, задача тривиальной сложности, но все же возник некий можно сказать bottle neck или мб это фича..

Собственно моя логика выполнения задачи (не претендую на "идеальность") выглядит примерно так:
(Опционально) 0. - пингуем хост (разумно если на одном хосте нужно проверить к примеру 100 путей допустим с mp3 файлами, если хост пингуется то есть смысл дальше по 100 ссылкам бегать)
1. Приступаем к опросу урлов, к примеру GET экшен (об этом вопрос ниже)
2. Распарсить хедеры шага "1", если новый файл то следующий экшен его скачивает
ну и дальнейшие шаги по работе с storage описывать не буду.


И так шаг "1" если взять кубики (тут то и вопрос), экшен GET с опцией получить только заголовки, выполняется что-то похожее на описанное выше, НО, у как оказалось позже, я выполняю дважды действие по получению контента по ссылке, причем полностью (даже если файл весит 1гб, по описанной выше логике он дважды скачивается, т.е. 2гб прогоняется, да и плюс еще таймут экшена GET как я подозреваю в случае если не успеет выкачать этот 1гб этот проект вернет что то вроде GetResourse Error)



Пример попытки выполнить запроса мало того что он выполнялся пока не достиг таймаута экшена (20сек) так еще и по красной ветке.
линк для теста
Код:
launchpad.net/ubuntu/+archive/primary/+sourcefiles/chromium-browser/71.0.3578.98-0ubuntu1/chromium-browser_71.0.3578.98.orig.tar.xz
Вообщем то суть работы опции "Загружать только заголовки" выделю к тому же слово, которое НЕ выполняет свое функцию, ее стоило бы назвать не "Загружать" а "Показывать" или "Выводить только заголовки".

Если всеже получится загрузить, в ответе сниффера будет отоброжен ПОЛНОСТЬЮ файл в виде кракозябры (на скрине результат не загруженного в таймут действия), проверить можете сами на других файлах загрузив их экшеном





Собственно к чему все это тяну, не просто чтобы пов**атся и поприе** к словам.
Возьмем curl, и выполним первые шаги задачи наглядно через curl

К примеру попробуем обратится к файлу (тут даже не важен метод в большенстве случаев, да и суть не в методе обращения HTTP запроса, я протестил много разных вариантов, так что понимаю что я несу)
Код:
curl -v  -X HEAD https://launchpadlibrarian.net/401355021/chromium-browser_71.0.3578.98.orig.tar.xz
Warning: Setting custom HTTP method to HEAD with -X/--request may not work the
Warning: way you want. Consider using -I/--head instead.
*   Trying 91.189.89.228...
* TCP_NODELAY set
* Connected to launchpadlibrarian.net (91.189.89.228) port 443 (#0)
* schannel: SSL/TLS connection with launchpadlibrarian.net port 443 (step 1/3)
* schannel: checking server certificate revocation
* schannel: sending initial handshake data: sending 187 bytes...
* schannel: sent initial handshake data: sent 187 bytes
* schannel: SSL/TLS connection with launchpadlibrarian.net port 443 (step 2/3)
* schannel: failed to receive handshake, need more data
* schannel: SSL/TLS connection with launchpadlibrarian.net port 443 (step 2/3)
* schannel: encrypted data got 4096
* schannel: encrypted data buffer: offset 4096 length 4096
* schannel: encrypted data length: 76
* schannel: encrypted data buffer: offset 76 length 4096
* schannel: received incomplete message, need more data
* schannel: SSL/TLS connection with launchpadlibrarian.net port 443 (step 2/3)
* schannel: encrypted data got 271
* schannel: encrypted data buffer: offset 347 length 4096
* schannel: sending next handshake data: sending 126 bytes...
* schannel: SSL/TLS connection with launchpadlibrarian.net port 443 (step 2/3)
* schannel: encrypted data got 274
* schannel: encrypted data buffer: offset 274 length 4096
* schannel: SSL/TLS handshake complete
* schannel: SSL/TLS connection with launchpadlibrarian.net port 443 (step 3/3)
* schannel: stored credential handle in session cache
> HEAD /401355021/chromium-browser_71.0.3578.98.orig.tar.xz HTTP/1.1
> Host: launchpadlibrarian.net
> User-Agent: curl/7.55.1
> Accept: */*
>
* schannel: client wants to read 102400 bytes
* schannel: encdata_buffer resized 103424
* schannel: encrypted data buffer: offset 0 length 103424
* schannel: encrypted data got 287
* schannel: encrypted data buffer: offset 287 length 103424
* schannel: decrypted data length: 258
* schannel: decrypted data added: 258
* schannel: decrypted data cached: offset 258 length 102400
* schannel: encrypted data buffer: offset 0 length 103424
* schannel: decrypted data buffer: offset 258 length 102400
* schannel: schannel_recv cleanup
* schannel: decrypted data returned 258
* schannel: decrypted data buffer: offset 0 length 102400
< HTTP/1.1 200 OK
< Date: Sun, 27 Jan 2019 14:54:40 GMT
< Server: TwistedWeb/18.4.0
< Content-Length: 633860888
< Accept-Ranges: none
< Last-Modified: Thu, 13 Dec 2018 11:15:11 GMT
< Cache-Control: max-age=31536000, public
< Content-Type: application/octet-stream
В данном случае мы будет ожидать загрузки, причем довольно длительное время

А теперь выполним тоже самое с флагом -I (который в curl выполняет Загрузку только заголовка и выполняет его абсолютно корректно и правильно как в названии опции так и сам результат)
Код:
curl -v -I -X GET https://launchpadlibrarian.net/401355021/chromium-browser_71.0.3578.98.orig.tar.xz
*   Trying 91.189.89.229...
* TCP_NODELAY set
* Connected to launchpadlibrarian.net (91.189.89.229) port 443 (#0)
* schannel: SSL/TLS connection with launchpadlibrarian.net port 443 (step 1/3)
* schannel: checking server certificate revocation
* schannel: sending initial handshake data: sending 187 bytes...
* schannel: sent initial handshake data: sent 187 bytes
* schannel: SSL/TLS connection with launchpadlibrarian.net port 443 (step 2/3)
* schannel: failed to receive handshake, need more data
* schannel: SSL/TLS connection with launchpadlibrarian.net port 443 (step 2/3)
* schannel: encrypted data got 4096
* schannel: encrypted data buffer: offset 4096 length 4096
* schannel: encrypted data length: 76
* schannel: encrypted data buffer: offset 76 length 4096
* schannel: received incomplete message, need more data
* schannel: SSL/TLS connection with launchpadlibrarian.net port 443 (step 2/3)
* schannel: encrypted data got 271
* schannel: encrypted data buffer: offset 347 length 4096
* schannel: sending next handshake data: sending 126 bytes...
* schannel: SSL/TLS connection with launchpadlibrarian.net port 443 (step 2/3)
* schannel: encrypted data got 274
* schannel: encrypted data buffer: offset 274 length 4096
* schannel: SSL/TLS handshake complete
* schannel: SSL/TLS connection with launchpadlibrarian.net port 443 (step 3/3)
* schannel: stored credential handle in session cache
> GET /401355021/chromium-browser_71.0.3578.98.orig.tar.xz HTTP/1.1
> Host: launchpadlibrarian.net
> User-Agent: curl/7.55.1
> Accept: */*
>
* schannel: client wants to read 102400 bytes
* schannel: encdata_buffer resized 103424
* schannel: encrypted data buffer: offset 0 length 103424
* schannel: encrypted data got 13850
* schannel: encrypted data buffer: offset 13850 length 103424
* schannel: decrypted data length: 258
* schannel: decrypted data added: 258
* schannel: decrypted data cached: offset 258 length 102400
* schannel: encrypted data length: 13563
* schannel: encrypted data cached: offset 13563 length 103424
* schannel: decrypted data length: 7742
* schannel: decrypted data added: 7742
* schannel: decrypted data cached: offset 8000 length 102400
* schannel: encrypted data length: 5792
* schannel: encrypted data cached: offset 5792 length 103424
* schannel: decrypted data length: 450
* schannel: decrypted data added: 450
* schannel: decrypted data cached: offset 8450 length 102400
* schannel: encrypted data length: 5313
* schannel: encrypted data cached: offset 5313 length 103424
* schannel: failed to decrypt data, need more data
* schannel: schannel_recv cleanup
* schannel: decrypted data returned 8450
* schannel: decrypted data buffer: offset 0 length 102400
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Date: Sun, 27 Jan 2019 14:57:11 GMT
Date: Sun, 27 Jan 2019 14:57:11 GMT
< Server: TwistedWeb/18.4.0
Server: TwistedWeb/18.4.0
< Content-Length: 633860888
Content-Length: 633860888
< Accept-Ranges: none
Accept-Ranges: none
< Last-Modified: Thu, 13 Dec 2018 11:15:11 GMT
Last-Modified: Thu, 13 Dec 2018 11:15:11 GMT
< Cache-Control: max-age=31536000, public
Cache-Control: max-age=31536000, public
< Content-Type: application/octet-stream
Content-Type: application/octet-stream

<
* Excess found in a non pipelined read: excess = 8192 url = /401355021/chromium-browser_71.0.3578.98.orig.tar.xz (zero-length body)
* Connection #0 to host launchpadlibrarian.net left intact
Данный запрос выполнился моментально, использовал тот-же GET, коннект прервался на начале body response. Тобишь не грузится файлик в хрен скока размером (а он может быть и в 10гб повторюсь) Не ожидается загрузка (а если 10гб файл при 100 мбит, это нужно в идеальных условиях ставить таймут на 1.2 минуты под каждый такой запрос)??? а если не успеет то будет выход как эррор...


Собственно кто пояснит за функцию "Загружать только заголовки", и готов послушать также для кругозора более интересные пути решения хзадачи, и собственно как в рамках zenno (из коробки) выполнить тоже что и выполняет curl ?


p.s. а вопрос то поднимался, и походу от балды был ответ, хотя тс абсолютно правильно заметил "аномалию"
https://zennolab.com/discussion/threads/uznat-razmer-fajla-po-prjamoj-ssylke.21064/
 
Последнее редактирование:

comitatus

Client
Регистрация
01.09.2012
Сообщения
26
Благодарностей
7
Баллы
3
Собственно кто пояснит за функцию
сторонними библиотеками решать. что у стандартного кубика, что при использование метода HttpGet, флаг headers only влияет только что показать в возвращаемом значении, а не на загружаемый контент.
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)