Подтвердить что ты не робот

Как получить urllib2 для регистрации ВСЕХ переданных байтов

Я пишу веб-приложение, которое использует несколько сторонних веб-API, и я хочу отслеживать запрос и ответы низкого уровня для анализа ad-hock. Поэтому я ищу рецепт, который заставит Python urllib2 регистрировать все байты, переданные через HTTP. Может быть, подчиненный обработчик?

4b9b3361

Ответ 1

Ну, я нашел, как настроить встроенный механизм отладки библиотеки:

import logging, urllib2, sys

hh = urllib2.HTTPHandler()
hsh = urllib2.HTTPSHandler()
hh.set_http_debuglevel(1)
hsh.set_http_debuglevel(1)
opener = urllib2.build_opener(hh, hsh)
logger = logging.getLogger()
logger.addHandler(logging.StreamHandler(sys.stdout))
logger.setLevel(logging.NOTSET)

Но я все еще ищу способ сбросить всю переданную информацию.

Ответ 2

Это выглядит довольно сложно. В urllib2, urllib или httplib (которые это построены) нет крючков для перехвата входных или выходных данных.

Единственное, что происходит со мной, кроме переключения тактики на использование внешнего инструмента (которого много, и большинство людей используют такие вещи), было бы написать подкласс socket.socket в вашем собственном новом модуле (скажем, "capture_socket" ), а затем вставьте это в httplib, используя "import capture_socket; import httplib; httplib.socket = capture_socket". Вам нужно будет скопировать все необходимые ссылки (что-нибудь из формы "socket.foo", которое используется в httplib) в ваш собственный модуль, но тогда вы можете переопределить такие вещи, как recv() и sendall() в вашем подклассе, чтобы сделать что вам нравится с данными.

Осложнения, скорее всего, возникнут, если вы используете SSL, и я не уверен, будет ли это достаточно или вам также понадобится создать собственный файл socket._fileobject. Это кажется выполнимым, хотя, и просматривая источник в httplib.py и socket.py в стандартной библиотеке, вы расскажете больше.