PythonでSPDYのHello worldを実装してみる

SPDYプロトコルがどういうものなのか理解しておきたかったので、spdy/3の仕様を最近読んでる。
SPDY Protocol - Draft 3 - The Chromium Projects
で、実際どういう挙動になるのかPythonで実装してみた。
今回は単純にtext/plainで「Hello, SPDY」と表示するだけ。

PythonTLS NPN

WebでSPDYを使う場合は、TLS NPNでプロトコルを切り替えないといけないが、Pythonsslモジュールではこれは3.3からの対応となる。
SSLContext.set_npn_protocols(protocols)
オレオレ証明書HTTPSサーバーを作り、set_npn_protocolsでspdy/3を設定しておいたら、Google ChromeTLS NPNでSPDYを使ってくれてた。
NPNでspdy/3を選択したら、以降はサーバー/クライアント間ではSDPYのプロトコルでしゃべらないといけない。

バイナリ操作

SPDYはバイナリプロトコルなので、structモジュールで値をpack/unpackしたりが必要となる。
8ビットより短い単位での操作が必要なので、ビット演算も使うことになる。
また、zlibでのcompress/decompressも必要となる。

動かしてみた

作成したserver.pyを実行してChromeでアクセスし、SPDY indicatorが反応してくれるところまでできた。

試したコードはbitbucketに置いてる。きれいには作れてない。
Python3.3の標準ライブラリのみで実装してる。
tokibito / sample_nullpobug / source / python / spdy / server.py — Bitbucket
実際に使おうと思ったらもっと実装が必要だし、パフォーマンスを考えるとCかCythonなどを使ったほうがよさそう。