Часть моего приложения основана на HTTP-клиенте, основанном на Win32 API.
Каждый 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
не может угадать, являются ли символы процента, которые он читает, результатом кодирования процента или нет.