fix: small improvements
This commit is contained in:
parent
45e37dfda7
commit
3d172545d1
4 changed files with 102 additions and 160 deletions
|
|
@ -175,17 +175,18 @@ my ($t_headers_ignore, $tp_headers_ignore, $t_headers_extract,
|
||||||
$tp_headers_extract, $t_headers_inject, $tp_headers_inject,
|
$tp_headers_extract, $t_headers_inject, $tp_headers_inject,
|
||||||
$t_headers_propagate, $tp_headers_propagate);
|
$t_headers_propagate, $tp_headers_propagate);
|
||||||
|
|
||||||
my ($tp_headers, $tp_resp) = http2_get_traceparent('/trace-on');
|
my ($tp_headers, $tp_resp) = http2_get('/trace-on', trace_headers => 1);
|
||||||
my ($t_headers, $t_resp) = http2_get_ssl('/trace-on');
|
my ($t_headers, $t_resp) = http2_get('/trace-on', ssl => 1);
|
||||||
|
|
||||||
($t_headers_ignore, $_) = http2_get('/context-ignore');
|
($t_headers_ignore, $_) = http2_get('/context-ignore');
|
||||||
($tp_headers_ignore, $_) = http2_get_traceparent('/context-ignore');
|
($tp_headers_ignore, $_) = http2_get('/context-ignore', trace_headers => 1);
|
||||||
($t_headers_extract, $_) = http2_get('/context-extract');
|
($t_headers_extract, $_) = http2_get('/context-extract');
|
||||||
($tp_headers_extract, $_) = http2_get_traceparent('/context-extract');
|
($tp_headers_extract, $_) = http2_get('/context-extract', trace_headers => 1);
|
||||||
($t_headers_inject, $_) = http2_get('/context-inject');
|
($t_headers_inject, $_) = http2_get('/context-inject');
|
||||||
($tp_headers_inject, $_) = http2_get_traceparent('/context-inject');
|
($tp_headers_inject, $_) = http2_get('/context-inject', trace_headers => 1);
|
||||||
($t_headers_propagate, $_) = http2_get('/context-propagate');
|
($t_headers_propagate, $_) = http2_get('/context-propagate');
|
||||||
($tp_headers_propagate, $_) = http2_get_traceparent('/context-propagate');
|
($tp_headers_propagate, $_) =
|
||||||
|
http2_get('/context-propagate', trace_headers => 1);
|
||||||
|
|
||||||
my $frames = $f->{http_start}();
|
my $frames = $f->{http_start}();
|
||||||
my ($frame) = grep { $_->{type} eq "DATA" } @$frames;
|
my ($frame) = grep { $_->{type} eq "DATA" } @$frames;
|
||||||
|
|
@ -365,59 +366,31 @@ is($tp_headers_propagate->{'x-otel-tracestate'},
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
sub http2_get {
|
sub http2_get {
|
||||||
my ($path) = @_;
|
my ($path, %extra) = @_;
|
||||||
my ($frames, $frame);
|
my ($frames, $frame);
|
||||||
|
|
||||||
my $s = Test::Nginx::HTTP2->new();
|
my $s = $extra{ssl}
|
||||||
|
? Test::Nginx::HTTP2->new(
|
||||||
|
undef, socket => get_ssl_socket(8082, ['h2']))
|
||||||
|
: Test::Nginx::HTTP2->new();
|
||||||
|
|
||||||
my $sid = $s->new_stream({ path => $path });
|
my $sid = $extra{trace_headers}
|
||||||
$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
|
? $s->new_stream({ headers => [
|
||||||
|
|
||||||
($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
|
|
||||||
my $headers = $frame->{headers};
|
|
||||||
|
|
||||||
($frame) = grep { $_->{type} eq "DATA" } @$frames;
|
|
||||||
my $data = $frame->{data};
|
|
||||||
|
|
||||||
return $headers, $data;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub http2_get_traceparent {
|
|
||||||
my ($path) = @_;
|
|
||||||
my ($frames, $frame);
|
|
||||||
|
|
||||||
my $s = Test::Nginx::HTTP2->new();
|
|
||||||
|
|
||||||
my $sid = $s->new_stream({ headers => [
|
|
||||||
{ name => ':method', value => 'GET' },
|
{ name => ':method', value => 'GET' },
|
||||||
{ name => ':scheme', value => 'http' },
|
{ name => ':scheme', value => 'http' },
|
||||||
{ name => ':path', value => $path },
|
{ name => ':path', value => $path },
|
||||||
{ name => ':authority', value => 'localhost' },
|
{ name => ':authority', value => 'localhost' },
|
||||||
{ name => 'user-agent', value => 'nginx-tests', mode => 2 },
|
{ name => 'user-agent', value => 'nginx-tests', mode => 2 },
|
||||||
{ name => 'traceparent',
|
{ name => 'traceparent',
|
||||||
value => '00-0af7651916cd43dd8448eb211c80319c-b9c7c989f97918e1-01',
|
value => '00-0af7651916cd43dd8448eb211c80319c-' .
|
||||||
mode => 2 },
|
'b9c7c989f97918e1-01',
|
||||||
|
mode => 2
|
||||||
|
},
|
||||||
{ name => 'tracestate',
|
{ name => 'tracestate',
|
||||||
value => 'congo=ucfJifl5GOE,rojo=00f067aa0ba902b7', mode => 2 }]});
|
value => 'congo=ucfJifl5GOE,rojo=00f067aa0ba902b7',
|
||||||
$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
|
mode => 2
|
||||||
|
}]})
|
||||||
($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
|
: $s->new_stream({ path => $path });
|
||||||
my $headers = $frame->{headers};
|
|
||||||
|
|
||||||
($frame) = grep { $_->{type} eq "DATA" } @$frames;
|
|
||||||
my $data = $frame->{data};
|
|
||||||
|
|
||||||
return $headers, $data;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub http2_get_ssl {
|
|
||||||
my ($path) = @_;
|
|
||||||
my ($frames, $frame);
|
|
||||||
|
|
||||||
my $s = Test::Nginx::HTTP2->new(undef,
|
|
||||||
socket => get_ssl_socket(8082, ['h2']));
|
|
||||||
|
|
||||||
my $sid = $s->new_stream({ path => $path });
|
|
||||||
$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
|
$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
|
||||||
|
|
||||||
($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
|
($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
|
||||||
|
|
|
||||||
|
|
@ -180,17 +180,18 @@ my ($t_headers_ignore, $tp_headers_ignore, $t_headers_extract,
|
||||||
$tp_headers_extract, $t_headers_inject, $tp_headers_inject,
|
$tp_headers_extract, $t_headers_inject, $tp_headers_inject,
|
||||||
$t_headers_propagate, $tp_headers_propagate);
|
$t_headers_propagate, $tp_headers_propagate);
|
||||||
|
|
||||||
my ($tp_headers, $tp_resp) = http2_get_traceparent('/trace-on');
|
my ($tp_headers, $tp_resp) = http2_get('/trace-on', trace_headers => 1);
|
||||||
my ($t_headers, $t_resp) = http2_get_ssl('/trace-on');
|
my ($t_headers, $t_resp) = http2_get('/trace-on', ssl => 1);
|
||||||
|
|
||||||
($t_headers_ignore, $_) = http2_get('/context-ignore');
|
($t_headers_ignore, $_) = http2_get('/context-ignore');
|
||||||
($tp_headers_ignore, $_) = http2_get_traceparent('/context-ignore');
|
($tp_headers_ignore, $_) = http2_get('/context-ignore', trace_headers => 1);
|
||||||
($t_headers_extract, $_) = http2_get('/context-extract');
|
($t_headers_extract, $_) = http2_get('/context-extract');
|
||||||
($tp_headers_extract, $_) = http2_get_traceparent('/context-extract');
|
($tp_headers_extract, $_) = http2_get('/context-extract', trace_headers => 1);
|
||||||
($t_headers_inject, $_) = http2_get('/context-inject');
|
($t_headers_inject, $_) = http2_get('/context-inject');
|
||||||
($tp_headers_inject, $_) = http2_get_traceparent('/context-inject');
|
($tp_headers_inject, $_) = http2_get('/context-inject', trace_headers => 1);
|
||||||
($t_headers_propagate, $_) = http2_get('/context-propagate');
|
($t_headers_propagate, $_) = http2_get('/context-propagate');
|
||||||
($tp_headers_propagate, $_) = http2_get_traceparent('/context-propagate');
|
($tp_headers_propagate, $_) =
|
||||||
|
http2_get('/context-propagate', trace_headers => 1);
|
||||||
|
|
||||||
#batch1 (5 reqeusts)
|
#batch1 (5 reqeusts)
|
||||||
http2_get('/trace-on') for (1..5);
|
http2_get('/trace-on') for (1..5);
|
||||||
|
|
@ -371,59 +372,31 @@ is($tp_headers_propagate->{'x-otel-tracestate'},
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
sub http2_get {
|
sub http2_get {
|
||||||
my ($path) = @_;
|
my ($path, %extra) = @_;
|
||||||
my ($frames, $frame);
|
my ($frames, $frame);
|
||||||
|
|
||||||
my $s = Test::Nginx::HTTP2->new();
|
my $s = $extra{ssl}
|
||||||
|
? Test::Nginx::HTTP2->new(
|
||||||
|
undef, socket => get_ssl_socket(8082, ['h2']))
|
||||||
|
: Test::Nginx::HTTP2->new();
|
||||||
|
|
||||||
my $sid = $s->new_stream({ path => $path });
|
my $sid = $extra{trace_headers}
|
||||||
$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
|
? $s->new_stream({ headers => [
|
||||||
|
|
||||||
($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
|
|
||||||
my $headers = $frame->{headers};
|
|
||||||
|
|
||||||
($frame) = grep { $_->{type} eq "DATA" } @$frames;
|
|
||||||
my $data = $frame->{data};
|
|
||||||
|
|
||||||
return $headers, $data;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub http2_get_traceparent {
|
|
||||||
my ($path) = @_;
|
|
||||||
my ($frames, $frame);
|
|
||||||
|
|
||||||
my $s = Test::Nginx::HTTP2->new();
|
|
||||||
|
|
||||||
my $sid = $s->new_stream({ headers => [
|
|
||||||
{ name => ':method', value => 'GET' },
|
{ name => ':method', value => 'GET' },
|
||||||
{ name => ':scheme', value => 'http' },
|
{ name => ':scheme', value => 'http' },
|
||||||
{ name => ':path', value => $path },
|
{ name => ':path', value => $path },
|
||||||
{ name => ':authority', value => 'localhost' },
|
{ name => ':authority', value => 'localhost' },
|
||||||
{ name => 'user-agent', value => 'nginx-tests', mode => 2 },
|
{ name => 'user-agent', value => 'nginx-tests', mode => 2 },
|
||||||
{ name => 'traceparent',
|
{ name => 'traceparent',
|
||||||
value => '00-0af7651916cd43dd8448eb211c80319c-b9c7c989f97918e1-01',
|
value => '00-0af7651916cd43dd8448eb211c80319c-' .
|
||||||
mode => 2 },
|
'b9c7c989f97918e1-01',
|
||||||
|
mode => 2
|
||||||
|
},
|
||||||
{ name => 'tracestate',
|
{ name => 'tracestate',
|
||||||
value => 'congo=ucfJifl5GOE,rojo=00f067aa0ba902b7', mode => 2 }]});
|
value => 'congo=ucfJifl5GOE,rojo=00f067aa0ba902b7',
|
||||||
$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
|
mode => 2
|
||||||
|
}]})
|
||||||
($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
|
: $s->new_stream({ path => $path });
|
||||||
my $headers = $frame->{headers};
|
|
||||||
|
|
||||||
($frame) = grep { $_->{type} eq "DATA" } @$frames;
|
|
||||||
my $data = $frame->{data};
|
|
||||||
|
|
||||||
return $headers, $data;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub http2_get_ssl {
|
|
||||||
my ($path) = @_;
|
|
||||||
my ($frames, $frame);
|
|
||||||
|
|
||||||
my $s = Test::Nginx::HTTP2->new(undef,
|
|
||||||
socket => get_ssl_socket(8082, ['h2']));
|
|
||||||
|
|
||||||
my $sid = $s->new_stream({ path => $path });
|
|
||||||
$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
|
$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
|
||||||
|
|
||||||
($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
|
($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
|
||||||
|
|
|
||||||
46
tests/otel.t
46
tests/otel.t
|
|
@ -165,20 +165,20 @@ my $p = port(4317);
|
||||||
my $f = grpc();
|
my $f = grpc();
|
||||||
|
|
||||||
#do requests
|
#do requests
|
||||||
my $t_off_resp = http_get('/trace-off');
|
my $t_off_resp = http1_get('/trace-off');
|
||||||
|
|
||||||
#batch0 (10 requests)
|
#batch0 (10 requests)
|
||||||
my $tp_resp = http_get_traceparent('/trace-on');
|
my $tp_resp = http1_get('/trace-on', trace_headers => 1);
|
||||||
my $t_resp = http_get_ssl('/trace-on');
|
my $t_resp = http1_get('/trace-on', ssl => 1);
|
||||||
|
|
||||||
my $t_resp_ignore = http_get('/context-ignore');
|
my $t_resp_ignore = http1_get('/context-ignore');
|
||||||
my $tp_resp_ignore = http_get_traceparent('/context-ignore');
|
my $tp_resp_ignore = http1_get('/context-ignore', trace_headers => 1);
|
||||||
my $t_resp_extract = http_get('/context-extract');
|
my $t_resp_extract = http1_get('/context-extract');
|
||||||
my $tp_resp_extract = http_get_traceparent('/context-extract');
|
my $tp_resp_extract = http1_get('/context-extract', trace_headers => 1);
|
||||||
my $t_resp_inject = http_get('/context-inject');
|
my $t_resp_inject = http1_get('/context-inject');
|
||||||
my $tp_resp_inject = http_get_traceparent('/context-inject');
|
my $tp_resp_inject = http1_get('/context-inject', trace_headers => 1);
|
||||||
my $t_resp_propagate = http_get('/context-propagate');
|
my $t_resp_propagate = http1_get('/context-propagate');
|
||||||
my $tp_resp_propagate = http_get_traceparent('/context-propagate');
|
my $tp_resp_propagate = http1_get('/context-propagate', trace_headers => 1);
|
||||||
|
|
||||||
my $frames = $f->{http_start}();
|
my $frames = $f->{http_start}();
|
||||||
my ($frame) = grep { $_->{type} eq "DATA" } @$frames;
|
my ($frame) = grep { $_->{type} eq "DATA" } @$frames;
|
||||||
|
|
@ -187,7 +187,7 @@ my $batch0 = to_hash(decode_protobuf(substr($frame->{data}, 8)));
|
||||||
my $spans = $$batch0{scope_spans};
|
my $spans = $$batch0{scope_spans};
|
||||||
|
|
||||||
#batch1 (5 reqeusts)
|
#batch1 (5 reqeusts)
|
||||||
http_get('/trace-on') for (1..5);
|
http1_get('/trace-on') for (1..5);
|
||||||
|
|
||||||
$frames = $f->{http_start}();
|
$frames = $f->{http_start}();
|
||||||
($frame) = grep { $_->{type} eq "DATA" } @$frames;
|
($frame) = grep { $_->{type} eq "DATA" } @$frames;
|
||||||
|
|
@ -246,7 +246,7 @@ is(get_attr("http.scheme", "string_value", $$spans{span1}), 'https',
|
||||||
'http.scheme metric - trace on (https)');
|
'http.scheme metric - trace on (https)');
|
||||||
is(get_attr("http.flavor", "string_value", $$spans{span1}), '1.0',
|
is(get_attr("http.flavor", "string_value", $$spans{span1}), '1.0',
|
||||||
'http.flavor metric - trace on (https)');
|
'http.flavor metric - trace on (https)');
|
||||||
isnt(get_attr("http.user_agent", "string_value", $$spans{span1}),
|
is(get_attr("http.user_agent", "string_value", $$spans{span1}),
|
||||||
'nginx-tests', 'http.user_agent metric - trace on (https)');
|
'nginx-tests', 'http.user_agent metric - trace on (https)');
|
||||||
is(get_attr("http.request_content_length", "int_value", $$spans{span1}), 0,
|
is(get_attr("http.request_content_length", "int_value", $$spans{span1}), 0,
|
||||||
'http.request_content_length metric - trace on (https)');
|
'http.request_content_length metric - trace on (https)');
|
||||||
|
|
@ -358,25 +358,23 @@ like($tp_resp_propagate,
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
sub http_get_traceparent {
|
sub http1_get {
|
||||||
my ($path) = @_;
|
my ($path, %extra) = @_;
|
||||||
|
|
||||||
return http(<<EOF);
|
my $s = $extra{ssl} ? get_ssl_socket(8081) : undef;
|
||||||
|
|
||||||
|
my $r = <<EOF;
|
||||||
GET $path HTTP/1.0
|
GET $path HTTP/1.0
|
||||||
Host: localhost
|
Host: localhost
|
||||||
User-agent: nginx-tests
|
User-agent: nginx-tests
|
||||||
|
EOF
|
||||||
|
|
||||||
|
$r .= <<EOF if $extra{trace_headers};
|
||||||
Traceparent: 00-0af7651916cd43dd8448eb211c80319c-b9c7c989f97918e1-01
|
Traceparent: 00-0af7651916cd43dd8448eb211c80319c-b9c7c989f97918e1-01
|
||||||
Tracestate: congo=ucfJifl5GOE,rojo=00f067aa0ba902b7
|
Tracestate: congo=ucfJifl5GOE,rojo=00f067aa0ba902b7
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
}
|
|
||||||
|
|
||||||
sub http_get_ssl {
|
return http($r . "\n", socket => $s);
|
||||||
my ($path) = @_;
|
|
||||||
|
|
||||||
my $s = get_ssl_socket(8081) or return;
|
|
||||||
|
|
||||||
return http_get($path, socket => $s);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub get_ssl_socket {
|
sub get_ssl_socket {
|
||||||
|
|
|
||||||
|
|
@ -170,23 +170,23 @@ $t->try_run('no OTEL module')->plan(65);
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
#do requests
|
#do requests
|
||||||
my $t_off_resp = http_get('/trace-off');
|
my $t_off_resp = http1_get('/trace-off');
|
||||||
|
|
||||||
#batch0 (10 requests)
|
#batch0 (10 requests)
|
||||||
my $tp_resp = http_get_traceparent('/trace-on');
|
my $tp_resp = http1_get('/trace-on', trace_headers => 1);
|
||||||
my $t_resp = http_get_ssl('/trace-on');
|
my $t_resp = http1_get('/trace-on', ssl => 1);
|
||||||
|
|
||||||
my $t_resp_ignore = http_get('/context-ignore');
|
my $t_resp_ignore = http1_get('/context-ignore');
|
||||||
my $tp_resp_ignore = http_get_traceparent('/context-ignore');
|
my $tp_resp_ignore = http1_get('/context-ignore', trace_headers => 1);
|
||||||
my $t_resp_extract = http_get('/context-extract');
|
my $t_resp_extract = http1_get('/context-extract');
|
||||||
my $tp_resp_extract = http_get_traceparent('/context-extract');
|
my $tp_resp_extract = http1_get('/context-extract', trace_headers => 1);
|
||||||
my $t_resp_inject = http_get('/context-inject');
|
my $t_resp_inject = http1_get('/context-inject');
|
||||||
my $tp_resp_inject = http_get_traceparent('/context-inject');
|
my $tp_resp_inject = http1_get('/context-inject', trace_headers => 1);
|
||||||
my $t_resp_propagate = http_get('/context-propagate');
|
my $t_resp_propagate = http1_get('/context-propagate');
|
||||||
my $tp_resp_propagate = http_get_traceparent('/context-propagate');
|
my $tp_resp_propagate = http1_get('/context-propagate', trace_headers => 1);
|
||||||
|
|
||||||
#batch1 (5 reqeusts)
|
#batch1 (5 reqeusts)
|
||||||
http_get('/trace-on') for (1..5);
|
http1_get('/trace-on') for (1..5);
|
||||||
|
|
||||||
#waiting batch1 is sent to collector for 1s
|
#waiting batch1 is sent to collector for 1s
|
||||||
select undef, undef, undef, 1;
|
select undef, undef, undef, 1;
|
||||||
|
|
@ -263,7 +263,7 @@ is(get_attr("http.scheme", "stringValue", $$spans[1]), 'https',
|
||||||
'http.scheme metric - trace on (https)');
|
'http.scheme metric - trace on (https)');
|
||||||
is(get_attr("http.flavor", "stringValue", $$spans[1]), '1.0',
|
is(get_attr("http.flavor", "stringValue", $$spans[1]), '1.0',
|
||||||
'http.flavor metric - trace on (https)');
|
'http.flavor metric - trace on (https)');
|
||||||
isnt(get_attr("http.user_agent", "stringValue", $$spans[1]), 'nginx-tests',
|
is(get_attr("http.user_agent", "stringValue", $$spans[1]), 'nginx-tests',
|
||||||
'http.user_agent metric - trace on (https)');
|
'http.user_agent metric - trace on (https)');
|
||||||
is(get_attr("http.request_content_length", "intValue", $$spans[1]), 0,
|
is(get_attr("http.request_content_length", "intValue", $$spans[1]), 0,
|
||||||
'http.request_content_length metric - trace on (https)');
|
'http.request_content_length metric - trace on (https)');
|
||||||
|
|
@ -362,25 +362,23 @@ like($tp_resp_propagate,
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
sub http_get_traceparent {
|
sub http1_get {
|
||||||
my ($path) = @_;
|
my ($path, %extra) = @_;
|
||||||
|
|
||||||
return http(<<EOF);
|
my $s = $extra{ssl} ? get_ssl_socket(8081) : undef;
|
||||||
|
|
||||||
|
my $r = <<EOF;
|
||||||
GET $path HTTP/1.0
|
GET $path HTTP/1.0
|
||||||
Host: localhost
|
Host: localhost
|
||||||
User-agent: nginx-tests
|
User-agent: nginx-tests
|
||||||
|
EOF
|
||||||
|
|
||||||
|
$r .= <<EOF if $extra{trace_headers};
|
||||||
Traceparent: 00-0af7651916cd43dd8448eb211c80319c-b9c7c989f97918e1-01
|
Traceparent: 00-0af7651916cd43dd8448eb211c80319c-b9c7c989f97918e1-01
|
||||||
Tracestate: congo=ucfJifl5GOE,rojo=00f067aa0ba902b7
|
Tracestate: congo=ucfJifl5GOE,rojo=00f067aa0ba902b7
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
}
|
|
||||||
|
|
||||||
sub http_get_ssl {
|
return http($r . "\n", socket => $s);
|
||||||
my ($path) = @_;
|
|
||||||
|
|
||||||
my $s = get_ssl_socket(8081) or return;
|
|
||||||
|
|
||||||
return http_get($path, socket => $s);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub get_ssl_socket {
|
sub get_ssl_socket {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue