@@ -663,7 +663,40 @@ describe('WebSocket', () => {
663
663
} ) ;
664
664
} ) ;
665
665
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 ) => {
667
700
server . once ( 'upgrade' , ( req , socket ) => {
668
701
const key = crypto
669
702
. createHash ( 'sha1' )
@@ -693,6 +726,97 @@ describe('WebSocket', () => {
693
726
} ) ;
694
727
} ) ;
695
728
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
+
696
820
it ( 'fails if server sends a subprotocol when none was requested' , ( done ) => {
697
821
const wss = new WebSocket . Server ( { server } ) ;
698
822
0 commit comments