2016-03-19 25 views
0

私はC++でHTTPプロキシを作成しています。クライアントがGETまたはCONNECT要求をプロキシに送信すると、プロキシはパケットのHTTPヘッダーを解析し、その中のホスト名を解決し、サーバー宛先への別のソケットを開き、クライアントの要求を送信します。次に、プロキシはクライアントにサーバーの応答を送信します。プロキシのGETメソッドとCONNECTメソッド

GET http://www.gstatic.com/generate_204 HTTP/1.1 

CONNECT cr-input.getspeakit.com:443 HTTP/1.1 

しかし、私は、サーバーからのGETの応答を解析する際、私は400のステータスコードを見つけ、すなわちBad Request

はここで、サーバーへのプロキシによって送信され、クライアントからGETCONNECT要求だこれはと思われます(Wikipediaから):

不正なリクエスト構文、無効なリクエストメッセージフレーミング、または不正なリクエストルーティング。

GETリクエストでサーバーに間違った引数を送信しますか?

+0

プロキシがサーバーに送信する内容を含めることはできますか? –

+0

Stack Overflowは、プログラミングおよび開発に関する質問のサイトです。この質問は、プログラミングや開発に関するものではないので、話題にはならないようです。ヘルプセンターの[ここではどのトピックを参照できますか](http://stackoverflow.com/help/on-topic)を参照してください。おそらく、[スーパーユーザー](http://superuser.com/)または[Web Apps Stack Exchange](http://webapps.stackexchange.com/)がより良い場所になるでしょう。また、[Dev Opsについての質問はどこに投稿しますか?](http://meta.stackexchange.com/q/134306)を参照してください。 – jww

答えて

0
  1. GET。構文は間違っているわけではありませんが、要求があなたによって偽造されておらず、実際にwww.gstatic.comに行く場合は、あらゆる種類の要求が40xステータスコードを生成することを自分で確認できます。これは、Googleが静的コンテンツをオフロードするために使用するドメインです。それが依然として、それが要求の40倍を返す理由。 Googleに行く。

  2. CONNECT。 CONNECTをサーバーに転送する場合、これは間違っています。 CONNECTは、プロキシをバイパスしてエンドツーエンドのバイナリ接続を開くためのものです。順序は次のようになります。

    • クライアントからの接続要求を取得
    • IPに
    • オープンTCP接続:ポートクライアントへ
    • 戻る「OK 200」(明らかにDNS解決後)接続が正常に開かれた場合、または
    • データがいずれかの端から受信された場合は、接続の1つが閉じられるまでそれをもう一方の端に転送します。閉じるときには、もう片方。
+1

GET要求のホスト名とポート部分を削除する必要があります。それはプロキシのためだけです。 – EJP

+0

GET要求にポートがないため、完全なURLを指定するとHTTP 1.1が指定されます。 RFC 2616からリクエストURIの例: 'GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1' – mementum

+0

もし' CONNECT www.youtube.com:443 HTTP/1.1が得られたら ホスト:www.youtube.com:443 プロキシ接続:キープアライブ ユーザーエージェント:Mozilla/5.0(X11; Linux x86_64)AppleWebKit/537.36(GeckoのようなKHTML)Chrome/49.0.2623.87 Safari/537.36 '、443ポートのために開かなければならないTCP接続はSSLで保護されていますか? – elmazzun