all lists on lists.proxmox.com
 help / color / mirror / Atom feed
* [pve-devel] [PATCH http-server] http: support Content-Encoding=deflate
@ 2024-04-16 11:44 Maximiliano Sandoval
  2024-04-16 11:49 ` Thomas Lamprecht
  0 siblings, 1 reply; 2+ messages in thread
From: Maximiliano Sandoval @ 2024-04-16 11:44 UTC (permalink / raw)
  To: pve-devel

Add support for compressing the body of responses with
`Content-Encoding=deflate` as per [RFC9110]. Note that in this context
`deflate` is actually a "zlib" data format as defined in [RFC1950].

[RFC9110] https://www.rfc-editor.org/rfc/rfc9110#name-deflate-coding
[RFC1950] https://www.rfc-editor.org/rfc/rfc1950

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
---
 src/PVE/APIServer/AnyEvent.pm | 23 +++++++++++++++++------
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/src/PVE/APIServer/AnyEvent.pm b/src/PVE/APIServer/AnyEvent.pm
index b60b825..a43d6bb 100644
--- a/src/PVE/APIServer/AnyEvent.pm
+++ b/src/PVE/APIServer/AnyEvent.pm
@@ -123,6 +123,7 @@ sub cleanup_reqstate {
     delete $reqstate->{request};
     delete $reqstate->{proto};
     delete $reqstate->{accept_gzip};
+    delete $reqstate->{accept_deflate};
     delete $reqstate->{starttime};
 
     if ($reqstate->{tmpfilename}) {
@@ -288,7 +289,7 @@ sub response {
     $reqstate->{hdl}->timeout($self->{timeout});
 
     $nocomp = 1 if !$self->{compression};
-    $nocomp = 1 if !$reqstate->{accept_gzip};
+    $nocomp = 1 if !$reqstate->{accept_gzip} && !$reqstate->{accept_deflate};
 
     my $code = $resp->code;
     my $msg = $resp->message || HTTP::Status::status_message($code);
@@ -333,11 +334,17 @@ sub response {
 	$content_length = length($content);
 
 	if (!$nocomp && ($content_length > 1024)) {
-	    my $comp = Compress::Zlib::memGzip($content);
-	    $resp->header('Content-Encoding', 'gzip');
-	    $content = $comp;
-	    $content_length = length($content);
+	    if ($reqstate->{accept_gzip}) {
+		my $comp = Compress::Zlib::memGzip($content);
+		$resp->header('Content-Encoding', 'gzip');
+		$content = $comp;
+	    } elsif ($reqstate->{accept_deflate}) {
+		my $comp = Compress::Zlib::compress($content);
+		$resp->header('Content-Encoding', 'deflate');
+		$content = $comp;
+	    }
 	}
+	$content_length = length($content);
 	$resp->header("Content-Length" => $content_length);
 	$reqstate->{log}->{content_length} = $content_length;
 
@@ -735,7 +742,10 @@ sub proxy_request {
 	    if $auth->{api_token};
 	$headers->{'CSRFPreventionToken'} = $auth->{token}
 	    if $auth->{token};
-	$headers->{'Accept-Encoding'} = 'gzip' if ($reqstate->{accept_gzip} && $self->{compression});
+	if ($self->{compression}) {
+	    $headers->{'Accept-Encoding'} = 'deflate' if $reqstate->{accept_deflate};
+	    $headers->{'Accept-Encoding'} = 'gzip' if $reqstate->{accept_gzip};
+	}
 
 	if (defined(my $host = $reqstate->{request}->header('Host'))) {
 	    $headers->{Host} = $host;
@@ -1361,6 +1371,7 @@ sub process_header {
     my $conn = $request->header('Connection');
     my $accept_enc = $request->header('Accept-Encoding');
     $reqstate->{accept_gzip} = ($accept_enc && $accept_enc =~ m/gzip/) ? 1 : 0;
+    $reqstate->{accept_deflate} = ($accept_enc && $accept_enc =~ m/deflate/) ? 1 : 0;
 
     if ($conn) {
 	$reqstate->{keep_alive} = 0 if $conn =~ m/close/oi;
-- 
2.39.2





^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [pve-devel] [PATCH http-server] http: support Content-Encoding=deflate
  2024-04-16 11:44 [pve-devel] [PATCH http-server] http: support Content-Encoding=deflate Maximiliano Sandoval
@ 2024-04-16 11:49 ` Thomas Lamprecht
  0 siblings, 0 replies; 2+ messages in thread
