Можно ли читать только первые N байтов с HTTP-сервера с помощью команды Linux? - PullRequest
19 голосов
/ 26 апреля 2011

Вот вопрос.

Учитывая URL http://www.example.com, можем ли мы прочитать первые N байтов со страницы?

  • , используя wget , мы можем загрузить всю страницу.
  • , используя curl , здесь есть -r, 0-499 указывает первые 500 байтов.Кажется, это решает проблему.

    Вы также должны знать, что на многих серверах HTTP / 1.1 эта функция не включена, поэтому при попытке получить диапазон вы получитевесь документ.

  • с использованием urlib в Python.похожий вопрос здесь , но, согласно комментарию Константина, это правда?

    В прошлый раз, когда я попробовал эту технику, она потерпела неудачу, потому что на самом деле было невозможно прочитать изHTTP-сервер указывает только определенный объем данных, то есть вы неявно читаете весь HTTP-ответ и только затем читаете из него первые N байтов.Итак, в конце вы загрузили весь вредоносный ответ 1 ГБ.

Итак, проблема в том, как мы можем прочитать первые N байтов с HTTP-сервера впрактика?

С уважением и благодарностью

Ответы [ 5 ]

16 голосов
/ 11 июня 2014

Вы можете сделать это изначально с помощью следующей команды curl (нет необходимости выгружать весь документ).Согласно man-странице culr:

RANGES В HTTP 1.1 введены байтовые диапазоны.Используя это, клиент может запросить получение только одной или нескольких частей указанного документа.curl поддерживает это с флагом -r.

Get the first 100 bytes of a document:
    curl -r 0-99 http://www.get.this/

Get the last 500 bytes of a document:  
    curl -r -500 http://www.get.this/

`curl` also supports simple ranges for FTP files as well.
Then you can only specify start and stop position.

Get the first 100 bytes of a document using FTP:
    curl -r 0-99 ftp://www.get.this/README

Это работает для меня даже с веб-приложением Java, которое развернуто в GigaSpaces.

9 голосов
/ 26 апреля 2011
curl <url> | head -c 499

или

curl <url> | dd bs=1 count=499

должны делать

Также существуют более простые утилиты с возможностью наличия борадера, такие как

    netcat host 80 <<"HERE" | dd count=499 of=output.fragment
GET /urlpath/query?string=more&bloddy=stuff

HERE

Или

GET /urlpath/query?string=more&bloddy=stuff
2 голосов
/ 26 апреля 2011

Вы также должны знать, что многие HTTP / 1.1 серверы не имеют этого функция включена, так что когда вы попытаться получить диапазон, вы будете вместо получить весь документ.

В любом случае вам придется получить всю сеть, так что вы можете получить сеть с помощью curl и, например, направить ее к голове.

голова

c, --bytes = [-] N выведите первые N байтов каждого файла; с начальным '-', распечатать все но последние N байтов каждого файла

0 голосов
/ 04 декабря 2018

Я пришел сюда в поисках способа измерения времени обработки сервера, которое, как я думал, можно измерить, сказав curl, чтобы он прекратил загрузку через 1 байт или что-то в этом роде.

Для меня лучшим решением оказалось выполнение запроса HEAD, поскольку это обычно позволяет серверу обрабатывать запрос в обычном режиме, но не возвращает тела ответа:

time curl --head <URL>
0 голосов
/ 26 апреля 2011

Сделать подключение к сокету. Прочитайте байты, которые вы хотите. Закрыть, и все готово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...