是否可以遍历httplib.HTTPResponse的数据?

时间:2013-07-03 15:47:28

标签: python streaming httplib

我正在尝试开发一个非常简单的概念验证,以便以流方式检索和处理数据。我请求的服务器将以块的形式发送数据,这很好,但我在使用httplib迭代块时遇到问题。

以下是我正在尝试的内容:     导入httplib

def getData(src):
    d = src.read(1024)
    while d and len(d) > 0:
        yield d
        d = src.read(1024)

if __name__ == "__main__":
    con = httplib.HTTPSConnection('example.com', port='8443', cert_file='...', key_file='...')
    con.putrequest('GET', '/path/to/resource')
    response = con.getresponse()

    for s in getData(response):
        print s
        raw_input() # Just to give me a moment to examine each packet

非常简单。只需打开与服务器的HTTPS连接,请求资源,并一次获取1024字节的结果。我肯定是成功建立了HTTPS连接,所以这根本不是问题。

但是,我发现对src.read(1024)的调用每次都返回相同的内容。它只返回响应的前1024个字节,显然从不跟踪文件中的光标。

那么我应该如何一次接收1024个字节? read()上的文档非常稀少。我曾考虑使用urllib或urllib2,但似乎都无法建立HTTPS连接。

HTTPS是必需的,而且我在一个相当受限制的公司环境中工作,像Requests这样的软件包有点难以掌握。如果可能的话,我想在Python的标准库中找到一个解决方案。

// Big Old Fat Edit

原来的代码中我只是忘了更新d变量。我在yield循环之外的读取初始化它,并且从未在循环中更改它。一旦我将它添加回去,它就能完美地运作。

所以,简而言之,我只是一个大白痴。

2 个答案:

答案 0 :(得分:0)

你的con.putrequest()实际上有效吗?使用该方法执行请求还需要您调用一些其他方法,如官方httplib文档中所示:

http://docs.python.org/2/library/httplib.html

  

作为使用上述request()方法的替代方法,您   也可以使用这四个功能一步一步地发送您的请求   下方。

putrequest()
putheader()
endheaders()
send()

你有没有理由不使用默认的HTTPConnection.request()函数?

这是我的工作版本,使用request()代替:

import httlplib

def getData(src, chunk_size=1024):
    d = src.read(chunk_size)
    while d:
        yield d
        d = src.read(chunk_size)

if __name__ == "__main__":
    con = httplib.HTTPSConnection('google.com')
    con.request('GET', '/')
    response = con.getresponse()

    for s in getData(response, 8):
        print s
        raw_input() # Just to give me a moment to examine each packet

答案 1 :(得分:-1)

您可以使用seek命令将光标与读取一起移动。

这是我对这个问题的尝试。如果我在过程中减少pythonic,我道歉。

if __name__ == "__main__":
     con = httplib.HTTPSConnection('example.com', port='8443', cert_file='...', key_file='...')
    con.putrequest('GET', '/path/to/resource')
    response = con.getresponse()
    c=0
    while True:
        response.seek(c*1024,0)
        data =d.read(1024)
        c+=1
        if len(data)==0:
            break
        print data
        raw_input()

我希望它至少有用。