4
4
5
5
use Http \Client \HttpClient ;
6
6
use 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 ;
13
7
use Psr \Http \Message \RequestInterface ;
14
8
use Psr \Http \Message \ResponseInterface ;
15
- use Psr \Http \Message \StreamInterface ;
16
9
use 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 ;
20
11
21
12
/**
22
13
* Client for the React promise implementation.
23
14
*
24
- * @author Stéphane Hulard <stephane@hlrd.me >
15
+ * @author Stéphane Hulard <s.hulard@chstudio.fr >
25
16
*/
26
17
class Client implements HttpClient, HttpAsyncClient
27
18
{
28
19
/**
29
20
* React HTTP client.
30
21
*
31
- * @var Client
22
+ * @var ReactBrowser
32
23
*/
33
24
private $ client ;
34
25
@@ -39,41 +30,19 @@ class Client implements HttpClient, HttpAsyncClient
39
30
*/
40
31
private $ loop ;
41
32
42
- /**
43
- * @var ResponseFactory
44
- */
45
- private $ responseFactory ;
46
-
47
- /**
48
- * @var StreamFactory
49
- */
50
- private $ streamFactory ;
51
-
52
33
/**
53
34
* 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
59
35
*/
60
36
public function __construct (
61
- ResponseFactory $ responseFactory = null ,
62
37
LoopInterface $ loop = null ,
63
- ReactClient $ client = null ,
64
- StreamFactory $ streamFactory = null
38
+ ReactBrowser $ client = null
65
39
) {
66
40
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 ' );
70
42
}
71
43
72
44
$ this ->loop = $ loop ?: ReactFactory::buildEventLoop ();
73
45
$ this ->client = $ client ?: ReactFactory::buildHttpClient ($ this ->loop );
74
-
75
- $ this ->responseFactory = $ responseFactory ?: MessageFactoryDiscovery::find ();
76
- $ this ->streamFactory = $ streamFactory ?: StreamFactoryDiscovery::find ();
77
46
}
78
47
79
48
/**
@@ -91,91 +60,17 @@ public function sendRequest(RequestInterface $request): ResponseInterface
91
60
*/
92
61
public function sendAsyncRequest (RequestInterface $ request )
93
62
{
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
154
72
);
155
73
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 ;
180
75
}
181
76
}
0 commit comments