2011-07-15 34 views
0

私はHTTP POSTとGETを処理するためにWininetを使用するカスタムhttpコンポーネントを持っています。正常に動作しますが、一部のサイトでは応答ヘッダーのSet-Cookieパラメータが返され、次回の呼び出し時にこのCookieがブラウザで使用されると予想しています。私の見ている限り、私のwininetベースのコンポーネントはそれらのクッキーを処理していません。私はHTTPアナライザのようないくつかのHTTPスニファを使用すると、私はそれを見ることができます。 IEは正常に動作します。私の要求ヘッダーでの違いはありません。IEと同じです。WininetはHTTPヘッダー値 "Set-Cookie"を処理しますか?

私はこれらのクッキーを自分で処理する必要がありますか?もしそうなら、どうですか?

答えて

1

WinInetはCookieを処理しません。あなたはそれを自分で処理する必要があります。

WinInetのlibararyには、とInternetSetCookie()があります。 Managing Cookiesには良いMSDN記事があります。

詳細はアプリケーションとアーキテクチャによって異なりますが、通常はInternetGetCookie() clunkyを使用して実装されています。 HTTPヘッダを取得するための例と

// Create a session cookie. 
bReturn = InternetSetCookie(TEXT("http://www.adventure_works.com"), NULL, 
      TEXT("TestData = Test")); 

MSDNの記事がhereを見つけることができます:代わりに私はクッキーが存在する場合InternetSetCookie()を呼び出し、その後InternetReadFile()への呼び出しで、ラインのすべてのHTTPヘッダを取得します。

+0

ありがとうございました。 –

+0

どのように私はクッキーを設定する必要があるホストを見つける必要がありますか?つまり、http://www.xxx.com/xxx/xxxx.dll?xxx=xxxにデータを投稿すると、ホストhttp://www.xxx.comにCookieを設定する必要がありますか?次のリクエストが同じURLに送信されたが、httpsページに送信された場合は、 –

+0

はい、cookieは、set-cookieヘッダーを返したドメインに明示的に予約されています。クッキーを読んでみてくださいRFC:http://www.ietf.org/rfc/rfc2109.txt –

0

上記の答えは間違っています。 CInternetSessionは実際にクッキーを処理します。このセッションのhttp応答が がSet-Cookieヘッダーを返した場合、そのCookieはセッションオブジェクトによって自動的に保存され、その後の要求では がサーバーに返されます。 SetCookie()を使う必要はありません。

ただし、いくつかの注意点と落とし穴があります。有効期限なしに返されたCookieは、セッションCookie であり、MEMORYにのみ保存されます。 CInternetSessionオブジェクトが破棄されると、CInternetSessionオブジェクトは永久に消滅します。

CInternetSessionオブジェクトにフラグを設定するには、SetOptionとCookieを無効にする要求を設定することができます。 フラグINTERNET_OPTION_SUPPRESS_SERVER_AUTHおよびINTERNET_FLAG_NO_COOKIESを参照してください。あなたがこれをしていないように注意してください。

キャッシングに注意してください。スクリプトを一度取得してクッキーを取得し、再度取得して返されたクッキーを印刷します。 それは動作しません!クッキーは印刷されません。どうして? 「ファイル」がキャッシュされているためです。 2回目の呼び出しでは、wininetはサーバーに接続する ではありません。古い応答をもう一度返します。もちろん、クッキーは印刷されていません。 を回避するには、フラグINTERNET_FLAG_RELOADを使用する必要があります。ここで本質です:また

int flags = INTERNET_FLAG_RELOAD; 
int port = INTERNET_DEFAULT_HTTP_PORT; 
CHttpConnection *connection = session.GetHttpConnection("www.example.com", flags, port); 
CHttpFile *fil = connection->OpenRequest(CHttpConnection::HTTP_VERB_GET, "cgi-bin/test.pl", 
             0,1,0, "HTTP/1.1", flags); 
fil->SendRequest(); 

、クッキーはURLのhttpでスクリプトによって設定されている場合ことに注意してください:それはURLをhttpに関連付けられています//example.com/cgi-bin/test.pl://例.com/cgi-bin/soはスクリプトhttp://example.com/cgi-bin/hello.plに返されます。 Cookieヘッダーはこの動作を変更することができます。

+0

あなたは2歳の質問の権利であることを実感していますか?事は今まで変わっているかもしれません。 –

+0

私は知っている限り、これはいつもそうでした。 – Henrik2

関連する問題