Есть ли способ прочитать коды заголовков, не загружая файл вообще? - PullRequest
0 голосов
/ 17 ноября 2009
 import httplib
 conn = httplib.HTTPConnection(head)
 conn.request("HEAD",tail)
 res = conn.getresponse()
 print res.status

В настоящее время я использую это, чтобы получить код заголовка HTTP файла. Тем не менее, кажется, что этот код ЗАГРУЗИТ файл, а затем получит код.

Однако некоторые файлы на самом деле являются видеофайлами ... и моя программа не сможет загрузить их.

Есть ли способ прочитать коды заголовков, не загружая файл вообще?

Ответы [ 4 ]

2 голосов
/ 17 ноября 2009

К сожалению, HTTP-метод HEAD , как и любой другой HTTP-метод, является директивой для сервера. В спецификации HTTP говорится, что сервер не должен возвращать тело в случае, но если сервер не реализован или не настроен правильно, он может вернуть все содержимое URL.

Существуют и другие факторы, которые могут быть здесь задействованы, когда прокси-сервер на вашей стороне или на стороне сервера может кэшировать контент (особенно если это видео) и возвращать его из кэша. Поскольку данные поступают из кэша, полное соблюдение спецификации HTTP может отсутствовать.

1 голос
/ 17 ноября 2009

Цель команды HTTP HEAD - вернуть информацию заголовка, идентичную той, которую вы получили бы с помощью команды GET, но без тела ответа (например, самого видео). Если вы ввели команду HEAD и все равно получили полный текст ответа, это звучит как проблема с сервером, к которому вы подключаетесь.

0 голосов
/ 18 ноября 2009

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

>>> import urllib2
>>> f = urllib2.urlopen("http://stackoverflow.com/")
>>> for k,v in f.headers.items():
...     print repr(k), "=", repr(v)
... 
'content-length' = '113782'
'expires' = 'Tue, 17 Nov 2009 22:12:33 GMT'
'server' = 'Microsoft-IIS/7.0'
'connection' = 'close'
'cache-control' = 'private'
'date' = 'Tue, 17 Nov 2009 22:12:33 GMT'
'content-type' = 'text/html; charset=utf-8'
>>> f.read(20)
'\r\n\r\n<!DOCTYPE HTML P'
>>> 

Здесь не должно быть оснований для генерации запроса HEAD.

0 голосов
/ 18 ноября 2009

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

Однако прагматичное решение вашей проблемы - просто запросить первые N байтов файла, а затем проанализировать их как заголовок. Или выполните потоковое соединение, периодически анализируя полный заголовок, а затем отмените загрузку, как только получите необходимую информацию заголовка.

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