首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何判断服务器是否支持Range header?

如何判断服务器是否支持Range header?
EN

Stack Overflow用户
提问于 2009-04-06 06:55:05
回答 3查看 20.8K关注 0票数 26

我一直试图通过使用Range标头值从特定点流式传输音频,但我总是从一开始就得到正确的歌曲。我是通过一个程序来做这件事的,所以我不确定问题出在我的代码中还是在服务器上。

如何了解服务器是否支持Range header param?

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2018-06-01 11:02:24

这是为其他正在寻找如何做到这一点的人准备的。您可以使用curl:

代码语言:javascript
复制
curl -I http://exampleserver.com/example_video.mp4

在标题中,您应该看到

代码语言:javascript
复制
Accept-Ranges: bytes

您可以更进一步,测试检索范围

代码语言:javascript
复制
curl --header "Range: bytes=100-107" -I http://exampleserver.com/example_vide0.mp4

在标题中,您应该看到

代码语言:javascript
复制
HTTP/1.1 206 Partial Content

代码语言:javascript
复制
Content-Range: bytes 100-107/10000000
Content-Length: 8

您将看到文件的长度,而不是10000000

票数 17
EN

Stack Overflow用户

发布于 2013-04-05 16:20:22

虽然我在回答这个问题时有点晚,但我认为我的回答会对未来的访问者有所帮助。下面是一个python方法,它检测服务器是否支持范围查询。

代码语言:javascript
复制
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
票数 7
EN

Stack Overflow用户

发布于 2009-04-06 07:22:00

一种方法是尝试,并检查响应。在您的情况下,服务器似乎不支持范围。

或者,在URI上执行GET或HEAD,并检查Accept-Ranges response header

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/720419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档