@@ -684,6 +684,39 @@ test("createServer: includes headers from web socket upgrade response", async (t
684684 t . not ( req . headers [ "sec-websocket-accept" ] , ":(" ) ;
685685 t . deepEqual ( req . headers [ "set-cookie" ] , [ "key=value" ] ) ;
686686} ) ;
687+ test ( "createServer: handles web socket upgrade response with Sec-WebSocket-Protocol header" , async ( t ) => {
688+ // https://github.com/cloudflare/miniflare/issues/179
689+ const mf = useMiniflareWithHandler (
690+ { HTTPPlugin, WebSocketPlugin } ,
691+ { } ,
692+ async ( globals ) => {
693+ const [ client , worker ] = Object . values ( new globals . WebSocketPair ( ) ) ;
694+ worker . accept ( ) ;
695+ worker . addEventListener ( "message" , ( e : MessageEvent ) => {
696+ worker . send ( `worker:${ e . data } ` ) ;
697+ } ) ;
698+ return new globals . Response ( null , {
699+ status : 101 ,
700+ webSocket : client ,
701+ headers : { "Sec-WebSocket-Protocol" : "protocol2" } ,
702+ } ) ;
703+ }
704+ ) ;
705+ const port = await listen ( t , await createServer ( mf ) ) ;
706+
707+ const ws = new StandardWebSocket ( `ws://localhost:${ port } ` , [
708+ "protocol1" ,
709+ "protocol2" ,
710+ "protocol3" ,
711+ ] ) ;
712+ ws . addListener ( "upgrade" , ( req ) => {
713+ t . is ( req . headers [ "sec-websocket-protocol" ] , "protocol2" ) ;
714+ } ) ;
715+ const [ eventTrigger , eventPromise ] = triggerPromise < Data > ( ) ;
716+ ws . addEventListener ( "message" , ( e ) => eventTrigger ( e . data ) ) ;
717+ ws . addEventListener ( "open" , ( ) => ws . send ( "hello" ) ) ;
718+ t . is ( await eventPromise , "worker:hello" ) ;
719+ } ) ;
687720test ( "createServer: expects status 101 and web socket response for successful upgrades" , async ( t ) => {
688721 const log = new TestLog ( ) ;
689722 log . error = ( message ) => log . logWithLevel ( LogLevel . ERROR , message . toString ( ) ) ;
0 commit comments