source: main/trunk/greenstone2/perllib/cpan/HTTP/Daemon.pm@ 27181

Last change on this file since 27181 was 27181, checked in by davidb, 11 years ago

Latest libwww-perl (v6x) isn't as self-sufficeint as earlier (v5.x) in terms of supporting Perl modules. Dropping back to to this earlier version so activate.pl runs smoothly when system-installed Perl on Unix system does not have the LWP and related modules installed

File size: 22.6 KB
Line 
1package HTTP::Daemon;
2
3use strict;
4use vars qw($VERSION @ISA $PROTO $DEBUG);
5
6$VERSION = "5.827";
7
8use IO::Socket qw(AF_INET INADDR_ANY inet_ntoa);
9@ISA=qw(IO::Socket::INET);
10
11$PROTO = "HTTP/1.1";
12
13
14sub new
15{
16 my($class, %args) = @_;
17 $args{Listen} ||= 5;
18 $args{Proto} ||= 'tcp';
19 return $class->SUPER::new(%args);
20}
21
22
23sub accept
24{
25 my $self = shift;
26 my $pkg = shift || "HTTP::Daemon::ClientConn";
27 my ($sock, $peer) = $self->SUPER::accept($pkg);
28 if ($sock) {
29 ${*$sock}{'httpd_daemon'} = $self;
30 return wantarray ? ($sock, $peer) : $sock;
31 }
32 else {
33 return;
34 }
35}
36
37
38sub url
39{
40 my $self = shift;
41 my $url = $self->_default_scheme . "://";
42 my $addr = $self->sockaddr;
43 if (!$addr || $addr eq INADDR_ANY) {
44 require Sys::Hostname;
45 $url .= lc Sys::Hostname::hostname();
46 }
47 else {
48 $url .= gethostbyaddr($addr, AF_INET) || inet_ntoa($addr);
49 }
50 my $port = $self->sockport;
51 $url .= ":$port" if $port != $self->_default_port;
52 $url .= "/";
53 $url;
54}
55
56
57sub _default_port {
58 80;
59}
60
61
62sub _default_scheme {
63 "http";
64}
65
66
67sub product_tokens
68{
69 "libwww-perl-daemon/$HTTP::Daemon::VERSION";
70}
71
72
73
74package HTTP::Daemon::ClientConn;
75
76use vars qw(@ISA $DEBUG);
77use IO::Socket ();
78@ISA=qw(IO::Socket::INET);
79*DEBUG = \$HTTP::Daemon::DEBUG;
80
81use HTTP::Request ();
82use HTTP::Response ();
83use HTTP::Status;
84use HTTP::Date qw(time2str);
85use LWP::MediaTypes qw(guess_media_type);
86use Carp ();
87
88my $CRLF = "\015\012"; # "\r\n" is not portable
89my $HTTP_1_0 = _http_version("HTTP/1.0");
90my $HTTP_1_1 = _http_version("HTTP/1.1");
91
92
93sub get_request
94{
95 my($self, $only_headers) = @_;
96 if (${*$self}{'httpd_nomore'}) {
97 $self->reason("No more requests from this connection");
98 return;
99 }
100
101 $self->reason("");
102 my $buf = ${*$self}{'httpd_rbuf'};
103 $buf = "" unless defined $buf;
104
105 my $timeout = $ {*$self}{'io_socket_timeout'};
106 my $fdset = "";
107 vec($fdset, $self->fileno, 1) = 1;
108 local($_);
109
110 READ_HEADER:
111 while (1) {
112 # loop until we have the whole header in $buf
113 $buf =~ s/^(?:\015?\012)+//; # ignore leading blank lines
114 if ($buf =~ /\012/) { # potential, has at least one line
115 if ($buf =~ /^\w+[^\012]+HTTP\/\d+\.\d+\015?\012/) {
116 if ($buf =~ /\015?\012\015?\012/) {
117 last READ_HEADER; # we have it
118 }
119 elsif (length($buf) > 16*1024) {
120 $self->send_error(413); # REQUEST_ENTITY_TOO_LARGE
121 $self->reason("Very long header");
122 return;
123 }
124 }
125 else {
126 last READ_HEADER; # HTTP/0.9 client
127 }
128 }
129 elsif (length($buf) > 16*1024) {
130 $self->send_error(414); # REQUEST_URI_TOO_LARGE
131 $self->reason("Very long first line");
132 return;
133 }
134 print STDERR "Need more data for complete header\n" if $DEBUG;
135 return unless $self->_need_more($buf, $timeout, $fdset);
136 }
137 if ($buf !~ s/^(\S+)[ \t]+(\S+)(?:[ \t]+(HTTP\/\d+\.\d+))?[^\012]*\012//) {
138 ${*$self}{'httpd_client_proto'} = _http_version("HTTP/1.0");
139 $self->send_error(400); # BAD_REQUEST
140 $self->reason("Bad request line: $buf");
141 return;
142 }
143 my $method = $1;
144 my $uri = $2;
145 my $proto = $3 || "HTTP/0.9";
146 $uri = "http://$uri" if $method eq "CONNECT";
147 $uri = $HTTP::URI_CLASS->new($uri, $self->daemon->url);
148 my $r = HTTP::Request->new($method, $uri);
149 $r->protocol($proto);
150 ${*$self}{'httpd_client_proto'} = $proto = _http_version($proto);
151 ${*$self}{'httpd_head'} = ($method eq "HEAD");
152
153 if ($proto >= $HTTP_1_0) {
154 # we expect to find some headers
155 my($key, $val);
156 HEADER:
157 while ($buf =~ s/^([^\012]*)\012//) {
158 $_ = $1;
159 s/\015$//;
160 if (/^([^:\s]+)\s*:\s*(.*)/) {
161 $r->push_header($key, $val) if $key;
162 ($key, $val) = ($1, $2);
163 }
164 elsif (/^\s+(.*)/) {
165 $val .= " $1";
166 }
167 else {
168 last HEADER;
169 }
170 }
171 $r->push_header($key, $val) if $key;
172 }
173
174 my $conn = $r->header('Connection');
175 if ($proto >= $HTTP_1_1) {
176 ${*$self}{'httpd_nomore'}++ if $conn && lc($conn) =~ /\bclose\b/;
177 }
178 else {
179 ${*$self}{'httpd_nomore'}++ unless $conn &&
180 lc($conn) =~ /\bkeep-alive\b/;
181 }
182
183 if ($only_headers) {
184 ${*$self}{'httpd_rbuf'} = $buf;
185 return $r;
186 }
187
188 # Find out how much content to read
189 my $te = $r->header('Transfer-Encoding');
190 my $ct = $r->header('Content-Type');
191 my $len = $r->header('Content-Length');
192
193 # Act on the Expect header, if it's there
194 for my $e ( $r->header('Expect') ) {
195 if( lc($e) eq '100-continue' ) {
196 $self->send_status_line(100);
197 $self->send_crlf;
198 }
199 else {
200 $self->send_error(417);
201 $self->reason("Unsupported Expect header value");
202 return;
203 }
204 }
205
206 if ($te && lc($te) eq 'chunked') {
207 # Handle chunked transfer encoding
208 my $body = "";
209 CHUNK:
210 while (1) {
211 print STDERR "Chunked\n" if $DEBUG;
212 if ($buf =~ s/^([^\012]*)\012//) {
213 my $chunk_head = $1;
214 unless ($chunk_head =~ /^([0-9A-Fa-f]+)/) {
215 $self->send_error(400);
216 $self->reason("Bad chunk header $chunk_head");
217 return;
218 }
219 my $size = hex($1);
220 last CHUNK if $size == 0;
221
222 my $missing = $size - length($buf) + 2; # 2=CRLF at chunk end
223 # must read until we have a complete chunk
224 while ($missing > 0) {
225 print STDERR "Need $missing more bytes\n" if $DEBUG;
226 my $n = $self->_need_more($buf, $timeout, $fdset);
227 return unless $n;
228 $missing -= $n;
229 }
230 $body .= substr($buf, 0, $size);
231 substr($buf, 0, $size+2) = '';
232
233 }
234 else {
235 # need more data in order to have a complete chunk header
236 return unless $self->_need_more($buf, $timeout, $fdset);
237 }
238 }
239 $r->content($body);
240
241 # pretend it was a normal entity body
242 $r->remove_header('Transfer-Encoding');
243 $r->header('Content-Length', length($body));
244
245 my($key, $val);
246 FOOTER:
247 while (1) {
248 if ($buf !~ /\012/) {
249 # need at least one line to look at
250 return unless $self->_need_more($buf, $timeout, $fdset);
251 }
252 else {
253 $buf =~ s/^([^\012]*)\012//;
254 $_ = $1;
255 s/\015$//;
256 if (/^([\w\-]+)\s*:\s*(.*)/) {
257 $r->push_header($key, $val) if $key;
258 ($key, $val) = ($1, $2);
259 }
260 elsif (/^\s+(.*)/) {
261 $val .= " $1";
262 }
263 elsif (!length) {
264 last FOOTER;
265 }
266 else {
267 $self->reason("Bad footer syntax");
268 return;
269 }
270 }
271 }
272 $r->push_header($key, $val) if $key;
273
274 }
275 elsif ($te) {
276 $self->send_error(501); # Unknown transfer encoding
277 $self->reason("Unknown transfer encoding '$te'");
278 return;
279
280 }
281 elsif ($len) {
282 # Plain body specified by "Content-Length"
283 my $missing = $len - length($buf);
284 while ($missing > 0) {
285 print "Need $missing more bytes of content\n" if $DEBUG;
286 my $n = $self->_need_more($buf, $timeout, $fdset);
287 return unless $n;
288 $missing -= $n;
289 }
290 if (length($buf) > $len) {
291 $r->content(substr($buf,0,$len));
292 substr($buf, 0, $len) = '';
293 }
294 else {
295 $r->content($buf);
296 $buf='';
297 }
298 }
299 elsif ($ct && $ct =~ m/^multipart\/\w+\s*;.*boundary\s*=\s*("?)(\w+)\1/i) {
300 # Handle multipart content type
301 my $boundary = "$CRLF--$2--";
302 my $index;
303 while (1) {
304 $index = index($buf, $boundary);
305 last if $index >= 0;
306 # end marker not yet found
307 return unless $self->_need_more($buf, $timeout, $fdset);
308 }
309 $index += length($boundary);
310 $r->content(substr($buf, 0, $index));
311 substr($buf, 0, $index) = '';
312
313 }
314 ${*$self}{'httpd_rbuf'} = $buf;
315
316 $r;
317}
318
319
320sub _need_more
321{
322 my $self = shift;
323 #my($buf,$timeout,$fdset) = @_;
324 if ($_[1]) {
325 my($timeout, $fdset) = @_[1,2];
326 print STDERR "select(,,,$timeout)\n" if $DEBUG;
327 my $n = select($fdset,undef,undef,$timeout);
328 unless ($n) {
329 $self->reason(defined($n) ? "Timeout" : "select: $!");
330 return;
331 }
332 }
333 print STDERR "sysread()\n" if $DEBUG;
334 my $n = sysread($self, $_[0], 2048, length($_[0]));
335 $self->reason(defined($n) ? "Client closed" : "sysread: $!") unless $n;
336 $n;
337}
338
339
340sub read_buffer
341{
342 my $self = shift;
343 my $old = ${*$self}{'httpd_rbuf'};
344 if (@_) {
345 ${*$self}{'httpd_rbuf'} = shift;
346 }
347 $old;
348}
349
350
351sub reason
352{
353 my $self = shift;
354 my $old = ${*$self}{'httpd_reason'};
355 if (@_) {
356 ${*$self}{'httpd_reason'} = shift;
357 }
358 $old;
359}
360
361
362sub proto_ge
363{
364 my $self = shift;
365 ${*$self}{'httpd_client_proto'} >= _http_version(shift);
366}
367
368
369sub _http_version
370{
371 local($_) = shift;
372 return 0 unless m,^(?:HTTP/)?(\d+)\.(\d+)$,i;
373 $1 * 1000 + $2;
374}
375
376
377sub antique_client
378{
379 my $self = shift;
380 ${*$self}{'httpd_client_proto'} < $HTTP_1_0;
381}
382
383
384sub force_last_request
385{
386 my $self = shift;
387 ${*$self}{'httpd_nomore'}++;
388}
389
390sub head_request
391{
392 my $self = shift;
393 ${*$self}{'httpd_head'};
394}
395
396
397sub send_status_line
398{
399 my($self, $status, $message, $proto) = @_;
400 return if $self->antique_client;
401 $status ||= RC_OK;
402 $message ||= status_message($status) || "";
403 $proto ||= $HTTP::Daemon::PROTO || "HTTP/1.1";
404 print $self "$proto $status $message$CRLF";
405}
406
407
408sub send_crlf
409{
410 my $self = shift;
411 print $self $CRLF;
412}
413
414
415sub send_basic_header
416{
417 my $self = shift;
418 return if $self->antique_client;
419 $self->send_status_line(@_);
420 print $self "Date: ", time2str(time), $CRLF;
421 my $product = $self->daemon->product_tokens;
422 print $self "Server: $product$CRLF" if $product;
423}
424
425
426sub send_header
427{
428 my $self = shift;
429 while (@_) {
430 my($k, $v) = splice(@_, 0, 2);
431 $v = "" unless defined($v);
432 print $self "$k: $v$CRLF";
433 }
434}
435
436
437sub send_response
438{
439 my $self = shift;
440 my $res = shift;
441 if (!ref $res) {
442 $res ||= RC_OK;
443 $res = HTTP::Response->new($res, @_);
444 }
445 my $content = $res->content;
446 my $chunked;
447 unless ($self->antique_client) {
448 my $code = $res->code;
449 $self->send_basic_header($code, $res->message, $res->protocol);
450 if ($code =~ /^(1\d\d|[23]04)$/) {
451 # make sure content is empty
452 $res->remove_header("Content-Length");
453 $content = "";
454 }
455 elsif ($res->request && $res->request->method eq "HEAD") {
456 # probably OK
457 }
458 elsif (ref($content) eq "CODE") {
459 if ($self->proto_ge("HTTP/1.1")) {
460 $res->push_header("Transfer-Encoding" => "chunked");
461 $chunked++;
462 }
463 else {
464 $self->force_last_request;
465 }
466 }
467 elsif (length($content)) {
468 $res->header("Content-Length" => length($content));
469 }
470 else {
471 $self->force_last_request;
472 $res->header('connection','close');
473 }
474 print $self $res->headers_as_string($CRLF);
475 print $self $CRLF; # separates headers and content
476 }
477 if ($self->head_request) {
478 # no content
479 }
480 elsif (ref($content) eq "CODE") {
481 while (1) {
482 my $chunk = &$content();
483 last unless defined($chunk) && length($chunk);
484 if ($chunked) {
485 printf $self "%x%s%s%s", length($chunk), $CRLF, $chunk, $CRLF;
486 }
487 else {
488 print $self $chunk;
489 }
490 }
491 print $self "0$CRLF$CRLF" if $chunked; # no trailers either
492 }
493 elsif (length $content) {
494 print $self $content;
495 }
496}
497
498
499sub send_redirect
500{
501 my($self, $loc, $status, $content) = @_;
502 $status ||= RC_MOVED_PERMANENTLY;
503 Carp::croak("Status '$status' is not redirect") unless is_redirect($status);
504 $self->send_basic_header($status);
505 my $base = $self->daemon->url;
506 $loc = $HTTP::URI_CLASS->new($loc, $base) unless ref($loc);
507 $loc = $loc->abs($base);
508 print $self "Location: $loc$CRLF";
509 if ($content) {
510 my $ct = $content =~ /^\s*</ ? "text/html" : "text/plain";
511 print $self "Content-Type: $ct$CRLF";
512 }
513 print $self $CRLF;
514 print $self $content if $content && !$self->head_request;
515 $self->force_last_request; # no use keeping the connection open
516}
517
518
519sub send_error
520{
521 my($self, $status, $error) = @_;
522 $status ||= RC_BAD_REQUEST;
523 Carp::croak("Status '$status' is not an error") unless is_error($status);
524 my $mess = status_message($status);
525 $error ||= "";
526 $mess = <<EOT;
527<title>$status $mess</title>
528<h1>$status $mess</h1>
529$error
530EOT
531 unless ($self->antique_client) {
532 $self->send_basic_header($status);
533 print $self "Content-Type: text/html$CRLF";
534 print $self "Content-Length: " . length($mess) . $CRLF;
535 print $self $CRLF;
536 }
537 print $self $mess unless $self->head_request;
538 $status;
539}
540
541
542sub send_file_response
543{
544 my($self, $file) = @_;
545 if (-d $file) {
546 $self->send_dir($file);
547 }
548 elsif (-f _) {
549 # plain file
550 local(*F);
551 sysopen(F, $file, 0) or
552 return $self->send_error(RC_FORBIDDEN);
553 binmode(F);
554 my($ct,$ce) = guess_media_type($file);
555 my($size,$mtime) = (stat _)[7,9];
556 unless ($self->antique_client) {
557 $self->send_basic_header;
558 print $self "Content-Type: $ct$CRLF";
559 print $self "Content-Encoding: $ce$CRLF" if $ce;
560 print $self "Content-Length: $size$CRLF" if $size;
561 print $self "Last-Modified: ", time2str($mtime), "$CRLF" if $mtime;
562 print $self $CRLF;
563 }
564 $self->send_file(\*F) unless $self->head_request;
565 return RC_OK;
566 }
567 else {
568 $self->send_error(RC_NOT_FOUND);
569 }
570}
571
572
573sub send_dir
574{
575 my($self, $dir) = @_;
576 $self->send_error(RC_NOT_FOUND) unless -d $dir;
577 $self->send_error(RC_NOT_IMPLEMENTED);
578}
579
580
581sub send_file
582{
583 my($self, $file) = @_;
584 my $opened = 0;
585 local(*FILE);
586 if (!ref($file)) {
587 open(FILE, $file) || return undef;
588 binmode(FILE);
589 $file = \*FILE;
590 $opened++;
591 }
592 my $cnt = 0;
593 my $buf = "";
594 my $n;
595 while ($n = sysread($file, $buf, 8*1024)) {
596 last if !$n;
597 $cnt += $n;
598 print $self $buf;
599 }
600 close($file) if $opened;
601 $cnt;
602}
603
604
605sub daemon
606{
607 my $self = shift;
608 ${*$self}{'httpd_daemon'};
609}
610
611
6121;
613
614__END__
615
616=head1 NAME
617
618HTTP::Daemon - a simple http server class
619
620=head1 SYNOPSIS
621
622 use HTTP::Daemon;
623 use HTTP::Status;
624
625 my $d = HTTP::Daemon->new || die;
626 print "Please contact me at: <URL:", $d->url, ">\n";
627 while (my $c = $d->accept) {
628 while (my $r = $c->get_request) {
629 if ($r->method eq 'GET' and $r->uri->path eq "/xyzzy") {
630 # remember, this is *not* recommended practice :-)
631 $c->send_file_response("/etc/passwd");
632 }
633 else {
634 $c->send_error(RC_FORBIDDEN)
635 }
636 }
637 $c->close;
638 undef($c);
639 }
640
641=head1 DESCRIPTION
642
643Instances of the C<HTTP::Daemon> class are HTTP/1.1 servers that
644listen on a socket for incoming requests. The C<HTTP::Daemon> is a
645subclass of C<IO::Socket::INET>, so you can perform socket operations
646directly on it too.
647
648The accept() method will return when a connection from a client is
649available. The returned value will be an C<HTTP::Daemon::ClientConn>
650object which is another C<IO::Socket::INET> subclass. Calling the
651get_request() method on this object will read data from the client and
652return an C<HTTP::Request> object. The ClientConn object also provide
653methods to send back various responses.
654
655This HTTP daemon does not fork(2) for you. Your application, i.e. the
656user of the C<HTTP::Daemon> is responsible for forking if that is
657desirable. Also note that the user is responsible for generating
658responses that conform to the HTTP/1.1 protocol.
659
660The following methods of C<HTTP::Daemon> are new (or enhanced) relative
661to the C<IO::Socket::INET> base class:
662
663=over 4
664
665=item $d = HTTP::Daemon->new
666
667=item $d = HTTP::Daemon->new( %opts )
668
669The constructor method takes the same arguments as the
670C<IO::Socket::INET> constructor, but unlike its base class it can also
671be called without any arguments. The daemon will then set up a listen
672queue of 5 connections and allocate some random port number.
673
674A server that wants to bind to some specific address on the standard
675HTTP port will be constructed like this:
676
677 $d = HTTP::Daemon->new(
678 LocalAddr => 'www.thisplace.com',
679 LocalPort => 80,
680 );
681
682See L<IO::Socket::INET> for a description of other arguments that can
683be used configure the daemon during construction.
684
685=item $c = $d->accept
686
687=item $c = $d->accept( $pkg )
688
689=item ($c, $peer_addr) = $d->accept
690
691This method works the same the one provided by the base class, but it
692returns an C<HTTP::Daemon::ClientConn> reference by default. If a
693package name is provided as argument, then the returned object will be
694blessed into the given class. It is probably a good idea to make that
695class a subclass of C<HTTP::Daemon::ClientConn>.
696
697The accept method will return C<undef> if timeouts have been enabled
698and no connection is made within the given time. The timeout() method
699is described in L<IO::Socket>.
700
701In list context both the client object and the peer address will be
702returned; see the description of the accept method L<IO::Socket> for
703details.
704
705=item $d->url
706
707Returns a URL string that can be used to access the server root.
708
709=item $d->product_tokens
710
711Returns the name that this server will use to identify itself. This
712is the string that is sent with the C<Server> response header. The
713main reason to have this method is that subclasses can override it if
714they want to use another product name.
715
716The default is the string "libwww-perl-daemon/#.##" where "#.##" is
717replaced with the version number of this module.
718
719=back
720
721The C<HTTP::Daemon::ClientConn> is a C<IO::Socket::INET>
722subclass. Instances of this class are returned by the accept() method
723of C<HTTP::Daemon>. The following methods are provided:
724
725=over 4
726
727=item $c->get_request
728
729=item $c->get_request( $headers_only )
730
731This method reads data from the client and turns it into an
732C<HTTP::Request> object which is returned. It returns C<undef>
733if reading fails. If it fails, then the C<HTTP::Daemon::ClientConn>
734object ($c) should be discarded, and you should not try call this
735method again on it. The $c->reason method might give you some
736information about why $c->get_request failed.
737
738The get_request() method will normally not return until the whole
739request has been received from the client. This might not be what you
740want if the request is an upload of a large file (and with chunked
741transfer encoding HTTP can even support infinite request messages -
742uploading live audio for instance). If you pass a TRUE value as the
743$headers_only argument, then get_request() will return immediately
744after parsing the request headers and you are responsible for reading
745the rest of the request content. If you are going to call
746$c->get_request again on the same connection you better read the
747correct number of bytes.
748
749=item $c->read_buffer
750
751=item $c->read_buffer( $new_value )
752
753Bytes read by $c->get_request, but not used are placed in the I<read
754buffer>. The next time $c->get_request is called it will consume the
755bytes in this buffer before reading more data from the network
756connection itself. The read buffer is invalid after $c->get_request
757has failed.
758
759If you handle the reading of the request content yourself you need to
760empty this buffer before you read more and you need to place
761unconsumed bytes here. You also need this buffer if you implement
762services like I<101 Switching Protocols>.
763
764This method always returns the old buffer content and can optionally
765replace the buffer content if you pass it an argument.
766
767=item $c->reason
768
769When $c->get_request returns C<undef> you can obtain a short string
770describing why it happened by calling $c->reason.
771
772=item $c->proto_ge( $proto )
773
774Return TRUE if the client announced a protocol with version number
775greater or equal to the given argument. The $proto argument can be a
776string like "HTTP/1.1" or just "1.1".
777
778=item $c->antique_client
779
780Return TRUE if the client speaks the HTTP/0.9 protocol. No status
781code and no headers should be returned to such a client. This should
782be the same as !$c->proto_ge("HTTP/1.0").
783
784=item $c->head_request
785
786Return TRUE if the last request was a C<HEAD> request. No content
787body must be generated for these requests.
788
789=item $c->force_last_request
790
791Make sure that $c->get_request will not try to read more requests off
792this connection. If you generate a response that is not self
793delimiting, then you should signal this fact by calling this method.
794
795This attribute is turned on automatically if the client announces
796protocol HTTP/1.0 or worse and does not include a "Connection:
797Keep-Alive" header. It is also turned on automatically when HTTP/1.1
798or better clients send the "Connection: close" request header.
799
800=item $c->send_status_line
801
802=item $c->send_status_line( $code )
803
804=item $c->send_status_line( $code, $mess )
805
806=item $c->send_status_line( $code, $mess, $proto )
807
808Send the status line back to the client. If $code is omitted 200 is
809assumed. If $mess is omitted, then a message corresponding to $code
810is inserted. If $proto is missing the content of the
811$HTTP::Daemon::PROTO variable is used.
812
813=item $c->send_crlf
814
815Send the CRLF sequence to the client.
816
817=item $c->send_basic_header
818
819=item $c->send_basic_header( $code )
820
821=item $c->send_basic_header( $code, $mess )
822
823=item $c->send_basic_header( $code, $mess, $proto )
824
825Send the status line and the "Date:" and "Server:" headers back to
826the client. This header is assumed to be continued and does not end
827with an empty CRLF line.
828
829See the description of send_status_line() for the description of the
830accepted arguments.
831
832=item $c->send_header( $field, $value )
833
834=item $c->send_header( $field1, $value1, $field2, $value2, ... )
835
836Send one or more header lines.
837
838=item $c->send_response( $res )
839
840Write a C<HTTP::Response> object to the
841client as a response. We try hard to make sure that the response is
842self delimiting so that the connection can stay persistent for further
843request/response exchanges.
844
845The content attribute of the C<HTTP::Response> object can be a normal
846string or a subroutine reference. If it is a subroutine, then
847whatever this callback routine returns is written back to the
848client as the response content. The routine will be called until it
849return an undefined or empty value. If the client is HTTP/1.1 aware
850then we will use chunked transfer encoding for the response.
851
852=item $c->send_redirect( $loc )
853
854=item $c->send_redirect( $loc, $code )
855
856=item $c->send_redirect( $loc, $code, $entity_body )
857
858Send a redirect response back to the client. The location ($loc) can
859be an absolute or relative URL. The $code must be one the redirect
860status codes, and defaults to "301 Moved Permanently"
861
862=item $c->send_error
863
864=item $c->send_error( $code )
865
866=item $c->send_error( $code, $error_message )
867
868Send an error response back to the client. If the $code is missing a
869"Bad Request" error is reported. The $error_message is a string that
870is incorporated in the body of the HTML entity body.
871
872=item $c->send_file_response( $filename )
873
874Send back a response with the specified $filename as content. If the
875file is a directory we try to generate an HTML index of it.
876
877=item $c->send_file( $filename )
878
879=item $c->send_file( $fd )
880
881Copy the file to the client. The file can be a string (which
882will be interpreted as a filename) or a reference to an C<IO::Handle>
883or glob.
884
885=item $c->daemon
886
887Return a reference to the corresponding C<HTTP::Daemon> object.
888
889=back
890
891=head1 SEE ALSO
892
893RFC 2616
894
895L<IO::Socket::INET>, L<IO::Socket>
896
897=head1 COPYRIGHT
898
899Copyright 1996-2003, Gisle Aas
900
901This library is free software; you can redistribute it and/or
902modify it under the same terms as Perl itself.
903
Note: See TracBrowser for help on using the repository browser.