From e5719c991b9ff5609f326f54497516a17bb660cf Mon Sep 17 00:00:00 2001 From: Relintai Date: Fri, 22 Dec 2023 13:02:17 +0100 Subject: [PATCH] Store incoming http request parameters properly. --- modules/http_server_simple/http_parser.cpp | 2 +- .../http_server_simple/http_server_simple.cpp | 3 ++ .../simple_web_server_request.cpp | 15 ++++++++ .../simple_web_server_request.h | 5 +++ modules/web/http/web_server_request.cpp | 31 ++++++++++------ modules/web/http/web_server_request.h | 3 ++ .../http/web_server_request_scriptable.cpp | 37 ++++++++++++++----- .../web/http/web_server_request_scriptable.h | 6 +++ 8 files changed, 81 insertions(+), 21 deletions(-) diff --git a/modules/http_server_simple/http_parser.cpp b/modules/http_server_simple/http_parser.cpp index 1088c2df1..8e327d1f6 100644 --- a/modules/http_server_simple/http_parser.cpp +++ b/modules/http_server_simple/http_parser.cpp @@ -328,7 +328,7 @@ int HTTPParser::on_header_value(const char *at, size_t length) { ERR_PRINT("header_val " + s); #endif - _request->add_post_parameter(_queued_header_field, s); + _request->add_header_parameter(_queued_header_field, s); if (_queued_header_field == "host") { _request->set_host(s); diff --git a/modules/http_server_simple/http_server_simple.cpp b/modules/http_server_simple/http_server_simple.cpp index d7d146b20..b21489a68 100644 --- a/modules/http_server_simple/http_server_simple.cpp +++ b/modules/http_server_simple/http_server_simple.cpp @@ -281,6 +281,9 @@ void HTTPServerConnection::send_file(Ref request, const String return; } + //String range = request->get_htt + + String s = "HTTP/1.1 " + HTTPServerEnums::get_status_code_header_string(request->get_status_code()) + "\r\n"; if (!custom_headers.has("Connection")) { diff --git a/modules/http_server_simple/simple_web_server_request.cpp b/modules/http_server_simple/simple_web_server_request.cpp index fe5bd6861..46f190534 100644 --- a/modules/http_server_simple/simple_web_server_request.cpp +++ b/modules/http_server_simple/simple_web_server_request.cpp @@ -124,6 +124,17 @@ void SimpleWebServerRequest::set_get_parameter(const String &key, const String & _get_parameters[key] = value; } +String SimpleWebServerRequest::get_header_parameter(const String &key) const { + if (!_header_parameters.has(key)) { + return ""; + } + + return _header_parameters[key]; +} +void SimpleWebServerRequest::set_header_parameter(const String &key, const String &value) { + _header_parameters[key] = value; +} + void SimpleWebServerRequest::send_redirect(const String &location, const HTTPServerEnums::HTTPStatusCode status_code) { ERR_FAIL_COND(!_server); @@ -167,6 +178,10 @@ void SimpleWebServerRequest::add_get_parameter(const String &key, const String & _get_parameters[key] = value; } +void SimpleWebServerRequest::add_header_parameter(const String &key, const String &value) { + _header_parameters[key] = value; +} + void SimpleWebServerRequest::set_parser_path(const String &value) { //https://www.rfc-editor.org/rfc/rfc3986.txt //3.4. Query diff --git a/modules/http_server_simple/simple_web_server_request.h b/modules/http_server_simple/simple_web_server_request.h index 72a4a762e..2bed875ec 100644 --- a/modules/http_server_simple/simple_web_server_request.h +++ b/modules/http_server_simple/simple_web_server_request.h @@ -73,6 +73,9 @@ public: virtual void set_post_parameter(const String &key, const String &value); virtual void set_get_parameter(const String &key, const String &value); + virtual String get_header_parameter(const String &key) const; + virtual void set_header_parameter(const String &key, const String &value); + virtual void send_redirect(const String &location, const HTTPServerEnums::HTTPStatusCode status_code = HTTPServerEnums::HTTP_STATUS_CODE_302_FOUND); virtual void send(); virtual void send_file(const String &p_file_path); @@ -81,6 +84,7 @@ public: void add_post_parameter(const String &key, const String &value); void add_get_parameter(const String &key, const String &value); + void add_header_parameter(const String &key, const String &value); void set_parser_path(const String &value); void set_host(const String &value); @@ -107,6 +111,7 @@ protected: HashMap _post_parameters; HashMap _get_parameters; + HashMap _header_parameters; String _parser_path; String _host; diff --git a/modules/web/http/web_server_request.cpp b/modules/web/http/web_server_request.cpp index 03b947104..aaeb84863 100644 --- a/modules/web/http/web_server_request.cpp +++ b/modules/web/http/web_server_request.cpp @@ -136,7 +136,7 @@ bool WebServerRequest::has_csrf_token() { String WebServerRequest::get_csrf_token() { if (!_session.is_valid()) { - return ""; + return String(); } const Variant &val = _session->get_const("csrf_token"); @@ -174,7 +174,7 @@ bool WebServerRequest::validate_csrf_token() { } String WebServerRequest::get_cookie(const String &key) { - return ""; + return String(); } void WebServerRequest::response_add_cookie(const Ref &cookie) { @@ -214,7 +214,7 @@ String WebServerRequest::custom_response_header_get(const StringName &key) { String *e = _custom_response_headers.getptr(key); if (!e) { - return ""; + return String(); } return *e; @@ -252,10 +252,10 @@ int WebServerRequest::get_file_count() const { return 0; } String WebServerRequest::get_file_file_name(const int index) const { - return ""; + return String(); } String WebServerRequest::get_file_key(const int index) const { - return ""; + return String(); } int WebServerRequest::get_file_length(const int index) const { return 0; @@ -264,19 +264,19 @@ PoolByteArray WebServerRequest::get_file_data(const int index) const { return PoolByteArray(); } String WebServerRequest::get_file_data_str(const int index) const { - return ""; + return String(); } String WebServerRequest::get_parameter(const String &key) const { - return ""; + return String(); } String WebServerRequest::get_post_parameter(const String &key) const { - return ""; + return String(); } String WebServerRequest::get_get_parameter(const String &key) const { - return ""; + return String(); } void WebServerRequest::set_post_parameter(const String &key, const String &value) { @@ -284,6 +284,12 @@ void WebServerRequest::set_post_parameter(const String &key, const String &value void WebServerRequest::set_get_parameter(const String &key, const String &value) { } +String WebServerRequest::get_header_parameter(const String &key) const { + return String(); +} +void WebServerRequest::set_header_parameter(const String &key, const String &value) { +} + HTTPServerEnums::HTTPStatusCode WebServerRequest::get_status_code() const { return _status_code; } @@ -343,7 +349,7 @@ void WebServerRequest::send_error(int error_code) { } String WebServerRequest::parser_get_path() { - return ""; + return String(); } void WebServerRequest::setup_url_stack() { @@ -517,7 +523,7 @@ String WebServerRequest::get_url_site_add(const String &add) const { } String WebServerRequest::get_host() const { - return ""; + return String(); } void WebServerRequest::update() { @@ -642,6 +648,9 @@ void WebServerRequest::_bind_methods() { ClassDB::bind_method(D_METHOD("set_post_parameter", "key", "value"), &WebServerRequest::set_post_parameter); ClassDB::bind_method(D_METHOD("set_get_parameter", "key", "value"), &WebServerRequest::set_get_parameter); + ClassDB::bind_method(D_METHOD("get_header_parameter", "key"), &WebServerRequest::get_header_parameter); + ClassDB::bind_method(D_METHOD("set_header_parameter", "key", "value"), &WebServerRequest::set_header_parameter); + ClassDB::bind_method(D_METHOD("get_status_code"), &WebServerRequest::get_status_code); ClassDB::bind_method(D_METHOD("set_status_code", "val"), &WebServerRequest::set_status_code); ADD_PROPERTY(PropertyInfo(Variant::INT, "status_code"), "set_status_code", "get_status_code"); diff --git a/modules/web/http/web_server_request.h b/modules/web/http/web_server_request.h index 695e572f3..28a0c456a 100644 --- a/modules/web/http/web_server_request.h +++ b/modules/web/http/web_server_request.h @@ -125,6 +125,9 @@ public: virtual void set_post_parameter(const String &key, const String &value); virtual void set_get_parameter(const String &key, const String &value); + virtual String get_header_parameter(const String &key) const; + virtual void set_header_parameter(const String &key, const String &value); + HTTPServerEnums::HTTPStatusCode get_status_code() const; void set_status_code(const HTTPServerEnums::HTTPStatusCode status_code); diff --git a/modules/web/http/web_server_request_scriptable.cpp b/modules/web/http/web_server_request_scriptable.cpp index 1812b9635..51d348d49 100644 --- a/modules/web/http/web_server_request_scriptable.cpp +++ b/modules/web/http/web_server_request_scriptable.cpp @@ -85,6 +85,13 @@ void WebServerRequestScriptable::set_get_parameter(const String &key, const Stri call("_set_get_parameter", key, value); } +String WebServerRequestScriptable::get_header_parameter(const String &key) const { + return const_cast(this)->call("_get_header_parameter", key); +} +void WebServerRequestScriptable::set_header_parameter(const String &key, const String &value) { + call("_set_header_parameter", key, value); +} + void WebServerRequestScriptable::send_redirect(const String &location, const HTTPServerEnums::HTTPStatusCode status_code) { call("_send_redirect", location, status_code); } @@ -128,7 +135,7 @@ void WebServerRequestScriptable::update() { // script virtuals String WebServerRequestScriptable::_get_cookie(const String &key) { - return ""; + return String(); } HTTPServerEnums::HTTPMethod WebServerRequestScriptable::_get_method() const { @@ -141,10 +148,10 @@ int WebServerRequestScriptable::_get_file_count() const { return 0; } String WebServerRequestScriptable::_get_file_file_name(const int index) const { - return ""; + return String(); } String WebServerRequestScriptable::_get_file_key(const int index) const { - return ""; + return String(); } int WebServerRequestScriptable::_get_file_length(const int index) const { return 0; @@ -153,19 +160,19 @@ PoolByteArray WebServerRequestScriptable::_get_file_data(const int index) const return PoolByteArray(); } String WebServerRequestScriptable::_get_file_data_str(const int index) const { - return ""; + return String(); } String WebServerRequestScriptable::_get_parameter(const String &key) const { - return ""; + return String(); } String WebServerRequestScriptable::_get_post_parameter(const String &key) const { - return ""; + return String(); } String WebServerRequestScriptable::_get_get_parameter(const String &key) const { - return ""; + return String(); } void WebServerRequestScriptable::_set_post_parameter(const String &key, const String &value) { @@ -173,6 +180,12 @@ void WebServerRequestScriptable::_set_post_parameter(const String &key, const St void WebServerRequestScriptable::_set_get_parameter(const String &key, const String &value) { } +String WebServerRequestScriptable::_get_header_parameter(const String &key) const { + return String(); +} +void WebServerRequestScriptable::_set_header_parameter(const String &key, const String &value) { +} + void WebServerRequestScriptable::_send_redirect(const String &location, const HTTPServerEnums::HTTPStatusCode status_code) { } @@ -224,7 +237,7 @@ void WebServerRequestScriptable::_send_error(int error_code) { } String WebServerRequestScriptable::_parser_get_path() { - return ""; + return String(); } String WebServerRequestScriptable::_get_path_full() const { @@ -232,7 +245,7 @@ String WebServerRequestScriptable::_get_path_full() const { } String WebServerRequestScriptable::_get_host() const { - return ""; + return String(); } void WebServerRequestScriptable::_update() { @@ -271,6 +284,9 @@ void WebServerRequestScriptable::_bind_methods() { BIND_VMETHOD(MethodInfo("_set_post_parameter", PropertyInfo(Variant::STRING, "key"), PropertyInfo(Variant::STRING, "value"))); BIND_VMETHOD(MethodInfo("_set_get_parameter", PropertyInfo(Variant::STRING, "key"), PropertyInfo(Variant::STRING, "value"))); + BIND_VMETHOD(MethodInfo("_get_header_parameter", PropertyInfo(Variant::STRING, "key"))); + BIND_VMETHOD(MethodInfo("_set_header_parameter", PropertyInfo(Variant::STRING, "key"), PropertyInfo(Variant::STRING, "value"))); + BIND_VMETHOD(MethodInfo("_send_redirect", PropertyInfo(Variant::STRING, "location"), PropertyInfo(Variant::INT, "status_code"))); BIND_VMETHOD(MethodInfo("_compile_body")); @@ -304,6 +320,9 @@ void WebServerRequestScriptable::_bind_methods() { ClassDB::bind_method(D_METHOD("_set_post_parameter", "key", "value"), &WebServerRequestScriptable::_set_post_parameter); ClassDB::bind_method(D_METHOD("_set_get_parameter", "key", "value"), &WebServerRequestScriptable::_set_get_parameter); + ClassDB::bind_method(D_METHOD("_get_header_parameter", "key"), &WebServerRequestScriptable::_get_header_parameter); + ClassDB::bind_method(D_METHOD("_set_header_parameter", "key", "value"), &WebServerRequestScriptable::_set_header_parameter); + ClassDB::bind_method(D_METHOD("_send_redirect", "location", "status_code"), &WebServerRequestScriptable::_send_redirect); ClassDB::bind_method(D_METHOD("_compile_body"), &WebServerRequestScriptable::_compile_body); diff --git a/modules/web/http/web_server_request_scriptable.h b/modules/web/http/web_server_request_scriptable.h index c1b0e49cd..891d2c5b6 100644 --- a/modules/web/http/web_server_request_scriptable.h +++ b/modules/web/http/web_server_request_scriptable.h @@ -72,6 +72,9 @@ public: virtual void set_post_parameter(const String &key, const String &value); virtual void set_get_parameter(const String &key, const String &value); + virtual String get_header_parameter(const String &key) const; + virtual void set_header_parameter(const String &key, const String &value); + virtual void send_redirect(const String &location, const HTTPServerEnums::HTTPStatusCode status_code = HTTPServerEnums::HTTP_STATUS_CODE_302_FOUND); virtual void compile_body(); virtual void compile_and_send_body(); @@ -105,6 +108,9 @@ public: virtual void _set_post_parameter(const String &key, const String &value); virtual void _set_get_parameter(const String &key, const String &value); + virtual String _get_header_parameter(const String &key) const; + virtual void _set_header_parameter(const String &key, const String &value); + void _send_redirect(const String &location, const HTTPServerEnums::HTTPStatusCode status_code); void _compile_body(); void _compile_and_send_body();