diff --git a/modules/websocket/doc_classes/WebSocketServer.xml b/modules/websocket/doc_classes/WebSocketServer.xml
index 30766aba815..c0b1cdd6836 100644
--- a/modules/websocket/doc_classes/WebSocketServer.xml
+++ b/modules/websocket/doc_classes/WebSocketServer.xml
@@ -59,6 +59,13 @@
If [code]false[/code] is passed instead (default), you must call [PacketPeer] functions ([code]put_packet[/code], [code]get_packet[/code], etc.), on the [WebSocketPeer] returned via [code]get_peer(id)[/code] to communicate with the peer with given [code]id[/code] (e.g. [code]get_peer(id).get_available_packet_count[/code]).
+
+
+
+
+ Sets additional headers to be sent to clients during the HTTP handshake.
+
+
diff --git a/modules/websocket/emws_server.cpp b/modules/websocket/emws_server.cpp
index 96473520df0..9422bf24cb6 100644
--- a/modules/websocket/emws_server.cpp
+++ b/modules/websocket/emws_server.cpp
@@ -33,6 +33,9 @@
#include "emws_server.h"
#include "core/os/os.h"
+void EMWSServer::set_extra_headers(const Vector &p_headers) {
+}
+
Error EMWSServer::listen(int p_port, Vector p_protocols, bool gd_mp_api) {
return FAILED;
}
diff --git a/modules/websocket/emws_server.h b/modules/websocket/emws_server.h
index 208a3add9b0..8803814b822 100644
--- a/modules/websocket/emws_server.h
+++ b/modules/websocket/emws_server.h
@@ -42,6 +42,7 @@ class EMWSServer : public WebSocketServer {
public:
Error set_buffers(int p_in_buffer, int p_in_packets, int p_out_buffer, int p_out_packets);
+ void set_extra_headers(const Vector &p_headers);
Error listen(int p_port, Vector p_protocols = Vector(), bool gd_mp_api = false);
void stop();
bool is_listening() const;
diff --git a/modules/websocket/websocket_server.cpp b/modules/websocket/websocket_server.cpp
index 4544043f616..b0418484ed1 100644
--- a/modules/websocket/websocket_server.cpp
+++ b/modules/websocket/websocket_server.cpp
@@ -42,6 +42,7 @@ WebSocketServer::~WebSocketServer() {
void WebSocketServer::_bind_methods() {
ClassDB::bind_method(D_METHOD("is_listening"), &WebSocketServer::is_listening);
+ ClassDB::bind_method(D_METHOD("set_extra_headers", "headers"), &WebSocketServer::set_extra_headers, DEFVAL(Vector()));
ClassDB::bind_method(D_METHOD("listen", "port", "protocols", "gd_mp_api"), &WebSocketServer::listen, DEFVAL(Vector()), DEFVAL(false));
ClassDB::bind_method(D_METHOD("stop"), &WebSocketServer::stop);
ClassDB::bind_method(D_METHOD("has_peer", "id"), &WebSocketServer::has_peer);
diff --git a/modules/websocket/websocket_server.h b/modules/websocket/websocket_server.h
index b8b2e6f71ba..561afa0047a 100644
--- a/modules/websocket/websocket_server.h
+++ b/modules/websocket/websocket_server.h
@@ -52,6 +52,7 @@ protected:
public:
virtual void poll() = 0;
+ virtual void set_extra_headers(const Vector &p_headers) = 0;
virtual Error listen(int p_port, const Vector p_protocols = Vector(), bool gd_mp_api = false) = 0;
virtual void stop() = 0;
virtual bool is_listening() const = 0;
diff --git a/modules/websocket/wsl_server.cpp b/modules/websocket/wsl_server.cpp
index 0c500499a47..c24077fbe2c 100644
--- a/modules/websocket/wsl_server.cpp
+++ b/modules/websocket/wsl_server.cpp
@@ -104,7 +104,7 @@ bool WSLServer::PendingPeer::_parse_request(const Vector p_protocols) {
return true;
}
-Error WSLServer::PendingPeer::do_handshake(const Vector p_protocols, uint64_t p_timeout) {
+Error WSLServer::PendingPeer::do_handshake(const Vector p_protocols, uint64_t p_timeout, const Vector &p_extra_headers) {
if (OS::get_singleton()->get_ticks_msec() - time > p_timeout) {
print_verbose(vformat("WebSocket handshake timed out after %.3f seconds.", p_timeout * 0.001));
return ERR_TIMEOUT;
@@ -149,6 +149,9 @@ Error WSLServer::PendingPeer::do_handshake(const Vector p_protocols, uin
if (protocol != "") {
s += "Sec-WebSocket-Protocol: " + protocol + "\r\n";
}
+ for (int i = 0; i < p_extra_headers.size(); i++) {
+ s += p_extra_headers[i] + "\r\n";
+ }
s += "\r\n";
response = s.utf8();
has_request = true;
@@ -175,6 +178,10 @@ Error WSLServer::PendingPeer::do_handshake(const Vector p_protocols, uin
return OK;
}
+void WSLServer::set_extra_headers(const Vector &p_headers) {
+ _extra_headers = p_headers;
+}
+
Error WSLServer::listen(int p_port, const Vector p_protocols, bool gd_mp_api) {
ERR_FAIL_COND_V(is_listening(), ERR_ALREADY_IN_USE);
@@ -206,7 +213,7 @@ void WSLServer::poll() {
List[> remove_peers;
for (List][>::Element *E = _pending.front(); E; E = E->next()) {
Ref ppeer = E->get();
- Error err = ppeer->do_handshake(_protocols, handshake_timeout);
+ Error err = ppeer->do_handshake(_protocols, handshake_timeout, _extra_headers);
if (err == ERR_BUSY) {
continue;
} else if (err != OK) {
diff --git a/modules/websocket/wsl_server.h b/modules/websocket/wsl_server.h
index dc4d2278f01..edd4dfc925c 100644
--- a/modules/websocket/wsl_server.h
+++ b/modules/websocket/wsl_server.h
@@ -64,7 +64,7 @@ private:
PendingPeer();
- Error do_handshake(const Vector p_protocols, uint64_t p_timeout);
+ Error do_handshake(const Vector p_protocols, uint64_t p_timeout, const Vector &p_extra_headers);
};
int _in_buf_size;
@@ -75,9 +75,11 @@ private:
List][> _pending;
Ref _server;
Vector _protocols;
+ Vector _extra_headers;
public:
Error set_buffers(int p_in_buffer, int p_in_packets, int p_out_buffer, int p_out_packets);
+ void set_extra_headers(const Vector &p_headers);
Error listen(int p_port, const Vector p_protocols = Vector(), bool gd_mp_api = false);
void stop();
bool is_listening() const;
]