Skip to content

Commit 6c9b993

Browse files
committed
Applied changes to percent encoding of query parameters in the uri_builder
1 parent 2c57190 commit 6c9b993

File tree

7 files changed

+69
-53
lines changed

7 files changed

+69
-53
lines changed

include/network/uri/detail/encode.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ OutputIterator encode_query(InputIterator first, InputIterator last,
110110
OutputIterator out) {
111111
auto it = first;
112112
while (it != last) {
113-
detail::encode_char(*it, out, "/.@&%;=");
113+
detail::encode_char(*it, out, "/.@&%;");
114114
++it;
115115
}
116116
return out;

include/network/uri/uri_builder.hpp

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,13 +182,29 @@ class uri_builder {
182182
uri_builder &clear_path();
183183

184184
/**
185+
* \deprecated Please use append_query_parameter
186+
* \warning This function's behaviour has changed and percent encoding
187+
* of the '=' character is not ignored.
185188
* \brief Adds a new query to the uri_builder.
186189
* \param query The query.
187190
* \returns \c *this
191+
* \sa append_query_parameter
188192
*/
189193
template <typename Source>
190194
uri_builder &append_query(const Source &query) {
191-
append_query(detail::translate(query));
195+
return append_query_parameter(query);
196+
}
197+
198+
/**
199+
* \brief Adds a new query value to the uri_builder. The '='
200+
* symbol is percent encoded.
201+
* \param parameter The query parameter.
202+
* \returns \c *this
203+
* \sa append_query_key_value_pair
204+
*/
205+
template <typename Source>
206+
uri_builder &append_query_parameter(const Source &parameter) {
207+
append_query_parameter(detail::translate(parameter));
192208
return *this;
193209
}
194210

@@ -245,7 +261,7 @@ class uri_builder {
245261
void set_port(string_type port);
246262
void set_authority(string_type authority);
247263
void set_path(string_type path);
248-
void append_query(string_type query);
264+
void append_query_parameter(string_type query);
249265
void append_query_key_value_pair(string_type key, string_type value);
250266
void set_fragment(string_type fragment);
251267

src/uri.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -275,9 +275,7 @@ uri::query_iterator::query_iterator(optional<detail::uri_part> query)
275275

276276
uri::query_iterator::query_iterator(const query_iterator &other)
277277
: query_(other.query_)
278-
, kvp_(other.kvp_) {
279-
280-
}
278+
, kvp_(other.kvp_) {}
281279

282280
uri::query_iterator &uri::query_iterator::operator = (const query_iterator &other) {
283281
auto tmp(other);

src/uri_builder.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ uri_builder::uri_builder(const network::uri &base_uri) {
3232
}
3333

3434
if (base_uri.has_query()) {
35-
append_query(base_uri.query().to_string());
35+
append_query_parameter(base_uri.query().to_string());
3636
}
3737

3838
if (base_uri.has_fragment()) {
@@ -111,7 +111,7 @@ uri_builder &uri_builder::clear_path() {
111111
return *this;
112112
}
113113

114-
void uri_builder::append_query(string_type query) {
114+
void uri_builder::append_query_parameter(string_type query) {
115115
if (!query_) {
116116
query_ = string_type();
117117
}

test/uri_builder_test.cpp

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ TEST(builder_test, full_uri_doesnt_throw) {
217217
.host("www.example.com")
218218
.port("80")
219219
.path("/path")
220-
.append_query("query")
220+
.append_query_key_value_pair("query", "value")
221221
.fragment("fragment")
222222
;
223223
ASSERT_NO_THROW(builder.uri());
@@ -231,10 +231,10 @@ TEST(builder_test, full_uri) {
231231
.host("www.example.com")
232232
.port("80")
233233
.path("/path")
234-
.append_query("query")
234+
.append_query_key_value_pair("query", "value")
235235
.fragment("fragment")
236236
;
237-
ASSERT_EQ("http://[email protected]:80/path?query#fragment", builder.uri().string());
237+
ASSERT_EQ("http://[email protected]:80/path?query=value#fragment", builder.uri().string());
238238
}
239239

240240
TEST(builder_test, full_uri_has_scheme) {
@@ -245,7 +245,7 @@ TEST(builder_test, full_uri_has_scheme) {
245245
.host("www.example.com")
246246
.port("80")
247247
.path("/path")
248-
.append_query("query")
248+
.append_query_key_value_pair("query", "value")
249249
.fragment("fragment")
250250
;
251251
ASSERT_TRUE(builder.uri().has_scheme());
@@ -259,7 +259,7 @@ TEST(builder_test, full_uri_scheme_value) {
259259
.host("www.example.com")
260260
.port("80")
261261
.path("/path")
262-
.append_query("query")
262+
.append_query_key_value_pair("query", "value")
263263
.fragment("fragment")
264264
;
265265
ASSERT_EQ("http", builder.uri().scheme());
@@ -273,7 +273,7 @@ TEST(builder_test, full_uri_has_user_info) {
273273
.host("www.example.com")
274274
.port("80")
275275
.path("/path")
276-
.append_query("query")
276+
.append_query_key_value_pair("query", "value")
277277
.fragment("fragment")
278278
;
279279
ASSERT_TRUE(builder.uri().has_user_info());
@@ -287,7 +287,7 @@ TEST(builder_test, full_uri_user_info_value) {
287287
.host("www.example.com")
288288
.port("80")
289289
.path("/path")
290-
.append_query("query")
290+
.append_query_key_value_pair("query", "value")
291291
.fragment("fragment")
292292
;
293293
ASSERT_EQ("user", builder.uri().user_info());
@@ -301,7 +301,7 @@ TEST(builder_test, full_uri_has_host) {
301301
.host("www.example.com")
302302
.port("80")
303303
.path("/path")
304-
.append_query("query")
304+
.append_query_key_value_pair("query", "value")
305305
.fragment("fragment")
306306
;
307307
ASSERT_TRUE(builder.uri().has_host());
@@ -315,7 +315,7 @@ TEST(builder_test, full_uri_host_value) {
315315
.host("www.example.com")
316316
.port("80")
317317
.path("/path")
318-
.append_query("query")
318+
.append_query_key_value_pair("query", "value")
319319
.fragment("fragment")
320320
;
321321
ASSERT_EQ("www.example.com", builder.uri().host());
@@ -329,7 +329,7 @@ TEST(builder_test, full_uri_has_port) {
329329
.host("www.example.com")
330330
.port("80")
331331
.path("/path")
332-
.append_query("query")
332+
.append_query_key_value_pair("query", "value")
333333
.fragment("fragment")
334334
;
335335
ASSERT_TRUE(builder.uri().has_port());
@@ -343,7 +343,7 @@ TEST(builder_test, full_uri_has_path) {
343343
.host("www.example.com")
344344
.port("80")
345345
.path("/path")
346-
.append_query("query")
346+
.append_query_key_value_pair("query", "value")
347347
.fragment("fragment")
348348
;
349349
ASSERT_TRUE(builder.uri().has_path());
@@ -357,7 +357,7 @@ TEST(builder_test, full_uri_path_value) {
357357
.host("www.example.com")
358358
.port("80")
359359
.path("/path")
360-
.append_query("query")
360+
.append_query_key_value_pair("query", "value")
361361
.fragment("fragment")
362362
;
363363
ASSERT_EQ("/path", builder.uri().path());
@@ -371,7 +371,7 @@ TEST(builder_test, full_uri_has_query) {
371371
.host("www.example.com")
372372
.port("80")
373373
.path("/path")
374-
.append_query("query")
374+
.append_query_key_value_pair("query", "value")
375375
.fragment("fragment")
376376
;
377377
ASSERT_TRUE(builder.uri().has_query());
@@ -385,10 +385,10 @@ TEST(builder_test, full_uri_query_value) {
385385
.host("www.example.com")
386386
.port("80")
387387
.path("/path")
388-
.append_query("query")
388+
.append_query_key_value_pair("query", "value")
389389
.fragment("fragment")
390390
;
391-
ASSERT_EQ("query", builder.uri().query());
391+
ASSERT_EQ("query=value", builder.uri().query());
392392
}
393393

394394
TEST(builder_test, full_uri_has_fragment) {
@@ -399,7 +399,7 @@ TEST(builder_test, full_uri_has_fragment) {
399399
.host("www.example.com")
400400
.port("80")
401401
.path("/path")
402-
.append_query("query")
402+
.append_query_key_value_pair("query", "value")
403403
.fragment("fragment")
404404
;
405405
ASSERT_TRUE(builder.uri().has_fragment());
@@ -413,7 +413,7 @@ TEST(builder_test, full_uri_fragment_value) {
413413
.host("www.example.com")
414414
.port("80")
415415
.path("/path")
416-
.append_query("query")
416+
.append_query_key_value_pair("query", "value")
417417
.fragment("fragment")
418418
;
419419
ASSERT_EQ("fragment", builder.uri().fragment());
@@ -718,17 +718,6 @@ TEST(builder_test, path_should_be_prefixed_with_slash_2) {
718718
}
719719

720720
TEST(builder_test, set_multiple_query_with_encoding) {
721-
network::uri_builder builder;
722-
builder
723-
.scheme("http")
724-
.host("example.com")
725-
.append_query("q1=foo bar")
726-
.append_query("q2=biz baz")
727-
;
728-
ASSERT_EQ("http://example.com?q1=foo%20bar&q2=biz%20baz", builder.uri().string());
729-
}
730-
731-
TEST(builder_test, set_multiple_query_with_encoding_2) {
732721
network::uri_builder builder;
733722
builder
734723
.scheme("http")
@@ -799,9 +788,22 @@ TEST(builder_test, construct_from_uri_bug_116) {
799788
ASSERT_FALSE(c.has_port()) << c.string();
800789
}
801790

791+
TEST(builder_test, append_query_value) {
792+
network::uri_builder ub(network::uri("http://example.com"));
793+
ASSERT_NO_THROW(ub.append_query_parameter("q"));
794+
ASSERT_EQ(network::string_view("q"), ub.uri().query_begin()->first);
795+
}
796+
797+
TEST(builder_test, append_query_value_encodes_equal_sign) {
798+
network::uri_builder ub(network::uri("http://example.com"));
799+
ASSERT_NO_THROW(ub.append_query_parameter("="));
800+
ASSERT_EQ(network::string_view("%3D"), ub.uri().query_begin()->first);
801+
}
802+
802803
TEST(builder_test, append_query_key_value_pair_encodes_equals_sign) {
803804
network::uri_builder ub(network::uri("http://example.com"));
804805
ASSERT_NO_THROW(ub.append_query_key_value_pair("q", "="));
806+
ASSERT_EQ(network::string_view("q"), ub.uri().query_begin()->first);
805807
ASSERT_EQ(network::string_view("%3D"), ub.uri().query_begin()->second);
806808
}
807809

test/uri_encoding_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ TEST(uri_encoding_test, encode_query_iterator) {
5454
std::string instance;
5555
network::uri::encode_query(std::begin(unencoded), std::end(unencoded),
5656
std::back_inserter(instance));
57-
ASSERT_EQ("%21%23%24&%27%28%29%2A%2B%2C/%3A;=%3F@%5B%5D", instance);
57+
ASSERT_EQ("%21%23%24&%27%28%29%2A%2B%2C/%3A;%3D%3F@%5B%5D", instance);
5858
}
5959

6060
TEST(uri_encoding_test, encode_fragment_iterator) {

test/uri_resolve_test.cpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ TEST_F(uri_resolve_test, base_has_empty_path__path_is_ref_path_1)
4141

4242
TEST_F(uri_resolve_test, base_has_empty_path__path_is_ref_path_2)
4343
{
44-
uri reference = uri_builder().path("g/x/y").append_query("q").fragment("s").uri();
45-
ASSERT_EQ("http://a/g/x/y?q#s", resolved(uri("http://a/"), reference));
44+
uri reference = uri_builder().path("g/x/y").append_query_key_value_pair("q", "1").fragment("s").uri();
45+
ASSERT_EQ("http://a/g/x/y?q=1#s", resolved(uri("http://a/"), reference));
4646
}
4747

4848
// normal examples
@@ -69,8 +69,8 @@ TEST_F(uri_resolve_test, path_starts_with_slash__path_is_ref_path) {
6969
}
7070

7171
TEST_F(uri_resolve_test, path_starts_with_slash_with_query_fragment__path_is_ref_path) {
72-
uri reference = uri_builder().path("/g/x").append_query("y").fragment("s").uri();
73-
ASSERT_EQ("http://a/g/x?y#s", resolved(reference));
72+
uri reference = uri_builder().path("/g/x").append_query_key_value_pair("y", "z").fragment("s").uri();
73+
ASSERT_EQ("http://a/g/x?y=z#s", resolved(reference));
7474
}
7575

7676
TEST_F(uri_resolve_test, DISABLED_has_authority__base_scheme_with_ref_authority) {
@@ -81,18 +81,18 @@ TEST_F(uri_resolve_test, DISABLED_has_authority__base_scheme_with_ref_authority)
8181
}
8282

8383
TEST_F(uri_resolve_test, path_is_empty_but_has_query__returns_base_with_ref_query) {
84-
uri reference = uri_builder().append_query("y").uri();
85-
ASSERT_EQ("http://a/b/c/d;p?y", resolved(reference));
84+
uri reference = uri_builder().append_query_key_value_pair("y", "z").uri();
85+
ASSERT_EQ("http://a/b/c/d;p?y=z", resolved(reference));
8686
}
8787

8888
TEST_F(uri_resolve_test, path_is_empty_but_has_query_base_no_query__returns_base_with_ref_query) {
89-
uri reference = uri_builder().append_query("y").uri();
90-
ASSERT_EQ("http://a/b/c/d?y", resolved(uri("http://a/b/c/d"), reference));
89+
uri reference = uri_builder().append_query_key_value_pair("y", "z").uri();
90+
ASSERT_EQ("http://a/b/c/d?y=z", resolved(uri("http://a/b/c/d"), reference));
9191
}
9292

9393
TEST_F(uri_resolve_test, merge_path_with_query) {
94-
uri reference = uri_builder().path("g").append_query("y").uri();
95-
ASSERT_EQ("http://a/b/c/g?y", resolved(reference));
94+
uri reference = uri_builder().path("g").append_query_key_value_pair("y", "z").uri();
95+
ASSERT_EQ("http://a/b/c/g?y=z", resolved(reference));
9696
}
9797

9898
TEST_F(uri_resolve_test, append_fragment) {
@@ -106,8 +106,8 @@ TEST_F(uri_resolve_test, merge_paths_with_fragment) {
106106
}
107107

108108
TEST_F(uri_resolve_test, merge_paths_with_query_and_fragment) {
109-
uri reference = uri_builder().path("g").append_query("y").fragment("s").uri();
110-
ASSERT_EQ("http://a/b/c/g?y#s", resolved(reference));
109+
uri reference = uri_builder().path("g").append_query_key_value_pair("y", "z").fragment("s").uri();
110+
ASSERT_EQ("http://a/b/c/g?y=z#s", resolved(reference));
111111
}
112112

113113
TEST_F(uri_resolve_test, merge_paths_with_semicolon_1) {
@@ -121,8 +121,8 @@ TEST_F(uri_resolve_test, merge_paths_with_semicolon_2) {
121121
}
122122

123123
TEST_F(uri_resolve_test, merge_paths_with_semicolon_3) {
124-
uri reference = uri_builder().path("g;x").append_query("y").fragment("s").uri();
125-
ASSERT_EQ("http://a/b/c/g;x?y#s", resolved(reference));
124+
uri reference = uri_builder().path("g;x").append_query_key_value_pair("y", "z").fragment("s").uri();
125+
ASSERT_EQ("http://a/b/c/g;x?y=z#s", resolved(reference));
126126
}
127127

128128
TEST_F(uri_resolve_test, path_is_empty__returns_base) {
@@ -245,12 +245,12 @@ TEST_F(uri_resolve_test, abnormal_example_14) {
245245
}
246246

247247
TEST_F(uri_resolve_test, abnormal_example_15) {
248-
uri reference = uri_builder().path("g").append_query("y/./x").uri();
248+
uri reference = uri_builder().path("g").append_query_parameter("y/./x").uri();
249249
ASSERT_EQ("http://a/b/c/g?y/./x", resolved(reference));
250250
}
251251

252252
TEST_F(uri_resolve_test, abnormal_example_16) {
253-
uri reference = uri_builder().path("g").append_query("y/../x").uri();
253+
uri reference = uri_builder().path("g").append_query_parameter("y/../x").uri();
254254
ASSERT_EQ("http://a/b/c/g?y/../x", resolved(reference));
255255
}
256256

0 commit comments

Comments
 (0)