DEFER: (with-http-request) +DEFER: start-websocket SYMBOL: redirects @@ -128,6 +129,15 @@ SYMBOL: redirects quot (with-http-request) ] [ too-many-redirects ] if ; inline recursive +:: do-redirect-websocket ( response -- response ) + redirects inc + redirects get request get redirects>> < [ + request get clone + response "location" header redirect-url + response code>> 307 = [ "GET" >>method f >>post-data ] unless + start-websocket + ] [ too-many-redirects ] if ; inline recursive + : read-chunk-size ( -- n ) read-crlf ";" split1 drop [ blank? ] trim-tail hex> [ "Bad chunk size" throw ] unless* ; @@ -245,6 +255,41 @@ SYMBOL: redirects [ do-redirect ] [ nip ] if ] with-variable ; inline recursive +TUPLE: websocket response stream ; + +: ( response stream -- websocket ) + websocket new + swap >>stream + swap >>response ; inline + +: start-websocket ( request -- websocket ) + ?default-proxy + request [ + [ + |dispose + [ + [ + [ in>> ] [ out>> ] bi + [ ?https-tunnel ] with-streams* + ] + [ + out>> + [ request get write-request ] + with-output-stream* + ] [ + in>> [ + read-response + dup response set + dup redirect? + request get redirects>> 0 > and + [ response get t ] [ f f ] if + ] with-input-stream* + ] tri + ] keep -rot + ] with-destructors + [ swap dispose do-redirect-websocket ] [ nip ] if + ] with-variable ; inline recursive +