… | |
… | |
88 | use HTTP::Date; |
88 | use HTTP::Date; |
89 | |
89 | |
90 | sub new { |
90 | sub new { |
91 | my $class = shift; |
91 | my $class = shift; |
92 | my $fh = shift; |
92 | my $fh = shift; |
93 | my (undef, $iaddr) = unpack_sockaddr_in $fh->getpeername |
93 | my (undef, $iaddr) = unpack_sockaddr_in $fh->peername |
94 | or $self->err(500, "unable to get peername"); |
94 | or $self->err(500, "unable to get peername"); |
95 | $self->{remote_address} = inet_ntoa $iaddr; |
95 | $self->{remote_address} = inet_ntoa $iaddr; |
96 | bless { fh => $fh }, $class; |
96 | bless { fh => $fh }, $class; |
97 | } |
97 | } |
98 | |
98 | |
… | |
… | |
151 | ([^\040]+) \040+ |
151 | ([^\040]+) \040+ |
152 | HTTP\/([0-9]+\.[0-9]+) |
152 | HTTP\/([0-9]+\.[0-9]+) |
153 | \015\012/gx |
153 | \015\012/gx |
154 | or $self->err(403, "method not allowed", { Allow => "GET,HEAD" }); |
154 | or $self->err(403, "method not allowed", { Allow => "GET,HEAD" }); |
155 | |
155 | |
156 | $2 ne "1.0" |
156 | $2 < 2 |
157 | or $self->err(506, "http protocol version not supported"); |
157 | or $self->err(506, "http protocol version not supported"); |
158 | |
158 | |
159 | $self->{method} = $1; |
159 | $self->{method} = $1; |
160 | $self->{uri} = $2; |
160 | $self->{uri} = $2; |
161 | |
161 | |
… | |
… | |
164 | my (%hdr, $h, $v); |
164 | my (%hdr, $h, $v); |
165 | |
165 | |
166 | $hdr{lc $1} .= ",$2" |
166 | $hdr{lc $1} .= ",$2" |
167 | while $req =~ /\G |
167 | while $req =~ /\G |
168 | ([^:\000-\040]+): |
168 | ([^:\000-\040]+): |
169 | [\008\040]* |
169 | [\010\040]* |
170 | ((?: [^\015\012]+ | \015\012[\008\040] )*) |
170 | ((?: [^\015\012]+ | \015\012[\010\040] )*) |
171 | \015\012 |
171 | \015\012 |
172 | /gxc; |
172 | /gxc; |
173 | |
173 | |
174 | $req =~ /\G\015\012$/ |
174 | $req =~ /\G\015\012$/ |
175 | or $self->err(400, "bad request"); |
175 | or $self->err(400, "bad request"); |
… | |
… | |
206 | $self->{path} = "$::DOCROOT/$host$uri"; |
206 | $self->{path} = "$::DOCROOT/$host$uri"; |
207 | } |
207 | } |
208 | |
208 | |
209 | sub server_address { |
209 | sub server_address { |
210 | my $self = shift; |
210 | my $self = shift; |
211 | my ($port, $iaddr) = unpack_sockaddr_in $self->{fh}->getsockname |
211 | my ($port, $iaddr) = unpack_sockaddr_in $self->{fh}->sockname |
212 | or $self->err(500, "unable to get socket name"); |
212 | or $self->err(500, "unable to get socket name"); |
213 | ((inet_ntoa $iaddr), $port); |
213 | ((inet_ntoa $iaddr), $port); |
214 | } |
214 | } |
215 | |
215 | |
216 | sub server_host { |
216 | sub server_host { |
… | |
… | |
344 | |
344 | |
345 | $self->print_response(@code, $hdr, ""); |
345 | $self->print_response(@code, $hdr, ""); |
346 | |
346 | |
347 | if ($self->{method} eq "GET") { |
347 | if ($self->{method} eq "GET") { |
348 | my ($fh, $buf); |
348 | my ($fh, $buf); |
349 | open $fh, "<", $self->{path} |
349 | cpen $fh, "<", $self->{path} |
350 | or die "$self->{path}: late open failure ($!)"; |
350 | or die "$self->{path}: late open failure ($!)"; |
351 | |
351 | |
352 | if ($l) { |
352 | if ($l) { |
353 | sysseek $fh, $l, 0 |
353 | sysseek $fh, $l, 0 |
354 | or die "$self->{path}: cannot seek to $l ($!)"; |
354 | or die "$self->{path}: cannot seek to $l ($!)"; |