@@ -599,4 +599,117 @@ 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 testSplitMessagesWithBufferedWindowsEndOfLineSequence ()
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:hello \r\n\r" );
678+ $ stream ->write ("\ndata:hi \r\n\r\n" );
679+
680+ $ expected = ['hello ' , 'hi ' ];
681+ $ this ->assertCount (count ($ expected ), $ messages );
682+ foreach ($ messages as $ i => $ message ) {
683+ $ this ->assertInstanceOf ('Clue\React\EventSource\MessageEvent ' , $ message );
684+ $ this ->assertEquals ($ expected [$ i ], $ message ->data );
685+ }
686+ }
687+
688+ public function testSplitMessagesWithMixedEndOfLine ()
689+ {
690+ $ deferred = new Deferred ();
691+ $ browser = $ this ->getMockBuilder ('React\Http\Browser ' )->disableOriginalConstructor ()->getMock ();
692+ $ browser ->expects ($ this ->once ())->method ('withRejectErrorResponse ' )->willReturnSelf ();
693+ $ browser ->expects ($ this ->once ())->method ('requestStreaming ' )->willReturn ($ deferred ->promise ());
694+
695+ $ es = new EventSource ('http://example.com ' , $ browser );
696+
697+ $ stream = new ThroughStream ();
698+ $ response = new Response (200 , array ('Content-Type ' => 'text/event-stream ' ), new ReadableBodyStream ($ stream ));
699+ $ deferred ->resolve ($ response );
700+
701+ $ messages = [];
702+ $ es ->on ('message ' , function ($ m ) use (&$ messages ) {
703+ $ messages [] = $ m ;
704+ });
705+
706+ $ 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" );
707+
708+ $ expected = ['LF CR ' , 'CRLF LF ' , 'CRLF CR ' , 'LF CRLF ' , 'CR CRLF ' ];
709+ $ this ->assertCount (count ($ expected ), $ messages );
710+ foreach ($ messages as $ i => $ message ) {
711+ $ this ->assertInstanceOf ('Clue\React\EventSource\MessageEvent ' , $ message );
712+ $ this ->assertEquals ($ expected [$ i ], $ message ->data );
713+ }
714+ }
602715}
0 commit comments