mirror of
https://github.com/Relintai/pandemonium_engine.git
synced 2024-11-22 17:07:20 +01:00
Implemented sending responses. (In an extremely simple way for now.)
This commit is contained in:
parent
24e120142e
commit
a7b705ebea
@ -23,6 +23,10 @@ bool HTTPParser::is_ready() const {
|
||||
return _is_ready;
|
||||
}
|
||||
|
||||
bool HTTPParser::is_finished() const {
|
||||
return !_request.is_valid();
|
||||
}
|
||||
|
||||
void HTTPParser::reset() {
|
||||
_partial_data = "";
|
||||
_is_ready = false;
|
||||
|
@ -17,6 +17,7 @@ public:
|
||||
int get_request_count() const;
|
||||
|
||||
bool is_ready() const;
|
||||
bool is_finished() const;
|
||||
|
||||
void reset();
|
||||
|
||||
|
@ -205,9 +205,86 @@ void HTTPServerSimple::poll() {
|
||||
request->_server = this;
|
||||
|
||||
_web_server->server_handle_request(request);
|
||||
|
||||
if (_http_parser->get_request_count() == 0 && _http_parser->is_finished()) {
|
||||
_clear_client();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void HTTPServerSimple::send_redirect(const String &location, const HTTPServerEnums::HTTPStatusCode status_code) {
|
||||
//String s = "HTTP/1.1 " + itos(static_cast<int>(status_code)) + " Found\r\n";
|
||||
String s = "HTTP/1.1 302 Found\r\n";
|
||||
s += "Location: " + location + "\r\n";
|
||||
s += "Connection: Close\r\n";
|
||||
s += "\r\n";
|
||||
CharString cs = s.utf8();
|
||||
peer->put_data((const uint8_t *)cs.get_data(), cs.size() - 1);
|
||||
}
|
||||
void HTTPServerSimple::send(const String &body) {
|
||||
String s = "HTTP/1.1 302 Found\r\n";
|
||||
s += "Content-Length: " + itos(body.size()) + "\r\n";
|
||||
s += "Content-type: text/html\r\n";
|
||||
s += "Connection: Close\r\n";
|
||||
s += "\r\n";
|
||||
s += body;
|
||||
|
||||
CharString cs = s.utf8();
|
||||
peer->put_data((const uint8_t *)cs.get_data(), cs.size() - 1);
|
||||
}
|
||||
void HTTPServerSimple::send_file(const String &p_file_path) {
|
||||
if (!FileAccess::exists(p_file_path)) {
|
||||
String s = "HTTP/1.1 404 Not Found\r\n";
|
||||
s += "Connection: Close\r\n";
|
||||
s += "\r\n";
|
||||
CharString cs = s.utf8();
|
||||
peer->put_data((const uint8_t *)cs.get_data(), cs.size() - 1);
|
||||
return;
|
||||
}
|
||||
|
||||
String ctype;
|
||||
String req_ext = p_file_path.get_extension();
|
||||
|
||||
if (!mimes.has(req_ext)) {
|
||||
const String ctype = mimes[req_ext];
|
||||
} else {
|
||||
ctype = "text/plain";
|
||||
}
|
||||
|
||||
FileAccess *f = FileAccess::open(p_file_path, FileAccess::READ);
|
||||
ERR_FAIL_COND(!f);
|
||||
String s = "HTTP/1.1 200 OK\r\n";
|
||||
s += "Connection: Close\r\n";
|
||||
s += "Content-Type: " + ctype + "\r\n";
|
||||
s += "Access-Control-Allow-Origin: *\r\n";
|
||||
s += "Cross-Origin-Opener-Policy: same-origin\r\n";
|
||||
s += "Cross-Origin-Embedder-Policy: require-corp\r\n";
|
||||
s += "Cache-Control: no-store, max-age=0\r\n";
|
||||
s += "\r\n";
|
||||
CharString cs = s.utf8();
|
||||
|
||||
Error err = peer->put_data((const uint8_t *)cs.get_data(), cs.size() - 1);
|
||||
if (err != OK) {
|
||||
memdelete(f);
|
||||
ERR_FAIL();
|
||||
}
|
||||
|
||||
while (true) {
|
||||
uint8_t bytes[4096];
|
||||
uint64_t read = f->get_buffer(bytes, 4096);
|
||||
if (read == 0) {
|
||||
break;
|
||||
}
|
||||
err = peer->put_data(bytes, read);
|
||||
if (err != OK) {
|
||||
memdelete(f);
|
||||
ERR_FAIL();
|
||||
}
|
||||
}
|
||||
|
||||
memdelete(f);
|
||||
}
|
||||
|
||||
HTTPServerSimple::HTTPServerSimple() {
|
||||
_web_server = nullptr;
|
||||
|
||||
|
@ -37,6 +37,8 @@
|
||||
|
||||
#include "core/project_settings.h"
|
||||
|
||||
#include "../http/http_server_enums.h"
|
||||
|
||||
class HTTPParser;
|
||||
class WebServerSimple;
|
||||
|
||||
@ -49,6 +51,10 @@ public:
|
||||
void _send_response();
|
||||
void poll();
|
||||
|
||||
void send_redirect(const String &location, const HTTPServerEnums::HTTPStatusCode status_code);
|
||||
void send(const String &body);
|
||||
void send_file(const String &p_file_path);
|
||||
|
||||
HTTPServerSimple();
|
||||
~HTTPServerSimple();
|
||||
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include "../http/web_node.h"
|
||||
|
||||
#include "../http/web_permission.h"
|
||||
#include "http_server_simple.h"
|
||||
|
||||
String SimpleWebServerRequest::get_cookie(const String &key) {
|
||||
return "";
|
||||
@ -49,9 +50,16 @@ String SimpleWebServerRequest::get_parameter(const String &key) const {
|
||||
}
|
||||
|
||||
void SimpleWebServerRequest::send_redirect(const String &location, const HTTPServerEnums::HTTPStatusCode status_code) {
|
||||
ERR_FAIL_COND(!_server);
|
||||
|
||||
_server->send_redirect(location, status_code);
|
||||
}
|
||||
|
||||
void SimpleWebServerRequest::send() {
|
||||
ERR_FAIL_COND(!_server);
|
||||
|
||||
_server->send(compiled_body);
|
||||
|
||||
// if (connection_closed) {
|
||||
// SimpleWebServerRequestPool::return_request(this);
|
||||
// return;
|
||||
@ -61,6 +69,10 @@ void SimpleWebServerRequest::send() {
|
||||
}
|
||||
|
||||
void SimpleWebServerRequest::send_file(const String &p_file_path) {
|
||||
ERR_FAIL_COND(!_server);
|
||||
|
||||
_server->send_file(p_file_path);
|
||||
|
||||
// SimpleWebServerRequestPool::return_request(this);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user