※ ChatGPTを利用し、要約された質問です(原文:HTTP1.1のProxyServerを作りたい)
HTTP1.1のProxyServerを作りたい
このQ&Aのポイント
HTTP1.1のProxyServerをC言語で作成しようとしているが、通信がうまくいかず、レスポンスのデータの区切りがわからず問題が発生している。
解決策として、ヘッダのContent-Lengthラベルを使用してレスポンスのデータを区切る方法を考えているが、Transfer-Encodingプロトコルが存在し、データ部がgzipで圧縮されている場合はContent-Lengthが使用できない。
質問内容としては、プロトコルの解釈や問題点の見落としについての確認、gzipの解凍方法、参考になるHTTP1.1ProxyServerまたはクライアントのソースコードの探索の3つがある。
HTTP1.1のProxyServerを作りたい
いきなりですが、私がこの質問をするにいたったまでの経緯を話させていただきます。その後、その経緯を踏まえたうえで何点か質問があるのですが、それは後に書きます。
現在HTTP1.1のProxyServerを、C言語でBSDソケットを使って作成しようとしています。
しかし通信がうまくいきません。自分なりにおそらくこれが原因ではないかという、あたりをつけたんですが、その原因の解決方法がわかりません。その原因とは、
レスポンスのデータの区切りがわからないせいでデータがごっちゃになっているのではないか?。とうことです。
もう少し詳しく言うと、WebServerは、HTTP1.1Proxyは持続的接続を前提としたパイプライン接続をサポートしていると考えて通信しているため、一つのソケットに対して複数のレスポンスを返す。しかし現在の自分の書いているソースでは、一つのソケットから読み取れるだけ読み取ってそれをすべてclientのソケットに書き込んでいるため、レスポンスの区別がついていないのではないか?というのが問題点ではないかと考えています。
これを解決するためには、レスポンスのデータを区切りらなくてはなりません。それを知るためにはヘッダのContent-Lengthラベルを、読むのが一番早いのではないかと考えていますが、Transfer-Encodingなるプロトコルがあるようで、これを使って送信されてくるレスポンスの場合はContent-Lengthが使えません(データ部がhtmlの場合は大抵Transferを使っています)。なのでこのTransferプロトコルに対応するプログラムを書く必要性があるのですが、そのためにはデータ部を見なくてはいけないようなのですが、多くのレスポンスはデータ部をgzipで圧縮して送ってきています。
この過程を踏まえたうえでいくつか質問があります。
1つは、まずこの過程の上で何か自分は間違った解釈(プロトコルの理解違いや、問題点の見間違え等)をしていないでしょうか?
2つ目は、C(OSはlinux(Iphone)を使っています。)でgzipを解凍するための方法がわかりません。なにか参考になるサイトはないでしょうか?
3つ目は、参考になるHTTP1.1ProxyServerないしはクライアントの、ソースコードはないでしょうか?(1.0はいくつかみつけたんですが・・・)
どれか一つの質問へのお返事でも、結構です。よろしければご回答下さい。
お礼
返事おそくなってすいません。 このようなサイトがあったんですね。参考にさせていただきました。ありがとうございます。