ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-HTTP/HTTP.pm
Revision: 1.91
Committed: Mon Jan 3 01:03:29 2011 UTC (13 years, 4 months ago) by root
Branch: MAIN
Changes since 1.90: +4 -2 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.91 my $chunked = $hdr{"transfer-encoding"} =~ /\bchunked\b/i; # not quite correct...
790    
791     my $len = $chunked ? undef : $hdr{"content-length"};
792 root 1.82
793 root 1.88 # body handling, many different code paths
794     # - no body expected
795     # - want_body_handle
796     # - te chunked
797     # - 2x length known (with or without on_body)
798     # - 2x length not known (with or without on_body)
799     if (!$redirect && $arg{on_header} && !$arg{on_header}(\%hdr)) {
800     $finish->(undef, 598 => "Request cancelled by on_header");
801     } elsif (
802     $hdr{Status} =~ /^(?:1..|204|205|304)$/
803     or $method eq "HEAD"
804     or (defined $len && $len == 0) # == 0, not !, because "0 " is true
805     ) {
806     # no body
807     $finish->("", undef, undef, 1);
808    
809     } elsif (!$redirect && $arg{want_body_handle}) {
810     $_[0]->on_eof (undef);
811     $_[0]->on_error (undef);
812     $_[0]->on_read (undef);
813    
814     $finish->(delete $state{handle});
815    
816 root 1.91 } elsif ($chunked) {
817 root 1.88 my $cl = 0;
818     my $body = undef;
819     my $on_body = $arg{on_body} || sub { $body .= shift; 1 };
820    
821     $state{read_chunk} = sub {
822     $_[1] =~ /^([0-9a-fA-F]+)/
823     or $finish->(undef, $ae_error => "Garbled chunked transfer encoding");
824 root 1.82
825 root 1.88 my $len = hex $1;
826 root 1.82
827 root 1.88 if ($len) {
828     $cl += $len;
829 root 1.82
830 root 1.88 $_[0]->push_read (chunk => $len, sub {
831     $on_body->($_[1], \%hdr)
832     or return $finish->(undef, 598 => "Request cancelled by on_body");
833 root 1.82
834 root 1.88 $_[0]->push_read (line => sub {
835     length $_[1]
836     and return $finish->(undef, $ae_error => "Garbled chunked transfer encoding");
837     $_[0]->push_read (line => $state{read_chunk});
838 root 1.82 });
839 root 1.88 });
840     } else {
841     $hdr{"content-length"} ||= $cl;
842 root 1.84
843 root 1.88 $_[0]->push_read (line => $qr_nlnl, sub {
844     if (length $_[1]) {
845     for ("$_[1]") {
846     y/\015//d; # weed out any \015, as they show up in the weirdest of places.
847 root 1.84
848 root 1.88 my $hdr = parse_hdr
849     or return $finish->(undef, $ae_error => "Garbled response trailers");
850 root 1.84
851 root 1.88 %hdr = (%hdr, %$hdr);
852     }
853     }
854 root 1.84
855 root 1.88 $finish->($body, undef, undef, 1);
856 root 1.84 });
857     }
858 root 1.88 };
859    
860     $_[0]->push_read (line => $state{read_chunk});
861    
862     } elsif ($arg{on_body}) {
863     if (defined $len) {
864     $_[0]->on_read (sub {
865     $len -= length $_[0]{rbuf};
866    
867     $arg{on_body}(delete $_[0]{rbuf}, \%hdr)
868     or return $finish->(undef, 598 => "Request cancelled by on_body");
869    
870     $len > 0
871     or $finish->("", undef, undef, 1);
872     });
873 root 1.84 } else {
874 root 1.88 $_[0]->on_eof (sub {
875     $finish->("");
876     });
877     $_[0]->on_read (sub {
878     $arg{on_body}(delete $_[0]{rbuf}, \%hdr)
879     or $finish->(undef, 598 => "Request cancelled by on_body");
880     });
881     }
882     } else {
883     $_[0]->on_eof (undef);
884 root 1.82
885 root 1.88 if (defined $len) {
886     $_[0]->on_read (sub {
887     $finish->((substr delete $_[0]{rbuf}, 0, $len, ""), undef, undef, 1)
888     if $len <= length $_[0]{rbuf};
889     });
890     } else {
891     $_[0]->on_error (sub {
892     ($! == Errno::EPIPE || !$!)
893     ? $finish->(delete $_[0]{rbuf})
894     : $finish->(undef, $ae_error => $_[2]);
895     });
896     $_[0]->on_read (sub { });
897 root 1.82 }
898 root 1.88 }
899     };
900 root 1.82
901 root 1.88 $state{handle}->push_read (line => $qr_nlnl, $state{read_response});
902     };
903 root 1.82
904 root 1.88 my $connect_cb = sub {
905     $state{fh} = shift
906     or do {
907     my $err = "$!";
908     %state = ();
909     return $cb->(undef, { @pseudo, Status => $ae_error, Reason => $err });
910     };
911 root 1.44
912 root 1.88 return unless delete $state{connect_guard};
913 root 1.11
914 root 1.88 # get handle
915     $state{handle} = new AnyEvent::Handle
916     fh => $state{fh},
917     peername => $rhost,
918     tls_ctx => $arg{tls_ctx},
919     # these need to be reconfigured on keepalive handles
920     timeout => $timeout,
921     on_error => sub {
922     %state = ();
923     $cb->(undef, { @pseudo, Status => $ae_error, Reason => $_[2] });
924     },
925     on_eof => sub {
926     %state = ();
927     $cb->(undef, { @pseudo, Status => $ae_error, Reason => "Unexpected end-of-file" });
928     },
929     ;
930 root 1.11
931 root 1.88 # limit the number of persistent connections
932     # keepalive not yet supported
933 root 1.56 # if ($KA_COUNT{$_[1]} < $MAX_PERSISTENT_PER_HOST) {
934     # ++$KA_COUNT{$_[1]};
935     # $state{handle}{ka_count_guard} = AnyEvent::Util::guard {
936     # --$KA_COUNT{$_[1]}
937     # };
938     # $hdr{connection} = "keep-alive";
939     # }
940 root 1.1
941 root 1.88 $state{handle}->starttls ("connect") if $rscheme eq "https";
942    
943     # now handle proxy-CONNECT method
944     if ($proxy && $uscheme eq "https") {
945     # oh dear, we have to wrap it into a connect request
946    
947     # maybe re-use $uauthority with patched port?
948     $state{handle}->push_write ("CONNECT $uhost:$uport HTTP/1.0\015\012\015\012");
949     $state{handle}->push_read (line => $qr_nlnl, sub {
950     $_[1] =~ /^HTTP\/([0-9\.]+) \s+ ([0-9]{3}) (?: \s+ ([^\015\012]*) )?/ix
951     or return (%state = (), $cb->(undef, { @pseudo, Status => 599, Reason => "Invalid proxy connect response ($_[1])" }));
952    
953     if ($2 == 200) {
954     $rpath = $upath;
955     $handle_actual_request->();
956     } else {
957     %state = ();
958     $cb->(undef, { @pseudo, Status => $2, Reason => $3 });
959     }
960     });
961     } else {
962     $handle_actual_request->();
963     }
964     };
965    
966     _get_slot $uhost, sub {
967     $state{slot_guard} = shift;
968 root 1.64
969 root 1.88 return unless $state{connect_guard};
970 root 1.64
971     my $tcp_connect = $arg{tcp_connect}
972     || do { require AnyEvent::Socket; \&AnyEvent::Socket::tcp_connect };
973 root 1.57
974 root 1.64 $state{connect_guard} = $tcp_connect->($rhost, $rport, $connect_cb, $arg{on_prepare} || sub { $timeout });
975 root 1.1 };
976    
977     defined wantarray && AnyEvent::Util::guard { %state = () }
978     }
979    
980 elmex 1.15 sub http_get($@) {
981 root 1.1 unshift @_, "GET";
982     &http_request
983     }
984    
985 elmex 1.15 sub http_head($@) {
986 root 1.4 unshift @_, "HEAD";
987     &http_request
988     }
989    
990 elmex 1.15 sub http_post($$@) {
991 root 1.22 my $url = shift;
992     unshift @_, "POST", $url, "body";
993 root 1.3 &http_request
994     }
995    
996 root 1.9 =back
997    
998 root 1.55 =head2 DNS CACHING
999    
1000     AnyEvent::HTTP uses the AnyEvent::Socket::tcp_connect function for
1001     the actual connection, which in turn uses AnyEvent::DNS to resolve
1002     hostnames. The latter is a simple stub resolver and does no caching
1003     on its own. If you want DNS caching, you currently have to provide
1004     your own default resolver (by storing a suitable resolver object in
1005     C<$AnyEvent::DNS::RESOLVER>).
1006    
1007 root 1.2 =head2 GLOBAL FUNCTIONS AND VARIABLES
1008 root 1.1
1009     =over 4
1010    
1011 root 1.2 =item AnyEvent::HTTP::set_proxy "proxy-url"
1012    
1013     Sets the default proxy server to use. The proxy-url must begin with a
1014 root 1.52 string of the form C<http://host:port> (optionally C<https:...>), croaks
1015     otherwise.
1016    
1017     To clear an already-set proxy, use C<undef>.
1018 root 1.2
1019 root 1.80 =item AnyEvent::HTTP::cookie_jar_expire $jar[, $session_end]
1020    
1021     Remove all cookies from the cookie jar that have been expired. If
1022     C<$session_end> is given and true, then additionally remove all session
1023     cookies.
1024    
1025     You should call this function (with a true C<$session_end>) before you
1026     save cookies to disk, and you should call this function after loading them
1027     again. If you have a long-running program you can additonally call this
1028     function from time to time.
1029    
1030     A cookie jar is initially an empty hash-reference that is managed by this
1031     module. It's format is subject to change, but currently it is like this:
1032    
1033     The key C<version> has to contain C<1>, otherwise the hash gets
1034     emptied. All other keys are hostnames or IP addresses pointing to
1035     hash-references. The key for these inner hash references is the
1036     server path for which this cookie is meant, and the values are again
1037     hash-references. The keys of those hash-references is the cookie name, and
1038     the value, you guessed it, is another hash-reference, this time with the
1039     key-value pairs from the cookie, except for C<expires> and C<max-age>,
1040     which have been replaced by a C<_expires> key that contains the cookie
1041     expiry timestamp.
1042    
1043     Here is an example of a cookie jar with a single cookie, so you have a
1044     chance of understanding the above paragraph:
1045    
1046     {
1047     version => 1,
1048     "10.0.0.1" => {
1049     "/" => {
1050     "mythweb_id" => {
1051     _expires => 1293917923,
1052     value => "ooRung9dThee3ooyXooM1Ohm",
1053     },
1054     },
1055     },
1056     }
1057    
1058 root 1.61 =item $date = AnyEvent::HTTP::format_date $timestamp
1059    
1060     Takes a POSIX timestamp (seconds since the epoch) and formats it as a HTTP
1061     Date (RFC 2616).
1062    
1063     =item $timestamp = AnyEvent::HTTP::parse_date $date
1064    
1065 root 1.79 Takes a HTTP Date (RFC 2616) or a Cookie date (netscape cookie spec) or a
1066     bunch of minor variations of those, and returns the corresponding POSIX
1067     timestamp, or C<undef> if the date cannot be parsed.
1068 root 1.61
1069 root 1.3 =item $AnyEvent::HTTP::MAX_RECURSE
1070 root 1.1
1071 root 1.3 The default value for the C<recurse> request parameter (default: C<10>).
1072 root 1.1
1073     =item $AnyEvent::HTTP::USERAGENT
1074    
1075     The default value for the C<User-Agent> header (the default is
1076 root 1.40 C<Mozilla/5.0 (compatible; U; AnyEvent-HTTP/$VERSION; +http://software.schmorp.de/pkg/AnyEvent)>).
1077 root 1.1
1078 root 1.43 =item $AnyEvent::HTTP::MAX_PER_HOST
1079 root 1.1
1080 root 1.47 The maximum number of concurrent connections to the same host (identified
1081 root 1.43 by the hostname). If the limit is exceeded, then the additional requests
1082     are queued until previous connections are closed.
1083 root 1.1
1084 root 1.43 The default value for this is C<4>, and it is highly advisable to not
1085     increase it.
1086 root 1.3
1087 root 1.14 =item $AnyEvent::HTTP::ACTIVE
1088    
1089     The number of active connections. This is not the number of currently
1090     running requests, but the number of currently open and non-idle TCP
1091     connections. This number of can be useful for load-leveling.
1092    
1093 root 1.1 =back
1094    
1095     =cut
1096    
1097 root 1.61 our @month = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
1098     our @weekday = qw(Sun Mon Tue Wed Thu Fri Sat);
1099    
1100     sub format_date($) {
1101     my ($time) = @_;
1102    
1103     # RFC 822/1123 format
1104     my ($S, $M, $H, $mday, $mon, $year, $wday, $yday, undef) = gmtime $time;
1105    
1106     sprintf "%s, %02d %s %04d %02d:%02d:%02d GMT",
1107     $weekday[$wday], $mday, $month[$mon], $year + 1900,
1108     $H, $M, $S;
1109     }
1110    
1111     sub parse_date($) {
1112     my ($date) = @_;
1113    
1114     my ($d, $m, $y, $H, $M, $S);
1115    
1116 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$/) {
1117 root 1.70 # RFC 822/1123, required by RFC 2616 (with " ")
1118     # cookie dates (with "-")
1119    
1120 root 1.61 ($d, $m, $y, $H, $M, $S) = ($1, $2, $3, $4, $5, $6);
1121    
1122 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$/) {
1123 root 1.61 # RFC 850
1124     ($d, $m, $y, $H, $M, $S) = ($1, $2, $3 < 69 ? $3 + 2000 : $3 + 1900, $4, $5, $6);
1125    
1126 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])$/) {
1127 root 1.61 # ISO C's asctime
1128     ($d, $m, $y, $H, $M, $S) = ($2, $1, $6, $3, $4, $5);
1129     }
1130     # other formats fail in the loop below
1131    
1132     for (0..11) {
1133     if ($m eq $month[$_]) {
1134     require Time::Local;
1135     return Time::Local::timegm ($S, $M, $H, $d, $_, $y);
1136     }
1137     }
1138    
1139     undef
1140     }
1141    
1142 root 1.2 sub set_proxy($) {
1143 root 1.52 if (length $_[0]) {
1144     $_[0] =~ m%^(https?):// ([^:/]+) (?: : (\d*) )?%ix
1145     or Carp::croak "$_[0]: invalid proxy URL";
1146     $PROXY = [$2, $3 || 3128, $1]
1147     } else {
1148     undef $PROXY;
1149     }
1150 root 1.2 }
1151    
1152     # initialise proxy from environment
1153 root 1.52 eval {
1154     set_proxy $ENV{http_proxy};
1155     };
1156 root 1.2
1157 root 1.60 =head2 SOCKS PROXIES
1158    
1159     Socks proxies are not directly supported by AnyEvent::HTTP. You can
1160     compile your perl to support socks, or use an external program such as
1161     F<socksify> (dante) or F<tsocks> to make your program use a socks proxy
1162     transparently.
1163    
1164     Alternatively, for AnyEvent::HTTP only, you can use your own
1165     C<tcp_connect> function that does the proxy handshake - here is an example
1166     that works with socks4a proxies:
1167    
1168     use Errno;
1169     use AnyEvent::Util;
1170     use AnyEvent::Socket;
1171     use AnyEvent::Handle;
1172    
1173     # host, port and username of/for your socks4a proxy
1174     my $socks_host = "10.0.0.23";
1175     my $socks_port = 9050;
1176     my $socks_user = "";
1177    
1178     sub socks4a_connect {
1179     my ($host, $port, $connect_cb, $prepare_cb) = @_;
1180    
1181     my $hdl = new AnyEvent::Handle
1182     connect => [$socks_host, $socks_port],
1183     on_prepare => sub { $prepare_cb->($_[0]{fh}) },
1184     on_error => sub { $connect_cb->() },
1185     ;
1186    
1187     $hdl->push_write (pack "CCnNZ*Z*", 4, 1, $port, 1, $socks_user, $host);
1188    
1189     $hdl->push_read (chunk => 8, sub {
1190     my ($hdl, $chunk) = @_;
1191     my ($status, $port, $ipn) = unpack "xCna4", $chunk;
1192    
1193     if ($status == 0x5a) {
1194     $connect_cb->($hdl->{fh}, (format_address $ipn) . ":$port");
1195     } else {
1196     $! = Errno::ENXIO; $connect_cb->();
1197     }
1198     });
1199    
1200     $hdl
1201     }
1202    
1203     Use C<socks4a_connect> instead of C<tcp_connect> when doing C<http_request>s,
1204     possibly after switching off other proxy types:
1205    
1206     AnyEvent::HTTP::set_proxy undef; # usually you do not want other proxies
1207    
1208     http_get 'http://www.google.com', tcp_connect => \&socks4a_connect, sub {
1209     my ($data, $headers) = @_;
1210     ...
1211     };
1212    
1213 root 1.1 =head1 SEE ALSO
1214    
1215     L<AnyEvent>.
1216    
1217     =head1 AUTHOR
1218    
1219 root 1.18 Marc Lehmann <schmorp@schmorp.de>
1220     http://home.schmorp.de/
1221 root 1.1
1222 root 1.36 With many thanks to Дмитрий Шалашов, who provided countless
1223     testcases and bugreports.
1224    
1225 root 1.1 =cut
1226    
1227     1
1228