2012-03-12 14 views
2

私は現在Firefoxでテストしています。サーバーは、firefoxからのHTTPリクエストを文字列として受け取っています。今はどうしたらよいのか分かりません。ポート8080に接続し、要求を文字列として送信する必要がありますか?その後、ポート8080で応答を待ち受けますか?もしそうなら、どのような応答が来るでしょうか?私はどのようなタイプのコンテンツを期待しているのか分かりません。 HTMLの文字列ですか?私はそれをファイアーフォックスに送り返します。C HTTPプロキシサーバーの作成 - HTTP応答を受信して​​リダイレクトする方法

また、他の読んだところから、私はプロキシの種類がたくさんあると思っています。それについてはまだ分かりません。私のプロキシは、クライアントと実際のインターネットとの間の仲介人として役立つだけで、何もしません。

+0

プロキシの目的をより明確にすることができますか。基本的には、ブラウジングマシンのIPを隠すこと(または非公開のIPを扱う)ですか?また、Squidのような既製のソリューションを使用できない、または使用したくない特定の理由がありますか?また、パフォーマンスは重要ですか?もしそうなら、これは*大きな仕事です。 –

+0

これはクラスプロジェクトです。コマンドライン引数で提供されるいくつかのドメインを除外するだけです。私はコードを探しているわけではありません。そして、いいえ、間違いなくパフォーマンスはありません。これは小さなことです。 – Aerovistae

+0

@DavidSchwartzこれは宿題です、彼の最後の質問を見てください – wintersolutions

答えて

5

HTTPをプロキシするためのルールは、実際は非常に複雑です。しかし、特にパフォーマンスについて気にしない場合は、ほとんどを無視して回避することができます。

まず、一部のポートでリッスンする必要があります。受け取ったクエリを解析する必要があります。いくつかの行から構成され、それぞれにはCRLFのペアが続きます。 2つのCRLFペアでクエリヘッダーの最後を知ることができます。クエリ本体(POSTの場合)があり、複雑であるため解析する必要はありません。だからここにどのように偽のそれよです:

  1. 任意のConnectionヘッダーのクエリを確認してください。あなたが何かを取得した場合は、それらを削除します。

  2. もう一方の端にサーバーに接続します。

  3. 要求ヘッダーと要求ヘッダーを送信した後、要求ヘッダーの最後を示す2番目のCRLFの前に、Connection: closeヘッダーを追加します。その後、2番目のCRLFを送信します。

  4. 代理人の両方での代理人になります。あまりにも怠けてselectまたはpollを使用する場合は、追加のプロセスまたは追加のスレッドを使用できます。ハーフクローズ接続を正しくプロキシするようにしてください。 (ブラウザはクエリを終了すると送信をシャットダウンすることがありますが、応答をまだ聞いています)。

  5. ブラウザは接続を再利用しないでください。 HTTP/1.0の場合は、それを行うための特定の許可が必要ですが、それは取得できません。 HTTP/1.1の場合、サーバーはConnection: close要求を受け入れ、それ自身のConnection: closeヘッダーで応答する必要があります。

HTTPSは実際にはより簡単です。あなたはそれをサポートする必要がある場合は、CONNECTリクエストを解析する必要があります。しかし、あなたは相手に接続し、成功または失敗を報告し、双方向プロキシモードに入ります。

1

クライアントが望むURLに到達するようにリクエストを解析する必要があります。このURLには、必要な情報、つまり接続先のサーバー名が格納されています。クライアントがプロキシに接続していますが、実際にはhttp://example.comが必要です。 example.comに接続する必要があります。その後、完全にトランスペアレントなTCPプロキシにすることができます。双方向データ転送を適切に処理するとともに、TCPの半分を処理します。インターセプトして解析したリクエストを転送します。

プロキシが常に透過的であるとは限らないため、プロキシはさまざまです。プロキシは追加の認証と暗号化を提供できます。または、HTMLをフィルタリングすることができます。たとえば、帯域幅の狭いネットワーク上で高速サーフィンを行うために画像を削除または縮小することができます。または、LAN全体にキャッシュを提供できるため、人々は同じファイルを複数回ダウンロードすることはありません。

最初にすべきことは、TCP用の完全な汎用プロキシを作成することです:ポートフォワーダ。これは、接続するIPとポート番号で構成されたプログラムです。クライアント接続をリッスンし、設定されたIPおよびポートの宛先に接続してから、クライアントとクライアントの間でデータを渡します。

これを書くことができない場合は、HTTPプロキシを作成する際に問題がありますが、これは似ていますが、クライアントの要求から構成を取得する(複雑になります)。

関連する問題