use strict;
-use Carp qw[ ];
-use List::Util qw[ first ];
+use Carp qw[ ];
-use overload ( q/""/ => 'stringify', fallback => 1 );
-
-our $VERSION = '0.01';
+our $VERSION = '0.03';
our $TYPES = {
'application/octet-stream' => 'HTTP::Body::OctetStream',
=head1 SYNOPSIS
use HTTP::Body;
+
+ sub handler : method {
+ my ( $class, $r ) = @_;
+
+ my $content_type = $r->headers_in->get('Content-Type');
+ my $content_length = $r->headers_in->get('Content-Length');
+
+ my $body = HTTP::Body->new( $content_type, $content_length );
+ my $length = $content_length;
+
+ while ( $length ) {
+
+ $r->read( my $buffer, ( $length < 8192 ) ? $length : 8192 );
+
+ $length -= length($buffer);
+
+ $body->add($buffer);
+ }
+
+ my $uploads = $body->upload; # hashref
+ my $params = $body->param; # hashref
+ my $body = $body->body; # IO::Handle
+ }
=head1 DESCRIPTION
=head1 METHODS
-=over 4
+=over 4
+
+=item new
+
+Constructor. Takes content type and content length as parameters,
+returns a L<HTTP::Body> object.
=cut
Carp::croak( $class, '->new( $content_type, $content_length )' );
}
- my $type = first { index( lc($content_type), $_ ) >= 0 } keys %{$TYPES};
+ my $type;
+ foreach my $supported ( keys %{$TYPES} ) {
+ if ( index( lc($content_type), $supported ) >= 0 ) {
+ $type = $supported;
+ }
+ }
+
my $body = $TYPES->{ $type || 'application/octet-stream' };
eval "require $body";
my $self = {
buffer => '',
- body => '',
+ body => undef,
content_length => $content_length,
content_type => $content_type,
length => 0,
=item add
+Add string to internal buffer. Will call spin unless done. returns
+length before adding self.
+
=cut
sub add {
if ( defined $_[0] ) {
$self->{buffer} .= $_[0];
- $self->{body} .= $_[0];
$self->{length} += length( $_[0] );
}
=item body
+accessor for the body.
+
=cut
sub body {
=item buffer
+read only accessor for the buffer.
+
=cut
sub buffer {
=item content_length
+read only accessor for content length
+
=cut
sub content_length {
=item content_type
+ready only accessor for the content type
+
=cut
sub content_type {
=item init
+return self.
+
=cut
sub init {
=item length
+read only accessor for body length.
+
=cut
sub length {
=item spin
+Abstract method to spin the io handle.
+
=cut
sub spin {
=item state
+accessor for body state.
+
=cut
sub state {
return $self->{state};
}
-=item stringify
-
-=cut
-
-sub stringify {
- return shift->{body};
-}
-
=item param
+accesor for http parameters.
+
=cut
sub param {
=back
+=head1 BUGS
+
+Chunked requests are currently not supported.
+
=head1 AUTHOR
Christian Hansen, C<ch@ngmedia.com>
-Messed up by Sebastian Riedel
+
+Sebastian Riedel, C<sri@cpan.org>
=head1 LICENSE
-This library is free software . You can redistribute it and/or modify
+This library is free software. You can redistribute it and/or modify
it under the same terms as perl itself.
=cut