WinHttpOpenRequest的默认URL编码行为背后的原因

时间:2018-12-18 18:18:59

标签: winapi winhttp

我的应用程序的一部分依赖于基于Win32 API的HTTP客户端。

每个HTTP查询都是通过调用WinHttpOpenRequest来发起的,例如

std::wstring method = L"POST";
std::wstring path = L"/foo/bar%baz";
WinHttpOpenRequest(
            m_connectionHandler,
            method.c_str(),
            path.c_str(),
            NULL,
            WINHTTP_NO_REFERER,
            WINHTTP_DEFAULT_ACCEPT_TYPES,
            WINHTTP_FLAG_SECURE);

到目前为止,我一直依靠WinHttpOpenRequest的默认行为来对查询进行正确的百分比编码。

我刚刚发现文字字符%在默认情况下未保留转义符,我必须通过WINHTTP_FLAG_ESCAPE_PERCENT作为附加标志。

我真的不明白为什么为什么该API会正确编码每个保留字符(百分比字符本身除外)。这个选择背后是否有任何务实的理由?我可以安全地使用此附加标志,还是我看不到任何陷阱?

我能想象的唯一原因是要避免使用默认行为进行双百分比编码,即我已经对查询进行了百分比编码,WinHttpOpenRequest无法猜测其读取的字符百分比是否是a的结果百分比编码。

1 个答案:

答案 0 :(得分:0)

%也可以用作转义符,例如,您不能仅使用printf("%")而是printf("%%")来打印'%'。

如果您阻止%的转义功能,正如IInspectable所说,您将无法使用转义功能,例如%20,以及其他更多功能:%2B,%2F,%3F,% 3D,%21 ...

msdn document上的描述,标记WINHTTP_FLAG_ESCAPE_PERCENT表示

  

为pwszObjectName传入的字符串是从LPCWSTR转换而来的   到LPSTR。所有不安全的字符都将转换为转义序列   包括百分比符号。

但是,默认情况下,

  

除百分比符号外的所有不安全字符均为   转换为转义序列。