Проверка заголовков HTTP POST в Python без загрузки тела

1

Веб-сервер отвечает на запрос POST с загружаемым файлом (имеет Content- заголовок Disposition). Используя urllib или механический нож, в какой момент загрузится тело ответа?

opener = mechanize.build_opener(HTTPRefererProcessor, HTTPEquivProcessor, HTTPRefreshProcessor)
r = make_post_request() # makes Request object to send
res = opener.open(r)
info = response.info()
content_disp = info.getheader('content-disposition')
filename = content_disp.split('=')[1]
content = res.read() # or skip based on filename

У меня создалось впечатление, что тело не будет загружаться до чтения(), что было бы полезно для пропуски определенной загрузки (например, уже загруженных файлов), но я не вижу большого улучшения производительности.

  • 0
    используйте анализатор трафика, такой как wireshark ... что вы видите по соединению?
  • 0
    WireShark может сказать вам, сколько файла отправляется, но веб-сервер начнет передавать файл независимо от того, вызвали ли вы read (). Хотя все существующие буферы могут заполниться, и передача может прекратиться, если вы еще не вызвали read ().
Теги:
http
urllib2

2 ответа

1
Лучший ответ

Ну, когда вам просто нужны заголовки, вы должны использовать HTTP HEAD. POST и GET будут по определению возвращать контент.

С точки зрения остановки загрузки веб-сервер не будет ждать, чтобы начать отправку данных, и все с Python на вашу сетевую карту начнет получать и буферизировать данные немедленно.

Итак, ваш лучший выбор - найти лучший способ сделать это - например, HTTP HEAD. Если это не вариант, вызовите функцию close() на объект запроса сразу после получения любых заголовков, которые вам нужны, и надеюсь, что вы не тратите слишком много трафика.

(И для примера об использовании HTTP HEAD в Python, см. этот ответ некоторое время назад.)

  • 0
    Закрытие ответа - это именно то, что я сделал (не замечено во фрагменте). Я видел вопросы HEAD, но это сработало бы, только если загрузка осуществляется путем перенаправления на GET. Некоторые серверы будут включать контент в ответ на POST напрямую, поэтому HEAD не вариант (afaik).
  • 0
    Закрытие запроса - ваш лучший вариант, но вы должны знать, что вы, вероятно, тратите немало времени на пропускную способность. Если вам повезет, вы запретите серверу отправлять весь файл, но это не гарантируется. То, что вы просите, невозможно.
3

HTTP - это протокол connection- less, что означает, что канал не установлен, в котором сервер может записывать данные в несколько этапов. Так что, если POST или GET запрос, посылают к разъединяет, он ДОЛЖЕН реагирует с полным ответом, так как он не может знать, если Itwas 1-го или 2-го запроса. Cookies, AJAX, Comet помогает эмулировать что-то вроде канала, но его нет. Вот почему есть запрос HEAD: с этим браузер может определить, должен ли загружаться ресурс или нет.

  • 0
    HEAD является опцией, только если загрузка может быть произведена с помощью GET после нее.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню