質問
数週間前にPrivoxyをダウンロードしましたが、楽しみのために、Privoxyの簡単なバージョンをどのように実行できるか知りたいと思いました。
リクエストをプロキシに送信するようにブラウザ(クライアント)を構成する必要があることを理解しています。プロキシはWebにリクエストを送信します(httpプロキシであると言います)。プロキシは回答を受け取ります...しかし、プロキシはどのようにしてリクエストをブラウザ(クライアント)に送り返すことができますか?
C#とhttpプロキシをWebで検索しましたが、舞台裏で正しく動作する方法を理解できるものが見つかりませんでした。 (逆プロキシは必要ないと思いますが、確信はありません。)
この小さなプロジェクトを続けるための説明や情報がありますか?
更新
これは私が理解していることです(下の図を参照)。
ステップ1 すべてのリクエストがプロキシがリッスンするポートで127.0.0.1に送信されるように、クライアント(ブラウザー)を構成します。この方法では、リクエストはインターネットに直接送信されず、プロキシによって処理されます。
Step2 プロキシは新しい接続を確認し、HTTPヘッダーを読み取り、実行する必要があるリクエストを確認します。彼はリクエストを実行します。
Step3 プロキシはリクエストから回答を受け取ります。今、彼はウェブからクライアントに答えを送信する必要がありますが、どのように???
便利なリンク
Mentalisプロキシ:このプロジェクトがプロキシであることがわかりました(ただし、私が望むこと)。ソースを確認するかもしれませんが、コンセプトをより理解するために基本的なものが本当に欲しかったです。
ASPプロキシ:ここでもいくつかの情報を取得できる可能性があります。
リクエストリフレクター:これは簡単な例です。
解決
HttpListener でビルドできます
クラスで着信リクエストと < code> HttpWebRequest クラスでリクエストを中継します。
他のヒント
私はHttpListenerなどを使用しません。そのようにして、多くの問題に遭遇します。
最も重要なことは、サポートすることは大きな苦痛になることです:
- プロキシキープアライブ
- SSLは機能しません(正しい方法では、ポップアップが表示されます)
- .NETライブラリは厳密にRFCに準拠しているため、一部のリクエストは失敗します(IE、FF、および世界中のその他のブラウザでも動作します)。
あなたがする必要があるのは:
- TCPポートをリッスンする
- ブラウザリクエストの解析
- TCPレベルでそのホストに接続するホストを抽出
- カスタムヘッダーなどを追加する場合を除き、すべてを前後に転送します。
.NETで要件が異なる2つの異なるHTTPプロキシを作成しましたが、これが最善の方法であることがわかります。
Mentalisはこれを実行していますが、そのコードは「デリゲートスパゲッティ」であり、GoToよりも悪いです:)
最近 TcpListener および TcpClient 。
https://github.com/titanium007/Titanium-Web-Proxy
セキュアHTTPを正しい方法でサポートします。クライアントマシンは、プロキシが使用するルート証明書を信頼する必要があります。 WebSocketリレーもサポートします。パイプラインを除く、HTTP 1.1のすべての機能がサポートされています。とにかく、パイプライン処理はほとんどの最新のブラウザーでは使用されていません。 Windows認証(プレーン、ダイジェスト)もサポートしています。
プロジェクトを参照してアプリケーションを接続し、すべてのトラフィックを表示および変更できます。 (リクエストとレスポンス)。
パフォーマンスに関しては、マシン上でテストしており、顕著な遅延なく動作しています。
プロキシは次のように機能します。
ステップ1、proxyHost:proxyPortを使用するようにクライアントを構成します。
Proxyは、proxyHost:proxyPortでリッスンしているTCPサーバーです。 ブラウザはプロキシとの接続を開き、HTTPリクエストを送信します。 プロキシはこのリクエストを解析し、「ホスト」を検出しようとします。ヘッダ。このヘッダーは、接続を開く場所をプロキシに指示します。
ステップ2:プロキシは、「ホスト」で指定されたアドレスへの接続を開きます。ヘッダ。次に、HTTP要求をそのリモートサーバーに送信します。応答を読み取ります。
ステップ3:応答がリモートHTTPサーバーから読み取られた後、プロキシはブラウザーで以前に開かれたTCP接続を介して応答を送信します。
概略的には次のようになります:
Browser Proxy HTTP server
Open TCP connection
Send HTTP request ----------->
Read HTTP header
detect Host header
Send request to HTTP ----------->
Server
<-----------
Read response and send
<----------- it back to the browser
Render content
トラフィックを傍受するだけの場合、フィドラーコアを使用してプロキシを作成できます...
http://fiddler.wikidot.com/fiddlercore
最初にUIでfiddlerを実行して、その機能を確認します。これは、http / httpsトラフィックをデバッグできるプロキシです。 C#で記述されており、独自のアプリケーションに組み込むことができるコアを備えています。
FiddlerCoreは商用アプリケーションには無料ではありません。
OWINとWebAPIを使用すると、非常に簡単になりました。 C#プロキシサーバーの検索で、この投稿 http://blog.kloud.com.au/2013/11/24/do-it-yourself-web-api-proxy/ 。これが私が取っている道になります。
悪の博士に同意する HTTPListenerを使用すると、多くの問題が発生し、リクエストを解析する必要があり、ヘッダーと...に関与します。
- tcpリスナーを使用してブラウザのリクエストをリッスンします
- リクエストの最初の行のみを解析し、接続するホストドメインとポートを取得します
- ブラウザリクエストの最初の行で見つかったホストに正確な生のリクエストを送信します
- ターゲットサイトからデータを受信します(このセクションに問題があります)
- ホストから受け取った正確なデータをブラウザに送信
ブラウザのリクエストに含まれる内容を把握して解析する必要はないことがわかります。最初の行からターゲットサイトのアドレスのみを取得します 最初の行は通常これが好きです GET http://google.com HTTP1.1 または CONNECT facebook.com:443(SSLリクエスト用)
Socks4は、実装が非常に簡単なプロトコルです。初期接続をリッスンし、クライアントから要求されたホスト/ポートに接続し、成功コードをクライアントに送信してから、ソケットを介して発信および着信ストリームを転送します。
HTTPを使用する場合は、いくつかのHTTPヘッダーを読み取り、場合によっては設定/削除する必要があるため、もう少し作業が必要です。
正しく覚えていれば、SSLはHTTPプロキシとSocksプロキシで機能します。 HTTPプロキシの場合、上記のsocks4のように動作するCONNECT動詞を実装し、クライアントはプロキシされたtcpストリームを介してSSL接続を開きます。
ブラウザはプロキシに接続されているため、プロキシがWebサーバーから取得するデータは、ブラウザがプロキシに対して開始したのと同じ接続を介して送信されます。