From b82eee5255dc88b83605ba9d46b7c9b995a135ff Mon Sep 17 00:00:00 2001 From: zhang2014 Date: Fri, 29 Nov 2019 13:46:46 +0800 Subject: [PATCH] ISSUES-5436 fix review suggestions & add some '?' re2 test --- dbms/programs/server/HTTPHandlerFactory.cpp | 12 ++--- .../ExtractorContextChange.h | 4 +- .../HTTPQueryRequestHandler.cpp | 2 +- ...TPQueryRequestHandlerMatcherAndCreator.cpp | 45 +++++++++++-------- ...HTTPQueryRequestHandlerMatcherAndCreator.h | 4 +- .../HTTPSessionContextHolder.h | 1 + .../other_tests_configs/config.xml | 4 +- .../test_http_handlers_config/test.py | 18 ++++++-- .../config.xml | 12 ++--- .../users.xml | 0 .../config.xml | 4 +- .../config.xml | 20 ++++----- .../users.xml | 0 programs/server/config.xml | 6 +-- 14 files changed, 76 insertions(+), 56 deletions(-) rename dbms/tests/integration/test_http_handlers_config/{test_insert_and_select_predefine => test_insert_and_select_predefined}/config.xml (75%) rename dbms/tests/integration/test_http_handlers_config/{test_insert_and_select_predefine => test_insert_and_select_predefined}/users.xml (100%) rename dbms/tests/integration/test_http_handlers_config/{test_param_and_settings_predefine => test_param_and_settings_predefined}/config.xml (73%) rename dbms/tests/integration/test_http_handlers_config/{test_param_and_settings_predefine => test_param_and_settings_predefined}/users.xml (100%) diff --git a/dbms/programs/server/HTTPHandlerFactory.cpp b/dbms/programs/server/HTTPHandlerFactory.cpp index 9a2d1e52f0..b2c07075d5 100644 --- a/dbms/programs/server/HTTPHandlerFactory.cpp +++ b/dbms/programs/server/HTTPHandlerFactory.cpp @@ -12,7 +12,7 @@ namespace DB namespace ErrorCodes { extern const int SYNTAX_ERROR; - extern const int UNKNOW_HTTP_HANDLER_TYPE; + extern const int UNKNOWN_HTTP_HANDLER_TYPE; extern const int EMPTY_HTTP_HANDLER_IN_CONFIG; } @@ -99,13 +99,13 @@ HTTPHandlerMatcher createRootHandlerMatcher(IServer &, const String &); HTTPHandlerMatcher createPingHandlerMatcher(IServer &, const String &); HTTPHandlerMatcher createDynamicQueryHandlerMatcher(IServer &, const String &); HTTPHandlerMatcher createReplicasStatusHandlerMatcher(IServer &, const String &); -HTTPHandlerMatcher createPredefineQueryHandlerMatcher(IServer &, const String &); +HTTPHandlerMatcher createPredefinedQueryHandlerMatcher(IServer &, const String &); HTTPHandlerCreator createRootHandlerCreator(IServer &, const String &); HTTPHandlerCreator createPingHandlerCreator(IServer &, const String &); HTTPHandlerCreator createDynamicQueryHandlerCreator(IServer &, const String &); HTTPHandlerCreator createReplicasStatusHandlerCreator(IServer &, const String &); -HTTPHandlerCreator createPredefineQueryHandlerCreator(IServer &, const String &); +HTTPHandlerCreator createPredefinedQueryHandlerCreator(IServer &, const String &); void HTTPHandlerFactory::updateHTTPHandlersCreator(Poco::Util::AbstractConfiguration & configuration, const String & key) { @@ -126,14 +126,14 @@ void HTTPHandlerFactory::updateHTTPHandlersCreator(Poco::Util::AbstractConfigura handlers_creator.push_back({createPingHandlerMatcher(server, handler_key), createPingHandlerCreator(server, handler_key)}); else if (startsWith(http_handler_type_name, "dynamic_query_handler")) handlers_creator.push_back({createDynamicQueryHandlerMatcher(server, handler_key), createDynamicQueryHandlerCreator(server, handler_key)}); - else if (startsWith(http_handler_type_name, "predefine_query_handler")) - handlers_creator.push_back({createPredefineQueryHandlerMatcher(server, handler_key), createPredefineQueryHandlerCreator(server, handler_key)}); + else if (startsWith(http_handler_type_name, "predefined_query_handler")) + handlers_creator.push_back({createPredefinedQueryHandlerMatcher(server, handler_key), createPredefinedQueryHandlerCreator(server, handler_key)}); else if (startsWith(http_handler_type_name, "replicas_status_handler")) handlers_creator.push_back({createReplicasStatusHandlerMatcher(server, handler_key), createReplicasStatusHandlerCreator(server, handler_key)}); else if (http_handler_type_name == "no_handler_description") no_handler_description = configuration.getString(key + ".no_handler_description"); else - throw Exception("Unknown HTTPHandler type name: " + http_handler_type_name, ErrorCodes::UNKNOW_HTTP_HANDLER_TYPE); + throw Exception("Unknown HTTPHandler type name: " + http_handler_type_name, ErrorCodes::UNKNOWN_HTTP_HANDLER_TYPE); } } diff --git a/dbms/programs/server/HTTPRequestHandler/ExtractorContextChange.h b/dbms/programs/server/HTTPRequestHandler/ExtractorContextChange.h index 0fdfd73b4f..707e86a217 100644 --- a/dbms/programs/server/HTTPRequestHandler/ExtractorContextChange.h +++ b/dbms/programs/server/HTTPRequestHandler/ExtractorContextChange.h @@ -56,7 +56,7 @@ public: /// Settings can be overridden in the query. /// Some parameters (database, default_format, everything used in the code above) do not /// belong to the Settings class. - becomeReadonlyIfNeed(request); + becomeReadonlyIfNeeded(request); changeSettingsFromParams(params, reservedParamSuffixesFilter(is_multipart_data)); if (is_multipart_data || settings_may_in_post) @@ -82,7 +82,7 @@ private: /// In theory if initially readonly = 0, the client can change any setting and then set readonly /// to some other value. /// Only readonly queries are allowed for HTTP GET requests. - void becomeReadonlyIfNeed(Poco::Net::HTTPServerRequest & request) + void becomeReadonlyIfNeeded(Poco::Net::HTTPServerRequest & request) { if (request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) { diff --git a/dbms/programs/server/HTTPRequestHandler/HTTPQueryRequestHandler.cpp b/dbms/programs/server/HTTPRequestHandler/HTTPQueryRequestHandler.cpp index 1bb9390863..ca22496665 100644 --- a/dbms/programs/server/HTTPRequestHandler/HTTPQueryRequestHandler.cpp +++ b/dbms/programs/server/HTTPRequestHandler/HTTPQueryRequestHandler.cpp @@ -174,6 +174,6 @@ HTTPResponseBufferPtr HTTPQueryRequestHandler::createRespon template class HTTPQueryRequestHandler; -template class HTTPQueryRequestHandler; +template class HTTPQueryRequestHandler; } diff --git a/dbms/programs/server/HTTPRequestHandler/HTTPQueryRequestHandlerMatcherAndCreator.cpp b/dbms/programs/server/HTTPRequestHandler/HTTPQueryRequestHandlerMatcherAndCreator.cpp index 321a585d93..81f25f0bd0 100644 --- a/dbms/programs/server/HTTPRequestHandler/HTTPQueryRequestHandlerMatcherAndCreator.cpp +++ b/dbms/programs/server/HTTPRequestHandler/HTTPQueryRequestHandlerMatcherAndCreator.cpp @@ -9,12 +9,12 @@ namespace DB namespace ErrorCodes { - extern const int EMPTY_PREDEFINE_QUERY; + extern const int EMPTY_PREDEFINED_QUERY; extern const int CANNOT_COMPILE_REGEXP; extern const int UNKNOWN_QUERY_PARAMETER; extern const int DUPLICATE_CAPTURE_QUERY_PARAM; extern const int ILLEGAL_HTTP_HANDLER_PARAM_NAME; - extern const int TOO_MANY_INSERT_QUERY_WITH_PREDEFINE_QUERY; + extern const int TOO_MANY_INSERT_QUERY_WITH_PREDEFINED_QUERY; } ExtractorDynamicQueryParameters::ExtractorDynamicQueryParameters( @@ -62,6 +62,9 @@ ExtractorDynamicQueryParameters::ExtractorDynamicQueryParameters( template void extractParamWithRegex(Context & context, const RegexRule & regex, const std::map & extract_params, const String & value) { + if (value.empty()) + return; + int num_captures = regex->NumberOfCapturingGroups() + 1; re2_st::StringPiece matches[num_captures]; @@ -71,16 +74,19 @@ void extractParamWithRegex(Context & context, const RegexRule & regex, const std { for (const auto & [capturing_name, capturing_index] : extract_params) { - String param_name = capturing_name; const auto & capturing_value = matches[capturing_index]; - if constexpr (remove_prefix_for_param) + if (capturing_value.data()) { - const static size_t prefix_size = strlen("param_"); - param_name = capturing_name.substr(prefix_size); - } + String param_name = capturing_name; + if constexpr (remove_prefix_for_param) + { + const static size_t prefix_size = strlen("param_"); + param_name = capturing_name.substr(prefix_size); + } - context.setQueryParameter(param_name, String(capturing_value.data(), capturing_value.size())); + context.setQueryParameter(param_name, String(capturing_value.data(), capturing_value.size())); + } } } } @@ -93,7 +99,7 @@ ExtractRes ExtractorDynamicQueryParameters::extract(Context & context, Poco::Net if (!extract_from_headers.empty()) for (const auto & [header_name, extract_params] : extract_from_headers) - extractParamWithRegex(context, headers_regex.at(header_name), extract_params, request.get(header_name)); + extractParamWithRegex(context, headers_regex.at(header_name), extract_params, request.get(header_name, "")); String extracted_query_from_params; const static size_t prefix_size = strlen("param_"); @@ -112,7 +118,7 @@ ExtractRes ExtractorDynamicQueryParameters::extract(Context & context, Poco::Net return {{extracted_query_from_params, true}}; } -ExtractorPredefineQueryParameters::ExtractorPredefineQueryParameters( +ExtractorPredefinedQueryParameters::ExtractorPredefinedQueryParameters( Poco::Util::AbstractConfiguration & configuration, const String & key, const RegexRule & url_regex_, const HeadersRegexRule & headers_regex_) : url_regex(url_regex_), headers_regex(headers_regex_) { @@ -120,7 +126,7 @@ ExtractorPredefineQueryParameters::ExtractorPredefineQueryParameters( configuration.keys(key + ".queries", queries_key); if (queries_key.empty()) - throw Exception("There must be at least one predefined query in the predefined HTTPHandler.", ErrorCodes::EMPTY_PREDEFINE_QUERY); + throw Exception("There must be at least one predefined query in the predefined HTTPHandler.", ErrorCodes::EMPTY_PREDEFINED_QUERY); for (const auto & query_key : queries_key) { @@ -136,7 +142,7 @@ ExtractorPredefineQueryParameters::ExtractorPredefineQueryParameters( bool is_insert_query = extract_query_ast->as(); if (has_insert_query && is_insert_query) - throw Exception("Too many insert queries in predefined queries.", ErrorCodes::TOO_MANY_INSERT_QUERY_WITH_PREDEFINE_QUERY); + throw Exception("Too many insert queries in predefined queries.", ErrorCodes::TOO_MANY_INSERT_QUERY_WITH_PREDEFINED_QUERY); has_insert_query |= is_insert_query; predefine_queries.push_back({predefine_query, is_insert_query}); @@ -186,14 +192,14 @@ ExtractorPredefineQueryParameters::ExtractorPredefineQueryParameters( } } -ExtractRes ExtractorPredefineQueryParameters::extract(Context & context, Poco::Net::HTTPServerRequest & request, HTMLForm & params) +ExtractRes ExtractorPredefinedQueryParameters::extract(Context & context, Poco::Net::HTTPServerRequest & request, HTMLForm & params) { if (!extract_from_url.empty()) extractParamWithRegex(context, url_regex, extract_from_url, Poco::URI{request.getURI()}.getPath()); if (!extract_from_headers.empty()) for (const auto & [header_name, extract_params] : extract_from_headers) - extractParamWithRegex(context, headers_regex.at(header_name), extract_params, request.get(header_name)); + extractParamWithRegex(context, headers_regex.at(header_name), extract_params, request.get(header_name, "")); for (const auto & param : params) if (queries_names.count(param.first)) @@ -277,6 +283,9 @@ HTTPHandlerMatcher HTTPQueryRequestHandlerMatcherAndCreator::createHandlerMatche { for (const auto & [header_name, header_rule] : headers_rule) { + if (!request.has(header_name)) + return false; + const String & header_value = request.get(header_name); if (header_value.size() != findFirstMissingMatchPos(*header_rule, header_value)) return false; @@ -294,7 +303,7 @@ HTTPHandlerMatcher createDynamicQueryHandlerMatcher(IServer & server, const Stri } -HTTPHandlerMatcher createPredefineQueryHandlerMatcher(IServer & server, const String & key) +HTTPHandlerMatcher createPredefinedQueryHandlerMatcher(IServer & server, const String & key) { return HTTPQueryRequestHandlerMatcherAndCreator::invokeWithParsedRegexRule(server.config(), key, HTTPQueryRequestHandlerMatcherAndCreator::createHandlerMatcher); @@ -314,16 +323,16 @@ HTTPHandlerCreator createDynamicQueryHandlerCreator(IServer & server, const Stri }); } -HTTPHandlerCreator createPredefineQueryHandlerCreator(IServer & server, const String & key) +HTTPHandlerCreator createPredefinedQueryHandlerCreator(IServer & server, const String & key) { return HTTPQueryRequestHandlerMatcherAndCreator::invokeWithParsedRegexRule( server.config(), key, [&](const String &, const RegexRule & url_rule, const HeadersRegexRule & headers_rule) { - const auto & extract = std::make_shared(server.config(), key, url_rule, headers_rule); + const auto & extract = std::make_shared(server.config(), key, url_rule, headers_rule); return [&, query_extract = extract]() { - return new HTTPQueryRequestHandler(server, *query_extract); + return new HTTPQueryRequestHandler(server, *query_extract); }; }); } diff --git a/dbms/programs/server/HTTPRequestHandler/HTTPQueryRequestHandlerMatcherAndCreator.h b/dbms/programs/server/HTTPRequestHandler/HTTPQueryRequestHandlerMatcherAndCreator.h index 456689d1ff..0d7bc8356b 100644 --- a/dbms/programs/server/HTTPRequestHandler/HTTPQueryRequestHandlerMatcherAndCreator.h +++ b/dbms/programs/server/HTTPRequestHandler/HTTPQueryRequestHandlerMatcherAndCreator.h @@ -48,10 +48,10 @@ private: std::map> extract_from_headers; }; -class ExtractorPredefineQueryParameters +class ExtractorPredefinedQueryParameters { public: - ExtractorPredefineQueryParameters( + ExtractorPredefinedQueryParameters( Poco::Util::AbstractConfiguration & configuration, const String & key, const RegexRule & url_regex_, const HeadersRegexRule & headers_regex_ ); diff --git a/dbms/programs/server/HTTPRequestHandler/HTTPSessionContextHolder.h b/dbms/programs/server/HTTPRequestHandler/HTTPSessionContextHolder.h index 9ef8b8f7ab..deadd3910a 100644 --- a/dbms/programs/server/HTTPRequestHandler/HTTPSessionContextHolder.h +++ b/dbms/programs/server/HTTPRequestHandler/HTTPSessionContextHolder.h @@ -7,6 +7,7 @@ namespace DB { +/// Manage the lifetime of the session context. struct HTTPSessionContextHolder { ~HTTPSessionContextHolder(); diff --git a/dbms/tests/integration/test_http_handlers_config/other_tests_configs/config.xml b/dbms/tests/integration/test_http_handlers_config/other_tests_configs/config.xml index f117eaba2f..0c908a4f87 100644 --- a/dbms/tests/integration/test_http_handlers_config/other_tests_configs/config.xml +++ b/dbms/tests/integration/test_http_handlers_config/other_tests_configs/config.xml @@ -4,14 +4,14 @@ /ping_test - + POST /test_one_handler_with_insert_and_select INSERT INTO test.test VALUES(1) SELECT COUNT() FROM test.test WHERE id = {id:UInt8} - + test not found diff --git a/dbms/tests/integration/test_http_handlers_config/test.py b/dbms/tests/integration/test_http_handlers_config/test.py index 9e332dd867..a996fbdc90 100644 --- a/dbms/tests/integration/test_http_handlers_config/test.py +++ b/dbms/tests/integration/test_http_handlers_config/test.py @@ -35,8 +35,8 @@ def test_dynamic_query_handler_with_insert_and_select(): assert cluster.instance.http_request('query_data_from_test?max_threads=1&test_select_query_param=' + select_data_query, method='GET') == '1\n2\n3\n4\n' -def test_predefine_query_handler_with_insert_and_select(): - with contextlib.closing(SimpleCluster(ClickHouseCluster(__file__), "predefine_insert_and_select", "test_insert_and_select_predefine")) as cluster: +def test_predefined_query_handler_with_insert_and_select(): + with contextlib.closing(SimpleCluster(ClickHouseCluster(__file__), "predefined_insert_and_select", "test_insert_and_select_predefined")) as cluster: assert cluster.instance.http_request('create_test_table?max_threads=1', method='PUT') == '' assert cluster.instance.http_request('insert_data_to_test?max_threads=1', method='POST', data='(1)(2)(3)(4)') == '' assert cluster.instance.http_request('query_data_from_test?max_threads=1', method='GET') == '1\n2\n3\n4\n' @@ -54,18 +54,25 @@ def test_dynamic_query_handler_with_params_and_settings(): assert 'Syntax error' in cluster.instance.http_request('post_query_params_and_settings?post_query_param=' + test_query + '&' + query_param, method='POST', data=settings) assert cluster.instance.http_request('get_query_params_and_settings?get_query_param=' + quoted_test_query + '&' + query_param + '&' + settings) == '1\n2\n' + assert cluster.instance.http_request('query_param_with_url/123/max_threads?query_param=' + quoted_test_query + '&' + settings + '¶m_name_2=max_alter_threads') == '1\n2\n' assert cluster.instance.http_request('query_param_with_url/123/max_threads/max_alter_threads?query_param=' + quoted_test_query + '&' + settings) == '1\n2\n' + assert '`name_2` is not set' in cluster.instance.http_request('query_param_with_url/123/max_threads?query_param=' + quoted_test_query + '&' + settings) assert 'Duplicate name' in cluster.instance.http_request('query_param_with_url/123/max_threads_dump/max_alter_threads_dump?query_param=' + quoted_test_query + '&' + query_param + '&' + settings) assert cluster.instance.http_request('test_match_headers?query_param=' + quoted_test_query + '&' + settings, headers={'XXX': 'TEST_HEADER_VALUE', 'PARAMS_XXX': 'max_threads/max_alter_threads'}) == '1\n2\n' + assert cluster.instance.http_request('test_match_headers?query_param=' + quoted_test_query + '&' + settings + '¶m_name_2=max_alter_threads', headers={'XXX': 'TEST_HEADER_VALUE', 'PARAMS_XXX': 'max_threads'}) == '1\n2\n' + assert '`name_2` is not set' in cluster.instance.http_request('test_match_headers?query_param=' + quoted_test_query + '&' + settings, headers={'XXX': 'TEST_HEADER_VALUE', 'PARAMS_XXX': 'max_threads'}) + assert 'There is no handle /test_match_headers' in cluster.instance.http_request('test_match_headers?query_param=' + quoted_test_query + '&' + settings) -def test_predefine_query_handler_with_params_and_settings(): - with contextlib.closing(SimpleCluster(ClickHouseCluster(__file__), "predefine_params_and_settings", "test_param_and_settings_predefine")) as cluster: +def test_predefined_query_handler_with_params_and_settings(): + with contextlib.closing(SimpleCluster(ClickHouseCluster(__file__), "predefined_params_and_settings", "test_param_and_settings_predefined")) as cluster: settings = 'max_threads=1&max_alter_threads=2' query_param = 'name_1=max_threads&name_2=max_alter_threads' assert cluster.instance.http_request('get_query_params_and_settings?' + query_param + '&' + settings, method='GET') == '1\nmax_alter_threads\t2\n' assert cluster.instance.http_request('query_param_with_url/123/max_threads/max_alter_threads?' + settings) == '1\nmax_alter_threads\t2\n' + assert cluster.instance.http_request('query_param_with_url/123/max_threads?' + settings + '&name_2=max_alter_threads') == '1\nmax_alter_threads\t2\n' + assert '`name_2` is not set' in cluster.instance.http_request('query_param_with_url/123/max_threads?' + settings) assert 'Duplicate name' in cluster.instance.http_request('query_param_with_url/123/max_threads_dump/max_alter_threads_dump?' + query_param + '&' + settings) assert cluster.instance.http_request('post_query_params_and_settings?' + query_param, method='POST', data=settings) == '1\nmax_alter_threads\t2\n' @@ -73,6 +80,9 @@ def test_predefine_query_handler_with_params_and_settings(): assert cluster.instance.http_request('post_query_params_and_settings?' + query_param + '&' + settings, method='POST') == '1\nmax_alter_threads\t2\n' assert cluster.instance.http_request('post_query_params_and_settings', method='POST', data=query_param + '&' + settings) == '1\nmax_alter_threads\t2\n' assert cluster.instance.http_request('test_match_headers?' + settings, headers={'XXX': 'TEST_HEADER_VALUE', 'PARAMS_XXX': 'max_threads/max_alter_threads'}) == '1\nmax_alter_threads\t2\n' + assert cluster.instance.http_request('test_match_headers?' + settings + '&name_2=max_alter_threads', headers={'XXX': 'TEST_HEADER_VALUE', 'PARAMS_XXX': 'max_threads'}) == '1\nmax_alter_threads\t2\n' + assert '`name_2` is not set' in cluster.instance.http_request('test_match_headers?' + settings, headers={'XXX': 'TEST_HEADER_VALUE', 'PARAMS_XXX': 'max_threads'}) + assert 'There is no handle /test_match_headers' in cluster.instance.http_request('test_match_headers?' + settings) def test_other_configs(): diff --git a/dbms/tests/integration/test_http_handlers_config/test_insert_and_select_predefine/config.xml b/dbms/tests/integration/test_http_handlers_config/test_insert_and_select_predefined/config.xml similarity index 75% rename from dbms/tests/integration/test_http_handlers_config/test_insert_and_select_predefine/config.xml rename to dbms/tests/integration/test_http_handlers_config/test_insert_and_select_predefined/config.xml index 0f0ab81d13..6319bbf327 100644 --- a/dbms/tests/integration/test_http_handlers_config/test_insert_and_select_predefine/config.xml +++ b/dbms/tests/integration/test_http_handlers_config/test_insert_and_select_predefined/config.xml @@ -2,25 +2,25 @@ - + PUT /create_test_table CREATE DATABASE test CREATE TABLE test.test (id UInt8) Engine = Memory - + - + POST /insert_data_to_test INSERT INTO test.test VALUES - + - + GET /query_data_from_test SELECT * FROM test.test ORDER BY id - + diff --git a/dbms/tests/integration/test_http_handlers_config/test_insert_and_select_predefine/users.xml b/dbms/tests/integration/test_http_handlers_config/test_insert_and_select_predefined/users.xml similarity index 100% rename from dbms/tests/integration/test_http_handlers_config/test_insert_and_select_predefine/users.xml rename to dbms/tests/integration/test_http_handlers_config/test_insert_and_select_predefined/users.xml diff --git a/dbms/tests/integration/test_http_handlers_config/test_param_and_settings_dynamic/config.xml b/dbms/tests/integration/test_http_handlers_config/test_param_and_settings_dynamic/config.xml index 06c7143f3e..f9c576e554 100644 --- a/dbms/tests/integration/test_http_handlers_config/test_param_and_settings_dynamic/config.xml +++ b/dbms/tests/integration/test_http_handlers_config/test_param_and_settings_dynamic/config.xml @@ -16,14 +16,14 @@ GET - .+)/(?P.+)]]> + [^/]+)(/(?P[^/]+))?]]> query_param TEST_HEADER_VALUE - .+)/(?P.+)]]> + [^/]+)(/(?P[^/]+))?]]> query_param diff --git a/dbms/tests/integration/test_http_handlers_config/test_param_and_settings_predefine/config.xml b/dbms/tests/integration/test_http_handlers_config/test_param_and_settings_predefined/config.xml similarity index 73% rename from dbms/tests/integration/test_http_handlers_config/test_param_and_settings_predefine/config.xml rename to dbms/tests/integration/test_http_handlers_config/test_param_and_settings_predefined/config.xml index cca4bc04a6..1ad1fecb2e 100644 --- a/dbms/tests/integration/test_http_handlers_config/test_param_and_settings_predefine/config.xml +++ b/dbms/tests/integration/test_http_handlers_config/test_param_and_settings_predefined/config.xml @@ -2,42 +2,42 @@ - + POST /post_query_params_and_settings SELECT value FROM system.settings WHERE name = {name_1:String} SELECT name, value FROM system.settings WHERE name = {name_2:String} - + - + GET /get_query_params_and_settings SELECT value FROM system.settings WHERE name = {name_1:String} SELECT name, value FROM system.settings WHERE name = {name_2:String} - + - + GET - .+)/(?P.+)]]> + [^/]+)(/(?P[^/]+))?]]> SELECT value FROM system.settings WHERE name = {name_1:String} SELECT name, value FROM system.settings WHERE name = {name_2:String} - + - + TEST_HEADER_VALUE - .+)/(?P.+)]]> + [^/]+)(/(?P[^/]+))?]]> SELECT value FROM system.settings WHERE name = {name_1:String} SELECT name, value FROM system.settings WHERE name = {name_2:String} - + diff --git a/dbms/tests/integration/test_http_handlers_config/test_param_and_settings_predefine/users.xml b/dbms/tests/integration/test_http_handlers_config/test_param_and_settings_predefined/users.xml similarity index 100% rename from dbms/tests/integration/test_http_handlers_config/test_param_and_settings_predefine/users.xml rename to dbms/tests/integration/test_http_handlers_config/test_param_and_settings_predefined/users.xml diff --git a/programs/server/config.xml b/programs/server/config.xml index c4ba4e66ab..74557a6ab7 100644 --- a/programs/server/config.xml +++ b/programs/server/config.xml @@ -537,8 +537,8 @@ url - RE2 compatible regular expression (optional) method - HTTP method(optional) headers - HTTP Header(optional) - queries - predefine queries (mandatory) - + queries - predefined queries (mandatory) + /test_simple_predefine GET default @@ -546,7 +546,7 @@ SELECT 1, {query_prepared_param_1:String} SELECT 1, {query_prepared_param_2:String} - + --> -- GitLab