Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Merge pull request #42 from One-com/master

Ensure that chunk buffer contains terminating HTTP newline
  • Loading branch information...
commit f0ac5bddeaaf37cf7524fc57e598f94040fdc8a2 2 parents c80c7cb + d678aba
@miyagawa authored
Showing with 53 additions and 1 deletion.
  1. +1 −1  lib/Starman/Server.pm
  2. +52 −0 t/chunked_termination.t
View
2  lib/Starman/Server.pm
@@ -406,7 +406,7 @@ sub _prepare_env {
if ($chunk_len == 0) {
last DECHUNK;
- } elsif (length $chunk_buffer < $chunk_len) {
+ } elsif (length $chunk_buffer < $chunk_len + 2) {
$chunk_buffer = $trailer . $chunk_buffer;
last;
}
View
52 t/chunked_termination.t
@@ -0,0 +1,52 @@
+use strict;
+
+use Test::More;
+
+{
+ package Starman::Server;
+
+ # Override the sysread method enabling it to read a stream of packages
+ # from an arrayref instead of an file handle:
+ use subs 'sysread';
+
+ *Starman::Server::sysread = sub {
+ if (ref $_[0] eq "ARRAY") {
+ die "EWOULDBLOCK\n" unless @{ $_[0] };
+
+ $_[1] = shift @{ $_[0] };
+ return length $_[1];
+ }
+
+ return CORE::sysread($_[0], $_[1], $_[2]);
+ };
+
+}
+
+use Starman::Server;
+
+my $server = {
+ server => {
+ client => [
+ "3\015\012foo\015\012", # Full chunk
+ "3\015\012bar", # Chunk missing terminating HTTP newline
+ "\015\012", # ... and then the termination
+ "0\015\012", # Empty chunk to mark end of stream
+ ],
+ }
+};
+
+my $env = {
+ HTTP_TRANSFER_ENCODING => 'chunked',
+};
+
+my $blocked;
+eval {
+ Starman::Server::_prepare_env( $server, $env );
+ 1;
+} or do {
+ $blocked = 1 if $@ =~ /^EWOULDBLOCK$/;
+};
+
+ok( !$blocked, "Reading chunked encoding does not block on well-placed package borders" );
+
+done_testing;
Please sign in to comment.
Something went wrong with that request. Please try again.