修改Twisted的FileSender()以支持字节范围标头

时间:2013-02-26 17:45:41

标签: python http-headers twisted twisted.web

我正在使用twisted作为我的视频流应用程序的一部分,HTML5视频流在很大程度上依赖于字节范围进行清理...但FileSender似乎不支持字节范围(导致一些问题)。 / p>

以前我只是将所有内容传递给Static.File.render_GET,它必须支持字节范围,但由于此后发生了一些变化,因此不再可行。

request.setHeader('Content-Type','video/octet-stream')
print request.getAllHeaders()
self.isLeaf = False
#return static.File.render_GET(self,request)
f = open('.path/to/file.mp4','rb')

def cbFinished(ignored):
    f.close()
    request.finish()

d = FileSender().beginFileTransfer(f,request)
d.addErrback(err).addCallback(cbFinished)
return NOT_DONE_YET

如果请求的文件类型为“mp4”,则会传递请求的代码,并且我收到的错误如下:

<GET /file.mp4 HTTP/1.1>
{'range': 'bytes=66673263716-', 'host': '192.168.1.64:8000', 'accept': '*/*', 'user-agent': 'Mozilla/5.0 (Nintendo WiiU) AppleWebKit/534.52 (KHTML, like Gecko) NX/2.1.0.8.23 NintendoBrowser/1.1.0.7579.EU'}
Unhandled Error
Traceback (most recent call last):
Failure: exceptions.Exception: Consumer asked us to stop producing
Unhandled Error
Traceback (most recent call last):
Failure: exceptions.RuntimeError: Producer was not unregistered for file.mp4
<GET /file.mp4 HTTP/1.1>
{'range': 'bytes=69839914264-', 'host': '192.168.1.64:8000', 'accept': '*/*', 'user-agent': 'Mozilla/5.0 (Nintendo WiiU) AppleWebKit/534.52 (KHTML, like Gecko) NX/2.1.0.8.23 NintendoBrowser/1.1.0.7579.EU'}

这表明WiiU正在请求不同的字节范围,这让我觉得这就是问题所在。 任何帮助将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:2)

没关系,事实证明static.File正是我所寻找的。 我确信自己只有在设置为目录时才有效,但它可以作为单个文件正常工作。 代码现在是:

rangedFile = static.File('/path/to/file.mp4',
                         defaultType='video/octet-stream')
return rangedFile.render_GET(request)