From c3bd22ec467b7d886010ccc920d42b03653dc559 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fabian=20Gr=C3=BCnbichler?= Date: Fri, 6 Mar 2020 11:20:28 +0100 Subject: [PATCH] websocket_proxy: pull out encoding into helper sub MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit to allow adding other types of frames. Signed-off-by: Fabian Grünbichler --- 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 534027d..666210d 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.39.2