Кодирование URI в C++ REST SDK (Касабланка)

Я использую http-прослушиватель C++ REST SDK 2.8 и заметил следующее. Если я отправлю следующий URL-адрес этому слушателю:

http://my_server/my%2fpath?key=xxx%26yyy%3Dzzz

и я делаю:

auto uri = request.relative_uri();
auto v_path_components = web::uri::split_path(web::uri::decode(uri.path()));
auto m_query_components = web::uri::split_query(web::uri::decode(uri.query()));

затем я обнаружил, что v_path_components содержит 2 элемента ["my", "path"], а m_query_components содержит 2 пары [("key","xxx"), (" ууу", "zzz")].

Я хочу и ожидал, что v_path_components будет содержать 1 элемент ["my/path"] и m_query_components содержать 1 пару [("key","xxx&yyy= ззз")].

Чтобы добиться последнего, relative_uri не должен декодировать/кодировать uri, так как при этом теряется информация. Кроме того, web::uri::decode() следует выполнять для результатов разделения, а не перед разделением. Но, поскольку сам REST SDK, а также многие образцы, поставляемые с ним, используют это вышеописанным образом, это наводит меня на мысль, что я могу ошибаться.

Может ли кто-нибудь подтвердить мои выводы или объяснить, почему я на неправильном пути?


person Luigi    schedule 01.04.2016    source источник


Ответы (1)


Ваши выводы имеют смысл.

Поскольку вы сначала декодируете, закодированный амперсанд (% 3D) становится разделителем пары ключ/значение. То же самое для компонентов пути. Косая черта (%2f) становится разделителем пути и анализируется как таковая.

person yano    schedule 14.01.2017