我正在编写一些代码,将内部应用程序集成到DVR中以检索视频文件。由于没有任何官方文档,所以这都是逆向工程,我无法理解以下事件序列(通过使用DVR的Android应用程序捕获)。
936 72.985204 192.168.0.1 192.168.0.200 HTTP 468 POST /cgi-bin/supervisor/NetworkBk.cgi HTTP/1.1 (application/x-www-form-urlencoded)
937 72.985368 192.168.0.200 192.168.0.1 TCP 54 mit-ml-dev > 41859 [ACK] Seq=1 Ack=415 Win=65535 Len=0
938 73.933676 192.168.0.200 192.168.0.1 HTTP 275 HTTP/1.0 200 OK (video/mpeg4)
939 73.933983 192.168.0.1 192.168.0.200 TCP 54 41859 > mit-ml-dev [ACK] Seq=415 Ack=222 Win=15544 Len=0
940 74.004433 192.168.0.200 192.168.0.1 TCP 74 [TCP segment of a reassembled PDU]
941 74.004887 192.168.0.1 192.168.0.200 TCP 54 41859 > mit-ml-dev [ACK] Seq=415 Ack=242 Win=15544 Len=0
942 74.024669 192.168.0.200 192.168.0.1 HTTP 1346 Continuation or non-HTTP traffic
HTTP POST请求视频文件,然后导致HTTP OK。我对接下来会发生什么感到困惑。收到HTTP 200后请求是否完成?那为什么它继续接收TCP数据然后获得HTTP Continuation或非HTTP流量?随后的TCP数据包包含我打算下载的视频文件。当我手动制作HTTP POST时,我得到HTTP OK响应,然后我就难倒了。
这是我用来模拟HTTP POST的代码。
import requests
dc = {"action":"download", "start_time":"2013 7 1 13 59 00", "end_time":"2013 7 14 3 0", "num":"255", "ch":"5"}
r = requests.post("http://192.168.0.200/cgi-bin/supervisor/NetworkBk.cgi", data=dc, auth=(username, password))
此代码获取HTTP 200 OK响应,如何进入Continuation或非HTTP流量?我是新手,所以不确定我是否提供了足够的细节。如果有帮助,我可以提供HTTP标头。
附录 这是HTTP OK回复的RAW响应。据我所知,没有什么可以期待额外的内容。
HTTP/1.0 200 OK
Date: Mon, 01 Jul 2013 15:01:34 GMT
nServer: Linux/2.x UPnP/1.0 Avtech/1.0
Expires: 0
Pragma: no-cache
Cache-Control: no-cache
Connection: close
Content-Type: video/mpeg4
Content-Length: 5
0
OK
答案 0 :(得分:0)
为什么它继续接收TCP数据然后获取HTTP 是继续还是非HTTP流量?
默认情况下,当您发出请求时,会立即下载响应正文。 因此,在这种情况下,一旦成功发出POST请求,DVR将立即开始通过TCP发送视频数据 - 很可能是作为H.264字节流。这将解释您所看到的非HTTP流量。
此代码获取HTTP 200 OK响应,我该如何访问 是继续还是非HTTP流量?
您可以覆盖此默认行为并推迟下载响应正文,直到您使用stream参数访问Response.content属性:然后您可以使用类似r.iter_content
的内容来迭代响应数据,然后写入他们到一个文件。 e.g。
import requests
url = "http://192.168.0.200/cgi-bin/supervisor/NetworkBk.cgi"
dc = {"action":"download", "start_time":"2013 7 1 13 59 00", "end_time":"2013 7 14 3 0", "num":"255", "ch":"5"}
r = requests.post(url, data=dc, auth=(username, password), stream=True)
if r.status_code == 200:
with open(path, 'wb') as f:
for chunk in r.iter_content():
f.write(chunk)