- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 Python 请求得到一个 ChunkedEncodingError(e)
。我正在使用以下内容来删除 JSON:
r = requests.get(url, headers=auth, stream=True)
并迭代每一行,使用回车符作为分隔符,这就是此 API 区分不同 JSON 事件的方式。
for d in r.iter_lines(delimiter="\n"):
d += "\n"
sock.send(d)
我在回车符上定界,然后将其作为端点添加回去,我将日志推送到实际上期望在每个事件结束时也有回车符。这似乎适用于大约 100k 的日志文件。当我尝试进行更大的调用时,我会抛出以下内容:
for d in r.iter_lines(delimiter="\n"):
logs_1 | File "/usr/local/lib/python2.7/dist-packages/requests/models.py", line 783, in iter_lines
logs_1 | for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode):
logs_1 | File "/usr/local/lib/python2.7/dist-packages/requests/models.py", line 742, in generate
logs_1 | raise ChunkedEncodingError(e)
logs_1 | requests.exceptions.ChunkedEncodingError: ('Connection broken: IncompleteRead(0 bytes read)', IncompleteRead(0 bytes read))
更新:我发现 API 有时也会发回 NoneType
。那么我如何在不破坏所有内容的情况下在响应中的某个地方解释这个空字节呢?每个单独的事件都以 \n
结束,我需要能够单独检查每个事件。我应该分块内容而不是 iter_lines
吗?然后确保 block 中没有NoneType
?这样我就不会尝试在 NoneType
上执行 iter_lines
而它会爆炸?
最佳答案
ChunkedEncodingError
是由:httplib.IncompletedRead
import httplib
def patch_http_response_read(func):
def inner(*args):
try:
return func(*args)
except httplib.IncompleteRead, e:
return e.partial
return inner
httplib.HTTPResponse.read = patch_http_response_read(httplib.HTTPResponse.read)
我认为这可能是一个补丁。它允许您处理有缺陷的 HTTP 服务器。
大多数服务器传输所有数据,但由于实现错误,它们会错误地关闭 session 和 httplib 引发错误并掩埋您宝贵的字节。
关于Python 请求 - ChunkedEncodingError(e) - requests.iter_lines,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44509423/
这里的任何人都经历过使用分块数据编码的请求和 HTTP 流。 我想知道 Requests 是否本质上知道服务器提供的 block 大小,并在 requests.iter_lines() 中使用它作为
我正在使用 Boto3 在 Python 脚本中读取 Athena 查询的结果。 我有以下代码,可以在 AWS Lambda 中正常运行。 def get_athena_results(s3_buck
我正在尝试为内部使用它的一个对象模拟流式 requests.get 函数。 我特别需要测试以下方法: class MyObject(object) def __iter__(self):
我正在使用 Python 请求得到一个 ChunkedEncodingError(e)。我正在使用以下内容来删除 JSON: r = requests.get(url, headers=auth, s
当我从服务器读取数据时,我需要找到一种方法来顺利管理服务器停顿。我写了下面的代码: def listener(): resp = requests.get(someurl, stream
我是一名优秀的程序员,十分优秀!