AnyEvent-HTTPD
view release on metacpan or search on metacpan
lib/AnyEvent/HTTPD/HTTPConnection.pm view on Meta::CPAN
if (ref ($content) eq 'CODE') {
weaken $self;
my $chunk_cb = sub {
my ($chunk) = @_;
return 0 unless defined ($self) && defined ($self->{hdl}) && !$self->{disconnected};
delete $self->{transport_polled};
if (defined ($chunk) && length ($chunk) > 0) {
$self->{hdl}->push_write ($chunk);
} else {
$self->response_done;
}
return 1;
};
$self->{transfer_cb} = $content;
$self->{hdl}->on_drain (sub {
return unless $self;
if (length $res) {
my $r = $res;
undef $res;
$chunk_cb->($r);
} elsif (not $self->{transport_polled}) {
$self->{transport_polled} = 1;
$self->{transfer_cb}->($chunk_cb) if $self;
}
});
} else {
$res .= $content;
$self->{hdl}->push_write ($res);
$self->response_done;
}
}
sub _unquote {
my ($str) = @_;
if ($str =~ /^"(.*?)"$/o) {
$str = $1;
my $obo = '';
while ($str =~ s/^(?:([^"]+)|\\(.))//so) {
$obo .= $1;
}
$str = $obo;
}
$str
}
sub decode_part {
my ($self, $hdr, $cont) = @_;
$hdr = _parse_headers ($hdr);
if ($hdr->{'content-disposition'} =~ /form-data|attachment/o) {
my ($dat, @pars) = split /\s*;\s*/o, $hdr->{'content-disposition'};
my @params;
my %p;
my @res;
for my $name_para (@pars) {
my ($name, $par) = split /\s*=\s*/o, $name_para;
if ($par =~ /^".*"$/o) { $par = _unquote ($par) }
$p{$name} = $par;
}
my ($ctype, $bound) = _content_type_boundary ($hdr->{'content-type'});
if ($ctype eq 'multipart/mixed') {
my $parts = $self->decode_multipart ($cont, $bound);
for my $sp (keys %$parts) {
for (@{$parts->{$sp}}) {
push @res, [$p{name}, @$_];
}
}
} else {
push @res, [$p{name}, $cont, $hdr->{'content-type'}, $p{filename}];
}
return @res
}
();
}
sub decode_multipart {
my ($self, $cont, $boundary) = @_;
my $parts = {};
while ($cont =~ s/
^--\Q$boundary\E \015?\012
((?:[^\015\012]+\015\012)* ) \015?\012
(.*?) \015?\012
(--\Q$boundary\E (--)? \015?\012)
/\3/xs) {
my ($h, $c, $e) = ($1, $2, $4);
if (my (@p) = $self->decode_part ($h, $c)) {
for my $part (@p) {
push @{$parts->{$part->[0]}}, [$part->[1], $part->[2], $part->[3]];
}
}
last if $e eq '--';
}
return $parts;
}
# application/x-www-form-urlencoded
#
( run in 0.999 second using v1.01-cache-2.11-cpan-e1769b4cff6 )