SATOXのシテオク日記

~ふもっふ、ふもふも~

いまさら聞けないSocketプロキシサーバ通信

一般プログラマにとっては一番低レベルの通信レイヤであるSocketを使って最近いろいろ遊んでいます。
そこでふとプロキシサーバ経由でHTTP通信をする必要が出てきたので、いろいろ調べた結果をご紹介します。結論から言うと、とっても簡単です。
通常通信とプロキシサーバ経由の通信を図にしてみると次のような感じです。通常は直にウェブサーバに対してGETなどのリクエストを行うわけですが、プロキシサーバ経由ではプロキシサーバに対してリクエストを行います。あ、当たり前のこと言ってますな。


例として、ウェブサーバはsatoxpochi.comでポート80番、プロキシサーバはproxy.comでポート1234番とします。どちらも実在しません。
通常のHTTPリクエストヘッダの内容は次の通りです。GET行にファイルパスを指定し、Hosts行にはサーバの名前を指定します。このとき、Socketでconnect()するのはsatoxpochi.comで80番ポートです。

GET hoge.html HTTP/1.1\r\n
Host: satoxpochi.com\r\n
\r\n
\r\n

一方、プロキシサーバ経由で繋ぐ場合のHTTPリクエストヘッダは以下の通りです。GET行にウェブサーバのフルパスを指定、ホストにはプロキシサーバの名前を指定します。このとき、Socketでconnect()するのはproxy.comで1234番ポートです。

GET http://satoxpochi.com/hoge.html HTTP/1.1\r\n
Host: proxy.com\r\n
\r\n
\r\n

いやはや、簡単ですね。