【发布时间】:2018-12-18 18:18:59
【问题描述】:
我的应用程序的一部分依赖于基于 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 无法猜测它读取的百分比字符是否是百分比编码的结果与否。
【问题讨论】:
-
如果百分号始终是 URL 编码的,您将无法自己将其用于 URL 编码目的,例如然后
%20将被转换为%%20,可能不是您想要的。 -
@IInspectable 我理解,但如果我在调用此函数之前完成了编码,我会期望使用 WINHTTP_FLAG_ESCAPE_DISABLE 完全禁用
WinHttpOpenRequest上的所有 url 编码。还是允许某种混合模式,即一些保留字符已经编码但不是全部? -
如果您不提供任何标志,
WinHttpOpenRequest可以使用任何资源定位器。不安全的字符被 URL 编码,而 URL 编码的序列被单独留下。这涵盖了绝大多数用例,包括 URL 的某些部分是 URL 编码的,而其他部分仍然包含不安全字符的情况。当您的应用程序将来自不同来源(应用程序代码和库)的 URL 拼凑在一起时,就会发生这种情况。要选择特殊待遇,您必须提供标志。这遵循针对最常见用例进行优化的指导原则。 -
非常感谢,您的回答很有道理,它回答了我的所有想法。随意填写答案,我会接受的。