tonyg / racket-rfc6455

RFC 6455 WebSockets support for Racket.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

read error (after closing connections)

bdeket opened this issue · comments

Hi,
I was trying to implement an echo server, but I seem unable to handle closed connections gracefully.

How would I go about this so it doesn't emit errors?
trying to catch/handle the errors here doesn't seem to work
(maybe because the error happens in a different thread with a different custodian?)

#lang racket/base

(require net/rfc6455
         net/url)

;echo server
(struct con (nam nec evt))
(define connections #hash())
(define (add-connection c)
  (define name (gensym 'connection))
  (set! connections (hash-set connections name (con name c (ws-recv-evt c)))))
(define (remove-connection name)
  (set! connections (hash-remove connections name)))

;new connections
(define stop-server
  (ws-serve* #:port 8081
             (ws-service-mapper
              ["/echo"
               [(#f) (λ (c) (add-connection c))]])))

;echo on message
(thread
 (λ()
   (let loop ()
     (for ([(n nne) (in-hash connections)])
       (define c (con-nec nne))
       (define e (con-evt nne))
       (println (list (ws-conn-closed? c)(ws-conn-close-status c)(ws-conn-close-reason c)))
       (cond
         [(sync/timeout 0.01 e)
          =>
          (λ (msg)
            (printf "server received: ~a\n" msg)
            (cond
              [(eof-object? msg)(ws-close! c)(remove-connection n)]
              [else (ws-send! c msg)]))]))
     (sleep .1)
     (loop))))

;test
(sleep 1)
(thread
 (λ ()
   (define c (ws-connect (string->url "ws://127.0.0.1:8081/echo")))
   (ws-send! c "test")
   (printf "client received: ~a\n"(ws-recv c))
   (sleep 1)
   (ws-close! c)))

The same error happens when I close the port from the browser, or if I reload the page in the browser.

Kr.
Bert

I get the same issue. haven't tried the fix yet. I seem to get different message text each time.

I've tried 2 websocket clients:

  • Chrome V96 on macOS
  • wscat terminal client 5.1.0 from npm

Here are some sample logs

Running server
read-request: malformed request #"\210\202\226\0\20B\225\351"
  context...:
   /Applications/Racket v7.6/share/pkgs/web-server-lib/web-server/private/util.rkt:48:0: network-error
   ...ow-val-first.rkt:486:18
   .../more-scheme.rkt:261:28
   /Applications/Racket v7.6/collects/racket/contract/private/arrow-higher-order.rkt:375:33
   /Applications/Racket v7.6/share/pkgs/web-server-lib/web-server/private/dispatch-server-with-connect-unit.rkt:144:4: connection-loop
read-request: malformed request #"\210\202\365\335\207D\3664"
  context...:
   /Applications/Racket v7.6/share/pkgs/web-server-lib/web-server/private/util.rkt:48:0: network-error
   ...ow-val-first.rkt:486:18
   .../more-scheme.rkt:261:28
   /Applications/Racket v7.6/collects/racket/contract/private/arrow-higher-order.rkt:375:33
   /Applications/Racket v7.6/share/pkgs/web-server-lib/web-server/private/dispatch-server-with-connect-unit.rkt:144:4: connection-loop
read-request: malformed request #"\210\202\267\243\343q\264J"
  context...:
   /Applications/Racket v7.6/share/pkgs/web-server-lib/web-server/private/util.rkt:48:0: network-error
   ...ow-val-first.rkt:486:18
   .../more-scheme.rkt:261:28
   /Applications/Racket v7.6/collects/racket/contract/private/arrow-higher-order.rkt:375:33
   /Applications/Racket v7.6/share/pkgs/web-server-lib/web-server/private/dispatch-server-with-connect-unit.rkt:144:4: connection-loop
read-request: malformed request #"\210\202s\n\372\220p\343"
  context...:
   /Applications/Racket v7.6/share/pkgs/web-server-lib/web-server/private/util.rkt:48:0: network-error
   ...ow-val-first.rkt:486:18
   .../more-scheme.rkt:261:28
   /Applications/Racket v7.6/collects/racket/contract/private/arrow-higher-order.rkt:375:33
   /Applications/Racket v7.6/share/pkgs/web-server-lib/web-server/private/dispatch-server-with-connect-unit.rkt:144:4: connection-loop

The ws server code is this basic script

#lang racket/base
(require net/rfc6455)

(define (handle c _)
  (ws-send! c "Hello, world!"))

(void (thread (lambda ()
                (ws-serve #:port 8081 handle)
                (displayln "Running server"))))

(thread-receive)
(displayln "Exiting")

This seems solved (doesn't throw errors anymore)