Skip to content

"Non-websocket request" in Unity #143

@eqbic

Description

@eqbic

Hello,

I want to implement a websocket server in unity with watson websocket. For this I built watson websocket for .Net Standard 2.1 and imported the dll to unity. Starting the websocket seems to work but as soon as I try to connect with a simple javascript client it says non-websocket request.

Server:

public class TuioWatsonServer : MonoBehaviour
    {
        private readonly WatsonWsServer _server = new();
        private readonly List<Guid> _connections = new();

        private void Awake()
        {
            _server.AcceptInvalidCertificates = true;
            _server.HttpHandler = HttpHandler;
            _server.Logger = Debug.Log;
            _server.Start();
        }

        private void OnEnable()
        {
            _server.ClientConnected += OnClientConnected;
            _server.ClientDisconnected += OnClientDisconnected;
            _server.MessageReceived += OnMessageReceived;
        }

        private void OnDisable()
        {
            _server.ClientConnected -= OnClientConnected;
            _server.ClientDisconnected -= OnClientDisconnected;
            _server.MessageReceived -= OnMessageReceived;
        }

        private void OnClientConnected(object sender, ConnectionEventArgs e)
        {
            _connections.Add(e.Client.Guid);
            Debug.Log($"Client connected: {e.Client}");
        }

        private void OnClientDisconnected(object sender, DisconnectionEventArgs e)
        {
            _connections.Remove(e.Client.Guid);
            Debug.Log($"Client disconnected: {e.Client}");
        }

        private void OnMessageReceived(object sender, MessageReceivedEventArgs e)
        {
            Debug.Log($"Message received from {e.Client} -> {Encoding.UTF8.GetString(e.Data)}");
        }

        

        static void HttpHandler(HttpListenerContext ctx)
        { 
            HttpListenerRequest req = ctx.Request;
            string contents = null;
            using (Stream stream = req.InputStream)
            {
                using (StreamReader readStream = new StreamReader(stream, Encoding.UTF8))
                {
                    contents = readStream.ReadToEnd();
                }
            }

            Debug.Log("Non-websocket request received for: " + req.HttpMethod.ToString() + " " + req.RawUrl);
            if (req.Headers != null && req.Headers.Count > 0)
            {
                Debug.Log("Headers:"); 
                var items = req.Headers.AllKeys.SelectMany(req.Headers.GetValues, (k, v) => new { key = k, value = v });
                foreach (var item in items)
                {
                    Debug.Log($"  {item.key}: {item.value}");
                }
            }

            if (!String.IsNullOrEmpty(contents))
            {
                Debug.Log("Request body:");
                Debug.Log(contents);
            }
        }

        private void OnDestroy()
        {
            _server.Dispose();
        }
    }

Output when connecting:
image

I tried the test.server project and it worked. So this seems to be a unity related problem. Maybe somebody had similar experiences and found a solution.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions