File Coverage

blib/lib/HTTP/Body/XFormsMultipart.pm
Criterion Covered Total %
statement 32 34 94.1
branch 5 8 62.5
condition n/a
subroutine 8 8 100.0
pod 3 3 100.0
total 48 53 90.5


line stmt bran cond sub pod time code
1             package HTTP::Body::XFormsMultipart;
2             $HTTP::Body::XFormsMultipart::VERSION = '1.23';
3 10     10   68 use strict;
  10         21  
  10         493  
4 10     10   62 use base 'HTTP::Body::MultiPart';
  10         57  
  10         1507  
5 10     10   73 use bytes;
  10         23  
  10         68  
6              
7 10     10   282 use IO::File;
  10         18  
  10         1828  
8 10     10   68 use File::Temp 0.14;
  10         295  
  10         5903  
9              
10             =head1 NAME
11              
12             HTTP::Body::XFormsMultipart - HTTP Body XForms multipart/related submission Parser
13              
14             =head1 SYNOPSIS
15              
16             use HTTP::Body::XForms;
17              
18             =head1 DESCRIPTION
19              
20             HTTP Body XForms submission Parser. Inherits HTTP::Body::MultiPart.
21              
22             This body type is used to parse XForms submission. In this case, the
23             XML part that contains the model is indicated by the start attribute
24             in the content-type. The XML content is stored unparsed on the
25             parameter XForms:Model.
26              
27             =head1 METHODS
28              
29             =over 4
30              
31             =item init
32              
33             This function is overridden to detect the start part of the
34             multipart/related post.
35              
36             =cut
37              
38             sub init {
39 1     1 1 2 my $self = shift;
40 1         15 $self->SUPER::init(@_);
41 1 50       4 unless ( $self->content_type =~ /start=\"?\<?([^\"\>;,]+)\>?\"?/ ) {
42 0         0 my $content_type = $self->content_type;
43 0         0 Carp::croak( "Invalid boundary in content_type: '$content_type'" );
44             }
45            
46 1         5 $self->{start} = $1;
47              
48 1         5 return $self;
49             }
50              
51             =item start
52              
53             Defines the start part of the multipart/related body.
54              
55             =cut
56              
57             sub start {
58 4     4 1 24 return shift->{start};
59             }
60              
61             =item handler
62              
63             This function is overridden to differ the start part, which should be
64             set as the XForms:Model param if its content type is application/xml.
65              
66             =cut
67              
68             sub handler {
69 3     3 1 7 my ( $self, $part ) = @_;
70              
71 3         8 my $contentid = $part->{headers}{'Content-ID'};
72 3         17 $contentid =~ s/^.*[\<\"]//;
73 3         16 $contentid =~ s/[\>\"].*$//;
74            
75 3 100       9 if ( $contentid eq $self->start ) {
    50          
76 1         2 $part->{name} = 'XForms:Model';
77 1 50       4 if ($part->{done}) {
78 1         10 $self->body($part->{data});
79             }
80             }
81             elsif ( defined $contentid ) {
82 2         6 $part->{name} = $contentid;
83 2         6 $part->{filename} = $contentid;
84             }
85              
86 3         14 return $self->SUPER::handler($part);
87             }
88              
89             =back
90              
91             =head1 SUPPORT
92              
93             See L<HTTP::Body>
94              
95             =head1 AUTHOR
96              
97             Daniel Ruoso C<daniel@ruoso.com>
98              
99             =head1 LICENSE
100              
101             This library is free software . You can redistribute it and/or modify
102             it under the same terms as perl itself.
103              
104             =cut
105              
106             1;