Twisted: May 2009 Archives

HDEラボの桜井です。
昨日のプログラムに、ちょっとだけ機能を追加してみましょう。

追加する機能は、プロキシサーバよりさらに先にあるプロキシサーバ(上位プロキシ)を
経由してインターネットにつなげるものです。

 
# -*- coding: utf-8 -*-
from twisted.web import http, proxy
from twisted.internet import reactor, ssl
from twisted.python import log
import sys
import urlparse
 
# とりあえずログを標準出力へ
log.startLogging(sys.stdout)

# 上位プロキシ設定
proxyHost = "192.168.0.1"
proxyPort = 8080

# プロキシリクエストのクラス
class MyProxyRequest(proxy.ProxyRequest):

  # processメソッドを継承
  def process(self):
    parsed = urlparse.urlparse(self.uri)
    protocol = parsed[0]
    host = parsed[1]
    print self.method

    port = self.ports[protocol]
    if ':' in host:
      host, port = host.split(':')
      port = int(port)
    rest = urlparse.urlunparse(('', '') + parsed[2:])
    if not rest:
      rest = rest + '/'
    class_ = self.protocols[protocol]
    headers = self.getAllHeaders().copy()
    if 'host' not in headers:
      headers['host'] = host
    self.content.seek(0, 0)
    s = self.content.read()

    # 上位プロキシの設定がある場合はこちら
    if proxyHost != "" and proxyPort != 0:
      clientFactory = class_(self.method, self.uri, self.clientproto, headers, s, self)
      self.reactor.connectTCP(proxyHost, proxyPort, clientFactory)
    # プロキシが必要ない場合はこちら
    else:
      clientFactory = class_(self.method, rest, self.clientproto, headers, s, self)
      self.reactor.connectTCP(host, port, clientFactory)

# プロキシクラスを継承
class MyProxy(proxy.Proxy):
  requestFactory = MyProxyRequest

# HTTPプロキシサーバのクラス
class MyProxyFactory(http.HTTPFactory):
  protocol = MyProxy
 
# 実行
reactor.listenTCP(8080, MyProxyFactory())
reactor.run


本当はhttpsのプロキシもやりたいんだけどなぁ...。
HDEラボの桜井です。
いろいろと調査の多い昨今の仕事状況ですが、久しぶりにTwistedでも。

試験用にどうしてもHTTPプロキシサーバが必要だったので、なぜかTwistedで自作。
とりあえず機能は単純。
・HTTPプロキシしかできない(CONNECTメソッドはまだできない)
・上位プロキシに転送できない
・ログは標準出力に出す

# -*- coding: utf-8 -*-
from twisted.web import http, proxy
from twisted.internet import reactor, ssl
from twisted.python import log
import sys

# とりあえずログを標準出力へ
log.startLogging(sys.stdout)

# HTTPプロキシサーバのクラス
class MyProxyFactory(http.HTTPFactory):
  protocol = proxy.Proxy

# 実行
reactor.listenTCP(8080, MyProxyFactory())
reactor.run

WEBブラウザのプロキシ設定をして、アクセスすればログが見れます。
CONNECTメソッド対応、上位プロキシ対応ができたらまた公開します。

About this Archive

This page is a archive of entries in the Twisted category from May 2009.

Twisted: March 2009 is the previous archive.

Find recent content on the main index or look in the archives to find all content.