[pve-devel] [PATCH http-server 2/4] websocket_proxy: pull out encoding into helper sub

Fabian Grünbichler f.gruenbichler at proxmox.com
Fri Mar 6 11:20:28 CET 2020


to allow adding other types of frames.

Signed-off-by: Fabian Grünbichler <f.gruenbichler at proxmox.com>
---
 PVE/APIServer/AnyEvent.pm | 50 ++++++++++++++++++++++-----------------
 1 file changed, 28 insertions(+), 22 deletions(-)

diff --git a/PVE/APIServer/AnyEvent.pm b/PVE/APIServer/AnyEvent.pm
index 9f432e1..7147d81 100644
--- a/PVE/APIServer/AnyEvent.pm
+++ b/PVE/APIServer/AnyEvent.pm
@@ -380,6 +380,33 @@ sub websocket_proxy {
 	    die "websocket_proxy: missing port or socket\n";
 	}
 
+	my $encode = sub {
+	    my ($data, $opcode) = @_;
+
+	    my $string;
+	    my $payload;
+	    if ($binary) {
+		$string = $opcode ? $opcode : "\x82"; # binary frame
+		$payload = $$data;
+	    } else {
+		$string = $opcode ? $opcode : "\x81"; # text frame
+		$payload = encode_base64($$data, '');
+	    }
+
+	    my $payload_len = length($payload);
+	    if ($payload_len <= 125) {
+		$string .= pack 'C', $payload_len;
+	    } elsif ($payload_len <= 0xffff) {
+		$string .= pack 'C', 126;
+		$string .= pack 'n', $payload_len;
+	    } else {
+		$string .= pack 'C', 127;
+		$string .= pack 'Q>', $payload_len;
+	    }
+	    $string .= $payload;
+	    return $string;
+	};
+
 	tcp_connect $remhost, $remport, sub {
 	    my ($fh) = @_
 		or die "connect to '$remhost:$remport' failed: $!";
@@ -414,28 +441,7 @@ sub websocket_proxy {
 		my $len = length($hdl->{rbuf});
 		my $data = substr($hdl->{rbuf}, 0, $len > $max_payload_size ? $max_payload_size : $len, '');
 
-		my $string;
-		my $payload;
-
-		if ($binary) {
-		    $string = "\x82"; # binary frame
-		    $payload = $data;
-		} else {
-		    $string = "\x81"; # text frame
-		    $payload = encode_base64($data, '');
-		}
-
-		my $payload_len = length($payload);
-		if ($payload_len <= 125) {
-		    $string .= pack 'C', $payload_len;
-		} elsif ($payload_len <= 0xffff) {
-		    $string .= pack 'C', 126;
-		    $string .= pack 'n', $payload_len;
-		} else {
-		    $string .= pack 'C', 127;
-		    $string .= pack 'Q>', $payload_len;
-		}
-		$string .= $payload;
+		my $string = $encode->(\$data);
 
 		$reqstate->{hdl}->push_write($string) if $reqstate->{hdl};
 	    };
-- 
2.20.1





More information about the pve-devel mailing list