Proxy

C# と .NET Framework で作る簡単プロキシサーバ

前回よりも安定して動作するようになりました。 このプログラムは .NET Framework で用意されている HttpListener クラスと HttpWebRequest を使ってプロキシサーバ (Proxy Server) を実現します。 System.Net.HttpListener の仕様上、プラットフォームに制…

Proxy を更新しました

WWWC 補助ツール からダウンロードできます。今回の更新で動くページがかなり増えたと思います。 CONNECT で Socket.xxxAsync を使わないようにしたので、Windows XP 以前でも動くかも。調べてないけど。 接続の再利用するかしないかの判断がうまくなったの…

SocketAsycnEventArgs は Windows XP 以上でしかサポートされていないらしい

SocketAyncEventArgs を使った通信は WindowsXP 以上でしかサポートされていないみたい。まぁこだわらなくて良いので Begin/End パターンを使えばいいか。操作ごとに SocketError がとれて便利だったけど。 .NET のヘルプで Socket.Poll を調べてみると、Soc…

Expect: 100-continue

Keep-Alive の実装が適当すぎるせいか、ソケットを再利用したときにサーバー側から切断されていてもそれを検出できない。 GET なら再接続して送り直せばいい。しかし POST でメッセージボディが大きすぎるとき、メモリ使いすぎて困る。 なのでクライアントか…

HTTP のリクエストを解析する

HTTP のリクエストを解析し、プログラム上で扱いやすくするクラス。 using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Linq; using System.Text; using System.IO; namespace ReadTest { class Request…

CONNECT のトンネリングは非同期で

CONNECT では切断されるまでつなぎ続けるのがベストっぽいので非同期メソッドをつかって処理しよう。 Socket.ReceiveAsync() でブラウザ側から読んで、読むのに使った SocketAsyncEventArgs をそのまま オリジンサーバーに Socket.SendAsync() で送ればいい…

ストリームから1行読み取る

ストリームから1行読み取りたいなら、StreamReader なんかが使えるわけだけど、文字列としてしか扱えないので不便だ。HTTP 通信ではヘッダまでは ASCII で読んで良いが、それ以降は画像だったり書庫だったりのデータが送られてくる事があるので、StreamReade…

C# で作る簡単プロクシサーバー

追記: 2008/12/28 改訂版 プロクシサーバーの作成は難しいです。ブラウザ側とプロクシ間の keep-alive と、プロクシとオリジンサーバー間の keep-alive ができないといけません。その辺の管理がややこしい。というわけで .NET Framework にぜんぶやってもら…

CONNECT のトンネリング

CONNECT で SSL 通信をトンネリングするとなんか重くなるなーとおもったら無限ループしてた。通信終わっても Socket.Connected == false にはならないのね。 切断されるまでトンネリングするっていうループで、切断の判断を Socket.Connected でしてた。でも…

Keep-Alive の実装

HTTP プロキシサーバを作っていて、最もやっかいなのは Keep-Alive の実装かな。 ブラウザ側との Keep-Alive とウェブサイト側との Keep-Alive をしなければならない。 (Browser Proxy, Proxy WebSite) ウェブサイト側の Socket を再利用しようとすると、既…

持続的接続

とりあえずなプロキシサーバーの実装ではあるが、keep-alive もできるようになってきた。ただ、例外処理はほとんどしていないのでその辺が問題だなー。ブラウザの中止ボタンとかで接続が止まったりとか、Origin Server が切断してきたりとか、なんやらするこ…

Proxy Server について

名前は今後考えるとして・・・。 まず、考えがあまかった。HTTP の仕様なんてほとんどみてなかった。リクエストラインとかレスポンスラインをとりあえず受信して、それをそのまま送信すればいいやって思ってた。でも仕様をみてみると、持続的接続とかあって…