-
Notifications
You must be signed in to change notification settings - Fork 73
Description
The current interface
template <typename Source>
uri_builder &append_query(const Source &query)
expects query
to be an unencoded key/value pair like key=value
, which is then percent-encoded internally. However, characters in /.@&%;=
are excluded from encoding which leads to broken URI's.
Example:
uri_builder ub(...);
ub.append_query("q=" + get_unsafe_data());
If get_unsafe_data()
returns a string that contains characters like %
or =
, these characters are never percent-encoded. In the former case, a URI decoder will usually expect a percent-encoded octet when reading a %
character. In the latter case, a URI decoder may try to split the string again in a key and value part.
To fix the %
issue, this character could simply be removed from the exclude set. On the other hand, =
cannot be removed from the exclude set, because it is needed literally as a separator between the key and value part.
Proposed solution:
I think the basic design problem here is that the key and value parts are not treated separately. An interface which does that already exists in the form of uri_builder::append_query_key_value_pair
(this function has been recently updated because it suffered from similar encoding issues).
uri_builder::append_query(input)
should reuse uri_builder::append_query_key_value_pair(key, value)
internally by splitting input
at the first =
character -- the left part goes as key
, the right part goes as value
. If no =
character is found, input
is passed as key
leaving value
empty. This way everything gets percent-encoded properly.
I can prepare a PR if you like.