ローカルプロキシとして使う、HTTPProxyサーバをC#で作成しようと思ってます。


・Proxyサーバに必要なコマンドなどがまとめられたページなど、サーバを作る際に役に立ちそうなページ
・Proxyサーバ実装のチュートリアルみたいなページ(C#でなくても可)
・C#でかれたたProxyサーバのソース

RubyのWEBrickでやっとけとかProxomitronのフィルターでやっとけとかは無しでお願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/10/22 16:01:33
  • 終了:2006/10/27 16:17:35

ベストアンサー

id:furutanian No.1

furutanian回答回数112ベストアンサー獲得回数142006/10/22 22:21:03

ポイント60pt

HTTP Proxy の動作は基本的に HTTP サーバと同じで、HTTP プロトコルのリクエストを受け付け、代理(Proxy)として HTTP サーバに接続し、受け取った結果をクライアントに返すことになりますので「必要なコマンド」は「HTTP リクエスト」と同じということになります。

通常の HTTP リクエストは以下のような形で、HTTP サーバに到着しますが、

「GET /index.html HTTP/1.0」

ブラウザの Proxy 機能をオンにすると、HTTP リクエストは以下のような形で、Proxy サーバに到着するようになります。

「GET http://www.example.com/index.html HTTP/1.0」

Proxy は、URL 部分を、アドレスとパスに分解、「www.example.com」のアドレスで待っている HTTP サーバに接続、「GET /index.html HTTP/1.0」という要求を出して、結果を受領、クライアントに返します。

C# ではなく Perl ですが、以下の場所に Proxy サーバのサンプルがあります。

http://x68000.q-e-d.net/~68user/net/http-proxy.html

勘所は以下の Proxy リクエストを解析、HTTP リクエストに変換する部分です。

  193:         if ( m|^([A-Z]+) [a-zA-Z]+://(.*?)/(.*?) (HTTP/\d\.\d)$|i ){
  197:             ($method, $host, $path, $proto_ver) = ($1, $2, $3, $4);
  208:                 $new_req = "$method /$path $proto_ver\r\n";

単純な正規表現で 4 つの要素に分解し、くっつけなおしているだけであり、一切「コマンド」としての扱いは行っていません。つまり、純粋な Proxy サーバには「コマンド」を理解する機能は不要なのです。

一応、HTTP リクエストは以下に一覧がありますが、事実上、PUT、POST、HEAD くらいしか利用されません。

http://www.7key.jp/nw/http1.html#request

もし、キャッシュ指向の Proxy サーバを作る場合、GET だけに着目して作れば十分でしょう。

id:shun262

HTTPProxy独自のコマンドってないんですね。

参考になります^^

2006/10/23 00:54:00

その他の回答(1件)

id:furutanian No.1

furutanian回答回数112ベストアンサー獲得回数142006/10/22 22:21:03ここでベストアンサー

ポイント60pt

HTTP Proxy の動作は基本的に HTTP サーバと同じで、HTTP プロトコルのリクエストを受け付け、代理(Proxy)として HTTP サーバに接続し、受け取った結果をクライアントに返すことになりますので「必要なコマンド」は「HTTP リクエスト」と同じということになります。

通常の HTTP リクエストは以下のような形で、HTTP サーバに到着しますが、

「GET /index.html HTTP/1.0」

ブラウザの Proxy 機能をオンにすると、HTTP リクエストは以下のような形で、Proxy サーバに到着するようになります。

「GET http://www.example.com/index.html HTTP/1.0」

Proxy は、URL 部分を、アドレスとパスに分解、「www.example.com」のアドレスで待っている HTTP サーバに接続、「GET /index.html HTTP/1.0」という要求を出して、結果を受領、クライアントに返します。

C# ではなく Perl ですが、以下の場所に Proxy サーバのサンプルがあります。

http://x68000.q-e-d.net/~68user/net/http-proxy.html

勘所は以下の Proxy リクエストを解析、HTTP リクエストに変換する部分です。

  193:         if ( m|^([A-Z]+) [a-zA-Z]+://(.*?)/(.*?) (HTTP/\d\.\d)$|i ){
  197:             ($method, $host, $path, $proto_ver) = ($1, $2, $3, $4);
  208:                 $new_req = "$method /$path $proto_ver\r\n";

単純な正規表現で 4 つの要素に分解し、くっつけなおしているだけであり、一切「コマンド」としての扱いは行っていません。つまり、純粋な Proxy サーバには「コマンド」を理解する機能は不要なのです。

一応、HTTP リクエストは以下に一覧がありますが、事実上、PUT、POST、HEAD くらいしか利用されません。

http://www.7key.jp/nw/http1.html#request

もし、キャッシュ指向の Proxy サーバを作る場合、GET だけに着目して作れば十分でしょう。

id:shun262

HTTPProxy独自のコマンドってないんですね。

参考になります^^

2006/10/23 00:54:00
id:lunlumo No.2

lunlumo回答回数107ベストアンサー獲得回数142006/10/23 23:01:14

ポイント10pt

 CONNECTはプロクシ用のメソッドですね。HTTPのみに対応したプロクシもどきであれば,furutanianさんの示された方法で十分かとは思いますが。

http://www.studyinghttp.net/method#CONNECT

id:shun262

ありがとうございます

2006/10/23 23:30:45

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません