Skip to content

Commit 01013ff

Browse files
committed
Documentation for connection timeouts and DNS resolution
1 parent 57d2137 commit 01013ff

File tree

1 file changed

+81
-0
lines changed

1 file changed

+81
-0
lines changed

README.md

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ Async HTTP CONNECT proxy connector, use any TCP/IP protocol through an HTTP prox
1111
* [ProxyConnector](#proxyconnector)
1212
* [Plain TCP connections](#plain-tcp-connections)
1313
* [Secure TLS connections](#secure-tls-connections)
14+
* [Connection timeout](#connection-timeout)
15+
* [DNS resolution](#dns-resolution)
1416
* [Advanced secure proxy connections](#advanced-secure-proxy-connections)
1517
* [Install](#install)
1618
* [Tests](#tests)
@@ -186,6 +188,85 @@ $connector->connect('tls://smtp.googlemail.com:465')->then(function (ConnectionI
186188
> Also note how secure TLS connections are in fact entirely handled outside of
187189
this HTTP CONNECT client implementation.
188190

191+
#### Connection timeout
192+
193+
By default, the `ProxyConnector` does not implement any timeouts for establishing remote
194+
connections.
195+
Your underlying operating system may impose limits on pending and/or idle TCP/IP
196+
connections, anywhere in a range of a few minutes to several hours.
197+
198+
Many use cases require more control over the timeout and likely values much
199+
smaller, usually in the range of a few seconds only.
200+
201+
You can use React's [`Connector`](https://github.com/reactphp/socket#connector)
202+
or the low-level
203+
[`TimeoutConnector`](https://github.com/reactphp/socket#timeoutconnector)
204+
to decorate any given `ConnectorInterface` instance.
205+
It provides the same `connect()` method, but will automatically reject the
206+
underlying connection attempt if it takes too long:
207+
208+
```php
209+
$connector = new Connector($loop, array(
210+
'tcp' => $proxy,
211+
'dns' => false,
212+
'timeout' => 3.0
213+
));
214+
215+
$connector->connect('tcp://google.com:80')->then(function ($stream) {
216+
// connection succeeded within 3.0 seconds
217+
});
218+
```
219+
220+
See also any of the [examples](examples).
221+
222+
> Also note how connection timeout is in fact entirely handled outside of this
223+
HTTP CONNECT client implementation.
224+
225+
#### DNS resolution
226+
227+
By default, the `ProxyConnector` does not perform any DNS resolution at all and simply
228+
forwards any hostname you're trying to connect to the remote proxy server.
229+
The remote proxy server is thus responsible for looking up any hostnames via DNS
230+
(this default mode is thus called *remote DNS resolution*).
231+
232+
As an alternative, you can also send the destination IP to the remote proxy
233+
server.
234+
In this mode you either have to stick to using IPs only (which is ofen unfeasable)
235+
or perform any DNS lookups locally and only transmit the resolved destination IPs
236+
(this mode is thus called *local DNS resolution*).
237+
238+
The default *remote DNS resolution* is useful if your local `ProxyConnector` either can
239+
not resolve target hostnames because it has no direct access to the internet or
240+
if it should not resolve target hostnames because its outgoing DNS traffic might
241+
be intercepted.
242+
243+
As noted above, the `ProxyConnector` defaults to using remote DNS resolution.
244+
However, wrapping the `ProxyConnector` in React's
245+
[`Connector`](https://github.com/reactphp/socket#connector) actually
246+
performs local DNS resolution unless explicitly defined otherwise.
247+
Given that remote DNS resolution is assumed to be the preferred mode, all
248+
other examples explicitly disable DNS resoltion like this:
249+
250+
```php
251+
$connector = new Connector($loop, array(
252+
'tcp' => $proxy,
253+
'dns' => false
254+
));
255+
```
256+
257+
If you want to explicitly use *local DNS resolution*, you can use the following code:
258+
259+
```php
260+
// set up Connector which uses Google's public DNS (8.8.8.8)
261+
$connector = Connector($loop, array(
262+
'tcp' => $proxy,
263+
'dns' => '8.8.8.8'
264+
));
265+
```
266+
267+
> Also note how local DNS resolution is in fact entirely handled outside of this
268+
HTTP CONNECT client implementation.
269+
189270
#### Advanced secure proxy connections
190271

191272
Note that communication between the client and the proxy is usually via an

0 commit comments

Comments
 (0)