فهرست منبع

fix #55: better input handling

George S. Baugh 5 سال پیش
والد
کامیت
717ba3ebc2
2فایلهای تغییر یافته به همراه10 افزوده شده و 5 حذف شده
  1. 3 0
      lib/Trog/Data/DUMMY.pm
  2. 7 5
      www/server.psgi

+ 3 - 0
lib/Trog/Data/DUMMY.pm

@@ -115,6 +115,9 @@ sub get ($self, %request) {
 
     @filtered = _dedup_versions(undef, @filtered);
 
+    # Heal bad data
+    @filtered = map { my $t = $_->{tags}; @$t = grep { defined $_ } @$t; $_ } @filtered;
+
     # Next, handle the query, tags and ACLs
     @filtered = grep { my $tags = $_->{tags}; grep { my $t = $_; grep {$t eq $_ } @{$request{tags}} } @$tags } @filtered if @{$request{tags}};
     @filtered = grep { my $tags = $_->{tags}; grep { my $t = $_; grep {$t eq $_ } @{$request{acls}} } @$tags } @filtered unless grep { $_ eq 'admin' } @{$request{acls}};    

+ 7 - 5
www/server.psgi

@@ -122,13 +122,15 @@ my $app = sub {
 
     #Actually parse the POSTDATA and dump it into the QUERY object if this is a POST
     if ($env->{REQUEST_METHOD} eq 'POST') {
-        #TODO don't slurp
-        my $slurpee = '';
-        my $input = $env->{'psgi.input'};
-        while (<$input>) { $slurpee .= $_ }
 
         my $body = HTTP::Body->new( $env->{CONTENT_TYPE}, $env->{CONTENT_LENGTH} );
-        $body->add($slurpee);
+        my $len = $env->{CONTENT_LENGTH};
+        while ( $len ) {
+            read($env->{'psgi.input'}, my $buf, ($len < 8192) ? 8192 : $len );
+            print "READ BYTES\n";
+            $len -= length($buf);
+            $body->add($buf);
+        }
 
         @$query{keys(%{$body->param})}  = values(%{$body->param});
         @$query{keys(%{$body->upload})} = values(%{$body->upload});