2009-11-17 3 views
0
import httplib 
conn = httplib.HTTPConnection(head) 
conn.request("HEAD",tail) 
res = conn.getresponse() 
print res.status 

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

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

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

+0

это зависит от того, насколько хорошо сервер на другом конце хорошо себя ведет ... – jldupont

+0

hmm .. если вы запрашиваете файл с сервера, который вы делаете сначала, то вы запрашиваете какой-то ресурс в вашем случае это видео файл. Таким образом, вы загружаете его и, наконец, ваша библиотека http дает вам заголовки назад. То, что я думаю – streetparade

+0

@streetparade: Это может быть то, что вы думаете, но это неправильно. Вся цель команды «HEAD» - указать серверу, на который вы хотите получить только заголовки HTTP, а не тело ответа. –

ответ

2

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

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

1

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

0

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

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

0

Используйте 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.