11
11
12
12
namespace Symfony \Component \HttpClient \Internal ;
13
13
14
- use Amp \CancellationToken ;
15
- use Amp \Deferred ;
14
+ use Amp \Cancellation ;
15
+ use Amp \Future ;
16
16
use Amp \Http \Client \Connection \ConnectionLimitingPool ;
17
17
use Amp \Http \Client \Connection \DefaultConnectionFactory ;
18
18
use Amp \Http \Client \InterceptedHttpClient ;
22
22
use Amp \Http \Client \Response ;
23
23
use Amp \Http \Tunnel \Http1TunnelConnector ;
24
24
use Amp \Http \Tunnel \Https1TunnelConnector ;
25
- use Amp \Promise ;
26
25
use Amp \Socket \Certificate ;
27
26
use Amp \Socket \ClientTlsContext ;
28
27
use Amp \Socket \ConnectContext ;
29
- use Amp \Socket \Connector ;
30
- use Amp \Socket \DnsConnector ;
28
+ use Amp \Socket \DnsSocketConnector ;
29
+ use Amp \Socket \Socket ;
31
30
use Amp \Socket \SocketAddress ;
32
- use Amp \Success ;
31
+ use Amp \Socket \ SocketConnector ;
33
32
use Psr \Log \LoggerInterface ;
34
33
35
34
/**
@@ -61,10 +60,7 @@ public function __construct(?callable $clientConfigurator, int $maxHostConnectio
61
60
$ this ->logger = &$ logger ;
62
61
}
63
62
64
- /**
65
- * @return Promise<Response>
66
- */
67
- public function request (array $ options , Request $ request , CancellationToken $ cancellation , array &$ info , \Closure $ onProgress , &$ handle ): Promise
63
+ public function request (array $ options , Request $ request , Cancellation $ cancellation , array &$ info , \Closure $ onProgress , &$ handle ): Response
68
64
{
69
65
if ($ options ['proxy ' ]) {
70
66
if ($ request ->hasHeader ('proxy-authorization ' )) {
@@ -94,22 +90,15 @@ public function request(array $options, Request $request, CancellationToken $can
94
90
}
95
91
96
92
$ request ->addEventListener (new AmpListener ($ info , $ options ['peer_fingerprint ' ]['pin-sha256 ' ] ?? [], $ onProgress , $ handle ));
97
- $ request ->setPushHandler (fn ($ request , $ response ): Promise => $ this ->handlePush ($ request , $ response , $ options ));
93
+ $ request ->setPushHandler (fn ($ request , $ response ) => $ this ->handlePush ($ request , $ response , $ options ));
98
94
99
- ($ request ->hasHeader ('content-length ' ) ? new Success ((int ) $ request ->getHeader ('content-length ' )) : $ request ->getBody ()->getBodyLength ())
100
- ->onResolve (static function ($ e , $ bodySize ) use (&$ info ) {
101
- if (null !== $ bodySize && 0 <= $ bodySize ) {
102
- $ info ['upload_content_length ' ] = ((1 + $ info ['upload_content_length ' ]) ?? 1 ) - 1 + $ bodySize ;
103
- }
104
- });
95
+ if (0 <= $ bodySize = $ request ->hasHeader ('content-length ' ) ? (int ) $ request ->getHeader ('content-length ' ) : $ request ->getBody ()->getContentLength () ?? -1 ) {
96
+ $ info ['upload_content_length ' ] = ((1 + $ info ['upload_content_length ' ]) ?? 1 ) - 1 + $ bodySize ;
97
+ }
105
98
106
99
[$ client , $ connector ] = $ this ->getClient ($ options );
107
100
$ response = $ client ->request ($ request , $ cancellation );
108
- $ response ->onResolve (static function ($ e ) use ($ connector , &$ handle ) {
109
- if (null === $ e ) {
110
- $ handle = $ connector ->handle ;
111
- }
112
- });
101
+ $ handle = $ connector ->handle ;
113
102
114
103
return $ response ;
115
104
}
@@ -142,22 +131,20 @@ private function getClient(array $options): array
142
131
$ options ['ciphers ' ] && $ context = $ context ->withCiphers ($ options ['ciphers ' ]);
143
132
$ options ['capture_peer_cert_chain ' ] && $ context = $ context ->withPeerCapturing ();
144
133
145
- $ connector = $ handleConnector = new class () implements Connector {
134
+ $ connector = $ handleConnector = new class () implements SocketConnector {
146
135
public $ connector ;
147
136
public $ uri ;
148
137
public $ handle ;
149
138
150
- public function connect (string $ uri , ConnectContext $ context = null , CancellationToken $ token = null ): Promise
139
+ public function connect (SocketAddress | string $ uri , ConnectContext $ context = null , Cancellation $ cancellation = null ): Socket
151
140
{
152
- $ result = $ this ->connector ->connect ($ this ->uri ?? $ uri , $ context , $ token );
153
- $ result ->onResolve (function ($ e , $ socket ) {
154
- $ this ->handle = null !== $ socket ? $ socket ->getResource () : false ;
155
- });
141
+ $ socket = $ this ->connector ->connect ($ this ->uri ?? $ uri , $ context , $ cancellation );
142
+ $ this ->handle = null !== $ socket ? $ socket ->getResource () : false ;
156
143
157
- return $ result ;
144
+ return $ socket ;
158
145
}
159
146
};
160
- $ connector ->connector = new DnsConnector (new AmpResolver ($ this ->dnsCache ));
147
+ $ connector ->connector = new DnsSocketConnector (new AmpResolver ($ this ->dnsCache ));
161
148
162
149
$ context = (new ConnectContext ())
163
150
->withTcpNoDelay ()
@@ -190,9 +177,8 @@ public function connect(string $uri, ConnectContext $context = null, Cancellatio
190
177
return $ this ->clients [$ key ] = [($ this ->clientConfigurator )(new PooledHttpClient ($ pool )), $ handleConnector ];
191
178
}
192
179
193
- private function handlePush (Request $ request , Promise $ response , array $ options ): Promise
180
+ private function handlePush (Request $ request , Future $ response , array $ options ): void
194
181
{
195
- $ deferred = new Deferred ();
196
182
$ authority = $ request ->getUri ()->getAuthority ();
197
183
198
184
if ($ this ->maxPendingPushes <= \count ($ this ->pushedResponses [$ authority ] ?? [])) {
@@ -203,13 +189,11 @@ private function handlePush(Request $request, Promise $response, array $options)
203
189
204
190
$ url = (string ) $ request ->getUri ();
205
191
$ this ->logger ?->debug(sprintf ('Queueing pushed response: "%s" ' , $ url ));
206
- $ this ->pushedResponses [$ authority ][] = [$ url , $ deferred , $ request, $ response , [
192
+ $ this ->pushedResponses [$ authority ][] = [$ url , $ response , $ request , [
207
193
'proxy ' => $ options ['proxy ' ],
208
194
'bindto ' => $ options ['bindto ' ],
209
195
'local_cert ' => $ options ['local_cert ' ],
210
196
'local_pk ' => $ options ['local_pk ' ],
211
197
]];
212
-
213
- return $ deferred ->promise ();
214
198
}
215
199
}
0 commit comments