我的应用程序的一部分依赖于基于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的结果百分比编码。
答案 0 :(得分:0)
%
也可以用作转义符,例如,您不能仅使用printf("%")
而是printf("%%")
来打印'%'。
如果您阻止%
的转义功能,正如IInspectable所说,您将无法使用转义功能,例如%20,以及其他更多功能:%2B,%2F,%3F,% 3D,%21 ...
在msdn document上的描述,标记WINHTTP_FLAG_ESCAPE_PERCENT
表示
为pwszObjectName传入的字符串是从LPCWSTR转换而来的 到LPSTR。所有不安全的字符都将转换为转义序列 包括百分比符号。
但是,默认情况下,
除百分比符号外的所有不安全字符均为 转换为转义序列。