44
55use Http \Client \HttpClient ;
66use Http \Client \HttpAsyncClient ;
7- use Http \Client \Exception \HttpException ;
8- use Http \Client \Exception \RequestException ;
9- use Http \Discovery \MessageFactoryDiscovery ;
10- use Http \Discovery \StreamFactoryDiscovery ;
11- use Http \Message \ResponseFactory ;
12- use Http \Message \StreamFactory ;
137use Psr \Http \Message \RequestInterface ;
148use Psr \Http \Message \ResponseInterface ;
15- use Psr \Http \Message \StreamInterface ;
169use React \EventLoop \LoopInterface ;
17- use React \HttpClient \Client as ReactClient ;
18- use React \HttpClient \Request as ReactRequest ;
19- use React \HttpClient \Response as ReactResponse ;
10+ use React \Http \Browser as ReactBrowser ;
2011
2112/**
2213 * Client for the React promise implementation.
2314 *
24- * @author Stéphane Hulard <[email protected] > 15+ * @author Stéphane Hulard <[email protected] > 2516 */
2617class Client implements HttpClient, HttpAsyncClient
2718{
2819 /**
2920 * React HTTP client.
3021 *
31- * @var Client
22+ * @var ReactBrowser
3223 */
3324 private $ client ;
3425
@@ -39,41 +30,19 @@ class Client implements HttpClient, HttpAsyncClient
3930 */
4031 private $ loop ;
4132
42- /**
43- * @var ResponseFactory
44- */
45- private $ responseFactory ;
46-
47- /**
48- * @var StreamFactory
49- */
50- private $ streamFactory ;
51-
5233 /**
5334 * Initialize the React client.
54- *
55- * @param ResponseFactory|null $responseFactory
56- * @param LoopInterface|null $loop
57- * @param ReactClient|null $client
58- * @param StreamFactory|null $streamFactory
5935 */
6036 public function __construct (
61- ResponseFactory $ responseFactory = null ,
6237 LoopInterface $ loop = null ,
63- ReactClient $ client = null ,
64- StreamFactory $ streamFactory = null
38+ ReactBrowser $ client = null
6539 ) {
6640 if (null !== $ client && null === $ loop ) {
67- throw new \RuntimeException (
68- 'You must give a LoopInterface instance with the Client '
69- );
41+ throw new \RuntimeException ('You must give a LoopInterface instance with the Client ' );
7042 }
7143
7244 $ this ->loop = $ loop ?: ReactFactory::buildEventLoop ();
7345 $ this ->client = $ client ?: ReactFactory::buildHttpClient ($ this ->loop );
74-
75- $ this ->responseFactory = $ responseFactory ?: MessageFactoryDiscovery::find ();
76- $ this ->streamFactory = $ streamFactory ?: StreamFactoryDiscovery::find ();
7746 }
7847
7948 /**
@@ -91,91 +60,17 @@ public function sendRequest(RequestInterface $request): ResponseInterface
9160 */
9261 public function sendAsyncRequest (RequestInterface $ request )
9362 {
94- $ reactRequest = $ this ->buildReactRequest ($ request );
95- $ promise = new Promise ($ this ->loop );
96-
97- $ reactRequest ->on ('error ' , function (\Exception $ error ) use ($ promise , $ request ) {
98- $ promise ->reject (new RequestException (
99- $ error ->getMessage (),
100- $ request ,
101- $ error
102- ));
103- });
104-
105- $ reactRequest ->on ('response ' , function (ReactResponse $ reactResponse = null ) use ($ promise , $ request ) {
106- $ bodyStream = $ this ->streamFactory ->createStream ();
107- $ reactResponse ->on ('data ' , function ($ data ) use (&$ bodyStream ) {
108- $ bodyStream ->write ((string ) $ data );
109- });
110-
111- $ reactResponse ->on ('end ' , function (\Exception $ error = null ) use ($ promise , $ request , $ reactResponse , &$ bodyStream ) {
112- $ response = $ this ->buildResponse (
113- $ reactResponse ,
114- $ bodyStream
115- );
116- if (null !== $ error ) {
117- $ promise ->reject (new HttpException (
118- $ error ->getMessage (),
119- $ request ,
120- $ response ,
121- $ error
122- ));
123- } else {
124- $ promise ->resolve ($ response );
125- }
126- });
127- });
128-
129- $ reactRequest ->end ((string ) $ request ->getBody ());
130-
131- return $ promise ;
132- }
133-
134- /**
135- * Build a React request from the PSR7 RequestInterface.
136- *
137- * @param RequestInterface $request
138- *
139- * @return ReactRequest
140- */
141- private function buildReactRequest (RequestInterface $ request )
142- {
143- $ headers = [];
144-
145- foreach ($ request ->getHeaders () as $ name => $ value ) {
146- $ headers [$ name ] = (is_array ($ value ) ? $ value [0 ] : $ value );
147- }
148-
149- $ reactRequest = $ this ->client ->request (
150- $ request ->getMethod (),
151- (string ) $ request ->getUri (),
152- $ headers ,
153- $ request ->getProtocolVersion ()
63+ $ promise = new Promise (
64+ $ this ->client ->request (
65+ $ request ->getMethod (),
66+ $ request ->getUri (),
67+ $ request ->getHeaders (),
68+ $ request ->getBody ()
69+ ),
70+ $ this ->loop ,
71+ $ request
15472 );
15573
156- return $ reactRequest ;
157- }
158-
159- /**
160- * Transform a React Response to a valid PSR7 ResponseInterface instance.
161- *
162- * @param ReactResponse $response
163- * @param StreamInterface $body
164- *
165- * @return ResponseInterface
166- */
167- private function buildResponse (
168- ReactResponse $ response ,
169- StreamInterface $ body
170- ) {
171- $ body ->rewind ();
172-
173- return $ this ->responseFactory ->createResponse (
174- $ response ->getCode (),
175- $ response ->getReasonPhrase (),
176- $ response ->getHeaders (),
177- $ body ,
178- $ response ->getVersion ()
179- );
74+ return $ promise ;
18075 }
18176}
0 commit comments