Python raw http запрос проблем с поиском через urllib2 - PullRequest
3 голосов
/ 09 ноября 2011

Я использую Python 2.6.5 и пытаюсь перехватить необработанный http-запрос, отправленный через HTTP, это работает нормально, за исключением случаев, когда я добавляю прокси-обработчик в микс, поэтому ситуация выглядит следующим образом:

  • HTTP и HTTPS-запросы работают нормально без обработчик прокси: необработанный HTTP-запрос перехвачен
  • HTTP-запросы работают нормально с обработчиком прокси: прокси-сервер в порядке, необработанный HTTP-запрос перехвачен
  • HTTPS-запросы терпят неудачу с обработчиком прокси: прокси в порядке, но необработанный HTTP-запрос не перехватывается!

Следующие вопросы близки, но не решают мою проблему:

Это яЧто я делаю:

class MyHTTPConnection(httplib.HTTPConnection):
    def send(self, s):
            global RawRequest
            RawRequest = s  # Saving to global variable for Requester class to see
            httplib.HTTPConnection.send(self, s)

class MyHTTPHandler(urllib2.HTTPHandler):
    def http_open(self, req):
            return self.do_open(MyHTTPConnection, req)

class MyHTTPSConnection(httplib.HTTPSConnection):
    def send(self, s):
            global RawRequest
            RawRequest = s  # Saving to global variable for Requester class to see
            httplib.HTTPSConnection.send(self, s)

class MyHTTPSHandler(urllib2.HTTPSHandler):
    def https_open(self, req):
            return self.do_open(MyHTTPSConnection, req)

Класс запроса:

global RawRequest
ProxyConf = { 'http':'http://127.0.0.1:8080', 'https':'http://127.0.0.1:8080' }
# If ProxyConf = { 'http':'http://127.0.0.1:8080' }, then Raw HTTPS request captured BUT the proxy does not see the HTTPS request!
# Also tried with similar results:     ProxyConf = { 'http':'http://127.0.0.1:8080', 'https':'https://127.0.0.1:8080' }
ProxyHandler = urllib2.ProxyHandler(ProxyConf)
urllib2.install_opener(urllib2.build_opener(ProxyHandler, MyHTTPHandler, MyHTTPSHandler))
urllib2.Request('http://www.google.com', None) # global RawRequest updated
# This is the problem: global RawRequest NOT updated!?
urllib2.Request('https://accounts.google.com', None) 

НО, если я удаляю ProxyHandler, он работает!:

global RawRequest
urllib2.install_opener(urllib2.build_opener(MyHTTPHandler, MyHTTPSHandler))
urllib2.Request('http://www.google.com', None) # global RawRequest updated
urllib2.Request('https://accounts.google.com', None) # global RawRequest updated

Как я могудобавить ProxyHandler в смесь, сохраняя доступ к RawRequest?

Заранее спасибо.

1 Ответ

1 голос
/ 10 ноября 2011

Отвечая на мой собственный вопрос: Кажется, ошибка в базовых библиотеках, поэтому создание RawRequest списка решает проблему: HTTP-запрос Raw является первым элементом. Пользовательский класс HTTPS вызывается несколько раз, последний из которых пуст. Тот факт, что пользовательский класс HTTP вызывается только один раз, говорит о том, что это ошибка в python, но решение со списком обходит его

RawRequest = s

просто нужно изменить на:

RawRequest.append(s)

с предыдущей инициализацией RawRequest = [] и извлечением необработанного запроса через RawRequest[0] (первый элемент списка)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...