mirror of
https://github.com/Relintai/pandemonium_engine.git
synced 2024-12-23 04:16:50 +01:00
Added get request parameter support for WebServerRequest.
This commit is contained in:
parent
cb409757c3
commit
38a36b3c70
@ -179,7 +179,7 @@ void HTTPParser::process_urlenc_data() {
|
|||||||
String key = p.get_slicec('=', 0).replace("+", " ").percent_decode();
|
String key = p.get_slicec('=', 0).replace("+", " ").percent_decode();
|
||||||
String value = p.get_slicec('=', 1).replace("+", " ").percent_decode();
|
String value = p.get_slicec('=', 1).replace("+", " ").percent_decode();
|
||||||
|
|
||||||
_request->add_parameter(key, value);
|
_request->add_post_parameter(key, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -280,7 +280,7 @@ int HTTPParser::on_header_value(const char *at, size_t length) {
|
|||||||
ERR_PRINT("header_val " + s);
|
ERR_PRINT("header_val " + s);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
_request->add_parameter(_queued_header_field, s);
|
_request->add_post_parameter(_queued_header_field, s);
|
||||||
|
|
||||||
if (_queued_header_field == "Host") {
|
if (_queued_header_field == "Host") {
|
||||||
_request->set_host(s);
|
_request->set_host(s);
|
||||||
@ -566,7 +566,7 @@ int HTTPParser::on_multipart_part_data_end_cb() {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
String s = _multipart_form_data.ptr();
|
String s = _multipart_form_data.ptr();
|
||||||
_request->add_parameter(_multipart_form_name, s);
|
_request->add_post_parameter(_multipart_form_name, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
_multipart_form_is_file = false;
|
_multipart_form_is_file = false;
|
||||||
|
@ -65,11 +65,25 @@ String SimpleWebServerRequest::get_file_data_str(const int index) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String SimpleWebServerRequest::get_parameter(const String &key) const {
|
String SimpleWebServerRequest::get_parameter(const String &key) const {
|
||||||
if (!_parameters.has(key)) {
|
if (!_post_parameters.has(key)) {
|
||||||
|
return get_get_parameter(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
return get_post_parameter(key);
|
||||||
|
}
|
||||||
|
String SimpleWebServerRequest::get_post_parameter(const String &key) const {
|
||||||
|
if (!_post_parameters.has(key)) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
return _parameters[key];
|
return _post_parameters[key];
|
||||||
|
}
|
||||||
|
String SimpleWebServerRequest::get_get_parameter(const String &key) const {
|
||||||
|
if (!_get_parameters.has(key)) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
return _get_parameters[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
void SimpleWebServerRequest::send_redirect(const String &location, const HTTPServerEnums::HTTPStatusCode status_code) {
|
void SimpleWebServerRequest::send_redirect(const String &location, const HTTPServerEnums::HTTPStatusCode status_code) {
|
||||||
@ -107,12 +121,62 @@ String SimpleWebServerRequest::get_host() const {
|
|||||||
return _host;
|
return _host;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SimpleWebServerRequest::add_parameter(const String &key, const String &value) {
|
void SimpleWebServerRequest::add_post_parameter(const String &key, const String &value) {
|
||||||
_parameters[key] = value;
|
_post_parameters[key] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SimpleWebServerRequest::add_get_parameter(const String &key, const String &value) {
|
||||||
|
_get_parameters[key] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SimpleWebServerRequest::set_parser_path(const String &value) {
|
void SimpleWebServerRequest::set_parser_path(const String &value) {
|
||||||
_parser_path = value;
|
//https://www.rfc-editor.org/rfc/rfc3986.txt
|
||||||
|
//3.4. Query
|
||||||
|
//The query component is indicated by the first question mark ("?") ...
|
||||||
|
int qpos = value.find_char('?');
|
||||||
|
|
||||||
|
if (qpos == -1) {
|
||||||
|
_parser_path = value;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_parser_path = value.substr_index(0, qpos);
|
||||||
|
|
||||||
|
//... and terminated by a number sign ("#") character or by the end of the URI.
|
||||||
|
int get_query_end = value.find_char('#', qpos);
|
||||||
|
|
||||||
|
// ...The characters slash ("/") and question mark ("?") may represent data within the query component.
|
||||||
|
// "key=value" pairs and one frequently used value is a reference to another URI, it is sometimes
|
||||||
|
// better for usability to avoid percent-encoding those characters.
|
||||||
|
|
||||||
|
if (get_query_end == -1) {
|
||||||
|
get_query_end = value.size() - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
String get_req_str = value.substr_index(qpos + 1, get_query_end);
|
||||||
|
|
||||||
|
Vector<String> get_req_params = get_req_str.split("&");
|
||||||
|
|
||||||
|
for (int i = 0; i < get_req_params.size(); ++i) {
|
||||||
|
String cp = get_req_params[i];
|
||||||
|
|
||||||
|
int eq = cp.find_char('=');
|
||||||
|
|
||||||
|
if (eq == -1) {
|
||||||
|
// skip if ¶m&
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
String key = cp.substr_index(0, eq);
|
||||||
|
String val = cp.substr_index(eq + 1, cp.size());
|
||||||
|
|
||||||
|
if (key.empty() || val.empty()) {
|
||||||
|
// &=v& or &p=&
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
add_get_parameter(key.percent_decode(), val.percent_decode());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SimpleWebServerRequest::set_host(const String &value) {
|
void SimpleWebServerRequest::set_host(const String &value) {
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
#ifndef SIMPLE_WEB_SERVER_REQUEST_H
|
#ifndef SIMPLE_WEB_SERVER_REQUEST_H
|
||||||
#define SIMPLE_WEB_SERVER_REQUEST_H
|
#define SIMPLE_WEB_SERVER_REQUEST_H
|
||||||
|
|
||||||
#include "core/variant/dictionary.h"
|
|
||||||
#include "core/containers/hash_map.h"
|
#include "core/containers/hash_map.h"
|
||||||
#include "core/string/ustring.h"
|
|
||||||
#include "core/containers/vector.h"
|
#include "core/containers/vector.h"
|
||||||
|
#include "core/string/ustring.h"
|
||||||
|
#include "core/variant/dictionary.h"
|
||||||
|
|
||||||
#include "modules/web/http/web_server_request.h"
|
#include "modules/web/http/web_server_request.h"
|
||||||
|
|
||||||
@ -35,6 +35,8 @@ public:
|
|||||||
virtual String get_file_data_str(const int index) const;
|
virtual String get_file_data_str(const int index) const;
|
||||||
|
|
||||||
virtual String get_parameter(const String &key) const;
|
virtual String get_parameter(const String &key) const;
|
||||||
|
virtual String get_post_parameter(const String &key) const;
|
||||||
|
virtual String get_get_parameter(const String &key) const;
|
||||||
|
|
||||||
virtual void send_redirect(const String &location, const HTTPServerEnums::HTTPStatusCode status_code = HTTPServerEnums::HTTP_STATUS_CODE_302_FOUND);
|
virtual void send_redirect(const String &location, const HTTPServerEnums::HTTPStatusCode status_code = HTTPServerEnums::HTTP_STATUS_CODE_302_FOUND);
|
||||||
virtual void send();
|
virtual void send();
|
||||||
@ -42,7 +44,8 @@ public:
|
|||||||
virtual String parser_get_path();
|
virtual String parser_get_path();
|
||||||
virtual String get_host() const;
|
virtual String get_host() const;
|
||||||
|
|
||||||
void add_parameter(const String &key, const String &value);
|
void add_post_parameter(const String &key, const String &value);
|
||||||
|
void add_get_parameter(const String &key, const String &value);
|
||||||
void set_parser_path(const String &value);
|
void set_parser_path(const String &value);
|
||||||
void set_host(const String &value);
|
void set_host(const String &value);
|
||||||
|
|
||||||
@ -63,7 +66,8 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
|
|
||||||
HashMap<String, String> _parameters;
|
HashMap<String, String> _post_parameters;
|
||||||
|
HashMap<String, String> _get_parameters;
|
||||||
String _parser_path;
|
String _parser_path;
|
||||||
String _host;
|
String _host;
|
||||||
|
|
||||||
|
@ -205,6 +205,14 @@ String WebServerRequest::get_parameter(const String &key) const {
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String WebServerRequest::get_post_parameter(const String &key) const {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
String WebServerRequest::get_get_parameter(const String &key) const {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
HTTPServerEnums::HTTPStatusCode WebServerRequest::get_status_code() const {
|
HTTPServerEnums::HTTPStatusCode WebServerRequest::get_status_code() const {
|
||||||
return _status_code;
|
return _status_code;
|
||||||
}
|
}
|
||||||
@ -541,6 +549,8 @@ void WebServerRequest::_bind_methods() {
|
|||||||
ClassDB::bind_method(D_METHOD("get_file_data_str", "index"), &WebServerRequest::get_file_data_str);
|
ClassDB::bind_method(D_METHOD("get_file_data_str", "index"), &WebServerRequest::get_file_data_str);
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("get_parameter", "key"), &WebServerRequest::get_parameter);
|
ClassDB::bind_method(D_METHOD("get_parameter", "key"), &WebServerRequest::get_parameter);
|
||||||
|
ClassDB::bind_method(D_METHOD("get_post_parameter", "key"), &WebServerRequest::get_post_parameter);
|
||||||
|
ClassDB::bind_method(D_METHOD("get_get_parameter", "key"), &WebServerRequest::get_get_parameter);
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("get_status_code"), &WebServerRequest::get_status_code);
|
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);
|
ClassDB::bind_method(D_METHOD("set_status_code", "val"), &WebServerRequest::set_status_code);
|
||||||
|
@ -78,6 +78,8 @@ public:
|
|||||||
virtual String get_file_data_str(const int index) const;
|
virtual String get_file_data_str(const int index) const;
|
||||||
|
|
||||||
virtual String get_parameter(const String &key) const;
|
virtual String get_parameter(const String &key) const;
|
||||||
|
virtual String get_post_parameter(const String &key) const;
|
||||||
|
virtual String get_get_parameter(const String &key) const;
|
||||||
|
|
||||||
HTTPServerEnums::HTTPStatusCode get_status_code() const;
|
HTTPServerEnums::HTTPStatusCode get_status_code() const;
|
||||||
void set_status_code(const HTTPServerEnums::HTTPStatusCode status_code);
|
void set_status_code(const HTTPServerEnums::HTTPStatusCode status_code);
|
||||||
|
Loading…
Reference in New Issue
Block a user