gpt4 book ai didi

python - 请求是否正确支持多部分响应?

转载 作者:太空狗 更新时间:2023-10-30 01:36:25 28 4
gpt4 key购买 nike

我在接收多部分响应时遇到错误。

WARNING connectionpool  Failed to parse headers (url=************): [StartBoundaryNotFoundDefect(), MultipartInvariantViolationDefect()], unparsed data: ''
Traceback (most recent call last):
File "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 399, in _make_request
assert_header_parsing(httplib_response.msg)
File "/usr/local/lib/python3.6/site-packages/urllib3/util/response.py", line 66, in assert_header_parsing
raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data)
urllib3.exceptions.HeaderParsingError: [StartBoundaryNotFoundDefect(), MultipartInvariantViolationDefect()], unparsed data: ''

这是否意味着该库不支持多部分响应?我的服务器的响应在所有其他情况下都有效,包括对浏览器的响应,所以我有点困惑。

有什么想法吗?

这是从服务器返回的内容(当然,为简洁起见,正文被截断了):

HTTP/1.1 200 OK
X-Powered-By: Servlet/3.1
X-CA-Affinity: 2411441258
Cache-Control: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Content-Encoding: gzip
X-Compressed-By: BICompressionFilter
Content-Type: multipart/related; type="text/xml"; boundary="1521336443366.-7832488688540884419.-1425166373"
Content-Language: en-US
Transfer-Encoding: chunked
Date: Sun, 18 Mar 2018 01:27:23 GMT

a

154e
<i ʲ O x\龅L dre Qyi
/su k

当然这是编码的。如果我在 Fiddler 中对其进行解码,它就是这样的:

HTTP/1.1 200 OK
X-Powered-By: Servlet/3.1
X-CA-Affinity: 2411441258
Cache-Control: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
X-Compressed-By: BICompressionFilter
Content-Type: multipart/related; type="text/xml"; boundary="1521336443366.-7832488688540884419.-1425166373"
Content-Language: en-US
Date: Sun, 18 Mar 2018 01:27:23 GMT
Content-Length: 17419


--1521336443366.-7832488688540884419.-1425166373
Content-Type: text/xml; charset=utf-8
Content-Length: 15261

<?xml version="1.0" encoding="UTF-8"?>

最佳答案

回答您的问题:是的,Requests 可以很好地处理多部分请求。话虽如此,我也看到了您遇到的相同错误。

这似乎是 urllib3 中的错误,但可能与 python 附带的 httplib 包一样深。在你的情况下,我猜它会回到响应的 UTF-8 编码,这显然你不能做太多(除非你还维护服务器端)。我相信忽略它是完全安全的,但简单地包括 urllib3.disable_warnings() 似乎对我来说并没有成功。如果你想消除这个特定的警告,你可以在你的代码中包含一个日志过滤器。 (归功于此方法的 home-assistant 维护者)

def filter_urllib3_logging():
"""Filter header errors from urllib3 due to a urllib3 bug."""
urllib3_logger = logging.getLogger("urllib3.connectionpool")
if not any(isinstance(x, NoHeaderErrorFilter)
for x in urllib3_logger.filters):
urllib3_logger.addFilter(
NoHeaderErrorFilter()
)


class NoHeaderErrorFilter(logging.Filter):
"""Filter out urllib3 Header Parsing Errors due to a urllib3 bug."""

def filter(self, record):
"""Filter out Header Parsing Errors."""
return "Failed to parse headers" not in record.getMessage()

然后,只需在您的设置中调用 filter_urllib3_logging()。它不会停止警告,但会隐藏它们 :D

!!请注意!!这也会隐藏,因此很难诊断由解析 header 引起的任何错误,这些错误有时可能是合法错误!

关于python - 请求是否正确支持多部分响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49338811/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com