Веб-сервер отвечает на запрос 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
У меня создалось впечатление, что тело не будет загружаться до чтения(), что было бы полезно для пропуски определенной загрузки (например, уже загруженных файлов), но я не вижу большого улучшения производительности.
Ну, когда вам просто нужны заголовки, вы должны использовать HTTP HEAD. POST и GET будут по определению возвращать контент.
С точки зрения остановки загрузки веб-сервер не будет ждать, чтобы начать отправку данных, и все с Python на вашу сетевую карту начнет получать и буферизировать данные немедленно.
Итак, ваш лучший выбор - найти лучший способ сделать это - например, HTTP HEAD. Если это не вариант, вызовите функцию close() на объект запроса сразу после получения любых заголовков, которые вам нужны, и надеюсь, что вы не тратите слишком много трафика.
(И для примера об использовании HTTP HEAD в Python, см. этот ответ некоторое время назад.)
HTTP - это протокол connection- less, что означает, что канал не установлен, в котором сервер может записывать данные в несколько этапов. Так что, если POST или GET запрос, посылают к разъединяет, он ДОЛЖЕН реагирует с полным ответом, так как он не может знать, если Itwas 1-го или 2-го запроса. Cookies, AJAX, Comet помогает эмулировать что-то вроде канала, но его нет. Вот почему есть запрос HEAD: с этим браузер может определить, должен ли загружаться ресурс или нет.