@@ -663,7 +663,40 @@ describe('WebSocket', () => {
663663      } ) ; 
664664    } ) ; 
665665
666-     it ( 'fails if the Sec-WebSocket-Extensions response header is invalid' ,  ( done )  =>  { 
666+     it ( 'fails if an unexpected Sec-WebSocket-Extensions header is received' ,  ( done )  =>  { 
667+       server . once ( 'upgrade' ,  ( req ,  socket )  =>  { 
668+         const  key  =  crypto 
669+           . createHash ( 'sha1' ) 
670+           . update ( req . headers [ 'sec-websocket-key' ]  +  GUID ) 
671+           . digest ( 'base64' ) ; 
672+ 
673+         socket . end ( 
674+           'HTTP/1.1 101 Switching Protocols\r\n'  + 
675+             'Upgrade: websocket\r\n'  + 
676+             'Connection: Upgrade\r\n'  + 
677+             `Sec-WebSocket-Accept: ${ key }   + 
678+             'Sec-WebSocket-Extensions: foo\r\n'  + 
679+             '\r\n' 
680+         ) ; 
681+       } ) ; 
682+ 
683+       const  ws  =  new  WebSocket ( `ws://localhost:${ server . address ( ) . port }  ,  { 
684+         perMessageDeflate : false 
685+       } ) ; 
686+ 
687+       ws . on ( 'open' ,  ( )  =>  done ( new  Error ( "Unexpected 'open' event" ) ) ) ; 
688+       ws . on ( 'error' ,  ( err )  =>  { 
689+         assert . ok ( err  instanceof  Error ) ; 
690+         assert . strictEqual ( 
691+           err . message , 
692+           'Server sent a Sec-WebSocket-Extensions header but no extension '  + 
693+             'was requested' 
694+         ) ; 
695+         ws . on ( 'close' ,  ( )  =>  done ( ) ) ; 
696+       } ) ; 
697+     } ) ; 
698+ 
699+     it ( 'fails if the Sec-WebSocket-Extensions header is invalid (1/2)' ,  ( done )  =>  { 
667700      server . once ( 'upgrade' ,  ( req ,  socket )  =>  { 
668701        const  key  =  crypto 
669702          . createHash ( 'sha1' ) 
@@ -693,6 +726,97 @@ describe('WebSocket', () => {
693726      } ) ; 
694727    } ) ; 
695728
729+     it ( 'fails if the Sec-WebSocket-Extensions header is invalid (2/2)' ,  ( done )  =>  { 
730+       server . once ( 'upgrade' ,  ( req ,  socket )  =>  { 
731+         const  key  =  crypto 
732+           . createHash ( 'sha1' ) 
733+           . update ( req . headers [ 'sec-websocket-key' ]  +  GUID ) 
734+           . digest ( 'base64' ) ; 
735+ 
736+         socket . end ( 
737+           'HTTP/1.1 101 Switching Protocols\r\n'  + 
738+             'Upgrade: websocket\r\n'  + 
739+             'Connection: Upgrade\r\n'  + 
740+             `Sec-WebSocket-Accept: ${ key }   + 
741+             'Sec-WebSocket-Extensions: '  + 
742+             'permessage-deflate; client_max_window_bits=7\r\n'  + 
743+             '\r\n' 
744+         ) ; 
745+       } ) ; 
746+ 
747+       const  ws  =  new  WebSocket ( `ws://localhost:${ server . address ( ) . port }  ) ; 
748+ 
749+       ws . on ( 'open' ,  ( )  =>  done ( new  Error ( "Unexpected 'open' event" ) ) ) ; 
750+       ws . on ( 'error' ,  ( err )  =>  { 
751+         assert . ok ( err  instanceof  Error ) ; 
752+         assert . strictEqual ( 
753+           err . message , 
754+           'Invalid Sec-WebSocket-Extensions header' 
755+         ) ; 
756+         ws . on ( 'close' ,  ( )  =>  done ( ) ) ; 
757+       } ) ; 
758+     } ) ; 
759+ 
760+     it ( 'fails if an unexpected extension is received (1/2)' ,  ( done )  =>  { 
761+       server . once ( 'upgrade' ,  ( req ,  socket )  =>  { 
762+         const  key  =  crypto 
763+           . createHash ( 'sha1' ) 
764+           . update ( req . headers [ 'sec-websocket-key' ]  +  GUID ) 
765+           . digest ( 'base64' ) ; 
766+ 
767+         socket . end ( 
768+           'HTTP/1.1 101 Switching Protocols\r\n'  + 
769+             'Upgrade: websocket\r\n'  + 
770+             'Connection: Upgrade\r\n'  + 
771+             `Sec-WebSocket-Accept: ${ key }   + 
772+             'Sec-WebSocket-Extensions: foo\r\n'  + 
773+             '\r\n' 
774+         ) ; 
775+       } ) ; 
776+ 
777+       const  ws  =  new  WebSocket ( `ws://localhost:${ server . address ( ) . port }  ) ; 
778+ 
779+       ws . on ( 'open' ,  ( )  =>  done ( new  Error ( "Unexpected 'open' event" ) ) ) ; 
780+       ws . on ( 'error' ,  ( err )  =>  { 
781+         assert . ok ( err  instanceof  Error ) ; 
782+         assert . strictEqual ( 
783+           err . message , 
784+           'Server indicated an extension that was not requested' 
785+         ) ; 
786+         ws . on ( 'close' ,  ( )  =>  done ( ) ) ; 
787+       } ) ; 
788+     } ) ; 
789+ 
790+     it ( 'fails if an unexpected extension is received (2/2)' ,  ( done )  =>  { 
791+       server . once ( 'upgrade' ,  ( req ,  socket )  =>  { 
792+         const  key  =  crypto 
793+           . createHash ( 'sha1' ) 
794+           . update ( req . headers [ 'sec-websocket-key' ]  +  GUID ) 
795+           . digest ( 'base64' ) ; 
796+ 
797+         socket . end ( 
798+           'HTTP/1.1 101 Switching Protocols\r\n'  + 
799+             'Upgrade: websocket\r\n'  + 
800+             'Connection: Upgrade\r\n'  + 
801+             `Sec-WebSocket-Accept: ${ key }   + 
802+             'Sec-WebSocket-Extensions: permessage-deflate,foo\r\n'  + 
803+             '\r\n' 
804+         ) ; 
805+       } ) ; 
806+ 
807+       const  ws  =  new  WebSocket ( `ws://localhost:${ server . address ( ) . port }  ) ; 
808+ 
809+       ws . on ( 'open' ,  ( )  =>  done ( new  Error ( "Unexpected 'open' event" ) ) ) ; 
810+       ws . on ( 'error' ,  ( err )  =>  { 
811+         assert . ok ( err  instanceof  Error ) ; 
812+         assert . strictEqual ( 
813+           err . message , 
814+           'Server indicated an extension that was not requested' 
815+         ) ; 
816+         ws . on ( 'close' ,  ( )  =>  done ( ) ) ; 
817+       } ) ; 
818+     } ) ; 
819+ 
696820    it ( 'fails if server sends a subprotocol when none was requested' ,  ( done )  =>  { 
697821      const  wss  =  new  WebSocket . Server ( {  server } ) ; 
698822
0 commit comments