[libhttp-entity-parser-perl] 01/03: modify disposition parser https://gist.github.com/chansen/7163968

gregor herrmann gregoa at debian.org
Sun Oct 23 00:23:46 UTC 2016


This is an automated email from the git hooks/post-receive script.

gregoa pushed a commit to tag 0.16
in repository libhttp-entity-parser-perl.

commit 551a5265d0ad3c038861fc6ab290ca32faa83a7d
Author: Masahiro Nagano <kazeburo at gmail.com>
Date:   Wed Nov 18 13:53:55 2015 +0900

    modify disposition parser https://gist.github.com/chansen/7163968
---
 t/01_content_type/multipart_form_data.t | 232 ++++++++++++++++++++++++++++++++
 1 file changed, 232 insertions(+)

diff --git a/t/01_content_type/multipart_form_data.t b/t/01_content_type/multipart_form_data.t
new file mode 100644
index 0000000..c360aa7
--- /dev/null
+++ b/t/01_content_type/multipart_form_data.t
@@ -0,0 +1,232 @@
+use strict;
+use warnings;
+use Test::More;
+use HTTP::Entity::Parser::MultiPart;
+use Hash::MultiValue;
+use HTTP::Headers;
+use t::Util;
+use File::Basename;
+
+
+my @tests = (
+    [ q<form-data; name="foo">,
+        [ q<foo>, undef ]
+    ],
+    [ q<form-data; name="">,
+        [ q<>, undef ]
+    ],
+    [ q<form-data; name=""; filename="">,
+        [ q<>, q<> ]
+    ],
+    [ q<form-data; name="foo"; filename="">,
+        [ q<foo>, q<> ]
+    ],
+    [ q<form-data; name=""; filename="foo.ext">,
+        [ q<>, q<foo.ext> ]
+    ],
+    [ q<form-data; name="Foo"; filename="doc.ext">,
+        [ q<Foo>, q<doc.ext> ]
+    ],
+    [ q<form-data; name="foO"; filename="bar baz.ext">,
+        [ q<foO>, q<bar baz.ext> ]
+    ],
+    [ q<form-data; name="FoO"; filename="b\az.ext">,
+        [ q<FoO>, q<b\az.ext> ]
+    ],
+    [ q<form-data; name="FOO"; filename="\"quoted\" bar.ext">,
+        [ q<FOO>, q<\"quoted\" bar.ext> ]
+    ],
+    [ q<form-data; name="foo"; filename="foo;bar;baz.ext">,
+        [ q<foo>, q<foo;bar;baz.ext> ]
+    ],
+    [ q<form-data; name="foo"; filename="foo\\bar||baz\\ext">,
+        [ q<foo>, q<foo\\bar||baz\\ext> ]
+    ],
+    [ q<form-data; name="foo"; filename="'bar.ext'">,
+        [ q<foo>, q<'bar.ext'> ]
+    ],
+    [ q<form-data; filename="foo"; name="bar">,
+        [ q<bar>, q<foo> ]
+    ],
+    [ q<form-data; name="=name"; filename="=filename.ext">,
+        [ q<=name>, q<=filename.ext> ]
+    ],
+    [ q<form-data; name="foo"; filename="/path/filename.ext">,
+        [ q<foo>, q</path/filename.ext> ]
+    ],
+
+    # disposition type and parameter names are case insensitive
+    [ q<FORM-DATA; name="foo"; FiLeNaMe="bar">,
+        [ q<foo>, q<bar> ]
+    ],
+    [ q<form-data; NamE="foo">,
+        [ q<foo>, undef ]
+    ],
+
+    # unquoted parameter values
+    [ q<form-data; name=foo>,
+        [ q<foo>, undef ]
+    ],
+    [ q<form-data; name=foo; filename=>,
+        [ q<foo>, q<> ]
+    ],
+    [ q<form-data; name=foo; filename=baz.ext>,
+        [ q<foo>, q<baz.ext> ]
+    ],
+    [ q<form-data; name=foo; filename=foo-bar+baz.ext>,
+        [ q<foo>, q<foo-bar+baz.ext> ]
+    ],
+    
+    # excessive LWS
+    [ q<  form-data  ;  name = "foo" >,
+        [ q<foo>, undef ]
+    ],
+    [ q<  form-data  ;  name = foo >,
+        [ q<foo>, undef ]
+    ],
+    [ q<  form-data  ;  name = "foo"  ;  filename = "baz"  >,
+        [ q<foo>, q<baz> ]
+    ],
+    [ q<  form-data  ;  name = "foo"  ;  filename =  >,
+        [ q<foo>, q<> ]
+    ],
+    
+    # lack of LWS
+    [ q<form-data;name="foo">,
+        [ q<foo>, undef ]
+    ],
+    [ q<form-data;name=foo>,
+        [ q<foo>, undef ]
+    ],
+    [ q<form-data;name="foo";filename="baz">,
+        [ q<foo>, q<baz> ]
+    ],
+    [ q<form-data;name="foo";filename=>,
+        [ q<foo>, q<> ]
+    ],
+
+    # extension parameters are ignored
+    [ q<form-data; name="foo"; baz="foo">,
+        [ q<foo>, undef ]
+    ],
+    [ q<form-data; name="foo"; baz="foo"; baz="bar">,
+        [ q<foo>, undef ]
+    ],
+    [ q<form-data; name="foo"; filename="bar"; baz="foo"; baz="bar">,
+        [ q<foo>, q<bar> ]
+    ],
+    
+    # ignore empty parameters and unknown tokens
+    [ q<form-data; name=foo; ;; baz=foo ; >,
+        [ q<foo>, undef ]
+    ],
+    [ q<form-data; name=foo; baz ; baz=foo ; >,
+        [ q<foo>, undef ]
+    ],
+
+    # Webkit based browsers percent-encode double-quote marks but does not
+    # percent-encode any percent characters or backslash characters.
+    # " Foo %22 " => %22 Foo %22 %22
+    # " \" "      => %22 \%22 %22
+    [ q<form-data; name="foo"; filename="%22 Foo %22 %22">,
+        [ q<foo>, q<%22 Foo %22 %22> ]
+    ],
+    [ q<form-data; name="foo"; filename="%22 \%22 %22">,
+        [ q<foo>, q<%22 \%22 %22> ]
+    ],
+    
+    # Firefox quotes double-quote marks but does not quoute any backslash 
+    # characters.
+    # " Foo " => \" Foo \"
+    # " \" "  => \" \\" \"
+    [ q<form-data; name="foo"; filename="\" Foo \"">,
+        [ q<foo>, q<\" Foo \"> ]
+    ],
+    [ q<form-data; name="foo"; filename="\" \\" \"">,
+        [ q<foo>, q<\" \\" \"> ]
+    ],
+    
+    # IE may provide a path containing backslash characters but does not 
+    # encode or quote the backslash character.
+    [ q<form-data; name="foo"; filename="C:\Documents and Settings\user\Documents\file.ext">,
+        [ q<foo>, q<C:\Documents and Settings\user\Documents\file.ext> ]
+    ],
+
+    # some old browsers does not escape double-quote marks
+    # <https://bugzilla.mozilla.org/show_bug.cgi?id=136676>
+    [ q<form-data; name=" foo " ">,
+        [ ],
+    ],
+
+    # disposition type must be form-data
+    [ q<attachment; name="foo">,
+        [ ]
+    ],
+    [ q<attachment; name="foo"; filename="baz">,
+        [ ]
+    ],
+
+    # name parameter is required
+    [ q<form-data;">,
+        [ ]
+    ],
+    [ q<form-data; filename="bar">,
+        [ ]
+    ],
+
+    # name parameter redundantly specified
+    [ q<form-data; name="foo"; name="bar"; filename="baz">,
+        [ ]
+    ],
+
+    # filename parameter redundantly specified
+    [ q<form-data; name="foo"; filename="bar"; filename="baz">,
+        [ ]
+    ],
+    
+    [ q<form-data; name>,
+        [ ]
+    ]
+);
+
+
+foreach my $test (@tests) {
+    my ($disposition, $exp) = @$test;
+    my $content = qq{------BOUNDARY
+Content-Disposition: $disposition
+Content-Type: text/plain
+
+fuga
+------BOUNDARY--
+};
+    $content =~ s/\r\n/\n/g;
+    $content =~ s/\n/\r\n/g;
+    my $env = {
+        CONTENT_LENGTH => length($content),
+        CONTENT_TYPE   => 'multipart/form-data; boundary=----BOUNDARY',
+    };
+
+    my ($params, $uploads) = ([],[]);
+    eval {
+        my $parser = HTTP::Entity::Parser::MultiPart->new($env);
+        $parser->add($_) for split //, $content;
+        ($params, $uploads) = $parser->finalize();
+    };
+    if ( $exp->[1] ) {
+        is_deeply($params,[], "no-params-<$disposition>");
+        is($uploads->[0], $exp->[0], "uploads-name-<$disposition>");
+        is($uploads->[1]->{filename}, $exp->[1], "uploads-filename-<$disposition>");
+    }
+    else {
+        is_deeply($uploads,[], "no-uploads-<$disposition>");
+        if (defined $exp->[0] && $disposition !~ m!filename!i ){
+            is($params->[0], $exp->[0], "params-name-<$disposition>");
+            is($params->[1], "fuga", "params-val-<$disposition>");
+        }
+        else {
+            is_deeply($params,[], "no-params2-<$disposition>");
+        }
+    }
+}
+
+done_testing();

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libhttp-entity-parser-perl.git



More information about the Pkg-perl-cvs-commits mailing list