From: Thomas Lamprecht @ 2024-04-16 11:49 UTC (permalink / raw)
  To: Proxmox VE development discussion, Maximiliano Sandoval

Am 16/04/2024 um 13:44 schrieb Maximiliano Sandoval:
> Add support for compressing the body of responses with
> `Content-Encoding=deflate` as per [RFC9110]. Note that in this context
> `deflate` is actually a "zlib" data format as defined in [RFC1950].
> 
> [RFC9110] https://www.rfc-editor.org/rfc/rfc9110#name-deflate-coding
> [RFC1950] https://www.rfc-editor.org/rfc/rfc1950
> 
> Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
> ---
>  src/PVE/APIServer/AnyEvent.pm | 23 +++++++++++++++++------
>  1 file changed, 17 insertions(+), 6 deletions(-)
> 
> diff --git a/src/PVE/APIServer/AnyEvent.pm b/src/PVE/APIServer/AnyEvent.pm
> index b60b825..a43d6bb 100644
> --- a/src/PVE/APIServer/AnyEvent.pm
> +++ b/src/PVE/APIServer/AnyEvent.pm
> @@ -123,6 +123,7 @@ sub cleanup_reqstate {
>      delete $reqstate->{request};
>      delete $reqstate->{proto};
>      delete $reqstate->{accept_gzip};
> +    delete $reqstate->{accept_deflate};
>      delete $reqstate->{starttime};
>  
>      if ($reqstate->{tmpfilename}) {
> @@ -288,7 +289,7 @@ sub response {
>      $reqstate->{hdl}->timeout($self->{timeout});
>  
>      $nocomp = 1 if !$self->{compression};
> -    $nocomp = 1 if !$reqstate->{accept_gzip};
> +    $nocomp = 1 if !$reqstate->{accept_gzip} && !$reqstate->{accept_deflate};
>  
>      my $code = $resp->code;
>      my $msg = $resp->message || HTTP::Status::status_message($code);
> @@ -333,11 +334,17 @@ sub response {
>  	$content_length = length($content);
>  
>  	if (!$nocomp && ($content_length > 1024)) {
> -	    my $comp = Compress::Zlib::memGzip($content);
> -	    $resp->header('Content-Encoding', 'gzip');
> -	    $content = $comp;
> -	    $content_length = length($content);
> +	    if ($reqstate->{accept_gzip}) {
> +		my $comp = Compress::Zlib::memGzip($content);
> +		$resp->header('Content-Encoding', 'gzip');
> +		$content = $comp;
> +	    } elsif ($reqstate->{accept_deflate}) {
> +		my $comp = Compress::Zlib::compress($content);
> +		$resp->header('Content-Encoding', 'deflate');
> +		$content = $comp;
> +	    }
>  	}
> +	$content_length = length($content);
>  	$resp->header("Content-Length" => $content_length);
>  	$reqstate->{log}->{content_length} = $content_length;
>  
> @@ -735,7 +742,10 @@ sub proxy_request {
>  	    if $auth->{api_token};
>  	$headers->{'CSRFPreventionToken'} = $auth->{token}
>  	    if $auth->{token};
> -	$headers->{'Accept-Encoding'} = 'gzip' if ($reqstate->{accept_gzip} && $self->{compression});
> +	if ($self->{compression}) {
> +	    $headers->{'Accept-Encoding'} = 'deflate' if $reqstate->{accept_deflate};
> +	    $headers->{'Accept-Encoding'} = 'gzip' if $reqstate->{accept_gzip};

it might warrant a comment (and a hint in the commit message) that gzip is
favored, otherwise it might seem like a bug that if both, accept_deflate and
accept_gzip are set, only the gzip one is set (even though passing a list
would be supported), or was this overlooked?




^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2024-04-16 11:50 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-04-16 11:44 [pve-devel] [PATCH http-server] http: support Content-Encoding=deflate Maximiliano Sandoval
2024-04-16 11:49 ` Thomas Lamprecht

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal