]> git.proxmox.com Git - pve-http-server.git/commitdiff
websocket_proxy: pull out encoding into helper sub
authorFabian Grünbichler <f.gruenbichler@proxmox.com>
Fri, 6 Mar 2020 10:20:28 +0000 (11:20 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Sat, 7 Mar 2020 19:11:12 +0000 (20:11 +0100)
to allow adding other types of frames.

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
PVE/APIServer/AnyEvent.pm

index 534027d5a0f87a2af07f95b8d7cd2adab0016517..666210d08cd955ae89b583d7ad5660af67a04a8f 100644 (file)
@@ -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};
            };