ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-HTTP/HTTP.pm
Revision: 1.90
Committed: Mon Jan 3 00:41:25 2011 UTC (13 years, 4 months ago) by root
Branch: MAIN
Changes since 1.89: +5 -0 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 =head1 NAME
2    
3     AnyEvent::HTTP - simple but non-blocking HTTP/HTTPS client
4    
5     =head1 SYNOPSIS
6    
7     use AnyEvent::HTTP;
8    
9 root 1.17 http_get "http://www.nethype.de/", sub { print $_[1] };
10    
11     # ... do something else here
12    
13 root 1.1 =head1 DESCRIPTION
14    
15     This module is an L<AnyEvent> user, you need to make sure that you use and
16     run a supported event loop.
17    
18 root 1.11 This module implements a simple, stateless and non-blocking HTTP
19     client. It supports GET, POST and other request methods, cookies and more,
20     all on a very low level. It can follow redirects supports proxies and
21     automatically limits the number of connections to the values specified in
22     the RFC.
23    
24     It should generally be a "good client" that is enough for most HTTP
25     tasks. Simple tasks should be simple, but complex tasks should still be
26     possible as the user retains control over request and response headers.
27    
28     The caller is responsible for authentication management, cookies (if
29     the simplistic implementation in this module doesn't suffice), referer
30     and other high-level protocol details for which this module offers only
31     limited support.
32    
33 root 1.1 =head2 METHODS
34    
35     =over 4
36    
37     =cut
38    
39     package AnyEvent::HTTP;
40    
41 root 1.85 use common::sense;
42 root 1.1
43 root 1.41 use Errno ();
44 root 1.1
45 root 1.51 use AnyEvent 5.0 ();
46 root 1.1 use AnyEvent::Util ();
47     use AnyEvent::Handle ();
48    
49     use base Exporter::;
50    
51 root 1.65 our $VERSION = '1.5';
52 root 1.1
53 root 1.17 our @EXPORT = qw(http_get http_post http_head http_request);
54 root 1.1
55 root 1.40 our $USERAGENT = "Mozilla/5.0 (compatible; U; AnyEvent-HTTP/$VERSION; +http://software.schmorp.de/pkg/AnyEvent)";
56 root 1.3 our $MAX_RECURSE = 10;
57 root 1.2 our $MAX_PERSISTENT = 8;
58     our $PERSISTENT_TIMEOUT = 2;
59     our $TIMEOUT = 300;
60 root 1.1
61     # changing these is evil
62 root 1.88 our $MAX_PERSISTENT_PER_HOST = 2;
63 root 1.11 our $MAX_PER_HOST = 4;
64 root 1.1
65 root 1.2 our $PROXY;
66 root 1.14 our $ACTIVE = 0;
67 root 1.2
68 root 1.1 my %KA_COUNT; # number of open keep-alive connections per host
69 root 1.11 my %CO_SLOT; # number of open connections, and wait queue, per host
70 root 1.1
71     =item http_get $url, key => value..., $cb->($data, $headers)
72    
73     Executes an HTTP-GET request. See the http_request function for details on
74 root 1.29 additional parameters and the return value.
75 root 1.1
76 root 1.5 =item http_head $url, key => value..., $cb->($data, $headers)
77    
78 root 1.29 Executes an HTTP-HEAD request. See the http_request function for details
79     on additional parameters and the return value.
80 root 1.5
81     =item http_post $url, $body, key => value..., $cb->($data, $headers)
82 root 1.3
83 root 1.26 Executes an HTTP-POST request with a request body of C<$body>. See the
84 root 1.29 http_request function for details on additional parameters and the return
85     value.
86 root 1.3
87 root 1.1 =item http_request $method => $url, key => value..., $cb->($data, $headers)
88    
89     Executes a HTTP request of type C<$method> (e.g. C<GET>, C<POST>). The URL
90     must be an absolute http or https URL.
91    
92 root 1.29 When called in void context, nothing is returned. In other contexts,
93     C<http_request> returns a "cancellation guard" - you have to keep the
94     object at least alive until the callback get called. If the object gets
95 root 1.58 destroyed before the callback is called, the request will be cancelled.
96 root 1.29
97 root 1.42 The callback will be called with the response body data as first argument
98 root 1.68 (or C<undef> if an error occured), and a hash-ref with response headers
99     (and trailers) as second argument.
100 root 1.2
101 root 1.7 All the headers in that hash are lowercased. In addition to the response
102 root 1.55 headers, the "pseudo-headers" (uppercase to avoid clashing with possible
103     response headers) C<HTTPVersion>, C<Status> and C<Reason> contain the
104 root 1.64 three parts of the HTTP Status-Line of the same name. If an error occurs
105     during the body phase of a request, then the original C<Status> and
106     C<Reason> values from the header are available as C<OrigStatus> and
107     C<OrigReason>.
108 root 1.55
109     The pseudo-header C<URL> contains the actual URL (which can differ from
110     the requested URL when following redirects - for example, you might get
111     an error that your URL scheme is not supported even though your URL is a
112     valid http URL because it redirected to an ftp URL, in which case you can
113     look at the URL pseudo header).
114    
115     The pseudo-header C<Redirect> only exists when the request was a result
116     of an internal redirect. In that case it is an array reference with
117     the C<($data, $headers)> from the redirect response. Note that this
118     response could in turn be the result of a redirect itself, and C<<
119     $headers->{Redirect}[1]{Redirect} >> will then contain the original
120     response, and so on.
121 root 1.20
122 root 1.32 If the server sends a header multiple times, then their contents will be
123     joined together with a comma (C<,>), as per the HTTP spec.
124 root 1.2
125     If an internal error occurs, such as not being able to resolve a hostname,
126 root 1.77 then C<$data> will be C<undef>, C<< $headers->{Status} >> will be
127     C<590>-C<599> and the C<Reason> pseudo-header will contain an error
128     message. Currently the following status codes are used:
129    
130     =over 4
131    
132     =item 595 - errors during connection etsbalishment, proxy handshake.
133    
134     =item 596 - errors during TLS negotiation, request sending and header processing.
135    
136 root 1.78 =item 597 - errors during body receiving or processing.
137 root 1.77
138 root 1.78 =item 598 - user aborted request via C<on_header> or C<on_body>.
139 root 1.77
140     =item 599 - other, usually nonretryable, errors (garbled URL etc.).
141    
142     =back
143 root 1.2
144 root 1.6 A typical callback might look like this:
145    
146     sub {
147     my ($body, $hdr) = @_;
148    
149     if ($hdr->{Status} =~ /^2/) {
150     ... everything should be ok
151     } else {
152     print "error, $hdr->{Status} $hdr->{Reason}\n";
153     }
154     }
155    
156 root 1.1 Additional parameters are key-value pairs, and are fully optional. They
157     include:
158    
159     =over 4
160    
161 root 1.3 =item recurse => $count (default: $MAX_RECURSE)
162 root 1.1
163     Whether to recurse requests or not, e.g. on redirects, authentication
164 root 1.3 retries and so on, and how often to do so.
165 root 1.1
166     =item headers => hashref
167    
168 root 1.68 The request headers to use. Currently, C<http_request> may provide its own
169     C<Host:>, C<Content-Length:>, C<Connection:> and C<Cookie:> headers and
170 root 1.69 will provide defaults at least for C<TE:>, C<Referer:> and C<User-Agent:>
171     (this can be suppressed by using C<undef> for these headers in which case
172     they won't be sent at all).
173 root 1.1
174 root 1.90 You really should provide your own C<User-Agent:> header value that is
175     appropriate for your program - I wouldn't be surprised if the default
176     AnyEvent string gets blocked by webservers sooner or later.
177    
178 root 1.1 =item timeout => $seconds
179    
180     The time-out to use for various stages - each connect attempt will reset
181 root 1.51 the timeout, as will read or write activity, i.e. this is not an overall
182     timeout.
183    
184     Default timeout is 5 minutes.
185 root 1.2
186     =item proxy => [$host, $port[, $scheme]] or undef
187    
188     Use the given http proxy for all requests. If not specified, then the
189     default proxy (as specified by C<$ENV{http_proxy}>) is used.
190    
191 root 1.47 C<$scheme> must be either missing, C<http> for HTTP or C<https> for
192 root 1.2 HTTPS.
193 root 1.1
194 root 1.3 =item body => $string
195    
196 root 1.68 The request body, usually empty. Will be sent as-is (future versions of
197 root 1.3 this module might offer more options).
198    
199 root 1.10 =item cookie_jar => $hash_ref
200    
201     Passing this parameter enables (simplified) cookie-processing, loosely
202     based on the original netscape specification.
203    
204 root 1.80 The C<$hash_ref> must be an (initially empty) hash reference which
205     will get updated automatically. It is possible to save the cookie jar
206     to persistent storage with something like JSON or Storable - see the
207     C<AnyEvent::HTTP::cookie_jar_expire> function if you wish to remove
208     expired or session-only cookies, and also for documentation on the format
209     of the cookie jar.
210 root 1.10
211 root 1.70 Note that this cookie implementation is not meant to be complete. If
212     you want complete cookie management you have to do that on your
213 root 1.80 own. C<cookie_jar> is meant as a quick fix to get most cookie-using sites
214 root 1.70 working. Cookies are a privacy disaster, do not use them unless required
215     to.
216 root 1.10
217 root 1.69 When cookie processing is enabled, the C<Cookie:> and C<Set-Cookie:>
218 root 1.70 headers will be set and handled by this module, otherwise they will be
219 root 1.69 left untouched.
220    
221 root 1.40 =item tls_ctx => $scheme | $tls_ctx
222    
223     Specifies the AnyEvent::TLS context to be used for https connections. This
224     parameter follows the same rules as the C<tls_ctx> parameter to
225     L<AnyEvent::Handle>, but additionally, the two strings C<low> or
226     C<high> can be specified, which give you a predefined low-security (no
227     verification, highest compatibility) and high-security (CA and common-name
228     verification) TLS context.
229    
230     The default for this option is C<low>, which could be interpreted as "give
231     me the page, no matter what".
232    
233 root 1.51 =item on_prepare => $callback->($fh)
234    
235     In rare cases you need to "tune" the socket before it is used to
236     connect (for exmaple, to bind it on a given IP address). This parameter
237     overrides the prepare callback passed to C<AnyEvent::Socket::tcp_connect>
238     and behaves exactly the same way (e.g. it has to provide a
239     timeout). See the description for the C<$prepare_cb> argument of
240     C<AnyEvent::Socket::tcp_connect> for details.
241    
242 root 1.59 =item tcp_connect => $callback->($host, $service, $connect_cb, $prepare_cb)
243    
244     In even rarer cases you want total control over how AnyEvent::HTTP
245     establishes connections. Normally it uses L<AnyEvent::Socket::tcp_connect>
246     to do this, but you can provide your own C<tcp_connect> function -
247 root 1.60 obviously, it has to follow the same calling conventions, except that it
248     may always return a connection guard object.
249 root 1.59
250     There are probably lots of weird uses for this function, starting from
251     tracing the hosts C<http_request> actually tries to connect, to (inexact
252     but fast) host => IP address caching or even socks protocol support.
253    
254 root 1.42 =item on_header => $callback->($headers)
255 root 1.41
256     When specified, this callback will be called with the header hash as soon
257     as headers have been successfully received from the remote server (not on
258     locally-generated errors).
259    
260     It has to return either true (in which case AnyEvent::HTTP will continue),
261     or false, in which case AnyEvent::HTTP will cancel the download (and call
262     the finish callback with an error code of C<598>).
263    
264     This callback is useful, among other things, to quickly reject unwanted
265     content, which, if it is supposed to be rare, can be faster than first
266     doing a C<HEAD> request.
267    
268 root 1.68 The downside is that cancelling the request makes it impossible to re-use
269     the connection. Also, the C<on_header> callback will not receive any
270     trailer (headers sent after the response body).
271    
272 root 1.42 Example: cancel the request unless the content-type is "text/html".
273 root 1.41
274 root 1.42 on_header => sub {
275     $_[0]{"content-type"} =~ /^text\/html\s*(?:;|$)/
276     },
277 root 1.41
278 root 1.42 =item on_body => $callback->($partial_body, $headers)
279 root 1.41
280 root 1.42 When specified, all body data will be passed to this callback instead of
281     to the completion callback. The completion callback will get the empty
282     string instead of the body data.
283 root 1.41
284 root 1.42 It has to return either true (in which case AnyEvent::HTTP will continue),
285     or false, in which case AnyEvent::HTTP will cancel the download (and call
286     the completion callback with an error code of C<598>).
287    
288 root 1.68 The downside to cancelling the request is that it makes it impossible to
289     re-use the connection.
290    
291 root 1.42 This callback is useful when the data is too large to be held in memory
292     (so the callback writes it to a file) or when only some information should
293     be extracted, or when the body should be processed incrementally.
294 root 1.41
295     It is usually preferred over doing your own body handling via
296 root 1.45 C<want_body_handle>, but in case of streaming APIs, where HTTP is
297     only used to create a connection, C<want_body_handle> is the better
298     alternative, as it allows you to install your own event handler, reducing
299     resource usage.
300 root 1.41
301     =item want_body_handle => $enable
302    
303     When enabled (default is disabled), the behaviour of AnyEvent::HTTP
304     changes considerably: after parsing the headers, and instead of
305     downloading the body (if any), the completion callback will be
306     called. Instead of the C<$body> argument containing the body data, the
307     callback will receive the L<AnyEvent::Handle> object associated with the
308     connection. In error cases, C<undef> will be passed. When there is no body
309     (e.g. status C<304>), the empty string will be passed.
310    
311     The handle object might or might not be in TLS mode, might be connected to
312     a proxy, be a persistent connection etc., and configured in unspecified
313     ways. The user is responsible for this handle (it will not be used by this
314     module anymore).
315    
316     This is useful with some push-type services, where, after the initial
317     headers, an interactive protocol is used (typical example would be the
318     push-style twitter API which starts a JSON/XML stream).
319    
320     If you think you need this, first have a look at C<on_body>, to see if
321 root 1.45 that doesn't solve your problem in a better way.
322 root 1.41
323 root 1.1 =back
324    
325 root 1.68 Example: do a simple HTTP GET request for http://www.nethype.de/ and print
326     the response body.
327 root 1.9
328     http_request GET => "http://www.nethype.de/", sub {
329     my ($body, $hdr) = @_;
330     print "$body\n";
331     };
332    
333 root 1.68 Example: do a HTTP HEAD request on https://www.google.com/, use a
334 root 1.9 timeout of 30 seconds.
335    
336     http_request
337     GET => "https://www.google.com",
338 root 1.90 headers => { "user-agent" => "MySearchClient 1.0" },
339 root 1.9 timeout => 30,
340     sub {
341     my ($body, $hdr) = @_;
342     use Data::Dumper;
343     print Dumper $hdr;
344     }
345     ;
346 root 1.1
347 root 1.68 Example: do another simple HTTP GET request, but immediately try to
348 root 1.29 cancel it.
349    
350     my $request = http_request GET => "http://www.nethype.de/", sub {
351     my ($body, $hdr) = @_;
352     print "$body\n";
353     };
354    
355     undef $request;
356    
357 root 1.1 =cut
358    
359 root 1.12 sub _slot_schedule;
360 root 1.11 sub _slot_schedule($) {
361     my $host = shift;
362    
363     while ($CO_SLOT{$host}[0] < $MAX_PER_HOST) {
364     if (my $cb = shift @{ $CO_SLOT{$host}[1] }) {
365 root 1.12 # somebody wants that slot
366 root 1.11 ++$CO_SLOT{$host}[0];
367 root 1.14 ++$ACTIVE;
368 root 1.11
369     $cb->(AnyEvent::Util::guard {
370 root 1.14 --$ACTIVE;
371 root 1.11 --$CO_SLOT{$host}[0];
372     _slot_schedule $host;
373     });
374     } else {
375     # nobody wants the slot, maybe we can forget about it
376     delete $CO_SLOT{$host} unless $CO_SLOT{$host}[0];
377     last;
378     }
379     }
380     }
381    
382     # wait for a free slot on host, call callback
383     sub _get_slot($$) {
384     push @{ $CO_SLOT{$_[0]}[1] }, $_[1];
385    
386     _slot_schedule $_[0];
387     }
388    
389 root 1.80 #############################################################################
390    
391     # expire cookies
392     sub cookie_jar_expire($;$) {
393     my ($jar, $session_end) = @_;
394    
395     %$jar = () if $jar->{version} != 1;
396    
397     my $anow = AE::now;
398    
399     while (my ($chost, $paths) = each %$jar) {
400     next unless ref $paths;
401    
402     while (my ($cpath, $cookies) = each %$paths) {
403     while (my ($cookie, $kv) = each %$cookies) {
404     if (exists $kv->{_expires}) {
405     delete $cookies->{$cookie}
406     if $anow > $kv->{_expires};
407     } elsif ($session_end) {
408     delete $cookies->{$cookie};
409     }
410     }
411    
412     delete $paths->{$cpath}
413     unless %$cookies;
414     }
415    
416     delete $jar->{$chost}
417     unless %$paths;
418     }
419     }
420    
421 root 1.72 # extract cookies from jar
422 root 1.71 sub cookie_jar_extract($$$$) {
423     my ($jar, $uscheme, $uhost, $upath) = @_;
424    
425     %$jar = () if $jar->{version} != 1;
426    
427     my @cookies;
428    
429     while (my ($chost, $paths) = each %$jar) {
430     next unless ref $paths;
431    
432     if ($chost =~ /^\./) {
433     next unless $chost eq substr $uhost, -length $chost;
434     } elsif ($chost =~ /\./) {
435     next unless $chost eq $uhost;
436     } else {
437     next;
438     }
439    
440     while (my ($cpath, $cookies) = each %$paths) {
441     next unless $cpath eq substr $upath, 0, length $cpath;
442    
443     while (my ($cookie, $kv) = each %$cookies) {
444     next if $uscheme ne "https" && exists $kv->{secure};
445    
446 root 1.80 if (exists $kv->{_expires} and AE::now > $kv->{_expires}) {
447     delete $cookies->{$cookie};
448     next;
449 root 1.71 }
450    
451     my $value = $kv->{value};
452    
453     if ($value =~ /[=;,[:space:]]/) {
454     $value =~ s/([\\"])/\\$1/g;
455     $value = "\"$value\"";
456     }
457    
458     push @cookies, "$cookie=$value";
459     }
460     }
461     }
462    
463     \@cookies
464     }
465    
466 root 1.72 # parse set_cookie header into jar
467 root 1.80 sub cookie_jar_set_cookie($$$$) {
468     my ($jar, $set_cookie, $uhost, $date) = @_;
469    
470     my $anow = int AE::now;
471     my $snow; # server-now
472 root 1.72
473     for ($set_cookie) {
474     # parse NAME=VALUE
475     my @kv;
476    
477 root 1.79 # expires is not http-compliant in the original cookie-spec,
478     # we support the official date format and some extensions
479 root 1.72 while (
480     m{
481     \G\s*
482     (?:
483 root 1.79 expires \s*=\s* ([A-Z][a-z][a-z]+,\ [^,;]+)
484 root 1.82 | ([^=;,[:space:]]+) (?: \s*=\s* (?: "((?:[^\\"]+|\\.)*)" | ([^=;,[:space:]]*) ) )?
485 root 1.72 )
486     }gcxsi
487     ) {
488     my $name = $2;
489     my $value = $4;
490    
491 root 1.82 if (defined $1) {
492 root 1.72 # expires
493     $name = "expires";
494     $value = $1;
495 root 1.82 } elsif (defined $3) {
496 root 1.72 # quoted
497     $value = $3;
498     $value =~ s/\\(.)/$1/gs;
499     }
500    
501     push @kv, lc $name, $value;
502    
503     last unless /\G\s*;/gc;
504     }
505    
506     last unless @kv;
507    
508     my $name = shift @kv;
509     my %kv = (value => shift @kv, @kv);
510    
511 root 1.80 if (exists $kv{"max-age"}) {
512     $kv{_expires} = $anow + delete $kv{"max-age"};
513     } elsif (exists $kv{expires}) {
514     $snow ||= parse_date ($date) || $anow;
515     $kv{_expires} = $anow + (parse_date (delete $kv{expires}) - $snow);
516     } else {
517     delete $kv{_expires};
518     }
519 root 1.72
520     my $cdom;
521     my $cpath = (delete $kv{path}) || "/";
522    
523     if (exists $kv{domain}) {
524     $cdom = delete $kv{domain};
525    
526     $cdom =~ s/^\.?/./; # make sure it starts with a "."
527    
528     next if $cdom =~ /\.$/;
529    
530     # this is not rfc-like and not netscape-like. go figure.
531     my $ndots = $cdom =~ y/.//;
532     next if $ndots < ($cdom =~ /\.[^.][^.]\.[^.][^.]$/ ? 3 : 2);
533     } else {
534     $cdom = $uhost;
535     }
536    
537     # store it
538 root 1.73 $jar->{version} = 1;
539 root 1.83 $jar->{lc $cdom}{$cpath}{$name} = \%kv;
540 root 1.72
541     redo if /\G\s*,/gc;
542     }
543     }
544    
545 root 1.66 # continue to parse $_ for headers and place them into the arg
546     sub parse_hdr() {
547     my %hdr;
548    
549     # things seen, not parsed:
550     # p3pP="NON CUR OTPi OUR NOR UNI"
551    
552     $hdr{lc $1} .= ",$2"
553     while /\G
554     ([^:\000-\037]*):
555     [\011\040]*
556     ((?: [^\012]+ | \012[\011\040] )*)
557     \012
558     /gxc;
559    
560     /\G$/
561     or return;
562    
563     # remove the "," prefix we added to all headers above
564     substr $_, 0, 1, ""
565     for values %hdr;
566    
567     \%hdr
568     }
569    
570 root 1.46 our $qr_nlnl = qr{(?<![^\012])\015?\012};
571 root 1.34
572 root 1.41 our $TLS_CTX_LOW = { cache => 1, sslv2 => 1 };
573     our $TLS_CTX_HIGH = { cache => 1, verify => 1, verify_peername => "https" };
574 root 1.40
575 elmex 1.15 sub http_request($$@) {
576 root 1.1 my $cb = pop;
577     my ($method, $url, %arg) = @_;
578    
579     my %hdr;
580    
581 root 1.40 $arg{tls_ctx} = $TLS_CTX_LOW if $arg{tls_ctx} eq "low" || !exists $arg{tls_ctx};
582     $arg{tls_ctx} = $TLS_CTX_HIGH if $arg{tls_ctx} eq "high";
583    
584 root 1.3 $method = uc $method;
585    
586 root 1.8 if (my $hdr = $arg{headers}) {
587 root 1.1 while (my ($k, $v) = each %$hdr) {
588     $hdr{lc $k} = $v;
589     }
590     }
591    
592 root 1.55 # pseudo headers for all subsequent responses
593     my @pseudo = (URL => $url);
594     push @pseudo, Redirect => delete $arg{Redirect} if exists $arg{Redirect};
595    
596 root 1.23 my $recurse = exists $arg{recurse} ? delete $arg{recurse} : $MAX_RECURSE;
597 root 1.8
598 root 1.64 return $cb->(undef, { @pseudo, Status => 599, Reason => "Too many redirections" })
599 root 1.8 if $recurse < 0;
600    
601 root 1.2 my $proxy = $arg{proxy} || $PROXY;
602 root 1.1 my $timeout = $arg{timeout} || $TIMEOUT;
603    
604 root 1.31 my ($uscheme, $uauthority, $upath, $query, $fragment) =
605 root 1.56 $url =~ m|(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)(?:(\?[^#]*))?(?:#(.*))?|;
606 root 1.2
607 root 1.31 $uscheme = lc $uscheme;
608 root 1.1
609 root 1.31 my $uport = $uscheme eq "http" ? 80
610     : $uscheme eq "https" ? 443
611 root 1.64 : return $cb->(undef, { @pseudo, Status => 599, Reason => "Only http and https URL schemes supported" });
612 root 1.13
613 root 1.31 $uauthority =~ /^(?: .*\@ )? ([^\@:]+) (?: : (\d+) )?$/x
614 root 1.64 or return $cb->(undef, { @pseudo, Status => 599, Reason => "Unparsable URL" });
615 root 1.10
616 root 1.86 my $uhost = lc $1;
617 root 1.10 $uport = $2 if defined $2;
618    
619 root 1.53 $hdr{host} = defined $2 ? "$uhost:$2" : "$uhost"
620     unless exists $hdr{host};
621 root 1.43
622 root 1.10 $uhost =~ s/^\[(.*)\]$/$1/;
623 root 1.56 $upath .= $query if length $query;
624 root 1.10
625     $upath =~ s%^/?%/%;
626    
627     # cookie processing
628     if (my $jar = $arg{cookie_jar}) {
629 root 1.71 my $cookies = cookie_jar_extract $jar, $uscheme, $uhost, $upath;
630 root 1.70
631 root 1.71 $hdr{cookie} = join "; ", @$cookies
632     if @$cookies;
633 root 1.10 }
634 root 1.1
635 root 1.31 my ($rhost, $rport, $rscheme, $rpath); # request host, port, path
636 root 1.2
637 root 1.10 if ($proxy) {
638 root 1.38 ($rpath, $rhost, $rport, $rscheme) = ($url, @$proxy);
639 root 1.31
640 root 1.47 $rscheme = "http" unless defined $rscheme;
641    
642 root 1.31 # don't support https requests over https-proxy transport,
643 root 1.38 # can't be done with tls as spec'ed, unless you double-encrypt.
644 root 1.31 $rscheme = "http" if $uscheme eq "https" && $rscheme eq "https";
645 root 1.86
646     $rhost = lc $rhost;
647     $rscheme = lc $rscheme;
648 root 1.10 } else {
649 root 1.31 ($rhost, $rport, $rscheme, $rpath) = ($uhost, $uport, $uscheme, $upath);
650 root 1.2 }
651    
652 root 1.47 # leave out fragment and query string, just a heuristic
653 root 1.66 $hdr{referer} = "$uscheme://$uauthority$upath" unless exists $hdr{referer};
654     $hdr{"user-agent"} = $USERAGENT unless exists $hdr{"user-agent"};
655 root 1.41
656 root 1.53 $hdr{"content-length"} = length $arg{body}
657     if length $arg{body} || $method ne "GET";
658 root 1.1
659 root 1.89 my $idempotent = $method =~ /^(?:GET|HEAD|PUT|DELETE|OPTIONS|TRACE)$/;
660    
661     # default value for keepalive is true iff the request is for an idempotent method
662     my $keepalive = exists $arg{keepalive}
663     ? $arg{keepalive}*1
664     : $idempotent ? $PERSISTENT_TIMEOUT : 0;
665    
666     $hdr{connection} = ($keepalive ? "" : "close ") . "Te"; #1.1
667 root 1.68 $hdr{te} = "trailers" unless exists $hdr{te}; #1.1
668 root 1.66
669 root 1.11 my %state = (connect_guard => 1);
670    
671 root 1.88 my $ae_error = 595; # connecting
672 root 1.1
673 root 1.88 # handle actual, non-tunneled, request
674     my $handle_actual_request = sub {
675     $ae_error = 596; # request phase
676    
677     $state{handle}->starttls ("connect") if $uscheme eq "https" && !exists $state{handle}{tls};
678    
679     # send request
680     $state{handle}->push_write (
681     "$method $rpath HTTP/1.1\015\012"
682     . (join "", map "\u$_: $hdr{$_}\015\012", grep defined $hdr{$_}, keys %hdr)
683     . "\015\012"
684     . (delete $arg{body})
685     );
686    
687     # return if error occured during push_write()
688     return unless %state;
689    
690 root 1.89 # reduce memory usage, save a kitten, also re-use it for the response headers.
691     %hdr = ();
692 root 1.88
693     # status line and headers
694     $state{read_response} = sub {
695     for ("$_[1]") {
696     y/\015//d; # weed out any \015, as they show up in the weirdest of places.
697    
698     /^HTTP\/0*([0-9\.]+) \s+ ([0-9]{3}) (?: \s+ ([^\012]*) )? \012/gxci
699     or return (%state = (), $cb->(undef, { @pseudo, Status => 599, Reason => "Invalid server response" }));
700    
701     # 100 Continue handling
702     # should not happen as we don't send expect: 100-continue,
703     # but we handle it just in case.
704     # since we send the request body regardless, if we get an error
705     # we are out of-sync, which we currently do NOT handle correctly.
706     return $state{handle}->push_read (line => $qr_nlnl, $state{read_response})
707     if $2 eq 100;
708    
709     push @pseudo,
710     HTTPVersion => $1,
711     Status => $2,
712     Reason => $3,
713     ;
714 root 1.1
715 root 1.88 my $hdr = parse_hdr
716     or return (%state = (), $cb->(undef, { @pseudo, Status => 599, Reason => "Garbled response headers" }));
717 root 1.77
718 root 1.88 %hdr = (%$hdr, @pseudo);
719     }
720 root 1.82
721 root 1.88 # redirect handling
722     # microsoft and other shitheads don't give a shit for following standards,
723     # try to support some common forms of broken Location headers.
724     if ($hdr{location} !~ /^(?: $ | [^:\/?\#]+ : )/x) {
725     $hdr{location} =~ s/^\.\/+//;
726    
727     my $url = "$rscheme://$uhost:$uport";
728    
729     unless ($hdr{location} =~ s/^\///) {
730     $url .= $upath;
731     $url =~ s/\/[^\/]*$//;
732 root 1.82 }
733    
734 root 1.88 $hdr{location} = "$url/$hdr{location}";
735     }
736 root 1.82
737 root 1.88 my $redirect;
738 root 1.82
739 root 1.88 if ($recurse) {
740     my $status = $hdr{Status};
741 root 1.82
742 root 1.88 # industry standard is to redirect POST as GET for
743     # 301, 302 and 303, in contrast to HTTP/1.0 and 1.1.
744     # also, the UA should ask the user for 301 and 307 and POST,
745     # industry standard seems to be to simply follow.
746     # we go with the industry standard.
747     if ($status == 301 or $status == 302 or $status == 303) {
748     # HTTP/1.1 is unclear on how to mutate the method
749     $method = "GET" unless $method eq "HEAD";
750     $redirect = 1;
751     } elsif ($status == 307) {
752     $redirect = 1;
753 root 1.82 }
754 root 1.88 }
755 root 1.82
756 root 1.88 my $finish = sub { # ($data, $err_status, $err_reason[, $keepalive])
757     my $may_keep_alive = $_[3];
758 root 1.82
759 root 1.88 $state{handle}->destroy if $state{handle};
760     %state = ();
761 root 1.82
762 root 1.88 if (defined $_[1]) {
763     $hdr{OrigStatus} = $hdr{Status}; $hdr{Status} = $_[1];
764     $hdr{OrigReason} = $hdr{Reason}; $hdr{Reason} = $_[2];
765     }
766 root 1.82
767 root 1.88 # set-cookie processing
768     if ($arg{cookie_jar}) {
769     cookie_jar_set_cookie $arg{cookie_jar}, $hdr{"set-cookie"}, $uhost, $hdr{date};
770     }
771 root 1.82
772 root 1.88 if ($redirect && exists $hdr{location}) {
773     # we ignore any errors, as it is very common to receive
774     # Content-Length != 0 but no actual body
775     # we also access %hdr, as $_[1] might be an erro
776     http_request (
777     $method => $hdr{location},
778     %arg,
779     recurse => $recurse - 1,
780     Redirect => [$_[0], \%hdr],
781     $cb);
782     } else {
783     $cb->($_[0], \%hdr);
784     }
785     };
786 root 1.82
787 root 1.88 $ae_error = 597; # body phase
788 root 1.82
789 root 1.88 my $len = $hdr{"content-length"};
790 root 1.82
791 root 1.88 # body handling, many different code paths
792     # - no body expected
793     # - want_body_handle
794     # - te chunked
795     # - 2x length known (with or without on_body)
796     # - 2x length not known (with or without on_body)
797     if (!$redirect && $arg{on_header} && !$arg{on_header}(\%hdr)) {
798     $finish->(undef, 598 => "Request cancelled by on_header");
799     } elsif (
800     $hdr{Status} =~ /^(?:1..|204|205|304)$/
801     or $method eq "HEAD"
802     or (defined $len && $len == 0) # == 0, not !, because "0 " is true
803     ) {
804     # no body
805     $finish->("", undef, undef, 1);
806    
807     } elsif (!$redirect && $arg{want_body_handle}) {
808     $_[0]->on_eof (undef);
809     $_[0]->on_error (undef);
810     $_[0]->on_read (undef);
811    
812     $finish->(delete $state{handle});
813    
814     } elsif ($hdr{"transfer-encoding"} =~ /\bchunked\b/i) {
815     my $cl = 0;
816     my $body = undef;
817     my $on_body = $arg{on_body} || sub { $body .= shift; 1 };
818    
819     $state{read_chunk} = sub {
820     $_[1] =~ /^([0-9a-fA-F]+)/
821     or $finish->(undef, $ae_error => "Garbled chunked transfer encoding");
822 root 1.82
823 root 1.88 my $len = hex $1;
824 root 1.82
825 root 1.88 if ($len) {
826     $cl += $len;
827 root 1.82
828 root 1.88 $_[0]->push_read (chunk => $len, sub {
829     $on_body->($_[1], \%hdr)
830     or return $finish->(undef, 598 => "Request cancelled by on_body");
831 root 1.82
832 root 1.88 $_[0]->push_read (line => sub {
833     length $_[1]
834     and return $finish->(undef, $ae_error => "Garbled chunked transfer encoding");
835     $_[0]->push_read (line => $state{read_chunk});
836 root 1.82 });
837 root 1.88 });
838     } else {
839     $hdr{"content-length"} ||= $cl;
840 root 1.84
841 root 1.88 $_[0]->push_read (line => $qr_nlnl, sub {
842     if (length $_[1]) {
843     for ("$_[1]") {
844     y/\015//d; # weed out any \015, as they show up in the weirdest of places.
845 root 1.84
846 root 1.88 my $hdr = parse_hdr
847     or return $finish->(undef, $ae_error => "Garbled response trailers");
848 root 1.84
849 root 1.88 %hdr = (%hdr, %$hdr);
850     }
851     }
852 root 1.84
853 root 1.88 $finish->($body, undef, undef, 1);
854 root 1.84 });
855     }
856 root 1.88 };
857    
858     $_[0]->push_read (line => $state{read_chunk});
859    
860     } elsif ($arg{on_body}) {
861     if (defined $len) {
862     $_[0]->on_read (sub {
863     $len -= length $_[0]{rbuf};
864    
865     $arg{on_body}(delete $_[0]{rbuf}, \%hdr)
866     or return $finish->(undef, 598 => "Request cancelled by on_body");
867    
868     $len > 0
869     or $finish->("", undef, undef, 1);
870     });
871 root 1.84 } else {
872 root 1.88 $_[0]->on_eof (sub {
873     $finish->("");
874     });
875     $_[0]->on_read (sub {
876     $arg{on_body}(delete $_[0]{rbuf}, \%hdr)
877     or $finish->(undef, 598 => "Request cancelled by on_body");
878     });
879     }
880     } else {
881     $_[0]->on_eof (undef);
882 root 1.82
883 root 1.88 if (defined $len) {
884     $_[0]->on_read (sub {
885     $finish->((substr delete $_[0]{rbuf}, 0, $len, ""), undef, undef, 1)
886     if $len <= length $_[0]{rbuf};
887     });
888     } else {
889     $_[0]->on_error (sub {
890     ($! == Errno::EPIPE || !$!)
891     ? $finish->(delete $_[0]{rbuf})
892     : $finish->(undef, $ae_error => $_[2]);
893     });
894     $_[0]->on_read (sub { });
895 root 1.82 }
896 root 1.88 }
897     };
898 root 1.82
899 root 1.88 $state{handle}->push_read (line => $qr_nlnl, $state{read_response});
900     };
901 root 1.82
902 root 1.88 my $connect_cb = sub {
903     $state{fh} = shift
904     or do {
905     my $err = "$!";
906     %state = ();
907     return $cb->(undef, { @pseudo, Status => $ae_error, Reason => $err });
908     };
909 root 1.44
910 root 1.88 return unless delete $state{connect_guard};
911 root 1.11
912 root 1.88 # get handle
913     $state{handle} = new AnyEvent::Handle
914     fh => $state{fh},
915     peername => $rhost,
916     tls_ctx => $arg{tls_ctx},
917     # these need to be reconfigured on keepalive handles
918     timeout => $timeout,
919     on_error => sub {
920     %state = ();
921     $cb->(undef, { @pseudo, Status => $ae_error, Reason => $_[2] });
922     },
923     on_eof => sub {
924     %state = ();
925     $cb->(undef, { @pseudo, Status => $ae_error, Reason => "Unexpected end-of-file" });
926     },
927     ;
928 root 1.11
929 root 1.88 # limit the number of persistent connections
930     # keepalive not yet supported
931 root 1.56 # if ($KA_COUNT{$_[1]} < $MAX_PERSISTENT_PER_HOST) {
932     # ++$KA_COUNT{$_[1]};
933     # $state{handle}{ka_count_guard} = AnyEvent::Util::guard {
934     # --$KA_COUNT{$_[1]}
935     # };
936     # $hdr{connection} = "keep-alive";
937     # }
938 root 1.1
939 root 1.88 $state{handle}->starttls ("connect") if $rscheme eq "https";
940    
941     # now handle proxy-CONNECT method
942     if ($proxy && $uscheme eq "https") {
943     # oh dear, we have to wrap it into a connect request
944    
945     # maybe re-use $uauthority with patched port?
946     $state{handle}->push_write ("CONNECT $uhost:$uport HTTP/1.0\015\012\015\012");
947     $state{handle}->push_read (line => $qr_nlnl, sub {
948     $_[1] =~ /^HTTP\/([0-9\.]+) \s+ ([0-9]{3}) (?: \s+ ([^\015\012]*) )?/ix
949     or return (%state = (), $cb->(undef, { @pseudo, Status => 599, Reason => "Invalid proxy connect response ($_[1])" }));
950    
951     if ($2 == 200) {
952     $rpath = $upath;
953     $handle_actual_request->();
954     } else {
955     %state = ();
956     $cb->(undef, { @pseudo, Status => $2, Reason => $3 });
957     }
958     });
959     } else {
960     $handle_actual_request->();
961     }
962     };
963    
964     _get_slot $uhost, sub {
965     $state{slot_guard} = shift;
966 root 1.64
967 root 1.88 return unless $state{connect_guard};
968 root 1.64
969     my $tcp_connect = $arg{tcp_connect}
970     || do { require AnyEvent::Socket; \&AnyEvent::Socket::tcp_connect };
971 root 1.57
972 root 1.64 $state{connect_guard} = $tcp_connect->($rhost, $rport, $connect_cb, $arg{on_prepare} || sub { $timeout });
973 root 1.1 };
974    
975     defined wantarray && AnyEvent::Util::guard { %state = () }
976     }
977    
978 elmex 1.15 sub http_get($@) {
979 root 1.1 unshift @_, "GET";
980     &http_request
981     }
982    
983 elmex 1.15 sub http_head($@) {
984 root 1.4 unshift @_, "HEAD";
985     &http_request
986     }
987    
988 elmex 1.15 sub http_post($$@) {
989 root 1.22 my $url = shift;
990     unshift @_, "POST", $url, "body";
991 root 1.3 &http_request
992     }
993    
994 root 1.9 =back
995    
996 root 1.55 =head2 DNS CACHING
997    
998     AnyEvent::HTTP uses the AnyEvent::Socket::tcp_connect function for
999     the actual connection, which in turn uses AnyEvent::DNS to resolve
1000     hostnames. The latter is a simple stub resolver and does no caching
1001     on its own. If you want DNS caching, you currently have to provide
1002     your own default resolver (by storing a suitable resolver object in
1003     C<$AnyEvent::DNS::RESOLVER>).
1004    
1005 root 1.2 =head2 GLOBAL FUNCTIONS AND VARIABLES
1006 root 1.1
1007     =over 4
1008    
1009 root 1.2 =item AnyEvent::HTTP::set_proxy "proxy-url"
1010    
1011     Sets the default proxy server to use. The proxy-url must begin with a
1012 root 1.52 string of the form C<http://host:port> (optionally C<https:...>), croaks
1013     otherwise.
1014    
1015     To clear an already-set proxy, use C<undef>.
1016 root 1.2
1017 root 1.80 =item AnyEvent::HTTP::cookie_jar_expire $jar[, $session_end]
1018    
1019     Remove all cookies from the cookie jar that have been expired. If
1020     C<$session_end> is given and true, then additionally remove all session
1021     cookies.
1022    
1023     You should call this function (with a true C<$session_end>) before you
1024     save cookies to disk, and you should call this function after loading them
1025     again. If you have a long-running program you can additonally call this
1026     function from time to time.
1027    
1028     A cookie jar is initially an empty hash-reference that is managed by this
1029     module. It's format is subject to change, but currently it is like this:
1030    
1031     The key C<version> has to contain C<1>, otherwise the hash gets
1032     emptied. All other keys are hostnames or IP addresses pointing to
1033     hash-references. The key for these inner hash references is the
1034     server path for which this cookie is meant, and the values are again
1035     hash-references. The keys of those hash-references is the cookie name, and
1036     the value, you guessed it, is another hash-reference, this time with the
1037     key-value pairs from the cookie, except for C<expires> and C<max-age>,
1038     which have been replaced by a C<_expires> key that contains the cookie
1039     expiry timestamp.
1040    
1041     Here is an example of a cookie jar with a single cookie, so you have a
1042     chance of understanding the above paragraph:
1043    
1044     {
1045     version => 1,
1046     "10.0.0.1" => {
1047     "/" => {
1048     "mythweb_id" => {
1049     _expires => 1293917923,
1050     value => "ooRung9dThee3ooyXooM1Ohm",
1051     },
1052     },
1053     },
1054     }
1055    
1056 root 1.61 =item $date = AnyEvent::HTTP::format_date $timestamp
1057    
1058     Takes a POSIX timestamp (seconds since the epoch) and formats it as a HTTP
1059     Date (RFC 2616).
1060    
1061     =item $timestamp = AnyEvent::HTTP::parse_date $date
1062    
1063 root 1.79 Takes a HTTP Date (RFC 2616) or a Cookie date (netscape cookie spec) or a
1064     bunch of minor variations of those, and returns the corresponding POSIX
1065     timestamp, or C<undef> if the date cannot be parsed.
1066 root 1.61
1067 root 1.3 =item $AnyEvent::HTTP::MAX_RECURSE
1068 root 1.1
1069 root 1.3 The default value for the C<recurse> request parameter (default: C<10>).
1070 root 1.1
1071     =item $AnyEvent::HTTP::USERAGENT
1072    
1073     The default value for the C<User-Agent> header (the default is
1074 root 1.40 C<Mozilla/5.0 (compatible; U; AnyEvent-HTTP/$VERSION; +http://software.schmorp.de/pkg/AnyEvent)>).
1075 root 1.1
1076 root 1.43 =item $AnyEvent::HTTP::MAX_PER_HOST
1077 root 1.1
1078 root 1.47 The maximum number of concurrent connections to the same host (identified
1079 root 1.43 by the hostname). If the limit is exceeded, then the additional requests
1080     are queued until previous connections are closed.
1081 root 1.1
1082 root 1.43 The default value for this is C<4>, and it is highly advisable to not
1083     increase it.
1084 root 1.3
1085 root 1.14 =item $AnyEvent::HTTP::ACTIVE
1086    
1087     The number of active connections. This is not the number of currently
1088     running requests, but the number of currently open and non-idle TCP
1089     connections. This number of can be useful for load-leveling.
1090    
1091 root 1.1 =back
1092    
1093     =cut
1094    
1095 root 1.61 our @month = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
1096     our @weekday = qw(Sun Mon Tue Wed Thu Fri Sat);
1097    
1098     sub format_date($) {
1099     my ($time) = @_;
1100    
1101     # RFC 822/1123 format
1102     my ($S, $M, $H, $mday, $mon, $year, $wday, $yday, undef) = gmtime $time;
1103    
1104     sprintf "%s, %02d %s %04d %02d:%02d:%02d GMT",
1105     $weekday[$wday], $mday, $month[$mon], $year + 1900,
1106     $H, $M, $S;
1107     }
1108    
1109     sub parse_date($) {
1110     my ($date) = @_;
1111    
1112     my ($d, $m, $y, $H, $M, $S);
1113    
1114 root 1.79 if ($date =~ /^[A-Z][a-z][a-z]+, ([0-9][0-9]?)[\- ]([A-Z][a-z][a-z])[\- ]([0-9][0-9][0-9][0-9]) ([0-9][0-9]?):([0-9][0-9]?):([0-9][0-9]?) GMT$/) {
1115 root 1.70 # RFC 822/1123, required by RFC 2616 (with " ")
1116     # cookie dates (with "-")
1117    
1118 root 1.61 ($d, $m, $y, $H, $M, $S) = ($1, $2, $3, $4, $5, $6);
1119    
1120 root 1.79 } elsif ($date =~ /^[A-Z][a-z][a-z]+, ([0-9][0-9]?)-([A-Z][a-z][a-z])-([0-9][0-9]) ([0-9][0-9]?):([0-9][0-9]?):([0-9][0-9]?) GMT$/) {
1121 root 1.61 # RFC 850
1122     ($d, $m, $y, $H, $M, $S) = ($1, $2, $3 < 69 ? $3 + 2000 : $3 + 1900, $4, $5, $6);
1123    
1124 root 1.79 } elsif ($date =~ /^[A-Z][a-z][a-z]+ ([A-Z][a-z][a-z]) ([0-9 ]?[0-9]) ([0-9][0-9]?):([0-9][0-9]?):([0-9][0-9]?) ([0-9][0-9][0-9][0-9])$/) {
1125 root 1.61 # ISO C's asctime
1126     ($d, $m, $y, $H, $M, $S) = ($2, $1, $6, $3, $4, $5);
1127     }
1128     # other formats fail in the loop below
1129    
1130     for (0..11) {
1131     if ($m eq $month[$_]) {
1132     require Time::Local;
1133     return Time::Local::timegm ($S, $M, $H, $d, $_, $y);
1134     }
1135     }
1136    
1137     undef
1138     }
1139    
1140 root 1.2 sub set_proxy($) {
1141 root 1.52 if (length $_[0]) {
1142     $_[0] =~ m%^(https?):// ([^:/]+) (?: : (\d*) )?%ix
1143     or Carp::croak "$_[0]: invalid proxy URL";
1144     $PROXY = [$2, $3 || 3128, $1]
1145     } else {
1146     undef $PROXY;
1147     }
1148 root 1.2 }
1149    
1150     # initialise proxy from environment
1151 root 1.52 eval {
1152     set_proxy $ENV{http_proxy};
1153     };
1154 root 1.2
1155 root 1.60 =head2 SOCKS PROXIES
1156    
1157     Socks proxies are not directly supported by AnyEvent::HTTP. You can
1158     compile your perl to support socks, or use an external program such as
1159     F<socksify> (dante) or F<tsocks> to make your program use a socks proxy
1160     transparently.
1161    
1162     Alternatively, for AnyEvent::HTTP only, you can use your own
1163     C<tcp_connect> function that does the proxy handshake - here is an example
1164     that works with socks4a proxies:
1165    
1166     use Errno;
1167     use AnyEvent::Util;
1168     use AnyEvent::Socket;
1169     use AnyEvent::Handle;
1170    
1171     # host, port and username of/for your socks4a proxy
1172     my $socks_host = "10.0.0.23";
1173     my $socks_port = 9050;
1174     my $socks_user = "";
1175    
1176     sub socks4a_connect {
1177     my ($host, $port, $connect_cb, $prepare_cb) = @_;
1178    
1179     my $hdl = new AnyEvent::Handle
1180     connect => [$socks_host, $socks_port],
1181     on_prepare => sub { $prepare_cb->($_[0]{fh}) },
1182     on_error => sub { $connect_cb->() },
1183     ;
1184    
1185     $hdl->push_write (pack "CCnNZ*Z*", 4, 1, $port, 1, $socks_user, $host);
1186    
1187     $hdl->push_read (chunk => 8, sub {
1188     my ($hdl, $chunk) = @_;
1189     my ($status, $port, $ipn) = unpack "xCna4", $chunk;
1190    
1191     if ($status == 0x5a) {
1192     $connect_cb->($hdl->{fh}, (format_address $ipn) . ":$port");
1193     } else {
1194     $! = Errno::ENXIO; $connect_cb->();
1195     }
1196     });
1197    
1198     $hdl
1199     }
1200    
1201     Use C<socks4a_connect> instead of C<tcp_connect> when doing C<http_request>s,
1202     possibly after switching off other proxy types:
1203    
1204     AnyEvent::HTTP::set_proxy undef; # usually you do not want other proxies
1205    
1206     http_get 'http://www.google.com', tcp_connect => \&socks4a_connect, sub {
1207     my ($data, $headers) = @_;
1208     ...
1209     };
1210    
1211 root 1.1 =head1 SEE ALSO
1212    
1213     L<AnyEvent>.
1214    
1215     =head1 AUTHOR
1216    
1217 root 1.18 Marc Lehmann <schmorp@schmorp.de>
1218     http://home.schmorp.de/
1219 root 1.1
1220 root 1.36 With many thanks to Дмитрий Шалашов, who provided countless
1221     testcases and bugreports.
1222    
1223 root 1.1 =cut
1224    
1225     1
1226