Если вы обнаружите, что ваши запросы или вызов urllib.request в Python 3 не могут сохранить поток, потому что вы получаете взамен «ICY 200 OK» вместо заголовка «HTTP / 1.0 200 OK», вам нужно сообщить функции ICY 200 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 заменяет нераспознанный ответ о статусе, а затем копирует соответствующие биты исходного ответа, которые необходимы для «реальной» функции _read_status. Наконец, вызывается оригинал, и его значения передаются обратно вызывающей стороне, а все остальное продолжается как обычно.
Я нашел, что это самый простой способ обойти проблему сообщения о состоянии, вызывающего ошибку. Надеюсь, это полезно и для вас.