ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-HTTP/README
Revision: 1.25
Committed: Sun Jun 8 23:33:28 2014 UTC (9 years, 11 months ago) by root
Branch: MAIN
CVS Tags: rel-2_2, rel-2_21
Changes since 1.24: +23 -16 lines
Log Message:
2.2

File Contents

# User Rev Content
1 root 1.1 NAME
2 root 1.2 AnyEvent::HTTP - simple but non-blocking HTTP/HTTPS client
3 root 1.1
4     SYNOPSIS
5 root 1.2 use AnyEvent::HTTP;
6 root 1.1
7 root 1.3 http_get "http://www.nethype.de/", sub { print $_[1] };
8    
9     # ... do something else here
10    
11 root 1.1 DESCRIPTION
12     This module is an AnyEvent user, you need to make sure that you use and
13     run a supported event loop.
14    
15 root 1.2 This module implements a simple, stateless and non-blocking HTTP client.
16     It supports GET, POST and other request methods, cookies and more, all
17 root 1.17 on a very low level. It can follow redirects, supports proxies, and
18 root 1.2 automatically limits the number of connections to the values specified
19     in the RFC.
20    
21     It should generally be a "good client" that is enough for most HTTP
22     tasks. Simple tasks should be simple, but complex tasks should still be
23     possible as the user retains control over request and response headers.
24    
25     The caller is responsible for authentication management, cookies (if the
26     simplistic implementation in this module doesn't suffice), referer and
27     other high-level protocol details for which this module offers only
28     limited support.
29    
30     METHODS
31     http_get $url, key => value..., $cb->($data, $headers)
32     Executes an HTTP-GET request. See the http_request function for
33 root 1.5 details on additional parameters and the return value.
34 root 1.2
35     http_head $url, key => value..., $cb->($data, $headers)
36     Executes an HTTP-HEAD request. See the http_request function for
37 root 1.5 details on additional parameters and the return value.
38 root 1.2
39     http_post $url, $body, key => value..., $cb->($data, $headers)
40 root 1.4 Executes an HTTP-POST request with a request body of $body. See the
41 root 1.5 http_request function for details on additional parameters and the
42     return value.
43 root 1.2
44     http_request $method => $url, key => value..., $cb->($data, $headers)
45     Executes a HTTP request of type $method (e.g. "GET", "POST"). The
46     URL must be an absolute http or https URL.
47    
48 root 1.5 When called in void context, nothing is returned. In other contexts,
49     "http_request" returns a "cancellation guard" - you have to keep the
50     object at least alive until the callback get called. If the object
51 root 1.14 gets destroyed before the callback is called, the request will be
52 root 1.5 cancelled.
53    
54 root 1.8 The callback will be called with the response body data as first
55 root 1.25 argument (or "undef" if an error occurred), and a hash-ref with
56 root 1.15 response headers (and trailers) as second argument.
57 root 1.2
58     All the headers in that hash are lowercased. In addition to the
59 root 1.13 response headers, the "pseudo-headers" (uppercase to avoid clashing
60     with possible response headers) "HTTPVersion", "Status" and "Reason"
61 root 1.14 contain the three parts of the HTTP Status-Line of the same name. If
62     an error occurs during the body phase of a request, then the
63     original "Status" and "Reason" values from the header are available
64     as "OrigStatus" and "OrigReason".
65 root 1.13
66     The pseudo-header "URL" contains the actual URL (which can differ
67     from the requested URL when following redirects - for example, you
68     might get an error that your URL scheme is not supported even though
69     your URL is a valid http URL because it redirected to an ftp URL, in
70     which case you can look at the URL pseudo header).
71    
72     The pseudo-header "Redirect" only exists when the request was a
73     result of an internal redirect. In that case it is an array
74     reference with the "($data, $headers)" from the redirect response.
75     Note that this response could in turn be the result of a redirect
76     itself, and "$headers->{Redirect}[1]{Redirect}" will then contain
77     the original response, and so on.
78 root 1.3
79 root 1.6 If the server sends a header multiple times, then their contents
80     will be joined together with a comma (","), as per the HTTP spec.
81 root 1.2
82     If an internal error occurs, such as not being able to resolve a
83     hostname, then $data will be "undef", "$headers->{Status}" will be
84 root 1.15 590-599 and the "Reason" pseudo-header will contain an error
85     message. Currently the following status codes are used:
86    
87 root 1.25 595 - errors during connection establishment, proxy handshake.
88 root 1.15 596 - errors during TLS negotiation, request sending and header
89     processing.
90     597 - errors during body receiving or processing.
91     598 - user aborted request via "on_header" or "on_body".
92     599 - other, usually nonretryable, errors (garbled URL etc.).
93 root 1.2
94     A typical callback might look like this:
95    
96     sub {
97     my ($body, $hdr) = @_;
98    
99     if ($hdr->{Status} =~ /^2/) {
100     ... everything should be ok
101     } else {
102     print "error, $hdr->{Status} $hdr->{Reason}\n";
103     }
104     }
105    
106     Additional parameters are key-value pairs, and are fully optional.
107     They include:
108    
109     recurse => $count (default: $MAX_RECURSE)
110     Whether to recurse requests or not, e.g. on redirects,
111 root 1.24 authentication and other retries and so on, and how often to do
112     so.
113 root 1.2
114 root 1.25 Only redirects to http and https URLs are supported. While most
115     common redirection forms are handled entirely within this
116     module, some require the use of the optional URI module. If it
117     is required but missing, then the request will fail with an
118     error.
119    
120 root 1.2 headers => hashref
121     The request headers to use. Currently, "http_request" may
122     provide its own "Host:", "Content-Length:", "Connection:" and
123 root 1.15 "Cookie:" headers and will provide defaults at least for "TE:",
124     "Referer:" and "User-Agent:" (this can be suppressed by using
125     "undef" for these headers in which case they won't be sent at
126     all).
127    
128     You really should provide your own "User-Agent:" header value
129     that is appropriate for your program - I wouldn't be surprised
130     if the default AnyEvent string gets blocked by webservers sooner
131     or later.
132 root 1.2
133 root 1.20 Also, make sure that your headers names and values do not
134     contain any embedded newlines.
135    
136 root 1.2 timeout => $seconds
137     The time-out to use for various stages - each connect attempt
138 root 1.11 will reset the timeout, as will read or write activity, i.e.
139     this is not an overall timeout.
140    
141     Default timeout is 5 minutes.
142 root 1.2
143     proxy => [$host, $port[, $scheme]] or undef
144 root 1.19 Use the given http proxy for all requests, or no proxy if
145     "undef" is used.
146 root 1.2
147 root 1.15 $scheme must be either missing or must be "http" for HTTP.
148 root 1.2
149 root 1.19 If not specified, then the default proxy is used (see
150     "AnyEvent::HTTP::set_proxy").
151    
152 root 1.2 body => $string
153 root 1.15 The request body, usually empty. Will be sent as-is (future
154 root 1.2 versions of this module might offer more options).
155    
156     cookie_jar => $hash_ref
157     Passing this parameter enables (simplified) cookie-processing,
158     loosely based on the original netscape specification.
159    
160     The $hash_ref must be an (initially empty) hash reference which
161     will get updated automatically. It is possible to save the
162 root 1.15 cookie jar to persistent storage with something like JSON or
163     Storable - see the "AnyEvent::HTTP::cookie_jar_expire" function
164     if you wish to remove expired or session-only cookies, and also
165     for documentation on the format of the cookie jar.
166    
167     Note that this cookie implementation is not meant to be
168     complete. If you want complete cookie management you have to do
169     that on your own. "cookie_jar" is meant as a quick fix to get
170     most cookie-using sites working. Cookies are a privacy disaster,
171     do not use them unless required to.
172    
173     When cookie processing is enabled, the "Cookie:" and
174     "Set-Cookie:" headers will be set and handled by this module,
175     otherwise they will be left untouched.
176 root 1.2
177 root 1.8 tls_ctx => $scheme | $tls_ctx
178     Specifies the AnyEvent::TLS context to be used for https
179     connections. This parameter follows the same rules as the
180     "tls_ctx" parameter to AnyEvent::Handle, but additionally, the
181     two strings "low" or "high" can be specified, which give you a
182     predefined low-security (no verification, highest compatibility)
183     and high-security (CA and common-name verification) TLS context.
184    
185     The default for this option is "low", which could be interpreted
186     as "give me the page, no matter what".
187    
188 root 1.15 See also the "sessionid" parameter.
189    
190     session => $string
191     The module might reuse connections to the same host internally.
192     Sometimes (e.g. when using TLS), you do not want to reuse
193     connections from other sessions. This can be achieved by setting
194     this parameter to some unique ID (such as the address of an
195     object storing your state data, or the TLS context) - only
196     connections using the same unique ID will be reused.
197    
198 root 1.11 on_prepare => $callback->($fh)
199     In rare cases you need to "tune" the socket before it is used to
200 root 1.25 connect (for example, to bind it on a given IP address). This
201 root 1.11 parameter overrides the prepare callback passed to
202     "AnyEvent::Socket::tcp_connect" and behaves exactly the same way
203     (e.g. it has to provide a timeout). See the description for the
204     $prepare_cb argument of "AnyEvent::Socket::tcp_connect" for
205     details.
206    
207 root 1.14 tcp_connect => $callback->($host, $service, $connect_cb,
208     $prepare_cb)
209     In even rarer cases you want total control over how
210     AnyEvent::HTTP establishes connections. Normally it uses
211     AnyEvent::Socket::tcp_connect to do this, but you can provide
212     your own "tcp_connect" function - obviously, it has to follow
213     the same calling conventions, except that it may always return a
214     connection guard object.
215    
216     There are probably lots of weird uses for this function,
217     starting from tracing the hosts "http_request" actually tries to
218     connect, to (inexact but fast) host => IP address caching or
219     even socks protocol support.
220    
221 root 1.8 on_header => $callback->($headers)
222     When specified, this callback will be called with the header
223     hash as soon as headers have been successfully received from the
224     remote server (not on locally-generated errors).
225    
226     It has to return either true (in which case AnyEvent::HTTP will
227     continue), or false, in which case AnyEvent::HTTP will cancel
228     the download (and call the finish callback with an error code of
229     598).
230    
231     This callback is useful, among other things, to quickly reject
232     unwanted content, which, if it is supposed to be rare, can be
233     faster than first doing a "HEAD" request.
234    
235 root 1.15 The downside is that cancelling the request makes it impossible
236     to re-use the connection. Also, the "on_header" callback will
237     not receive any trailer (headers sent after the response body).
238    
239 root 1.8 Example: cancel the request unless the content-type is
240     "text/html".
241    
242     on_header => sub {
243     $_[0]{"content-type"} =~ /^text\/html\s*(?:;|$)/
244     },
245    
246     on_body => $callback->($partial_body, $headers)
247     When specified, all body data will be passed to this callback
248     instead of to the completion callback. The completion callback
249     will get the empty string instead of the body data.
250    
251     It has to return either true (in which case AnyEvent::HTTP will
252     continue), or false, in which case AnyEvent::HTTP will cancel
253     the download (and call the completion callback with an error
254     code of 598).
255    
256 root 1.15 The downside to cancelling the request is that it makes it
257     impossible to re-use the connection.
258    
259 root 1.8 This callback is useful when the data is too large to be held in
260     memory (so the callback writes it to a file) or when only some
261     information should be extracted, or when the body should be
262     processed incrementally.
263    
264     It is usually preferred over doing your own body handling via
265 root 1.9 "want_body_handle", but in case of streaming APIs, where HTTP is
266     only used to create a connection, "want_body_handle" is the
267     better alternative, as it allows you to install your own event
268     handler, reducing resource usage.
269 root 1.8
270     want_body_handle => $enable
271     When enabled (default is disabled), the behaviour of
272     AnyEvent::HTTP changes considerably: after parsing the headers,
273     and instead of downloading the body (if any), the completion
274     callback will be called. Instead of the $body argument
275     containing the body data, the callback will receive the
276     AnyEvent::Handle object associated with the connection. In error
277     cases, "undef" will be passed. When there is no body (e.g.
278     status 304), the empty string will be passed.
279    
280     The handle object might or might not be in TLS mode, might be
281 root 1.15 connected to a proxy, be a persistent connection, use chunked
282     transfer encoding etc., and configured in unspecified ways. The
283     user is responsible for this handle (it will not be used by this
284     module anymore).
285 root 1.8
286     This is useful with some push-type services, where, after the
287     initial headers, an interactive protocol is used (typical
288     example would be the push-style twitter API which starts a
289     JSON/XML stream).
290    
291     If you think you need this, first have a look at "on_body", to
292 root 1.9 see if that doesn't solve your problem in a better way.
293 root 1.8
294 root 1.15 persistent => $boolean
295     Try to create/reuse a persistent connection. When this flag is
296     set (default: true for idempotent requests, false for all
297     others), then "http_request" tries to re-use an existing
298     (previously-created) persistent connection to the host and,
299     failing that, tries to create a new one.
300    
301     Requests failing in certain ways will be automatically retried
302     once, which is dangerous for non-idempotent requests, which is
303     why it defaults to off for them. The reason for this is because
304     the bozos who designed HTTP/1.1 made it impossible to
305     distinguish between a fatal error and a normal connection
306     timeout, so you never know whether there was a problem with your
307     request or not.
308    
309     When reusing an existent connection, many parameters (such as
310     TLS context) will be ignored. See the "session" parameter for a
311     workaround.
312    
313     keepalive => $boolean
314     Only used when "persistent" is also true. This parameter decides
315     whether "http_request" tries to handshake a HTTP/1.0-style
316     keep-alive connection (as opposed to only a HTTP/1.1 persistent
317     connection).
318    
319     The default is true, except when using a proxy, in which case it
320     defaults to false, as HTTP/1.0 proxies cannot support this in a
321     meaningful way.
322    
323     handle_params => { key => value ... }
324     The key-value pairs in this hash will be passed to any
325     AnyEvent::Handle constructor that is called - not all requests
326     will create a handle, and sometimes more than one is created, so
327     this parameter is only good for setting hints.
328    
329     Example: set the maximum read size to 4096, to potentially
330     conserve memory at the cost of speed.
331    
332     handle_params => {
333     max_read_size => 4096,
334     },
335    
336     Example: do a simple HTTP GET request for http://www.nethype.de/ and
337     print the response body.
338 root 1.2
339     http_request GET => "http://www.nethype.de/", sub {
340     my ($body, $hdr) = @_;
341     print "$body\n";
342     };
343    
344 root 1.15 Example: do a HTTP HEAD request on https://www.google.com/, use a
345 root 1.2 timeout of 30 seconds.
346    
347     http_request
348 root 1.22 HEAD => "https://www.google.com",
349 root 1.15 headers => { "user-agent" => "MySearchClient 1.0" },
350 root 1.2 timeout => 30,
351     sub {
352     my ($body, $hdr) = @_;
353     use Data::Dumper;
354     print Dumper $hdr;
355     }
356     ;
357    
358 root 1.15 Example: do another simple HTTP GET request, but immediately try to
359     cancel it.
360 root 1.5
361     my $request = http_request GET => "http://www.nethype.de/", sub {
362     my ($body, $hdr) = @_;
363     print "$body\n";
364     };
365    
366     undef $request;
367    
368 root 1.13 DNS CACHING
369     AnyEvent::HTTP uses the AnyEvent::Socket::tcp_connect function for the
370     actual connection, which in turn uses AnyEvent::DNS to resolve
371     hostnames. The latter is a simple stub resolver and does no caching on
372     its own. If you want DNS caching, you currently have to provide your own
373     default resolver (by storing a suitable resolver object in
374 root 1.15 $AnyEvent::DNS::RESOLVER) or your own "tcp_connect" callback.
375 root 1.13
376 root 1.2 GLOBAL FUNCTIONS AND VARIABLES
377     AnyEvent::HTTP::set_proxy "proxy-url"
378     Sets the default proxy server to use. The proxy-url must begin with
379 root 1.15 a string of the form "http://host:port", croaks otherwise.
380 root 1.12
381     To clear an already-set proxy, use "undef".
382 root 1.2
383 root 1.25 When AnyEvent::HTTP is loaded for the first time it will query the
384 root 1.19 default proxy from the operating system, currently by looking at
385     "$ENV{http_proxy"}.
386    
387 root 1.15 AnyEvent::HTTP::cookie_jar_expire $jar[, $session_end]
388     Remove all cookies from the cookie jar that have been expired. If
389     $session_end is given and true, then additionally remove all session
390     cookies.
391    
392     You should call this function (with a true $session_end) before you
393     save cookies to disk, and you should call this function after
394     loading them again. If you have a long-running program you can
395 root 1.25 additionally call this function from time to time.
396 root 1.15
397     A cookie jar is initially an empty hash-reference that is managed by
398     this module. It's format is subject to change, but currently it is
399     like this:
400    
401     The key "version" has to contain 1, otherwise the hash gets emptied.
402     All other keys are hostnames or IP addresses pointing to
403     hash-references. The key for these inner hash references is the
404     server path for which this cookie is meant, and the values are again
405 root 1.25 hash-references. Each key of those hash-references is a cookie name,
406     and the value, you guessed it, is another hash-reference, this time
407     with the key-value pairs from the cookie, except for "expires" and
408     "max-age", which have been replaced by a "_expires" key that
409     contains the cookie expiry timestamp. Session cookies are indicated
410     by not having an "_expires" key.
411 root 1.15
412     Here is an example of a cookie jar with a single cookie, so you have
413     a chance of understanding the above paragraph:
414    
415     {
416     version => 1,
417     "10.0.0.1" => {
418     "/" => {
419     "mythweb_id" => {
420     _expires => 1293917923,
421     value => "ooRung9dThee3ooyXooM1Ohm",
422     },
423     },
424     },
425     }
426    
427 root 1.14 $date = AnyEvent::HTTP::format_date $timestamp
428     Takes a POSIX timestamp (seconds since the epoch) and formats it as
429     a HTTP Date (RFC 2616).
430    
431     $timestamp = AnyEvent::HTTP::parse_date $date
432 root 1.15 Takes a HTTP Date (RFC 2616) or a Cookie date (netscape cookie spec)
433     or a bunch of minor variations of those, and returns the
434     corresponding POSIX timestamp, or "undef" if the date cannot be
435     parsed.
436 root 1.14
437 root 1.2 $AnyEvent::HTTP::MAX_RECURSE
438     The default value for the "recurse" request parameter (default: 10).
439    
440 root 1.15 $AnyEvent::HTTP::TIMEOUT
441 root 1.23 The default timeout for connection operations (default: 300).
442 root 1.15
443 root 1.2 $AnyEvent::HTTP::USERAGENT
444     The default value for the "User-Agent" header (the default is
445 root 1.8 "Mozilla/5.0 (compatible; U; AnyEvent-HTTP/$VERSION;
446 root 1.2 +http://software.schmorp.de/pkg/AnyEvent)").
447    
448 root 1.8 $AnyEvent::HTTP::MAX_PER_HOST
449 root 1.10 The maximum number of concurrent connections to the same host
450 root 1.8 (identified by the hostname). If the limit is exceeded, then the
451     additional requests are queued until previous connections are
452 root 1.15 closed. Both persistent and non-persistent connections are counted
453     in this limit.
454 root 1.2
455 root 1.8 The default value for this is 4, and it is highly advisable to not
456 root 1.15 increase it much.
457    
458     For comparison: the RFC's recommend 4 non-persistent or 2 persistent
459 root 1.25 connections, older browsers used 2, newer ones (such as firefox 3)
460 root 1.15 typically use 6, and Opera uses 8 because like, they have the
461     fastest browser and give a shit for everybody else on the planet.
462    
463     $AnyEvent::HTTP::PERSISTENT_TIMEOUT
464 root 1.25 The time after which idle persistent connections get closed by
465 root 1.15 AnyEvent::HTTP (default: 3).
466 root 1.2
467     $AnyEvent::HTTP::ACTIVE
468     The number of active connections. This is not the number of
469     currently running requests, but the number of currently open and
470 root 1.15 non-idle TCP connections. This number can be useful for
471 root 1.2 load-leveling.
472 root 1.1
473 root 1.16 SHOWCASE
474 root 1.25 This section contains some more elaborate "real-world" examples or code
475 root 1.16 snippets.
476    
477     HTTP/1.1 FILE DOWNLOAD
478 root 1.18 Downloading files with HTTP can be quite tricky, especially when
479 root 1.19 something goes wrong and you want to resume.
480 root 1.16
481     Here is a function that initiates and resumes a download. It uses the
482     last modified time to check for file content changes, and works with
483     many HTTP/1.0 servers as well, and usually falls back to a complete
484     re-download on older servers.
485    
486     It calls the completion callback with either "undef", which means a
487 root 1.25 nonretryable error occurred, 0 when the download was partial and should
488 root 1.16 be retried, and 1 if it was successful.
489    
490     use AnyEvent::HTTP;
491    
492     sub download($$$) {
493     my ($url, $file, $cb) = @_;
494    
495     open my $fh, "+<", $file
496     or die "$file: $!";
497    
498     my %hdr;
499     my $ofs = 0;
500    
501     warn stat $fh;
502     warn -s _;
503     if (stat $fh and -s _) {
504     $ofs = -s _;
505 root 1.21 warn "-s is ", $ofs;
506 root 1.16 $hdr{"if-unmodified-since"} = AnyEvent::HTTP::format_date +(stat _)[9];
507     $hdr{"range"} = "bytes=$ofs-";
508     }
509    
510     http_get $url,
511     headers => \%hdr,
512     on_header => sub {
513     my ($hdr) = @_;
514    
515     if ($hdr->{Status} == 200 && $ofs) {
516     # resume failed
517     truncate $fh, $ofs = 0;
518     }
519    
520     sysseek $fh, $ofs, 0;
521    
522     1
523     },
524     on_body => sub {
525     my ($data, $hdr) = @_;
526    
527     if ($hdr->{Status} =~ /^2/) {
528     length $data == syswrite $fh, $data
529     or return; # abort on write errors
530     }
531    
532     1
533     },
534     sub {
535     my (undef, $hdr) = @_;
536    
537     my $status = $hdr->{Status};
538    
539     if (my $time = AnyEvent::HTTP::parse_date $hdr->{"last-modified"}) {
540     utime $fh, $time, $time;
541     }
542    
543     if ($status == 200 || $status == 206 || $status == 416) {
544     # download ok || resume ok || file already fully downloaded
545     $cb->(1, $hdr);
546    
547     } elsif ($status == 412) {
548     # file has changed while resuming, delete and retry
549     unlink $file;
550     $cb->(0, $hdr);
551    
552     } elsif ($status == 500 or $status == 503 or $status =~ /^59/) {
553     # retry later
554     $cb->(0, $hdr);
555    
556     } else {
557     $cb->(undef, $hdr);
558     }
559     }
560     ;
561     }
562    
563     download "http://server/somelargefile", "/tmp/somelargefile", sub {
564     if ($_[0]) {
565     print "OK!\n";
566     } elsif (defined $_[0]) {
567     print "please retry later\n";
568     } else {
569     print "ERROR\n";
570     }
571     };
572    
573     SOCKS PROXIES
574 root 1.14 Socks proxies are not directly supported by AnyEvent::HTTP. You can
575     compile your perl to support socks, or use an external program such as
576     socksify (dante) or tsocks to make your program use a socks proxy
577     transparently.
578    
579     Alternatively, for AnyEvent::HTTP only, you can use your own
580     "tcp_connect" function that does the proxy handshake - here is an
581     example that works with socks4a proxies:
582    
583     use Errno;
584     use AnyEvent::Util;
585     use AnyEvent::Socket;
586     use AnyEvent::Handle;
587    
588     # host, port and username of/for your socks4a proxy
589     my $socks_host = "10.0.0.23";
590     my $socks_port = 9050;
591     my $socks_user = "";
592    
593     sub socks4a_connect {
594     my ($host, $port, $connect_cb, $prepare_cb) = @_;
595    
596     my $hdl = new AnyEvent::Handle
597     connect => [$socks_host, $socks_port],
598     on_prepare => sub { $prepare_cb->($_[0]{fh}) },
599     on_error => sub { $connect_cb->() },
600     ;
601    
602     $hdl->push_write (pack "CCnNZ*Z*", 4, 1, $port, 1, $socks_user, $host);
603    
604     $hdl->push_read (chunk => 8, sub {
605     my ($hdl, $chunk) = @_;
606     my ($status, $port, $ipn) = unpack "xCna4", $chunk;
607    
608     if ($status == 0x5a) {
609     $connect_cb->($hdl->{fh}, (format_address $ipn) . ":$port");
610     } else {
611     $! = Errno::ENXIO; $connect_cb->();
612     }
613     });
614    
615     $hdl
616     }
617    
618     Use "socks4a_connect" instead of "tcp_connect" when doing
619     "http_request"s, possibly after switching off other proxy types:
620    
621     AnyEvent::HTTP::set_proxy undef; # usually you do not want other proxies
622    
623     http_get 'http://www.google.com', tcp_connect => \&socks4a_connect, sub {
624     my ($data, $headers) = @_;
625     ...
626     };
627    
628 root 1.1 SEE ALSO
629 root 1.2 AnyEvent.
630 root 1.1
631     AUTHOR
632 root 1.3 Marc Lehmann <schmorp@schmorp.de>
633     http://home.schmorp.de/
634 root 1.1
635 root 1.25 With many thanks to Дмитрий Шалашов, who provided countless testcases
636     and bugreports.
637 root 1.7