File Coverage

blib/lib/Perlbal/XS/HTTPHeaders.pm
Criterion Covered Total %
statement 16 18 88.8
branch n/a
condition n/a
subroutine 6 6 100.0
pod n/a
total 22 24 91.6


line stmt bran cond sub pod time code
1             package Perlbal::XS::HTTPHeaders;
2              
3 1     1   41923 use 5.008;
  1         4  
  1         37  
4 1     1   6 use strict;
  1         3  
  1         31  
5 1     1   4 use warnings;
  1         6  
  1         44  
6 1     1   5 use Carp;
  1         2  
  1         103  
7              
8             require Exporter;
9 1     1   8761 use AutoLoader;
  1         2001  
  1         8  
10              
11 1     1   573 use Perlbal;
  0            
  0            
12             use Perlbal::HTTPHeaders;
13              
14             # inherit things from Perlbal::HTTPHeaders when we can
15             our @ISA = qw(Exporter Perlbal::HTTPHeaders);
16              
17             # flag we set when we are enabled or disabled
18             our $Enabled = 0;
19              
20             # Items to export into callers namespace by default. Note: do not export
21             # names by default without a very good reason. Use EXPORT_OK instead.
22             # Do not simply export all your public functions/methods/constants.
23              
24             # This allows declaration use HTTPHeaders ':all';
25             # If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
26             # will save memory.
27             our %EXPORT_TAGS = ( 'all' => [ qw(
28             H_REQUEST
29             H_RESPONSE
30             M_DELETE
31             M_GET
32             M_OPTIONS
33             M_POST
34             M_PUT
35             M_HEAD
36             ) ] );
37              
38             our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
39              
40             our @EXPORT = qw(
41             H_REQUEST
42             H_RESPONSE
43             M_DELETE
44             M_GET
45             M_OPTIONS
46             M_POST
47             M_PUT
48             M_HEAD
49             );
50              
51             our $VERSION = '0.20';
52              
53             sub AUTOLOAD {
54             # This AUTOLOAD is used to 'autoload' constants from the constant()
55             # XS function.
56              
57             my $constname;
58             our $AUTOLOAD;
59             ($constname = $AUTOLOAD) =~ s/.*:://;
60             croak "&Perlbal::XS::HTTPHeaders::constant not defined" if $constname eq 'constant';
61             my ($error, $val) = constant($constname);
62             if ($error) { croak $error; }
63             {
64             no strict 'refs';
65             # Fixed between 5.005_53 and 5.005_61
66             #XXX if ($] >= 5.00561) {
67             #XXX *$AUTOLOAD = sub () { $val };
68             #XXX }
69             #XXX else {
70             *$AUTOLOAD = sub { $val };
71             #XXX }
72             }
73             goto &$AUTOLOAD;
74             }
75              
76             require XSLoader;
77             XSLoader::load('Perlbal::XS::HTTPHeaders', $VERSION);
78              
79             # create a very bare response to send to a user (mostly used internally)
80             sub new_response {
81             my $code = $_[1];
82              
83             my $msg = $Perlbal::HTTPHeaders::HTTPCode->{$code} || "";
84             my $hdr = Perlbal::XS::HTTPHeaders->new(\"HTTP/1.0 $code $msg\r\n\r\n");
85             return $hdr;
86             }
87              
88             # do some magic to determine content length
89             sub content_length {
90             my Perlbal::XS::HTTPHeaders $self = $_[0];
91              
92             if ($self->isRequest()) {
93             return 0 if $self->getMethod() == M_HEAD();
94             } else {
95             my $code = $self->getStatusCode();
96             if ($code == 304 || $code == 204 || ($code >= 100 && $code <= 199)) {
97             return 0;
98             }
99             }
100              
101             if (defined (my $clen = $self->getHeader('Content-length'))) {
102             return $clen+0;
103             }
104              
105             return undef;
106             }
107              
108             sub set_version {
109             my Perlbal::XS::HTTPHeaders $self = $_[0];
110             my $ver = $_[1];
111              
112             die "Bogus version" unless $ver =~ /^(\d+)\.(\d+)$/;
113              
114             my ($ver_ma, $ver_mi) = ($1, $2);
115             $self->setVersionNumber($ver_ma * 1000 + $ver_mi);
116              
117             return $self;
118             }
119              
120             sub clone {
121             return Perlbal::XS::HTTPHeaders->new( $_[0]->to_string_ref );
122             }
123              
124             ### Perlbal::XS interface implementation
125             my @subs = qw{
126             new new_response DESTROY getReconstructed getHeader setHeader
127             getMethod getStatusCode getVersionNumber setVersionNumber isRequest
128             isResponse setStatusCode getURI setURI header to_string to_string_ref
129             code request_method request_uri headers_list set_request_uri response_code
130             res_keep_alive req_keep_alive set_version content_length clone
131             http_code_english
132             };
133              
134             sub enable {
135             return 1 if $Enabled;
136             $Enabled = 1;
137             *Perlbal::HTTPHeaders::new = *Perlbal::XS::HTTPHeaders::new;
138             *Perlbal::HTTPHeaders::new_response = *Perlbal::XS::HTTPHeaders::new_response;
139             return 1;
140             }
141              
142             sub disable {
143             return unless $Enabled;
144             *Perlbal::HTTPHeaders::new_response = *Perlbal::HTTPHeaders::new_response_PERL;
145             *Perlbal::HTTPHeaders::new = *Perlbal::HTTPHeaders::new_PERL;
146             $Enabled = 0;
147             return 1;
148             }
149              
150             sub code {
151             my Perlbal::XS::HTTPHeaders $self = shift;
152              
153             my ($code, $msg) = @_;
154             $msg ||= $self->http_code_english($code);
155             $self->setCodeText($code, $msg);
156             }
157              
158             # save pointer to the old way of creating new objects
159             $Perlbal::XSModules{headers} = 'Perlbal::XS::HTTPHeaders';
160             #enable();
161              
162             # Preloaded methods go here.
163              
164             # Autoload methods go after =cut, and are processed by the autosplit program.
165              
166             1;
167             __END__