LINUX.ORG.RU

Python/Twisted, фильтрующий http-прокси


0

0

На самом деле это продолжение уже отдной из моих тем, которая находится вот тут: http://www.linux.org.ru/view-message.jsp?msgid=4180540

Вкратце: я хотел проксировать и фильтровать http (подменять контент и заголовки, и только потом отдавать клиенту/серверу). Сначала пытался сделать icap-сервер для squid, но ничего не получилось (точней понял, что затраченное на это время совсем бесполезно).

Сейчас я пытаюсь написать обработчик на python, используя twisted. Изучив http.py и proxy.py, подготовил небольшую заготовку:

from twisted.web import proxy, http
from twisted.internet import reactor
from twisted.python import log


class ProxyClientFactory(proxy.ProxyClientFactory):
    pass

class ProxyRequest(proxy.Request):
    protocols = {'http': ProxyClientFactory}

class Proxy(proxy.Proxy):
    requestFactory = ProxyRequest

class ProxyFactory(http.HTTPFactory):
    protocol = Proxy

Запускаю вот так:

#!/usr/bin/python

import sys
import filter

from twisted.python import log
from twisted.internet import reactor


log.startLogging(sys.stdout)

reactor.listenTCP(8080, filter.ProxyFactory())
reactor.run()

И мне кажется, что наследуя парочку классов, я ничего не изменил в логике работы сервера. Но оно не работает. Я долблю 8080 порт браузером, телнетом (GET / HTTP/1.0\r\nHost: linux.org.ru\r\n\r\n), а оно не отвечает. И в логах ничего интересного не пишет. Я в тупике. Вот логи:

$ ./proxy.py
/usr/lib64/python2.6/site-packages/twisted/internet/_sslverify.py:4: DeprecationWarning: the md5 module is deprecated; use hashlib instead
  import itertools, md5
/usr/lib64/python2.6/site-packages/twisted/web/microdom.py:157: SyntaxWarning: assertion is always true, perhaps remove parentheses?
  assert (oldChild.parentNode is self,
2009-11-05 22:21:55+0700 [-] Log opened.
2009-11-05 22:21:55+0700 [-] filter.ProxyFactory starting on 8080
2009-11-05 22:21:55+0700 [-] Starting factory <filter.ProxyFactory instance at 0x7d4560>

Причем если не наследовать ничего из twisted, то все прекрасно работает. Признаюсь, я новичок в python, а тем более в twisted, вдруг что-то упустил из виду? Спасибо за внимание. Надежда только на вашу помощь.

Все получилось. Поглядел вот тут: http://blog.somethingaboutcode.com/?p=155

Вот код нужного класса:

from twisted.web.proxy import Proxy, ProxyRequest, ProxyClient, ProxyClientFactory
from twisted.web.http import parse_qs, HTTPFactory
from twisted.python import log

def parse_cookies(cookietxt):
    result = {}
    if cookietxt:
        for cook in cookietxt.split(';'):
            cook = cook.lstrip()
            try:
                k, v = cook.split('=', 1)
                result[k] = v
            except ValueError:
                pass

    return result


class ProxyFilterClient(ProxyClient):
    def __init__(self, *args, **kwargs):
        ProxyClient.__init__(self, *args, **kwargs)
    
    def handleStatus(self, version, code, message):
        ProxyClient.handleStatus(self, version, code, message)

    def handleHeader(self, key, value):
        ProxyClient.handleHeader(self, key, value)
    
    def handleEndHeaders(self):
        ProxyClient.handleEndHeaders(self)
    
    def handleResponsePart(self, buffer):
        ProxyClient.handleResponsePart(self, buffer)

    def handleResponseEnd(self):
        print(dir(self))
        ProxyClient.handleResponseEnd(self)


class ProxyFilterClientFactory(ProxyClientFactory):
    protocol = ProxyFilterClient


class ProxyFilterRequest(ProxyRequest):
    protocols = {'http': ProxyFilterClientFactory}


class ProxyFilter(Proxy):
    requestFactory = ProxyFilterRequest


class ProxyFilterFactory(HTTPFactory):
    protocol = ProxyFilter
cheerfulboy
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.