@@ -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 } \r\n` +
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 } \r\n` +
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 } \r\n` +
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 } \r\n` +
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