6
6
use Psr \Http \Message \ResponseInterface ;
7
7
use React \EventLoop \LoopInterface ;
8
8
use React \Http \Client \Client as HttpClient ;
9
- use React \Http \Client \UpgradedResponse ;
10
9
use React \Promise \PromiseInterface ;
11
10
use React \Promise \Deferred ;
12
11
use React \Socket \Connector ;
13
- use React \Socket \ConnectionInterface ;
14
12
use React \Socket \ConnectorInterface ;
15
- use React \Stream \DuplexStreamInterface ;
16
13
use React \Stream \ReadableStreamInterface ;
17
14
18
15
/**
@@ -77,17 +74,36 @@ public function __construct(HttpClient $http)
77
74
*
78
75
* @internal
79
76
* @param RequestInterface $request
80
- * @param bool $upgrade Configures the sender to listen for upgrade
81
- * @return PromiseInterface Promise<ResponseInterface, ConnectionInterface, Exception>
77
+ * @return PromiseInterface Promise<ResponseInterface, Exception>
82
78
*/
83
- public function send (RequestInterface $ request, $ upgrade = false )
79
+ public function send (RequestInterface $ request )
84
80
{
85
81
// support HTTP/1.1 and HTTP/1.0 only, ensured by `Browser` already
86
82
assert (\in_array ($ request ->getProtocolVersion (), array ('1.0 ' , '1.1 ' ), true ));
87
83
88
84
$ body = $ request ->getBody ();
85
+ $ size = $ body ->getSize ();
86
+
87
+ if ($ size !== null && $ size !== 0 ) {
88
+ // automatically assign a "Content-Length" request header if the body size is known and non-empty
89
+ $ request = $ request ->withHeader ('Content-Length ' , (string )$ size );
90
+ } elseif ($ size === 0 && \in_array ($ request ->getMethod (), array ('POST ' , 'PUT ' , 'PATCH ' ))) {
91
+ // only assign a "Content-Length: 0" request header if the body is expected for certain methods
92
+ $ request = $ request ->withHeader ('Content-Length ' , '0 ' );
93
+ } elseif ($ body instanceof ReadableStreamInterface && $ body ->isReadable () && !$ request ->hasHeader ('Content-Length ' )) {
94
+ // use "Transfer-Encoding: chunked" when this is a streaming body and body size is unknown
95
+ $ request = $ request ->withHeader ('Transfer-Encoding ' , 'chunked ' );
96
+ } else {
97
+ // do not use chunked encoding if size is known or if this is an empty request body
98
+ $ size = 0 ;
99
+ }
100
+
101
+ // automatically add `Authorization: Basic …` request header if URL includes `user:pass@host`
102
+ if ($ request ->getUri ()->getUserInfo () !== '' && !$ request ->hasHeader ('Authorization ' )) {
103
+ $ request = $ request ->withHeader ('Authorization ' , 'Basic ' . \base64_encode ($ request ->getUri ()->getUserInfo ()));
104
+ }
89
105
90
- list ( $ size , $ requestStream) = $ this ->createRequestStream ($ request );
106
+ $ requestStream = $ this ->http -> request ($ request );
91
107
92
108
$ deferred = new Deferred (function ($ _ , $ reject ) use ($ requestStream ) {
93
109
// close request stream if request is cancelled
@@ -103,16 +119,6 @@ public function send(RequestInterface $request, $upgrade = false)
103
119
$ deferred ->resolve ($ response );
104
120
});
105
121
106
- /**
107
- * We listen for an upgrade, if the request was upgraded, we will hijack it and resolve immediately
108
- * This is useful for websocket connections that requires an HTTP Upgrade.
109
- */
110
- if ($ upgrade ) {
111
- $ requestStream ->on ('upgrade ' , function (DuplexStreamInterface $ socket , ResponseInterface $ response ) use ($ request , $ deferred ) {
112
- $ deferred ->resolve (new UpgradedResponse ($ socket , $ response , $ request ));
113
- });
114
- }
115
-
116
122
if ($ body instanceof ReadableStreamInterface) {
117
123
if ($ body ->isReadable ()) {
118
124
// length unknown => apply chunked transfer-encoding
@@ -148,31 +154,4 @@ public function send(RequestInterface $request, $upgrade = false)
148
154
149
155
return $ deferred ->promise ();
150
156
}
151
-
152
- protected function createRequestStream (RequestInterface $ request )
153
- {
154
- $ body = $ request ->getBody ();
155
- $ size = $ body ->getSize ();
156
-
157
- if ($ size !== null && $ size !== 0 ) {
158
- // automatically assign a "Content-Length" request header if the body size is known and non-empty
159
- $ request = $ request ->withHeader ('Content-Length ' , (string )$ size );
160
- } elseif ($ size === 0 && \in_array ($ request ->getMethod (), array ('POST ' , 'PUT ' , 'PATCH ' ))) {
161
- // only assign a "Content-Length: 0" request header if the body is expected for certain methods
162
- $ request = $ request ->withHeader ('Content-Length ' , '0 ' );
163
- } elseif ($ body instanceof ReadableStreamInterface && $ body ->isReadable () && !$ request ->hasHeader ('Content-Length ' )) {
164
- // use "Transfer-Encoding: chunked" when this is a streaming body and body size is unknown
165
- $ request = $ request ->withHeader ('Transfer-Encoding ' , 'chunked ' );
166
- } else {
167
- // do not use chunked encoding if size is known or if this is an empty request body
168
- $ size = 0 ;
169
- }
170
-
171
- // automatically add `Authorization: Basic …` request header if URL includes `user:pass@host`
172
- if ($ request ->getUri ()->getUserInfo () !== '' && !$ request ->hasHeader ('Authorization ' )) {
173
- $ request = $ request ->withHeader ('Authorization ' , 'Basic ' . \base64_encode ($ request ->getUri ()->getUserInfo ()));
174
- }
175
-
176
- return array ($ size , $ this ->http ->request ($ request ));
177
- }
178
157
}
0 commit comments