Browse Source

Added set_extra_headers() to WebSocketServer

(cherry picked from commit fd4341fba46b8e78eea2e7efeae74038f7f55c4b)
Oğuzhan Eroğlu 3 năm trước cách đây
mục cha
commit
ebaca9d432

+ 7 - 0
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]).
 			</description>
 		</method>
+		<method name="set_extra_headers">
+			<return type="void" />
+			<argument index="0" name="headers" type="PoolStringArray" default="PoolStringArray(  )" />
+			<description>
+				Sets additional headers to be sent to clients during the HTTP handshake.
+			</description>
+		</method>
 		<method name="stop">
 			<return type="void" />
 			<description>

+ 3 - 0
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<String> &p_headers) {
+}
+
 Error EMWSServer::listen(int p_port, Vector<String> p_protocols, bool gd_mp_api) {
 	return FAILED;
 }

+ 1 - 0
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<String> &p_headers);
 	Error listen(int p_port, Vector<String> p_protocols = Vector<String>(), bool gd_mp_api = false);
 	void stop();
 	bool is_listening() const;

+ 1 - 0
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<String>()));
 	ClassDB::bind_method(D_METHOD("listen", "port", "protocols", "gd_mp_api"), &WebSocketServer::listen, DEFVAL(Vector<String>()), DEFVAL(false));
 	ClassDB::bind_method(D_METHOD("stop"), &WebSocketServer::stop);
 	ClassDB::bind_method(D_METHOD("has_peer", "id"), &WebSocketServer::has_peer);

+ 1 - 0
modules/websocket/websocket_server.h

@@ -52,6 +52,7 @@ protected:
 
 public:
 	virtual void poll() = 0;
+	virtual void set_extra_headers(const Vector<String> &p_headers) = 0;
 	virtual Error listen(int p_port, const Vector<String> p_protocols = Vector<String>(), bool gd_mp_api = false) = 0;
 	virtual void stop() = 0;
 	virtual bool is_listening() const = 0;

+ 9 - 2
modules/websocket/wsl_server.cpp

@@ -104,7 +104,7 @@ bool WSLServer::PendingPeer::_parse_request(const Vector<String> p_protocols) {
 	return true;
 }
 
-Error WSLServer::PendingPeer::do_handshake(const Vector<String> p_protocols, uint64_t p_timeout) {
+Error WSLServer::PendingPeer::do_handshake(const Vector<String> p_protocols, uint64_t p_timeout, const Vector<String> &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<String> 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<String> p_protocols, uin
 	return OK;
 }
 
+void WSLServer::set_extra_headers(const Vector<String> &p_headers) {
+	_extra_headers = p_headers;
+}
+
 Error WSLServer::listen(int p_port, const Vector<String> p_protocols, bool gd_mp_api) {
 	ERR_FAIL_COND_V(is_listening(), ERR_ALREADY_IN_USE);
 
@@ -206,7 +213,7 @@ void WSLServer::poll() {
 	List<Ref<PendingPeer>> remove_peers;
 	for (List<Ref<PendingPeer>>::Element *E = _pending.front(); E; E = E->next()) {
 		Ref<PendingPeer> 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) {

+ 3 - 1
modules/websocket/wsl_server.h

@@ -64,7 +64,7 @@ private:
 
 		PendingPeer();
 
-		Error do_handshake(const Vector<String> p_protocols, uint64_t p_timeout);
+		Error do_handshake(const Vector<String> p_protocols, uint64_t p_timeout, const Vector<String> &p_extra_headers);
 	};
 
 	int _in_buf_size;
@@ -75,9 +75,11 @@ private:
 	List<Ref<PendingPeer>> _pending;
 	Ref<TCP_Server> _server;
 	Vector<String> _protocols;
+	Vector<String> _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<String> &p_headers);
 	Error listen(int p_port, const Vector<String> p_protocols = Vector<String>(), bool gd_mp_api = false);
 	void stop();
 	bool is_listening() const;