閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

wininet 関連の API が意外と便利

ネット上のファイルをダウンロードするための HTTP クライアントもどきを C++ を使って実装していたのですが、単純に GET リクエストを送ってレスポンスをファイルに書き出すだけでは不十分すぎて、例えば 302 Found がレスポンスとして返ってきたらリダイレクトしてやらなければならないとか、その辺りに対応していくのが非常に大変なため、ダウンロードする時は InternetOpen 系の API を使用することにしました。これは、レスポンスヘッダに 302 が返ってくるとちゃんとリダイレクトして、その先のものを拾ってきてくれるようなので。

さらに InternetReadFile 関数は、ヘッダを取り除いたファイルの中身だけを取ってくるので、いちいちヘッダ部分を取り除いたりとかいう細かい作業からも開放されて、思っていたより便利です。ヘッダ情報が欲しい時は別に関数が用意されているので、それを使用すればいいようです (HttpQueryInfo とか) 。ヘッダ情報引っ張ってこれるなら、 Last-Modifed ヘッダを見ている部分もソケットじゃなくて、この API に置き換えられるかも。

ソケットに費やした苦労は一体……。