WinInetというWindowsのAPI群があります。 これは、Win32 Internet Extensionsの略で、 Gopher、FTP、HTTPなどのプロトコルを容易に扱うためのAPI群です。
InternetOpen、InternetOpenUrlなどのAPIがこれに属します。
MFCでは、CInternetSession、CInternetConnectionなどのクラスがWinInetを使っています。
話は飛んで、WinInetは、HTTPサーバにアクセスした際、
HTTPステータスコード 301、302、303、307が返ってくると、自動的にリダイレクト先のURLにアクセスしてくれます。
それはそれでありがたいことなのですが、自動的に処理されてしまうと、これらのステータスコードが返ってきたことがアプリケーションからは分かりません。そのため、例えば、301(Moved Permanently)が返って来た場合にアプリケーション内部に記録されているURLを変更するような処理が実現できません。
ここでは、そんな自動リダイレクトを回避する方法を紹介します(前置き長い・・・)
以下のAPIを使う際、
InternetOpenUrl HttpOpenRequest CInternetSession::OpenURL CHttpConnection::OpenRequest
以下のフラグを設定します。
INTERNET_FLAG_NO_AUTO_REDIRECT
それだけです。
フラグの存在さえ知ってしまえば後は簡単な話です。
なお、上記フラグを設定して自動リダイレクトを回避した場合、リダイレクト処理を自力で行う必要があります。
HTTP_QUERY_LOCATIONフラグを指定してHttpQueryInfoやCHttpFile::QueryInfoを呼び出せばリダイレクト先のURLが分かりますので、
301、302、303、307が返ってきた場合は、再度HttpOpenRequestやCHttpConnection::OpenRequestを使ってリダイレクト先URLにアクセスしましょう。
WinInetは、これらのステータスコードが返ってくるたび、何度でもリダイレクトするようです。
この動作に合わせても良いとは思いますが、何度目かでリダイレクトするのを止めてエラーとしておいたほうが無難そうな気もします。
最後に、リダイレクト周りの処理をテストするためのURLを紹介します。
URLの「301」の部分を302、303、307に返ると、ステータスコードが変わります。アプリケーションのテスト用としてご自由にお使い下さい。
投稿者 MASATO : 2005年09月27日 21:46 | トラックバック