HDEラボの桜井です。
昨日のプログラムに、ちょっとだけ機能を追加してみましょう。
追加する機能は、プロキシサーバよりさらに先にあるプロキシサーバ(上位プロキシ)を
経由してインターネットにつなげるものです。
本当はhttpsのプロキシもやりたいんだけどなぁ...。
昨日のプログラムに、ちょっとだけ機能を追加してみましょう。
追加する機能は、プロキシサーバよりさらに先にあるプロキシサーバ(上位プロキシ)を
経由してインターネットにつなげるものです。
# -*- 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のプロキシもやりたいんだけどなぁ...。




Leave a comment