Unconditional URI-encoding in RequestContext::get_query<F>(F)

This commit is contained in:
Veloman Yunkan 2023-01-25 23:41:52 +04:00
parent 76dfc03751
commit b7a019469c
2 changed files with 6 additions and 7 deletions

View File

@ -245,7 +245,7 @@ std::pair<std::string, Library::BookIdSet> InternalServer::selectBooks(const Req
auto bookName = request.get_argument("content"); auto bookName = request.get_argument("content");
try { try {
const auto bookIds = Library::BookIdSet{mp_nameMapper->getIdForName(bookName)}; const auto bookIds = Library::BookIdSet{mp_nameMapper->getIdForName(bookName)};
const auto queryString = request.get_query([&](const std::string& key){return key == "content";}, true); const auto queryString = request.get_query([&](const std::string& key){return key == "content";});
return {queryString, bookIds}; return {queryString, bookIds};
} catch (const std::out_of_range&) { } catch (const std::out_of_range&) {
throw Error(noSuchBookErrorMsg(bookName)); throw Error(noSuchBookErrorMsg(bookName));
@ -270,7 +270,7 @@ std::pair<std::string, Library::BookIdSet> InternalServer::selectBooks(const Req
} }
} }
const auto bookIds = Library::BookIdSet(id_vec.begin(), id_vec.end()); const auto bookIds = Library::BookIdSet(id_vec.begin(), id_vec.end());
const auto queryString = request.get_query([&](const std::string& key){return key == "books.id";}, true); const auto queryString = request.get_query([&](const std::string& key){return key == "books.id";});
return {queryString, bookIds}; return {queryString, bookIds};
} catch(const std::out_of_range&) {} } catch(const std::out_of_range&) {}
@ -288,7 +288,7 @@ std::pair<std::string, Library::BookIdSet> InternalServer::selectBooks(const Req
throw Error(noSuchBookErrorMsg(bookName)); throw Error(noSuchBookErrorMsg(bookName));
} }
} }
const auto queryString = request.get_query([&](const std::string& key){return key == "books.name";}, true); const auto queryString = request.get_query([&](const std::string& key){return key == "books.name";});
return {queryString, bookIds}; return {queryString, bookIds};
} catch(const std::out_of_range&) {} } catch(const std::out_of_range&) {}
@ -299,7 +299,7 @@ std::pair<std::string, Library::BookIdSet> InternalServer::selectBooks(const Req
throw Error(nonParameterizedMessage("no-book-found")); throw Error(nonParameterizedMessage("no-book-found"));
} }
const auto bookIds = Library::BookIdSet(id_vec.begin(), id_vec.end()); const auto bookIds = Library::BookIdSet(id_vec.begin(), id_vec.end());
const auto queryString = request.get_query([&](const std::string& key){return startsWith(key, "books.filter.");}, true); const auto queryString = request.get_query([&](const std::string& key){return startsWith(key, "books.filter.");});
return {queryString, bookIds}; return {queryString, bookIds};
} }

View File

@ -96,16 +96,15 @@ class RequestContext {
std::string get_query() const { return queryString; } std::string get_query() const { return queryString; }
template<class F> template<class F>
std::string get_query(F filter, bool mustEncode) const { std::string get_query(F filter) const {
std::string q; std::string q;
const char* sep = ""; const char* sep = "";
auto encode = [=](const std::string& value) { return mustEncode?urlEncode(value):value; };
for ( const auto& a : arguments ) { for ( const auto& a : arguments ) {
if (!filter(a.first)) { if (!filter(a.first)) {
continue; continue;
} }
for (const auto& v: a.second) { for (const auto& v: a.second) {
q += sep + encode(a.first) + '=' + encode(v); q += sep + urlEncode(a.first) + '=' + urlEncode(v);
sep = "&"; sep = "&";
} }
} }