Как узнать, поддерживает ли сервер заголовок Range?
Я пытаюсь передать аудио из определенной точки, используя значения заголовка Range, но я всегда получаю песню с самого начала. Я делаю это через программу, поэтому не знаю, лежит ли проблема в моем коде или на сервере.
Как узнать, поддерживает ли сервер параметр заголовка Range?
Спасибо.
Ответы
Ответ 1
То, как определяет спецификация HTTP, если сервер знает, как поддерживать заголовок Range
, он будет. Это, в свою очередь, требует, чтобы он возвращал код ответа 206 Partial Content с Content-Range
, когда он возвращает вам контент. В противном случае он просто игнорирует заголовок Range
в вашем запросе и возвращает код ответа 200.
Это может показаться глупым, но уверены ли вы, что вы создаете правильный заголовок HTTP-запроса? Слишком часто я забываю указать HTTP/1.1 в запросе или забыть указать спецификатор Range, например "bytes".
О, и если все, что вы хотите сделать, это проверить, то просто отправьте запрос HEAD вместо запроса GET. Те же заголовки, то же самое, просто "ГОЛОВА", а не "ПОЛУЧИТЬ". Если вы получите ответ 206
, вы узнаете Range
, и в противном случае вы получите ответ 200
.
Ответ 2
Хотя я немного опоздал с ответом на этот вопрос, я думаю, что мой ответ поможет будущим посетителям. Вот метод python, который определяет, поддерживает ли сервер запросы диапазона или нет.
def accepts_byte_ranges(self, effective_url):
"""Test if the server supports multi-part file download. Method expects effective (absolute) url."""
import pycurl
import cStringIO
import re
c = pycurl.Curl()
header = cStringIO.StringIO()
# Get http header
c.setopt(c.URL, effective_url)
c.setopt(c.NOBODY, 1)
c.setopt(c.HEADERFUNCTION, header.write)
c.perform()
c.close()
header_text = header.getvalue()
header.close()
verbose_print(header_text)
# Check if server accepts byte-ranges
match = re.search('Accept-Ranges:\s+bytes', header_text)
if match:
return True
else:
# If server explicitly specifies "Accept-Ranges: none" in the header, we do not attempt partial download.
match = re.search('Accept-Ranges:\s+none', header_text)
if match:
return False
else:
c = pycurl.Curl()
# There is still hope, try a simple byte range query
c.setopt(c.RANGE, '0-0') # First byte
c.setopt(c.URL, effective_url)
c.setopt(c.NOBODY, 1)
c.perform()
http_code = c.getinfo(c.HTTP_CODE)
c.close()
if http_code == 206: # Http status code 206 means byte-ranges are accepted
return True
else:
return False
Ответ 3
Один из способов - просто попробовать и проверить ответ. В вашем случае, похоже, сервер не поддерживает диапазоны.
В качестве альтернативы, сделайте GET или HEAD в URI и проверьте заголовок ответа Accept-Ranges.