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)