From 9b84c337666b081d2ce4551129ec9850b396dcfc Mon Sep 17 00:00:00 2001 From: Aristotle Pagaltzis Date: Sat, 16 Feb 2019 19:44:28 +0100 Subject: [PATCH 1/8] simplify (and speed up) header output checks --- lib/Plack/Middleware/Deflater.pm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/Plack/Middleware/Deflater.pm b/lib/Plack/Middleware/Deflater.pm index 4cb0b03..77d84cb 100644 --- a/lib/Plack/Middleware/Deflater.pm +++ b/lib/Plack/Middleware/Deflater.pm @@ -122,7 +122,7 @@ sub new { die 'Cannot create a deflation stream' if $status != Z_OK; bless { - header => 0, + need_header => ($encoding eq 'gzip'), closed => 0, encoding => $encoding, encoder => $encoder, @@ -138,7 +138,7 @@ sub print : method { if ( ! defined $chunk ) { my ($buf,$status) = $self->{encoder}->flush(); die "deflate failed: $status" if ( $status != Z_OK ); - if ( !$self->{header} && $self->{encoding} eq 'gzip' ) { + if ( $self->{need_header} ) { $buf = pack("nccVcc",GZIP_MAGIC,Z_DEFLATED,0,time(),0,$Compress::Raw::Zlib::gzip_os_code) . $buf } $buf .= pack("LL", $self->{crc},$self->{length}) if $self->{encoding} eq 'gzip'; @@ -151,10 +151,10 @@ sub print : method { $self->{length} += length $chunk; $self->{crc} = crc32($chunk,$self->{crc}); if ( length $buf ) { - if ( !$self->{header} && $self->{encoding} eq 'gzip' ) { + if ( $self->{need_header} ) { $buf = pack("nccVcc",GZIP_MAGIC,Z_DEFLATED,0,time(),0,$Compress::Raw::Zlib::gzip_os_code) . $buf } - $self->{header} = 1; + $self->{need_header} = 0; return $buf; } return ''; From 0bd26dbda262345877732c2c12d6a1f9384897f3 Mon Sep 17 00:00:00 2001 From: Aristotle Pagaltzis Date: Sat, 16 Feb 2019 19:47:31 +0100 Subject: [PATCH 2/8] turn conditional block into guard --- lib/Plack/Middleware/Deflater.pm | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/lib/Plack/Middleware/Deflater.pm b/lib/Plack/Middleware/Deflater.pm index 77d84cb..762c333 100644 --- a/lib/Plack/Middleware/Deflater.pm +++ b/lib/Plack/Middleware/Deflater.pm @@ -150,14 +150,12 @@ sub print : method { die "deflate failed: $status" if ( $status != Z_OK ); $self->{length} += length $chunk; $self->{crc} = crc32($chunk,$self->{crc}); - if ( length $buf ) { - if ( $self->{need_header} ) { - $buf = pack("nccVcc",GZIP_MAGIC,Z_DEFLATED,0,time(),0,$Compress::Raw::Zlib::gzip_os_code) . $buf - } - $self->{need_header} = 0; - return $buf; + return '' if not length $buf; + if ( $self->{need_header} ) { + $buf = pack("nccVcc",GZIP_MAGIC,Z_DEFLATED,0,time(),0,$Compress::Raw::Zlib::gzip_os_code) . $buf } - return ''; + $self->{need_header} = 0; + return $buf; } sub close : method { From 54c283b59a8dbeb91e2d1d91d54b4dc5c0460742 Mon Sep 17 00:00:00 2001 From: Aristotle Pagaltzis Date: Sat, 16 Feb 2019 20:07:02 +0100 Subject: [PATCH 3/8] extract common code to crank the encoder --- lib/Plack/Middleware/Deflater.pm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/Plack/Middleware/Deflater.pm b/lib/Plack/Middleware/Deflater.pm index 762c333..2f7e8cc 100644 --- a/lib/Plack/Middleware/Deflater.pm +++ b/lib/Plack/Middleware/Deflater.pm @@ -134,10 +134,12 @@ sub new { sub print : method { my $self = shift; return if $self->{closed}; + my $chunk = shift; + my ($buf,$status) = defined $chunk ? $self->{encoder}->deflate($chunk) : $self->{encoder}->flush(); + die "deflate failed: $status" if ( $status != Z_OK ); + if ( ! defined $chunk ) { - my ($buf,$status) = $self->{encoder}->flush(); - die "deflate failed: $status" if ( $status != Z_OK ); if ( $self->{need_header} ) { $buf = pack("nccVcc",GZIP_MAGIC,Z_DEFLATED,0,time(),0,$Compress::Raw::Zlib::gzip_os_code) . $buf } @@ -146,8 +148,6 @@ sub print : method { return $buf; } - my ($buf,$status) = $self->{encoder}->deflate($chunk); - die "deflate failed: $status" if ( $status != Z_OK ); $self->{length} += length $chunk; $self->{crc} = crc32($chunk,$self->{crc}); return '' if not length $buf; From e7837c90a6c64886c2a6b99db63653a1f149ebe9 Mon Sep 17 00:00:00 2001 From: Aristotle Pagaltzis Date: Sat, 16 Feb 2019 20:08:35 +0100 Subject: [PATCH 4/8] extract common return case --- lib/Plack/Middleware/Deflater.pm | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/Plack/Middleware/Deflater.pm b/lib/Plack/Middleware/Deflater.pm index 2f7e8cc..00aff39 100644 --- a/lib/Plack/Middleware/Deflater.pm +++ b/lib/Plack/Middleware/Deflater.pm @@ -145,16 +145,17 @@ sub print : method { } $buf .= pack("LL", $self->{crc},$self->{length}) if $self->{encoding} eq 'gzip'; $self->{closed} = 1; - return $buf; } - - $self->{length} += length $chunk; - $self->{crc} = crc32($chunk,$self->{crc}); - return '' if not length $buf; - if ( $self->{need_header} ) { - $buf = pack("nccVcc",GZIP_MAGIC,Z_DEFLATED,0,time(),0,$Compress::Raw::Zlib::gzip_os_code) . $buf + else { + $self->{length} += length $chunk; + $self->{crc} = crc32($chunk,$self->{crc}); + return '' if not length $buf; + if ( $self->{need_header} ) { + $buf = pack("nccVcc",GZIP_MAGIC,Z_DEFLATED,0,time(),0,$Compress::Raw::Zlib::gzip_os_code) . $buf + } + $self->{need_header} = 0; } - $self->{need_header} = 0; + return $buf; } From 3d8b3d101f8ed2815185ae0d7ddb772db4934242 Mon Sep 17 00:00:00 2001 From: Aristotle Pagaltzis Date: Sat, 16 Feb 2019 20:01:38 +0100 Subject: [PATCH 5/8] extract common header generation --- lib/Plack/Middleware/Deflater.pm | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/Plack/Middleware/Deflater.pm b/lib/Plack/Middleware/Deflater.pm index 00aff39..f1409e9 100644 --- a/lib/Plack/Middleware/Deflater.pm +++ b/lib/Plack/Middleware/Deflater.pm @@ -140,9 +140,6 @@ sub print : method { die "deflate failed: $status" if ( $status != Z_OK ); if ( ! defined $chunk ) { - if ( $self->{need_header} ) { - $buf = pack("nccVcc",GZIP_MAGIC,Z_DEFLATED,0,time(),0,$Compress::Raw::Zlib::gzip_os_code) . $buf - } $buf .= pack("LL", $self->{crc},$self->{length}) if $self->{encoding} eq 'gzip'; $self->{closed} = 1; } @@ -150,9 +147,10 @@ sub print : method { $self->{length} += length $chunk; $self->{crc} = crc32($chunk,$self->{crc}); return '' if not length $buf; - if ( $self->{need_header} ) { - $buf = pack("nccVcc",GZIP_MAGIC,Z_DEFLATED,0,time(),0,$Compress::Raw::Zlib::gzip_os_code) . $buf - } + } + + if ( $self->{need_header} ) { + $buf = pack("nccVcc",GZIP_MAGIC,Z_DEFLATED,0,time(),0,$Compress::Raw::Zlib::gzip_os_code) . $buf; $self->{need_header} = 0; } From 9fe4b01023b390d544042968d2e6d2546f3db3ec Mon Sep 17 00:00:00 2001 From: Aristotle Pagaltzis Date: Sat, 16 Feb 2019 20:02:35 +0100 Subject: [PATCH 6/8] flip conditions for readability --- lib/Plack/Middleware/Deflater.pm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/Plack/Middleware/Deflater.pm b/lib/Plack/Middleware/Deflater.pm index f1409e9..2cababf 100644 --- a/lib/Plack/Middleware/Deflater.pm +++ b/lib/Plack/Middleware/Deflater.pm @@ -139,15 +139,15 @@ sub print : method { my ($buf,$status) = defined $chunk ? $self->{encoder}->deflate($chunk) : $self->{encoder}->flush(); die "deflate failed: $status" if ( $status != Z_OK ); - if ( ! defined $chunk ) { - $buf .= pack("LL", $self->{crc},$self->{length}) if $self->{encoding} eq 'gzip'; - $self->{closed} = 1; - } - else { + if ( defined $chunk ) { $self->{length} += length $chunk; $self->{crc} = crc32($chunk,$self->{crc}); return '' if not length $buf; } + else { + $buf .= pack("LL", $self->{crc},$self->{length}) if $self->{encoding} eq 'gzip'; + $self->{closed} = 1; + } if ( $self->{need_header} ) { $buf = pack("nccVcc",GZIP_MAGIC,Z_DEFLATED,0,time(),0,$Compress::Raw::Zlib::gzip_os_code) . $buf; From 088f84879abc74b858923e377b3ab36a5ef3d83e Mon Sep 17 00:00:00 2001 From: Aristotle Pagaltzis Date: Sat, 16 Feb 2019 21:37:38 +0100 Subject: [PATCH 7/8] skip CRC computation for deflate --- lib/Plack/Middleware/Deflater.pm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/Plack/Middleware/Deflater.pm b/lib/Plack/Middleware/Deflater.pm index 2cababf..5334099 100644 --- a/lib/Plack/Middleware/Deflater.pm +++ b/lib/Plack/Middleware/Deflater.pm @@ -140,8 +140,10 @@ sub print : method { die "deflate failed: $status" if ( $status != Z_OK ); if ( defined $chunk ) { - $self->{length} += length $chunk; - $self->{crc} = crc32($chunk,$self->{crc}); + if ( $self->{encoding} eq 'gzip' ) { + $self->{length} += length $chunk; + $self->{crc} = crc32($chunk,$self->{crc}); + } return '' if not length $buf; } else { From f5b61946ad7745b80da71ebdd83061478d1d6ee7 Mon Sep 17 00:00:00 2001 From: Aristotle Pagaltzis Date: Sat, 16 Feb 2019 21:39:00 +0100 Subject: [PATCH 8/8] cache gzip encoding string comparison --- lib/Plack/Middleware/Deflater.pm | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/Plack/Middleware/Deflater.pm b/lib/Plack/Middleware/Deflater.pm index 5334099..b12de59 100644 --- a/lib/Plack/Middleware/Deflater.pm +++ b/lib/Plack/Middleware/Deflater.pm @@ -116,13 +116,15 @@ use constant GZIP_MAGIC => 0x1f8b; sub new { my $class = shift; my $encoding = shift; - my ($encoder,$status) = $encoding eq 'gzip' + my $gzip = $encoding eq 'gzip'; + my ($encoder,$status) = $gzip ? deflateInit(-WindowBits => -MAX_WBITS()) : deflateInit(-WindowBits => MAX_WBITS()); die 'Cannot create a deflation stream' if $status != Z_OK; bless { - need_header => ($encoding eq 'gzip'), + gzip => $gzip, + need_header => $gzip, closed => 0, encoding => $encoding, encoder => $encoder, @@ -140,14 +142,14 @@ sub print : method { die "deflate failed: $status" if ( $status != Z_OK ); if ( defined $chunk ) { - if ( $self->{encoding} eq 'gzip' ) { + if ( $self->{gzip} ) { $self->{length} += length $chunk; $self->{crc} = crc32($chunk,$self->{crc}); } return '' if not length $buf; } else { - $buf .= pack("LL", $self->{crc},$self->{length}) if $self->{encoding} eq 'gzip'; + $buf .= pack("LL", $self->{crc},$self->{length}) if $self->{gzip}; $self->{closed} = 1; }