HTTPでコンテンツを取得するサンプルアプリを書いてみた

エントリ名の通り。もっとも完成したのは2週間以上前だけど。
httpget - HTTPでコンテンツを取得するサンプルアプリ
ソケットプログラミングのサンプルソースTCPクライアント版)で、仕事絡みなのでC言語で書いている。

切欠は仕事絡みだけど趣味と実益を兼ねてプライベートな時間に書いたものだし*1、表に出て困るようなネタは全く含まれていない(むしろ既知の仕様や技術しか含まれていない)ので、公開してしまうことにした。

HTTPには深入りしないようにしたのでRFCに準拠していない部分があるかもしれないし、リダイレクトに対応していないなど実用度は低い*2。でも頑張ってチャンク形式のレスポンスには対応した。

内部実装では fdopen(3) 経由で高水準入出力関数を使うようなことをせずに似たような機能を自前で書いているが、これは高水準の入出力関数が用意されていない環境でプログラミングすることが大半だから。そもそもBSDソケットを直接叩く機会が非常に少なく、最もよく使うTCP/IPAPIには read(2)/write(2) 相当の入出力関数しか用意されていない。

そういった環境向けの社内教育で使うサンプルソースなので、高水準関数を叩かずに自前でそれっぽいものを用意している。つまり「欲しいなら自作しろ」ということ。

「最初からBSDソケットじゃなくて普段使うAPIセットを使えばよいのでは?」と突っ込みが入りそうだが、そこはそれ、ライセンスだとか守秘義務とか色々と大人の事情がある訳で――「TCP/IPネットワークプログラミング入門」的な位置づけの課題(それも各担当レベルで用意する程度の代物)なので、あまり面倒なことはしたくない。基本的な雰囲気を味わう分にはBSDソケットで十分だし。

*1:正直な所サンプルソースを用意する必要性はない(ググれば腐るほど――じゃないかもしれないけど色々とヒットするし)のだが、しかし自分があまり理解できていないことを課題で出すのはどうかと思うし、「自分が出来ないことを出題している」と誤解されるのも嫌なので。

*2:まあ普通はWgetやらブラウザのダウンロード機能やらで十分なので。そういえばもう何年もダウンローダーの類を触ってないなあ。