如果您发现您的请求或Python 3中的urllib.request调用无法保存流,因为您收到的是“ICY 200 OK”,而不是“HTTP/1.0 200ok”头,那么您需要告诉底层函数icy200ok是OK!
您可以有效地做的是截取处理打开流后读取状态的例程,就在处理头之前。
只需在流打开代码上方放置这样的例程。def NiceToICY(self):
class InterceptedHTTPResponse():
pass
import io
line = self.fp.readline().replace(b"ICY 200 OK\r\n", b"HTTP/1.0 200 OK\r\n")
InterceptedSelf = InterceptedHTTPResponse()
InterceptedSelf.fp = io.BufferedReader(io.BytesIO(line))
InterceptedSelf.debuglevel = self.debuglevel
InterceptedSelf._close_conn = self._close_conn
return ORIGINAL_HTTP_CLIENT_READ_STATUS(InterceptedSelf)
然后在打开URL之前,将这些行放在主例程的开头。ORIGINAL_HTTP_CLIENT_READ_STATUS = urllib.request.http.client.HTTPResponse._read_status
urllib.request.http.client.HTTPResponse._read_status = NiceToICY
当打开流时,它们将重写标准例程(仅此一次),并运行NiceToICY函数来代替正常状态检查。NiceToICY替换未识别的状态响应,然后复制“real”read_status函数所需的原始响应的相关位。最后调用原始值,并将其中的值传递回调用方,其他所有内容将继续正常工作。
我发现这是解决导致错误的状态消息问题的最简单方法。希望对你也有用。