@@ -599,4 +599,88 @@ public function setExpectedException($exception, $exceptionMessage = '', $except
599599 parent ::setExpectedException ($ exception , $ exceptionMessage , $ exceptionCode );
600600 }
601601 }
602+
603+ public function testSplitMessagesWithCarriageReturn ()
604+ {
605+ $ deferred = new Deferred ();
606+ $ browser = $ this ->getMockBuilder ('React\Http\Browser ' )->disableOriginalConstructor ()->getMock ();
607+ $ browser ->expects ($ this ->once ())->method ('withRejectErrorResponse ' )->willReturnSelf ();
608+ $ browser ->expects ($ this ->once ())->method ('requestStreaming ' )->willReturn ($ deferred ->promise ());
609+
610+ $ es = new EventSource ('http://example.com ' , $ browser );
611+
612+ $ stream = new ThroughStream ();
613+ $ response = new Response (200 , array ('Content-Type ' => 'text/event-stream ' ), new ReadableBodyStream ($ stream ));
614+ $ deferred ->resolve ($ response );
615+
616+ $ messages = [];
617+ $ es ->on ('message ' , function ($ m ) use (&$ messages ) {
618+ $ messages [] = $ m ;
619+ });
620+
621+ $ stream ->write ("data:hello \r\rdata:hi \r\r" );
622+
623+ $ expected = ['hello ' , 'hi ' ];
624+ $ this ->assertCount (count ($ expected ), $ messages );
625+ foreach ($ messages as $ i => $ message ) {
626+ $ this ->assertInstanceOf ('Clue\React\EventSource\MessageEvent ' , $ message );
627+ $ this ->assertEquals ($ expected [$ i ], $ message ->data );
628+ }
629+ }
630+
631+ public function testSplitMessagesWithWindowsEndOfLineSequence ()
632+ {
633+ $ deferred = new Deferred ();
634+ $ browser = $ this ->getMockBuilder ('React\Http\Browser ' )->disableOriginalConstructor ()->getMock ();
635+ $ browser ->expects ($ this ->once ())->method ('withRejectErrorResponse ' )->willReturnSelf ();
636+ $ browser ->expects ($ this ->once ())->method ('requestStreaming ' )->willReturn ($ deferred ->promise ());
637+
638+ $ es = new EventSource ('http://example.com ' , $ browser );
639+
640+ $ stream = new ThroughStream ();
641+ $ response = new Response (200 , array ('Content-Type ' => 'text/event-stream ' ), new ReadableBodyStream ($ stream ));
642+ $ deferred ->resolve ($ response );
643+
644+ $ messages = [];
645+ $ es ->on ('message ' , function ($ m ) use (&$ messages ) {
646+ $ messages [] = $ m ;
647+ });
648+
649+ $ stream ->write ("data:hello \r\n\r\ndata:hi \r\n\r\n" );
650+
651+ $ expected = ['hello ' , 'hi ' ];
652+ $ this ->assertCount (count ($ expected ), $ messages );
653+ foreach ($ messages as $ i => $ message ) {
654+ $ this ->assertInstanceOf ('Clue\React\EventSource\MessageEvent ' , $ message );
655+ $ this ->assertEquals ($ expected [$ i ], $ message ->data );
656+ }
657+ }
658+
659+ public function testSplitMessagesWithMixedEndOfLine ()
660+ {
661+ $ deferred = new Deferred ();
662+ $ browser = $ this ->getMockBuilder ('React\Http\Browser ' )->disableOriginalConstructor ()->getMock ();
663+ $ browser ->expects ($ this ->once ())->method ('withRejectErrorResponse ' )->willReturnSelf ();
664+ $ browser ->expects ($ this ->once ())->method ('requestStreaming ' )->willReturn ($ deferred ->promise ());
665+
666+ $ es = new EventSource ('http://example.com ' , $ browser );
667+
668+ $ stream = new ThroughStream ();
669+ $ response = new Response (200 , array ('Content-Type ' => 'text/event-stream ' ), new ReadableBodyStream ($ stream ));
670+ $ deferred ->resolve ($ response );
671+
672+ $ messages = [];
673+ $ es ->on ('message ' , function ($ m ) use (&$ messages ) {
674+ $ messages [] = $ m ;
675+ });
676+
677+ $ stream ->write ("data: LF CR \n\rdata: CRLF LF \r\n\ndata: CRLF CR \r\n\rdata: LF CRLF \n\r\ndata: CR CRLF \r\r\n" );
678+
679+ $ expected = ['LF CR ' , 'CRLF LF ' , 'CRLF CR ' , 'LF CRLF ' , 'CR CRLF ' ];
680+ $ this ->assertCount (count ($ expected ), $ messages );
681+ foreach ($ messages as $ i => $ message ) {
682+ $ this ->assertInstanceOf ('Clue\React\EventSource\MessageEvent ' , $ message );
683+ $ this ->assertEquals ($ expected [$ i ], $ message ->data );
684+ }
685+ }
602686}
0 commit comments