Branch data Line data Source code
1 : : // Copyright (c) 2012-2022 The Bitcoin Core developers 2 : : // Distributed under the MIT software license, see the accompanying 3 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php. 4 : : 5 : : #include <httpserver.h> 6 : : #include <test/util/setup_common.h> 7 : : 8 : : #include <boost/test/unit_test.hpp> 9 : : 10 : 0 : BOOST_FIXTURE_TEST_SUITE(httpserver_tests, BasicTestingSetup) 11 : : 12 : 0 : BOOST_AUTO_TEST_CASE(test_query_parameters) 13 : : { 14 : 0 : std::string uri {}; 15 : : 16 : : // No parameters 17 : 0 : uri = "localhost:8080/rest/headers/someresource.json"; 18 : 0 : BOOST_CHECK(!GetQueryParameterFromUri(uri.c_str(), "p1").has_value()); 19 : : 20 : : // Single parameter 21 : 0 : uri = "localhost:8080/rest/endpoint/someresource.json?p1=v1"; 22 : 0 : BOOST_CHECK_EQUAL(GetQueryParameterFromUri(uri.c_str(), "p1").value(), "v1"); 23 : 0 : BOOST_CHECK(!GetQueryParameterFromUri(uri.c_str(), "p2").has_value()); 24 : : 25 : : // Multiple parameters 26 : 0 : uri = "/rest/endpoint/someresource.json?p1=v1&p2=v2"; 27 : 0 : BOOST_CHECK_EQUAL(GetQueryParameterFromUri(uri.c_str(), "p1").value(), "v1"); 28 : 0 : BOOST_CHECK_EQUAL(GetQueryParameterFromUri(uri.c_str(), "p2").value(), "v2"); 29 : : 30 : : // If the query string contains duplicate keys, the first value is returned 31 : 0 : uri = "/rest/endpoint/someresource.json?p1=v1&p1=v2"; 32 : 0 : BOOST_CHECK_EQUAL(GetQueryParameterFromUri(uri.c_str(), "p1").value(), "v1"); 33 : : 34 : : // Invalid query string syntax is the same as not having parameters 35 : 0 : uri = "/rest/endpoint/someresource.json&p1=v1&p2=v2"; 36 : 0 : BOOST_CHECK(!GetQueryParameterFromUri(uri.c_str(), "p1").has_value()); 37 : : 38 : : // URI with invalid characters (%) raises a runtime error regardless of which query parameter is queried 39 : 0 : uri = "/rest/endpoint/someresource.json&p1=v1&p2=v2%"; 40 : 0 : BOOST_CHECK_EXCEPTION(GetQueryParameterFromUri(uri.c_str(), "p1"), std::runtime_error, HasReason("URI parsing failed, it likely contained RFC 3986 invalid characters")); 41 : 0 : } 42 : 0 : BOOST_AUTO_TEST_SUITE_END()