Подтвердить что ты не робот

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

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

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

Спасибо.

4b9b3361

Ответ 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.