Recently in Twisted Category

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メソッド対応、上位プロキシ対応ができたらまた公開します。

HDEラボの桜井です。
3月もちょっと雪が降りそうですが、全国的には暖冬で少し心配です。

飲料水ネタが連発したので、Twistedネタでも。
Twistedは、いわゆる「イベント駆動型」のネットワークフレームワークです。
イベント駆動型ということは、非同期プログラミングということで、メソッドを実行したら登録したコールバック関数を実行する仕組みなのです。
(例、ajaxのxmlHttpRequest)
このコールバックの仕組みを提供するのが、Deferred(twisted.interneet.deferred)です。
以前書いたデータベース呼び出しのサンプルに、エラー処理を追加するためにDeferredオブジェクトを使ってみましょう。

HDEラボの桜井です。
今日2/9はなんと夏目漱石の誕生日(1867年)なんですねぇ。

今回は、Twistedを使ったWebサーバにBasic認証機能を追加してみます。

まずは、必要なパッケージをimportします。
from twisted.application import internet, service
from twisted.web import error, server, twcgi, static, resource
from twisted.cred import checkers, credentials
import crypt
import copy

次に、server.Siteクラスを継承したBasic認証を可能にするクラスを作成します。
class BasicAuthSite(server.Site):

  # パスワードファイルをセットします
  def setPasswordFile(self, file):
    self.passwordFile = file

  # server.Site.getResourceFor をオーバーライドします
  # superの使い方がよくわからなかったのでこんなコードになってます、すいません
  def getResourceFor(self, request):
    # ユーザ名とパスワードが違ったら、認証ダイアログをあげる
    if self.authorize(request.getUser(), request.getPassword()) == False:
      request.setResponseCode(401, "Authorization Required")
      request.setHeader('WWW-Authenticate', 'Basic realm="Authorization Required"')
    request.site = self
    request.sitepath = copy.copy(request.prepath)
    return resource.getChildForRequest(self.resource, request)

  # 認証を行うメソッド
  def authorize(self, user, password):
    # データベースファイル(Apacheのhtpasswdコマンドで作成)を開く
    file = checkers.FilePasswordDB(self.passwordFile)
    # 認証
    try:
      # ファイルよりユーザを取得
      data = file.getUser(user)
      # ユーザ名とパスワードをチェックするクラスのインスタンスを生成
      check = credentials.UsernameHashedPassword(data[0], data[1])
      # 入力されたパスワードが正しいかどうかチェックしてboolean型で返す
      return check.checkPassword(crypt.crypt(password, data[1]))
    # 該当するユーザがいない場合はFalse
    except KeyError:
      return False

HDEラボの桜井です。
「まいど1号」が無事軌道に乗ったようですね。

今日は、ちょっとしたことで、前回書いた記事のWebサーバにSSL機能を追加してみようと思います。

まず、ライブラリを読み込みます。
from twisted.internet import ssl


それから、下記のようにサーバを設定します。
# SSL証明書の設定
sslContext = ssl.DefaultOpenSSLContextFactory(秘密鍵のパス, 証明書のパス)

# SSLサーバの定義(site変数は、前回の記事で出てくる変数)
sslServer = internet.SSLServer(443, site, sslContext)

# SSL対応Webサーバの開始(application変数も前回のもの)
sslServer.setServiceParent(application)


いろいろ用途も考えられるかと思いますので、この際にTwistedを試してみてください。
HDEラボの桜井です。
最近は新型インフルエンザによるパンデミックが気になっています。

今日は、TwistedでCGIが動くWebサーバを書いてみます。

まず、仕様を簡単に説明します。

  • TCP:48080ポートで稼働
  • 動作するサーバの"cgi"ディレクトリでCGIプログラムが動作
  • 画像は動作するサーバの"image"ディレクトリで"image"というURLで公開
  • CGIプログラムの他にPHPも動作させてみる

では、さっそくソースを見てみましょう。

HDEラボの桜井です。
今日もTwistedネタです。最近やられっぱなしなので。

ちょっとx86(32bit)でもRPMを作ろうとしたところ、結構ハマったのでメモ。

<環境>
CentOS5.2(32bit)
Python 2.4とRPMで提供されているもろもろのパッケージ


HDEラボの桜井です。
今年もよろしくお願いします。

超小ネタですが、Twistedがバージョンアップされています。
こちらから8.2.0をダウンロードしてみてください。
ちょっと確認しましたが、やはりコンパイル時にyieldでコケるのは変わっていませんでした。
RPMを作ったりする方は注意しましょう。

HDEラボの桜井です。
今年も残り半分ですね。
余談ですが、今年は台風が一度も上陸しなかった年だそうです。

で、ちょっと軽い小ネタをひとつ。

最近はもっぱらTwistedを使った開発が多いので、思い切ってRPM化しようと考えてまして。
そうしたらちょっとしたことでできてしまうんですね。
コツもあるので、簡単に説明します。

#もしPython業界で常識だったらすいません

HDEラボの桜井です。
昨日とは打って変わって、渋谷は天気いいっす。
こんなときはゆっくりと散歩でもして、新製品のアイデアでも練りたいところですが...。

今日はちょっとしたメモ。
前回Twistedについて書いたときに(これ)、echo.tacというサンプルを載せたと思います。
実行順序としては、下記のようになります。

・Factoryクラスのインスタンスを生成する

・Protocolクラスのサブクラスのインスタンスを生成する

・デーモンとして常駐

じゃあ、Protocolクラスの初期化は一回だけなのか?
っていうことが疑問に思ったわけです。

About this Archive

This page is a archive of recent entries in the Twisted category.

SQLAlchemy is the previous category.

web.py is the next category.

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