socket ResourceWarning с использованием urllib в Python 3

Я использую urllib.запрос.urlopen (), чтобы получить от веб-службы, которую я пытаюсь протестировать.

Это возвращает объект HTTPResponse, который я затем прочитал (), чтобы получить тело ответа.

но я всегда вижу ResourceWarning о незамкнутом сокете из socket.py

вот соответствующая функция:

from urllib.request import Request, urlopen

def get_from_webservice(url):
    """ GET from the webservice  """
    req = Request(url, method="GET", headers=HEADERS)
    with urlopen(req) as rsp:
        body = rsp.read().decode('utf-8')
        return json.loads(body)

вот предупреждение, как оно появляется в выходных данных программы:

$ ./test/test_webservices.py
/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/socket.py:359: ResourceWarning: unclosed <socket.socket object, fd=5, family=30, type=1, proto=6>
self._sock = None
.s
----------------------------------------------------------------------
Ran 2 tests in 0.010s

OK (skipped=1)

Если есть что-то, что я могу сделать с HTTPResponse (или просьба?) для того чтобы сделать его закрыть свое гнездо чисто, Я бы очень хотел знать, потому что этот код для моих модульных тестов; мне не нравится игнорируя предупреждения где угодно, но только не там.

1 ответов


Я не знаю, если это на ответ, но это часть пути к ответу.

Если я добавлю заголовок "connection: close" к ответу от моих веб-служб, объект HTTPResponse, похоже, очистится должным образом без предупреждения.

и фактически, спецификация HTTP (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html) говорит:

HTTP/1.1 приложения, которые не поддерживают постоянные соединения должны включите опцию "Закрыть" соединение в каждое сообщение.

Итак, проблема была на сервере (т. е. моя ошибка!). В случае, если у вас нет контроля над заголовками, поступающими с сервера, я не знаю, что вы можете сделать.