NAME
AnyEvent::Connector - tcp_connect with transparent proxy handling
SYNOPSIS
use AnyEvent::Connector;## Specify the proxy setting explicitly.my $c = AnyEvent::Connector->new(proxy => 'http://proxy.example.com:8080',no_proxy => ['localhost', 'your-internal-domain.net']);## Proxy setting from "http_proxy" and "no_proxy" environment variables.my $cenv = AnyEvent::Connector->new(env_proxy => "http",);## Same API as AnyEvent::Socket::tcp_connectmy $guard = $c->tcp_connect("target.hogehoge.org", 80,sub {## connect callbackmy ($fh ,$host, $port, $retry) = @_;...;},sub {## prepare calbackmy ($fh) = @_;...;});
DESCRIPTION
AnyEvent::Connector object has "tcp_connect" method compatible with that from AnyEvent::Socket, and it handles proxy settings transparently.
CLASS METHODS
$conn = AnyEvent::Connector->new(%args)
The constructor.
Fields in %args are:
- "proxy" => STR (optional)
-
String of proxy URL. Currently only
"http"proxy is supported.If both
"proxy"and"env_proxy"are not specified, the$connwill directly connect to the destination host.If both
"proxy"and"env_proxy"are specified, setting by"proxy"is used.Setting empty string to
"proxy"disables the proxy setting done by"env_proxy"option.
- "no_proxy" => STR or ARRAYREF of STR (optional)
-
String or array-ref of strings of domain names, to which the
$connwill directly connect.If both
"no_proxy"and"env_proxy"are specified, setting by"no_proxy"is used.Setting empty string or empty array-ref to
"no_proxy"disables the no_proxy setting done by"env_proxy"option.
- "env_proxy" => STR (optional)
-
String of protocol specifier. If specified, proxy settings for that protocol are loaded from environment variables, and
$connis created.For example, if
"http"is specified,"http_proxy"(or"HTTP_PROXY") and"no_proxy"(or"NO_PROXY") environment variables are used to set"proxy"and"no_proxy"options, respectively."proxy"and"no_proxy"options have precedence over"env_proxy"option.
OBJECT METHOD
$guard = $conn->tcp_connect($host, $port, $connect_cb, $prepare_cb)
Make a (possibly proxied) TCP connection to the given $host and $port.
If "$conn->proxy_for($host, $port)" returns "undef", the behavior of this method is exactly the same as "tcp_connect" function from AnyEvent::Socket.
If "$conn->proxy_for($host, $port)" returns a proxy URL, it behaves in the following way.
- •
-
It connects to the proxy, and tells the proxy to connect to the final destination,
$hostand$port.
- •
-
It runs
$connect_cbafter the connection to the proxy AND (hopefully) the connection between the proxy and the final destination are both established.$connect_cb->($cb_fh, $cb_host, $cb_port, $cb_retry)$cb_fhis the filehandle to the proxy.$cb_hostand$cb_portare the hostname and port of the proxy.
- •
-
If the TCP connection to the proxy is established but the connection to the final destination fails for some reason,
$connect_cbis called with no argument passed (just as the original"tcp_connect"does).
- •
-
If given, it runs
$prepare_cbbefore it starts connecting to the proxy.
$proxy = $conn->proxy_for($host, $port)
If $conn uses a proxy to connect to the given $host and $port, it returns the string of the proxy URL. Otherwise, it returns "undef".
SEE ALSO
- •
-
AnyEvent::Socket
- •
-
AnyEvent::HTTP - it has
"tcp_connect"option to implement proxy connection. You can use AnyEvent::Connector for it.
REPOSITORY
<https://github.com/debug-ito/AnyEvent-Connector>
BUGS AND FEATURE REQUESTS
Please report bugs and feature requests to my Github issues <https://github.com/debug-ito/AnyEvent-Connector/issues>.
Although I prefer Github, non-Github users can use CPAN RT <https://rt.cpan.org/Public/Dist/Display.html?Name=AnyEvent-Connector>. Please send email to "bug-AnyEvent-Connector at rt.cpan.org" to report bugs if you do not have CPAN RT account.
AUTHOR
Toshio Ito, "<toshioito at cpan.org>"
LICENSE AND COPYRIGHT
Copyright 2018 Toshio Ito.
This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License.
See <http://dev.perl.org/licenses/> for more information.