首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MFC HTTP 請求取得 Set-Cookie 不完整:多 Cookie 處理與抓包對比

     編輯:程式設計綜合問答

問題現象

使用 CHttpFile::QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF) 取得回應標頭,Set-Cookie 僅回傳第一組 (PHPSESSID),瀏覽器實際收到多組 Cookie。

原因分析

  1. WinINet 預設合併同名標頭:HTTP_QUERY_RAW_HEADERS_CRLF 回傳原始標頭,但 Set-Cookie 為多行,部分版本僅回傳第一行。
  2. 請求標頭缺失:程式碼中手動 AddRequestHeaders 格式錯誤(含空格、換行),導致 Server 視為異常請求,簡化回應。
  3. 重導向/壓縮處理:未自動處理 302、gzip,導致標頭截斷。

解決方案

  1. 改用 HTTP_QUERY_SET_COOKIE 迭代:
CString cookie;
DWORD dwIndex = 0;
while (pFile->QueryInfo(HTTP_QUERY_SET_COOKIE, cookie, &dwIndex)) {
    AfxMessageBox(cookie); // 每組 Cookie
    dwIndex++;
}
  1. 修正請求標頭:
pFile->AddRequestHeaders(_T("Accept: */*"));
pFile->AddRequestHeaders(_T("User-Agent: Mozilla/5.0 ..."));
// 參數放在 OpenRequest 的 lpszObjectName,不要塞在 AddRequestHeaders
CHttpFile* pFile = pHttpConnect->OpenRequest(
    CHttpConnection::HTTP_VERB_GET,
    _T("/api/login.php?callback=...&action=login&login_account=dazhewang&password=111111..."));
pFile->SendRequest();
  1. 啟用自動重導向與解壓縮:
pFile->AddRequestHeaders(_T("Accept-Encoding: gzip, deflate"));
// WinINet 預設支援 gzip 解壓縮,確保不手動干擾

抓包對比驗證

使用 Wireshark/Fiddler 擷取程式發出的封包與瀏覽器封包,對比:

  • Request Line、Headers 順序、編碼
  • Cookie、Referer、User-Agent 是否一致
  • Response 原始標頭完整性

總結

MFC WinINet 取得多組 Set-Cookie 需迭代 HTTP_QUERY_SET_COOKIE,請求參數應放在 URL,標頭格式需標準,善用抓包工具對比差異。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved