Как я могу узнать, поддерживает ли сервер заголовок Range? - PullRequest
19 голосов
/ 06 апреля 2009

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

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

Спасибо.

Ответы [ 5 ]

29 голосов
/ 06 апреля 2009

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

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

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

7 голосов
/ 05 апреля 2013

Хотя я немного опоздал с ответом на этот вопрос, думаю, мой ответ поможет будущим посетителям. Вот метод 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
5 голосов
/ 06 апреля 2009

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

В качестве альтернативы выполните GET или HEAD для URI и проверьте заголовок ответа Accept-Ranges .

3 голосов
/ 01 июня 2018

Это для других, ищущих, как это сделать. Вы можете использовать curl:

curl -I http://exampleserver.com/example_video.mp4

В шапке вы должны увидеть

Accept-Ranges: bytes

Вы можете пойти дальше и проверить получение диапазона

curl --header "Range: bytes=100-107" -I http://exampleserver.com/example_vide0.mp4

и в заголовках вы должны увидеть

HTTP/1.1 206 Partial Content

и

Content-Range: bytes 100-107/10000000
Content-Length: 8

[вместо 10000000 вы увидите длину файла]

0 голосов
/ 05 февраля 2018
  • Вы можете использовать GET метод с 0-0 Range заголовком запроса и проверить, является ли код ответа 206 или нет, который ответит с помощью первый и последний байты тела ответа
  • Вы также можете использовать метод HEAD, чтобы сделать то же самое, что и первый сеанс, который получит тот же заголовок и код ответа без тела ответа

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

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

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