mirror of
https://github.com/Relintai/pandemonium_engine.git
synced 2025-04-14 07:40:48 +02:00
Rework the multipart parser code to also work with binary files.
This commit is contained in:
parent
25dda93577
commit
55eaf521b4
@ -1,6 +1,7 @@
|
|||||||
#include "web_server_request.h"
|
#include "web_server_request.h"
|
||||||
|
|
||||||
#include "core/object.h"
|
#include "core/object.h"
|
||||||
|
#include "core/variant.h"
|
||||||
#include "web_server.h"
|
#include "web_server.h"
|
||||||
#include "web_server_cookie.h"
|
#include "web_server_cookie.h"
|
||||||
|
|
||||||
@ -176,8 +177,8 @@ String WebServerRequest::get_file_key(const int index) const {
|
|||||||
int WebServerRequest::get_file_length(const int index) const {
|
int WebServerRequest::get_file_length(const int index) const {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
const uint8_t *WebServerRequest::get_file_data(const int index) const {
|
PoolByteArray WebServerRequest::get_file_data(const int index) const {
|
||||||
return nullptr;
|
return PoolByteArray();
|
||||||
}
|
}
|
||||||
String WebServerRequest::get_file_data_str(const int index) const {
|
String WebServerRequest::get_file_data_str(const int index) const {
|
||||||
return "";
|
return "";
|
||||||
@ -504,12 +505,12 @@ void WebServerRequest::_bind_methods() {
|
|||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("get_method"), &WebServerRequest::get_method);
|
ClassDB::bind_method(D_METHOD("get_method"), &WebServerRequest::get_method);
|
||||||
|
|
||||||
//virtual const uint8_t *get_file_data(const int index) const;
|
|
||||||
ClassDB::bind_method(D_METHOD("parse_files"), &WebServerRequest::parse_files);
|
ClassDB::bind_method(D_METHOD("parse_files"), &WebServerRequest::parse_files);
|
||||||
ClassDB::bind_method(D_METHOD("get_file_count"), &WebServerRequest::get_file_count);
|
ClassDB::bind_method(D_METHOD("get_file_count"), &WebServerRequest::get_file_count);
|
||||||
ClassDB::bind_method(D_METHOD("get_file_file_name", "index"), &WebServerRequest::get_file_file_name);
|
ClassDB::bind_method(D_METHOD("get_file_file_name", "index"), &WebServerRequest::get_file_file_name);
|
||||||
ClassDB::bind_method(D_METHOD("get_file_key", "index"), &WebServerRequest::get_file_key);
|
ClassDB::bind_method(D_METHOD("get_file_key", "index"), &WebServerRequest::get_file_key);
|
||||||
ClassDB::bind_method(D_METHOD("get_file_length", "index"), &WebServerRequest::get_file_length);
|
ClassDB::bind_method(D_METHOD("get_file_length", "index"), &WebServerRequest::get_file_length);
|
||||||
|
ClassDB::bind_method(D_METHOD("get_file_data"), &WebServerRequest::get_file_data);
|
||||||
ClassDB::bind_method(D_METHOD("get_file_data_str"), &WebServerRequest::get_file_data_str);
|
ClassDB::bind_method(D_METHOD("get_file_data_str"), &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);
|
||||||
|
@ -70,7 +70,7 @@ public:
|
|||||||
virtual String get_file_file_name(const int index) const;
|
virtual String get_file_file_name(const int index) const;
|
||||||
virtual String get_file_key(const int index) const;
|
virtual String get_file_key(const int index) const;
|
||||||
virtual int get_file_length(const int index) const;
|
virtual int get_file_length(const int index) const;
|
||||||
virtual const uint8_t *get_file_data(const int index) const;
|
virtual PoolByteArray get_file_data(const int index) const;
|
||||||
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;
|
||||||
|
@ -147,19 +147,31 @@ void HTTPParser::HTTPParser::process_multipart_data() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//ERR_PRINT("BODY");
|
//ERR_PRINT("BODY");
|
||||||
_multipart_form_data = _partial_data.substr_index(0, boundary_index - 4); //to strip the 2 \r\n from before the boundary
|
String data = _partial_data.substr_index(0, boundary_index - 4); //to strip the 2 \r\n from before the boundary
|
||||||
|
|
||||||
//ERR_PRINT(data);
|
//ERR_PRINT(data);
|
||||||
|
|
||||||
if (_multipart_form_is_file) {
|
if (_multipart_form_is_file) {
|
||||||
if (_multipart_form_data == "") {
|
if (data == "") {
|
||||||
_in_boundary_header = true;
|
_in_boundary_header = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
_request->add_file(_multipart_form_name, _multipart_form_filename, _multipart_form_data);
|
CharString cs = data.ascii();
|
||||||
|
|
||||||
|
PoolByteArray file_data;
|
||||||
|
file_data.resize(cs.length());
|
||||||
|
PoolByteArray::Write w = file_data.write();
|
||||||
|
|
||||||
|
for (int i = 0; i < cs.length(); i++) {
|
||||||
|
w[i] = cs[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
w.release();
|
||||||
|
|
||||||
|
_request->add_file(_multipart_form_name, _multipart_form_filename, file_data);
|
||||||
} else {
|
} else {
|
||||||
_request->add_parameter(_multipart_form_name, _multipart_form_data);
|
_request->add_parameter(_multipart_form_name, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
boundary_index += _multipart_boundary.size();
|
boundary_index += _multipart_boundary.size();
|
||||||
@ -182,7 +194,6 @@ void HTTPParser::_process_multipart_header(const String &header) {
|
|||||||
_multipart_form_name = "";
|
_multipart_form_name = "";
|
||||||
_multipart_form_filename = "";
|
_multipart_form_filename = "";
|
||||||
_multipart_form_content_type = "";
|
_multipart_form_content_type = "";
|
||||||
_multipart_form_data = "";
|
|
||||||
_multipart_form_is_file = false;
|
_multipart_form_is_file = false;
|
||||||
|
|
||||||
int nlc = header.get_slice_count("\r\n");
|
int nlc = header.get_slice_count("\r\n");
|
||||||
|
@ -85,7 +85,6 @@ private:
|
|||||||
String _multipart_form_name;
|
String _multipart_form_name;
|
||||||
String _multipart_form_filename;
|
String _multipart_form_filename;
|
||||||
String _multipart_form_content_type;
|
String _multipart_form_content_type;
|
||||||
String _multipart_form_data;
|
|
||||||
bool _multipart_form_is_file;
|
bool _multipart_form_is_file;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -44,18 +44,23 @@ String SimpleWebServerRequest::get_file_key(const int index) const {
|
|||||||
int SimpleWebServerRequest::get_file_length(const int index) const {
|
int SimpleWebServerRequest::get_file_length(const int index) const {
|
||||||
ERR_FAIL_INDEX_V(index, _files.size(), 0);
|
ERR_FAIL_INDEX_V(index, _files.size(), 0);
|
||||||
|
|
||||||
return _files[index].data.length();
|
return _files[index].data.size();
|
||||||
}
|
}
|
||||||
const uint8_t *SimpleWebServerRequest::get_file_data(const int index) const {
|
PoolByteArray SimpleWebServerRequest::get_file_data(const int index) const {
|
||||||
ERR_FAIL_INDEX_V(index, _files.size(), nullptr);
|
ERR_FAIL_INDEX_V(index, _files.size(), PoolByteArray());
|
||||||
|
|
||||||
//return _files[index].data.ptr();
|
return _files[index].data;
|
||||||
return nullptr;
|
|
||||||
}
|
}
|
||||||
String SimpleWebServerRequest::get_file_data_str(const int index) const {
|
String SimpleWebServerRequest::get_file_data_str(const int index) const {
|
||||||
ERR_FAIL_INDEX_V(index, _files.size(), "");
|
ERR_FAIL_INDEX_V(index, _files.size(), "");
|
||||||
|
|
||||||
return _files[index].data;
|
PoolByteArray::Read r = _files[index].data.read();
|
||||||
|
|
||||||
|
String ret = reinterpret_cast<const char *>(r.ptr());
|
||||||
|
|
||||||
|
r.release();
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
String SimpleWebServerRequest::get_parameter(const String &key) const {
|
String SimpleWebServerRequest::get_parameter(const String &key) const {
|
||||||
@ -113,7 +118,7 @@ void SimpleWebServerRequest::set_host(const String &value) {
|
|||||||
_host = value;
|
_host = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SimpleWebServerRequest::add_file(const String &key, const String &file_name, const String &data) {
|
void SimpleWebServerRequest::add_file(const String &key, const String &file_name, const PoolByteArray &data) {
|
||||||
FileEntry e;
|
FileEntry e;
|
||||||
e.key = key;
|
e.key = key;
|
||||||
e.file_name = file_name;
|
e.file_name = file_name;
|
||||||
|
@ -32,7 +32,7 @@ public:
|
|||||||
virtual String get_file_file_name(const int index) const;
|
virtual String get_file_file_name(const int index) const;
|
||||||
virtual String get_file_key(const int index) const;
|
virtual String get_file_key(const int index) const;
|
||||||
virtual int get_file_length(const int index) const;
|
virtual int get_file_length(const int index) const;
|
||||||
virtual const uint8_t *get_file_data(const int index) const;
|
virtual PoolByteArray get_file_data(const int index) const;
|
||||||
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;
|
||||||
@ -47,7 +47,7 @@ public:
|
|||||||
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);
|
||||||
|
|
||||||
void add_file(const String &key, const String &file_name, const String &data);
|
void add_file(const String &key, const String &file_name, const PoolByteArray &data);
|
||||||
|
|
||||||
//virtual String get_path_full() const;
|
//virtual String get_path_full() const;
|
||||||
|
|
||||||
@ -65,7 +65,7 @@ protected:
|
|||||||
|
|
||||||
struct FileEntry {
|
struct FileEntry {
|
||||||
String file_name;
|
String file_name;
|
||||||
String data;
|
PoolByteArray data;
|
||||||
String key; //form name key
|
String key; //form name key
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user