Причина, по которой WinHttpOpenRequest использует кодировку URL по умолчанию - PullRequest
0 голосов
/ 18 декабря 2018

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

1 Ответ

0 голосов
/ 19 декабря 2018

% Его также можно использовать в качестве escape-символа, например, вы не можете распечатать '%' только с помощью printf("%"), но printf("%%").

Если вы заблокируете escape-функцию %, как говорит IInspectable, вы не сможете использовать функцию выхода, например,% 20, и другие:% 2B,% 2F,% 3F,% 3D,% 21 ...

Описание в документе MSDN , флаг WINHTTP_FLAG_ESCAPE_PERCENT означает

Строка, переданная для pwszObjectName, преобразуется из LPCWSTR в LPSTR.Все небезопасные символы преобразуются в escape-последовательность, включая символ процента.

Но по умолчанию

все небезопасные символы, кроме символа процента, преобразуются в escape-последовательность.

...