2005年09月27日

WinInetでリダイレクト検出

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を紹介します。

http://www.sutosoft.com/test/redirect/301.html
http://www.sutosoft.com/test/redirect/301_goal.htmlにリダイレクトされます。ステータスコードは301が返ります。
http://www.sutosoft.com/test/redirect/301_rss.rdf
http://www.sutosoft.com/room/index.rdf(このサイトのRSS Feed)にリダイレクトされます。 RSSリーダーのテスト用にお使い下さい。
http://www.sutosoft.com/test/redirect/301_loop.html
自分自身にリダイレクトされます。Internet Explorer 6でこのURLにアクセスすると、いつまで経っても転送中のままになりますのでご注意下さい。サーバ側にも負担がかかりますので、このURLに対するアクセスだけはほどほどにするようお願い致します。

URLの「301」の部分を302、303、307に返ると、ステータスコードが変わります。アプリケーションのテスト用としてご自由にお使い下さい。

投稿者 MASATO : 2005年09月27日 21:46 | トラックバック
コメント
コメントする









名前、アドレスを登録しますか?