SYMBOL: request-socket : (with-http-request) ( request quot: ( chunk -- ) -- response/websocket ) [ swap ?default-proxy request [ |dispose dup request-socket [ [ [ in>> ] [ out>> ] bi [ ?https-tunnel ] with-streams* ] [ out>> [ request get write-request ] with-output-stream* ] [ in>> [ read-response { { [ dup redirect? request get redirects>> 0 > and ] [ request-socket get &dispose drop t ] } { [ dup check-websocket-upgraded? ] [ request-socket get 2array f ] } [ request-socket get &dispose drop [ nip response set ] [ read-response-body ] [ ] 2tri f ] } cond ] with-input-stream* ] tri ] with-variable [ do-redirect ] [ nip ] if ] with-variable ] with-destructors ; inline recursive : http-request* ( request -- response data/stream ) BV{ } clone [ '[ _ push-all ] with-http-request* ] keep over array? [ drop first2 ] [ B{ } like over content-encoding>> decode [ >>body ] keep ] if ; "demo.piesocket.com/v3/1?api_key=oCdCMcMPQpbvNjUIzqtvF1d2X2okWpDQj4AwARJuAgtjhzKxVEjQU6IdCjwm¬ify_self=1" add-websocket-headers http-request* nip [ in>> stream>> ] [ out>> stream>> ] bi [ "hello" f 1 f send-websocket-text [ B handle-websocket ] read-websocket-loop ] with-streams