… | |
… | |
163 | sub err_blocked { |
163 | sub err_blocked { |
164 | my $self = shift; |
164 | my $self = shift; |
165 | my $ip = $self->{remote_addr}; |
165 | my $ip = $self->{remote_addr}; |
166 | my $time = time2str $blocked{$ip} = $::NOW + $::BLOCKTIME; |
166 | my $time = time2str $blocked{$ip} = $::NOW + $::BLOCKTIME; |
167 | |
167 | |
|
|
168 | Coro::Event::do_timer(after => 15); |
|
|
169 | |
168 | $self->err(403, "too many connections", |
170 | $self->err(401, "too many connections", |
169 | { |
171 | { |
170 | "Content-Type" => "text/html", |
172 | "Content-Type" => "text/html", |
171 | "Retry-After" => $::BLOCKTIME |
173 | "Retry-After" => $::BLOCKTIME |
172 | }, |
174 | }, |
173 | <<EOF); |
175 | <<EOF); |
… | |
… | |
198 | defined $req or |
200 | defined $req or |
199 | $self->err(408, "request timeout"); |
201 | $self->err(408, "request timeout"); |
200 | |
202 | |
201 | my $ip = $self->{remote_addr}; |
203 | my $ip = $self->{remote_addr}; |
202 | |
204 | |
|
|
205 | $self->err_blocked($blocked{$ip}); |
203 | if ($blocked{$ip}) { |
206 | if ($blocked{$ip}) { |
204 | $self->err_blocked($blocked{$ip}) |
207 | $self->err_blocked($blocked{$ip}) |
205 | if $blocked{$ip} > $::NOW; |
208 | if $blocked{$ip} > $::NOW; |
206 | |
209 | |
207 | delete $blocked{$ip}; |
210 | delete $blocked{$ip}; |
… | |
… | |
215 | $req =~ /^(?:\015\012)? |
218 | $req =~ /^(?:\015\012)? |
216 | (GET|HEAD) \040+ |
219 | (GET|HEAD) \040+ |
217 | ([^\040]+) \040+ |
220 | ([^\040]+) \040+ |
218 | HTTP\/([0-9]+\.[0-9]+) |
221 | HTTP\/([0-9]+\.[0-9]+) |
219 | \015\012/gx |
222 | \015\012/gx |
220 | or $self->err(403, "method not allowed", { Allow => "GET,HEAD" }); |
223 | or $self->err(405, "method not allowed", { Allow => "GET,HEAD" }); |
221 | |
224 | |
222 | $2 ne "1.0" |
225 | $2 ne "1.0" |
223 | or $self->err(506, "http protocol version not supported"); |
226 | or $self->err(506, "http protocol version not supported"); |
224 | |
227 | |
225 | $self->{method} = $1; |
228 | $self->{method} = $1; |
… | |
… | |
403 | |
406 | |
404 | satisfiable: |
407 | satisfiable: |
405 | # check for segmented downloads |
408 | # check for segmented downloads |
406 | if ($l && $::NO_SEGMENTED) { |
409 | if ($l && $::NO_SEGMENTED) { |
407 | if (%{$uri{$self->{remote_addr}}{$self->{uri}}} > 1) { |
410 | if (%{$uri{$self->{remote_addr}}{$self->{uri}}} > 1) { |
|
|
411 | Coro::Event::do_timer(after => 15); |
|
|
412 | |
408 | $self->err(400, "segmented downloads are not allowed"); |
413 | $self->err(400, "segmented downloads are not allowed"); |
409 | } |
414 | } |
410 | } |
415 | } |
411 | |
416 | |
412 | $hdr->{"Content-Range"} = "bytes $l-$h/$length"; |
417 | $hdr->{"Content-Range"} = "bytes $l-$h/$length"; |