[libhttp-entity-parser-perl] 02/03: oops
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 91490a92e315894584a1963149da83f735830494
Author: Masahiro Nagano <kazeburo at gmail.com>
Date: Wed Nov 18 14:15:56 2015 +0900
oops
---
lib/HTTP/Entity/Parser/MultiPart.pm | 57 +++++++++++++++++++++++++++++++++----
1 file changed, 51 insertions(+), 6 deletions(-)
diff --git a/lib/HTTP/Entity/Parser/MultiPart.pm b/lib/HTTP/Entity/Parser/MultiPart.pm
index d184494..a8fe355 100644
--- a/lib/HTTP/Entity/Parser/MultiPart.pm
+++ b/lib/HTTP/Entity/Parser/MultiPart.pm
@@ -7,6 +7,51 @@ use File::Temp qw/tempfile/;
use Carp qw//;
use Fcntl ":seek";
+#
+# copy from https://gist.github.com/chansen/7163968
+#
+sub extract_form_data {
+ local $_ = shift;
+ # Fast exit for common form-data disposition
+ if (/\A form-data; \s name="((?:[^"]|\\")*)" (?: ;\s filename="((?:[^"]|\\")*)" )? \z/x) {
+ return ($1, $2);
+ }
+
+ # disposition type must be form-data
+ s/\A \s* form-data \s* ; //xi
+ or return;
+
+ my (%p, $k, $v);
+ while (length) {
+ s/ ^ \s+ //x;
+ s/ \s+ $ //x;
+
+ # skip empty parameters and unknown tokens
+ next if s/^ [^\s"=;]* \s* ; //x;
+
+ # parameter name (token)
+ s/^ ([^\s"=;]+) \s* = \s* //x
+ or return;
+ $k = lc $1;
+ # quoted parameter value
+ if (s/^ "((?:[^"]|\\")*)" \s* (?: ; | $) //x) {
+ $v = $1;
+ }
+ # unquoted parameter value (token)
+ elsif (s/^ ([^\s";]*) \s* (?: ; | $) //x) {
+ $v = $1;
+ }
+ else {
+ return;
+ }
+ if ($k eq 'name' || $k eq 'filename') {
+ return () if exists $p{$k};
+ $p{$k} = $v;
+ }
+ }
+ return exists $p{name} ? @p{qw(name filename)} : ();
+}
+
sub new {
my ($class, $env, $opts) = @_;
@@ -41,17 +86,17 @@ sub new {
(defined $disposition)
or die q/Content-Disposition header is missing in part/;
- my %disposition_param = ($disposition =~ /\b((?:file)?name)="?([^\";]*)"?/g);
- (exists $disposition_param{name} && length $disposition_param{name} > 0 )
+ my ($disposition_name, $disposition_filename) = extract_form_data($disposition);
+ defined $disposition_name
or die q/Parameter 'name' is missing from Content-Disposition header/;
$part = {
- name => $disposition_param{name},
+ name => $disposition_name,
headers => $headers,
};
- if ( exists $disposition_param{filename}) {
- $part->{filename} = $disposition_param{filename};
+ if ( defined $disposition_filename ) {
+ $part->{filename} = $disposition_filename;
$self->{tempdir} ||= do {
my $template = File::Spec->catdir(File::Spec->tmpdir, "HTTP-Entity-Parser-MultiPart-XXXXX");
my $dir = File::Temp->newdir($template, CLEANUP => 1);
@@ -72,7 +117,7 @@ sub new {
if ($fh) {
print $fh $chunk
or die qq/Could not write to file handle: '$!'/;
- if ($final && $part->{filename} ne "" ) {
+ if ($final && $part->{filename} ne "" ) { # compatible with HTTP::Body
seek($fh, 0, SEEK_SET)
or die qq/Could not rewind file handle: '$!'/;
--
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