From e128a27c58386bf4eb498812f0fe6906ded798d6 Mon Sep 17 00:00:00 2001 From: an-tao Date: Wed, 3 Apr 2019 00:17:30 +0800 Subject: [PATCH] Modifying URL encoding of HTTP requests --- examples/simple_example_test/main.cc | 6 ++++-- lib/src/HttpRequestImpl.cc | 18 +++++++++++++++--- lib/src/Utilities.cc | 3 +++ 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/examples/simple_example_test/main.cc b/examples/simple_example_test/main.cc index b26b1fc8..f55c4932 100644 --- a/examples/simple_example_test/main.cc +++ b/examples/simple_example_test/main.cc @@ -275,7 +275,8 @@ void doTest(const HttpClientPtr &client, std::promise &pro, bool isHttps = req = HttpRequest::newHttpRequest(); req->setMethod(drogon::Get); - req->setPath("/api/v1/apitest/3.14/List?P2=1234"); + req->setPath("/api/v1/apitest/3.14/List"); + req->setParameter("P2","1234"); client->sendRequest(req, [=](ReqResult result, const HttpResponsePtr &resp) { if (result == ReqResult::Ok) { @@ -375,7 +376,8 @@ void doTest(const HttpClientPtr &client, std::promise &pro, bool isHttps = /// Test static function req = HttpRequest::newHttpRequest(); req->setMethod(drogon::Get); - req->setPath("/api/v1/handle11/11/22/?p3=33&p4=44"); + req->setPath("/api/v1/handle11/11/22/?p3=33"); + req->setParameter("p4","44"); client->sendRequest(req, [=](ReqResult result, const HttpResponsePtr &resp) { if (result == ReqResult::Ok) { diff --git a/lib/src/HttpRequestImpl.cc b/lib/src/HttpRequestImpl.cc index 3a85f475..fd905dff 100755 --- a/lib/src/HttpRequestImpl.cc +++ b/lib/src/HttpRequestImpl.cc @@ -119,7 +119,7 @@ void HttpRequestImpl::appendToBuffer(MsgBuffer *output) const if (!_path.empty()) { - output->append(_path); + output->append(utils::urlEncode(_path)); } else { @@ -138,9 +138,21 @@ void HttpRequestImpl::appendToBuffer(MsgBuffer *output) const } content.resize(content.length() - 1); content = utils::urlEncode(content); - if (_method == Get || _method == Delete) + if (_method == Get || _method == Delete || _method == Head) { - output->append("?"); + auto ret = std::find(output->peek(), (const char *)output->beginWrite(), '?'); + if (ret != output->beginWrite()) + { + if (ret != output->beginWrite() - 1) + { + output->append("&"); + } + } + else + { + + output->append("?"); + } output->append(content); content.clear(); } diff --git a/lib/src/Utilities.cc b/lib/src/Utilities.cc index 1ea415ab..3a8c3e66 100755 --- a/lib/src/Utilities.cc +++ b/lib/src/Utilities.cc @@ -430,6 +430,9 @@ std::string urlEncode(const std::string &src) case ')': case '&': case '=': + case '/': + case '\\': + case '?': result.append(1, *iter); break; // escape