You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-11 13:10:58 +00:00
Expose the resource name the client used to the websocket server
This information is exposed to the websocket server through the client_connected-signal. example.com/chat?id=10 gives the resource name "/chat?id=10"
This commit is contained in:
@@ -34,7 +34,7 @@
|
||||
#include "core/config/project_settings.h"
|
||||
#include "core/os/os.h"
|
||||
|
||||
bool WSLServer::PendingPeer::_parse_request(const Vector<String> p_protocols) {
|
||||
bool WSLServer::PendingPeer::_parse_request(const Vector<String> p_protocols, String &r_resource_name) {
|
||||
Vector<String> psa = String((char *)req_buf).split("\r\n");
|
||||
int len = psa.size();
|
||||
ERR_FAIL_COND_V_MSG(len < 4, false, "Not enough response headers, got: " + itos(len) + ", expected >= 4.");
|
||||
@@ -45,6 +45,7 @@ bool WSLServer::PendingPeer::_parse_request(const Vector<String> p_protocols) {
|
||||
// Wrong protocol
|
||||
ERR_FAIL_COND_V_MSG(req[0] != "GET" || req[2] != "HTTP/1.1", false, "Invalid method or HTTP version.");
|
||||
|
||||
r_resource_name = req[1];
|
||||
Map<String, String> headers;
|
||||
for (int i = 1; i < len; i++) {
|
||||
Vector<String> header = psa[i].split(":", false, 1);
|
||||
@@ -95,7 +96,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, String &r_resource_name) {
|
||||
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;
|
||||
@@ -130,7 +131,7 @@ Error WSLServer::PendingPeer::do_handshake(const Vector<String> p_protocols, uin
|
||||
int l = req_pos;
|
||||
if (l > 3 && r[l] == '\n' && r[l - 1] == '\r' && r[l - 2] == '\n' && r[l - 3] == '\r') {
|
||||
r[l - 3] = '\0';
|
||||
if (!_parse_request(p_protocols)) {
|
||||
if (!_parse_request(p_protocols, r_resource_name)) {
|
||||
return FAILED;
|
||||
}
|
||||
String s = "HTTP/1.1 101 Switching Protocols\r\n";
|
||||
@@ -196,8 +197,9 @@ void WSLServer::poll() {
|
||||
|
||||
List<Ref<PendingPeer>> remove_peers;
|
||||
for (List<Ref<PendingPeer>>::Element *E = _pending.front(); E; E = E->next()) {
|
||||
String resource_name;
|
||||
Ref<PendingPeer> ppeer = E->get();
|
||||
Error err = ppeer->do_handshake(_protocols, handshake_timeout);
|
||||
Error err = ppeer->do_handshake(_protocols, handshake_timeout, resource_name);
|
||||
if (err == ERR_BUSY) {
|
||||
continue;
|
||||
} else if (err != OK) {
|
||||
@@ -220,7 +222,7 @@ void WSLServer::poll() {
|
||||
|
||||
_peer_map[id] = ws_peer;
|
||||
remove_peers.push_back(ppeer);
|
||||
_on_connect(id, ppeer->protocol);
|
||||
_on_connect(id, ppeer->protocol, resource_name);
|
||||
}
|
||||
for (List<Ref<PendingPeer>>::Element *E = remove_peers.front(); E; E = E->next()) {
|
||||
_pending.erase(E->get());
|
||||
|
||||
Reference in New Issue
Block a user