@@ -295,7 +295,7 @@ public function getRequestHandshake(
295295 throw new InvalidArgumentException ('You must supply a URI, key and origin ' );
296296 }
297297
298- list ($ host , $ port , $ path ) = self ::validateUri ($ uri );
298+ list ($ scheme , $ host , $ port , $ path ) = self ::validateUri ($ uri );
299299
300300 $ handshake = array (
301301 sprintf (self ::REQUEST_LINE_FORMAT , $ path )
@@ -311,7 +311,6 @@ public function getRequestHandshake(
311311 foreach ($ headers as $ name => $ value ) {
312312 $ handshake [] = sprintf (self ::HEADER_LINE_FORMAT , $ name , $ value );
313313 }
314-
315314 return implode ($ handshake , "\r\n" ) . "\r\n\r\n" ;
316315 }
317316
@@ -662,13 +661,11 @@ protected function getHeaders($response, &$request_line = null)
662661 $ return = array ();
663662 foreach (explode ("\r\n" , $ headers ) as $ header ) {
664663 $ parts = explode (': ' , $ header , 2 );
665-
666- if ( count ( $ parts ) != 2 ) {
667- throw new InvalidArgumentException ( ' Invalid header ' ) ;
664+ if ( count ( $ parts ) == 2 ) {
665+ list ( $ name , $ value ) = $ parts ;
666+ $ return [ $ name ] = $ value ;
668667 }
669668
670- list ($ name , $ value ) = $ parts ;
671- $ return [$ name ] = $ value ;
672669 }
673670
674671 return $ return ;
@@ -735,7 +732,7 @@ protected function getDefaultRequestHeaders($host, $key, $origin)
735732 self ::HEADER_HOST => $ host ,
736733 self ::HEADER_UPGRADE => self ::UPGRADE_VALUE ,
737734 self ::HEADER_CONNECTION => self ::CONNECTION_VALUE ,
738- self ::HEADER_KEY => $ this ->encodeKey ($ key ),
735+ self ::HEADER_KEY => $ key , //$ this->encodeKey($key),
739736 self ::HEADER_ORIGIN => $ origin ,
740737 self ::HEADER_VERSION => $ this ->getVersion ()
741738 );
@@ -779,4 +776,90 @@ protected function getPort($scheme)
779776 throw new InvalidArgumentException ('Unknown websocket scheme ' );
780777 }
781778 }
779+
780+ public function encode ($ payload , $ type = 'text ' , $ masked = true )
781+ {
782+ $ frameHead = array ();
783+ $ frame = '' ;
784+ $ payloadLength = strlen ($ payload );
785+
786+ switch ($ type )
787+ {
788+ case 'text ' :
789+ // first byte indicates FIN, Text-Frame (10000001):
790+ $ frameHead [0 ] = 129 ;
791+ break ;
792+
793+ case 'close ' :
794+ // first byte indicates FIN, Close Frame(10001000):
795+ $ frameHead [0 ] = 136 ;
796+ break ;
797+
798+ case 'ping ' :
799+ // first byte indicates FIN, Ping frame (10001001):
800+ $ frameHead [0 ] = 137 ;
801+ break ;
802+
803+ case 'pong ' :
804+ // first byte indicates FIN, Pong frame (10001010):
805+ $ frameHead [0 ] = 138 ;
806+ break ;
807+ }
808+
809+ // set mask and payload length (using 1, 3 or 9 bytes)
810+ if ($ payloadLength > 65535 )
811+ {
812+ $ payloadLengthBin = str_split (sprintf ('%064b ' , $ payloadLength ), 8 );
813+ $ frameHead [1 ] = ($ masked === true ) ? 255 : 127 ;
814+ for ($ i = 0 ; $ i < 8 ; $ i ++)
815+ {
816+ $ frameHead [$ i +2 ] = bindec ($ payloadLengthBin [$ i ]);
817+ }
818+ // most significant bit MUST be 0 (close connection if frame too big)
819+ if ($ frameHead [2 ] > 127 )
820+ {
821+ $ this ->close (1004 );
822+ return false ;
823+ }
824+ }
825+ elseif ($ payloadLength > 125 )
826+ {
827+ $ payloadLengthBin = str_split (sprintf ('%016b ' , $ payloadLength ), 8 );
828+ $ frameHead [1 ] = ($ masked === true ) ? 254 : 126 ;
829+ $ frameHead [2 ] = bindec ($ payloadLengthBin [0 ]);
830+ $ frameHead [3 ] = bindec ($ payloadLengthBin [1 ]);
831+ }
832+ else
833+ {
834+ $ frameHead [1 ] = ($ masked === true ) ? $ payloadLength + 128 : $ payloadLength ;
835+ }
836+
837+ // convert frame-head to string:
838+ foreach (array_keys ($ frameHead ) as $ i )
839+ {
840+ $ frameHead [$ i ] = chr ($ frameHead [$ i ]);
841+ }
842+ if ($ masked === true )
843+ {
844+ // generate a random mask:
845+ $ mask = array ();
846+ for ($ i = 0 ; $ i < 4 ; $ i ++)
847+ {
848+ $ mask [$ i ] = chr (rand (0 , 255 ));
849+ }
850+
851+ $ frameHead = array_merge ($ frameHead , $ mask );
852+ }
853+ $ frame = implode ('' , $ frameHead );
854+
855+ // append payload to frame:
856+ $ framePayload = array ();
857+ for ($ i = 0 ; $ i < $ payloadLength ; $ i ++)
858+ {
859+ $ frame .= ($ masked === true ) ? $ payload [$ i ] ^ $ mask [$ i % 4 ] : $ payload [$ i ];
860+ }
861+
862+ return $ frame ;
863+ }
864+
782865}
0 commit comments