CAtlHttpClientT Bug 已修复






4.91/5 (5投票s)
2004 年 3 月 8 日

47254
ATL 7 CAtlHttpClientT 代码的修复
引言
本文提供了一个对 ATL 7 的 CAtlHttpClientT
类的一个小的但重要的修复。
背景
HTTP/1.1 规范支持消息体的分块传输编码(参见 RFC 2068 的 3.6 节)。分块传输编码修改消息体,以便将其作为一系列块传输,每个块都有自己的大小指示。与通常的 HTTP 文件传输不同,分块传输不指定传输长度,即没有传输“Content-Length:”头部 – 发送者添加“Transfer-Encoding: chunked”头部代替。
ATL 7 错误
在 ATL 7 中,HTTP 客户端事务使用 CAtlHttpClientT
类执行。该类特别支持分块传输编码/解码。它包含一个受保护的方法 IsMsgBodyChunked()
,用于检查消息体是否为分块传输。此方法代码如下(ATLHTTP.INL,第 1254-1263 行)
template<class TSocketClass> inline bool CAtlHttpClientT<TSocketClass>::IsMsgBodyChunked() { CString strValue; return ( GetHeaderValue(_T("Transfer-Encoding"), strValue) && strValue == _T("chunked") // m_HeaderMap lower cases // all values before storing ); }
不幸的是,这里的 strValue
可能会以 CR/LF 结尾,即等于“chunked\r\n”(我在从 Microsoft IIS 接收文件时遇到过这种情况)。在这种情况下,CAtlHttpClientT
不会识别分块传输编码,并返回原始响应体。以下是错误修复:
template<class TSocketClass> inline bool CAtlHttpClientT<TSocketClass>::IsMsgBodyChunked() { CString strValue; if (!GetHeaderValue(_T("Transfer-Encoding"), strValue)) return false; if (strValue.Right(2) == _T("\r\n")) strValue = strValue.Left(strValue.GetLength() - 2); // m_HeaderMap lower cases all values before storing return strValue == _T("chunked"); }