2009-04-06 1 views
17

Я пытаюсь передать аудио из определенной точки, используя значения заголовка диапазона, но я всегда получаю песню с самого начала. Я делаю это через программу, поэтому не уверен, лежит ли проблема в моем коде или на сервере.Как узнать, поддерживает ли сервер заголовок Range?

Как узнать, поддерживает ли сервер параметр диапазона заголовка?

Спасибо.

+0

См. Этот вопрос в разделе «Ошибка сервера: [Проверить сервер на поддержку диапазона байтов?] (Http://serverfault.com/q/547073/104579) – Flimm

ответ

27

Способ, которым определяет HTTP spec, если сервер знает, как поддерживать заголовок Range, он будет. Это, в свою очередь, требует, чтобы он возвращал код ответа 206 Partial Content с заголовком Content-Range, когда он возвращает вам контент. В противном случае он просто проигнорирует заголовок Range в вашем запросе и вернет код ответа 200.

Это может показаться глупым, но вы уверены, что создаете правильный HTTP-заголовок запроса? Слишком часто я забываю указать HTTP/1.1 в запросе или забыть указать спецификатор Range, например «bytes».

О, и если все, что вы хотите сделать, это , проверьте, а затем просто отправьте запрос HEAD вместо запроса GET. Те же заголовки, то же самое, просто «ГОЛОВА», а не «ПОЛУЧИТЬ». Если вы получите ответ 206, вы узнаете, что поддерживается Range, и в противном случае вы получите ответ 200.

5

Один из способов - просто попробовать и проверить ответ. В вашем случае, похоже, сервер не поддерживает диапазоны.

В качестве альтернативы, сделайте GET или HEAD на URI и проверьте наличие Accept-Ranges response header.

6

Хотя я немного поздно отвечаю на этот вопрос, я думаю, что мой ответ поможет будущим посетителям. Вот метод 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 
0
  • Вы можете использовать GET метод с 0-0 заголовком Range запроса, и проверить, является ли код отклика 206 или нет, что ответят первые и последние байты тела ответа
  • You также может использовать метод HEAD сделать то же самое, что и в первом сеансе, который получит тот же заголовок ответа и код без тела ответа

Кроме того, вы можете проверить Accept-Ranges на заголовке ответа, чтобы определить, может ли он поддерживать диапазон, но обратите внимание, если значение none на поле Accept-Ranges, это означает, что он не может поддерживать диапазон, и если заголовок ответа не есть Accept-Ranges поле вы также не можете пальцем, он не может поддерживать диапазон от него.

Существует еще одна вещь, которую вы должны знать, если вы используете 0-Range на заголовок запроса с GET методом, чтобы проверить код ответа, сообщение тело ответа будет кэшируются автоматически на TCP окна приема, пока кэш не будет полный.

 Смежные вопросы

  • Нет связанных вопросов^_^