CDS-64: add options for SSL support (#103)

* Get rid of acceptors_pool_size environment variable
* Fix end_per_testcase/2 in the main test suite
This commit is contained in:
Sergei Shuvatov 2019-06-06 13:11:48 +03:00 committed by GitHub
parent 3fd2111537
commit a4921bde49
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 509 additions and 37 deletions

View File

@ -24,6 +24,7 @@
ignore => [
elvis,
elvis_utils,
woody_ssl_SUITE,
woody_tests_SUITE,
woody_transport_opts_SUITE
]

View File

@ -15,7 +15,6 @@
cache
]},
{env, [
{acceptors_pool_size, 100},
{enable_debug, false}
]},
{modules, []},

View File

@ -107,7 +107,7 @@ send(Url, Body, Options, ResOpts, WoodyState) ->
false ->
_ = log_event(?EV_CLIENT_SEND, WoodyState, #{url => Url}),
% MSPF-416: We resolve url host to an ip here to prevent
% reusing keep-alive connections do dead hosts
% reusing keep-alive connections to dead hosts
case woody_resolver:resolve_url(Url, WoodyState, ResOpts) of
{ok, {OldUrl, NewUrl}} ->
Headers = add_host_header(OldUrl, make_woody_headers(Context)),

View File

@ -28,7 +28,17 @@
}.
-export_type([handler_limits/0]).
-type transport_opts() :: ranch:opts().
-type transport_opts() :: #{
connection_type => worker | supervisor,
handshake_timeout => timeout(),
max_connections => ranch:max_conns(),
logger => module(),
num_acceptors => pos_integer(),
shutdown => timeout() | brutal_kill,
socket => any(),
socket_opts => any(),
transport => module() % ranch_tcp | ranch_ssl
}.
-export_type([transport_opts/0]).
@ -104,16 +114,8 @@
%%
-spec child_spec(atom(), options()) ->
supervisor:child_spec().
child_spec(Id, Opts = #{
ip := Ip,
port := Port
}) ->
% TODO
% It's essentially a _transport option_ as it is in the newer ranch versions, therefore we should
% probably make it such here too. Ultimately we need to stop looking woody environment vars up.
SocketOpts = [{ip, Ip}, {port, Port}],
TransportOpts0 = maps:get(transport_opts, Opts, #{}),
{Transport, TransportOpts} = get_socket_transport(SocketOpts, TransportOpts0),
child_spec(Id, Opts) ->
{Transport, TransportOpts} = get_socket_transport(Opts),
CowboyOpts = get_cowboy_config(Opts),
RanchRef = {?MODULE, Id},
DrainSpec = make_drain_childspec(RanchRef, Opts),
@ -133,15 +135,12 @@ make_server_childspec(Id, Children) ->
type => supervisor
}.
get_socket_transport(SocketOpts, TransportOpts0) ->
TransportOpts = case maps:get(num_acceptors, TransportOpts0, undefined) of
undefined ->
AcceptorsPool = genlib_app:env(woody, acceptors_pool_size, ?DEFAULT_ACCEPTORS_POOLSIZE),
set_ranch_option(num_acceptors, AcceptorsPool, TransportOpts0);
_ ->
TransportOpts0
end,
{ranch_tcp, set_ranch_option(socket_opts, SocketOpts, TransportOpts)}.
get_socket_transport(Opts = #{ip := Ip, port := Port}) ->
Defaults = #{num_acceptors => ?DEFAULT_ACCEPTORS_POOLSIZE},
TransportOpts = maps:merge(Defaults, maps:get(transport_opts, Opts, #{})),
Transport = maps:get(transport, TransportOpts, ranch_tcp),
SocketOpts = [{ip, Ip}, {port, Port} | maps:get(socket_opts, TransportOpts, [])],
{Transport, set_ranch_option(socket_opts, SocketOpts, TransportOpts)}.
set_ranch_option(Key, Value, Opts) ->
Opts#{Key => Value}.

203
test/woody_ssl_SUITE.erl Normal file
View File

@ -0,0 +1,203 @@
-module(woody_ssl_SUITE).
-include_lib("public_key/include/public_key.hrl").
-include_lib("common_test/include/ct.hrl").
-include_lib("stdlib/include/assert.hrl").
-include("woody_test_thrift.hrl").
-behaviour(supervisor).
-behaviour(woody_server_thrift_handler).
-behaviour(woody_event_handler).
%% common test callbacks
-export([
all/0,
init_per_suite/1,
end_per_suite/1
]).
%% tests
-export([
client_wo_cert_test/1,
valid_client_cert_test/1,
invalid_client_cert_test/1
]).
%% woody_event_handler callback
-export([handle_event/4]).
%% woody_server_thrift_handler callback
-export([handle_function/4]).
%% supervisor callback
-export([init/1]).
-type config() :: [{atom(), any()}].
-type case_name() :: atom().
-define(PATH, "/v1/test/weapons").
-define(THRIFT_DEFS, woody_test_thrift).
-define(data_dir(C), ?config(data_dir, C)).
-define(valid_subdir(C), filename:join(?data_dir(C), "valid")).
-define(invalid_subdir(C), filename:join(?data_dir(C), "invalid")).
-define(ca_cert(C), filename:join(?valid_subdir(C), "ca.crt")).
-define(server_cert(C), filename:join(?valid_subdir(C), "server.pem")).
-define(client_cert(C), filename:join(?valid_subdir(C), "client.pem")).
-define(invalid_client_cert(C), filename:join(?invalid_subdir(C), "client.pem")).
%%%
%%% CT callbacks
%%%
-spec all() ->
[case_name()].
all() ->
[
client_wo_cert_test,
invalid_client_cert_test,
valid_client_cert_test
].
-spec init_per_suite(config()) ->
config().
init_per_suite(C) ->
{ok, Sup} = supervisor:start_link({local, ?MODULE}, ?MODULE, []),
true = erlang:unlink(Sup),
{ok, Apps} = application:ensure_all_started(woody),
NewConfig = [{sup, Sup}, {apps, Apps} | C],
{ok, _WoodyServer} = start_woody_server(NewConfig),
NewConfig.
-spec end_per_suite(config()) ->
ok.
end_per_suite(C) ->
Sup = ?config(sup, C),
ok = proc_lib:stop(Sup),
[application:stop(App) || App <- proplists:get_value(apps, C)],
ok.
%%%
%%% Tests
%%%
-spec client_wo_cert_test(config()) -> _.
client_wo_cert_test(C) ->
SSLOptions = [{cacertfile, ?ca_cert(C)}],
?assertException(
error,
{woody_error, {internal, result_unexpected, <<"{tls_alert,\"handshake failure\"}">>}},
get_weapon(?FUNCTION_NAME, <<"BFG">>, SSLOptions)
).
-spec valid_client_cert_test(config()) -> _.
valid_client_cert_test(C) ->
SSLOptions = [{cacertfile, ?ca_cert(C)}, {certfile, ?client_cert(C)}],
{ok, #'Weapon'{}} = get_weapon(?FUNCTION_NAME, <<"BFG">>, SSLOptions).
-spec invalid_client_cert_test(config()) -> _.
invalid_client_cert_test(C) ->
SSLOptions = [{cacertfile, ?ca_cert(C)}, {certfile, ?invalid_client_cert(C)}],
?assertException(
error,
{woody_error, {internal, result_unexpected, <<"{tls_alert,\"unknown ca\"}">>}},
get_weapon(?FUNCTION_NAME, <<"BFG">>, SSLOptions)
).
%%%
%%% woody_event_handler callback
%%%
-spec handle_event(
woody_event_handler:event(),
woody:rpc_id(),
woody_event_handler:event_meta(),
woody:options()
) -> _.
handle_event(Event, RpcId, Meta, _) ->
{_Severity, {Format, Msg}, EvMeta} = woody_event_handler:format_event_and_meta(
Event, Meta, RpcId,
[event, role, service, service_schema, function, type, args, metadata,
deadline, status, url, code, result, execution_time]
),
ct:pal(Format ++ "~nmeta: ~p", Msg ++ [EvMeta]).
%%%
%%% woody_server_thrift_handler callback
%%%
-spec handle_function(woody:func(), woody:args(), woody_context:ctx(), woody:options()) ->
{ok, woody:result()}.
handle_function(get_weapon, [Name, _Data], _Context, _Opts) ->
{ok, #'Weapon'{name = Name, slot_pos = 0}}.
%%%
%%% Supervisor callback
%%%
-spec init(_) -> _.
init(_) ->
{ok, {
{one_for_one, 1, 1}, []
}}.
%%%
%%% Internal functions
%%%
start_woody_server(C) ->
Sup = ?config(sup, C),
Server = woody_server:child_spec(?MODULE, #{
handlers => [{?PATH, {{?THRIFT_DEFS, 'Weapons'}, ?MODULE}}],
event_handler => ?MODULE,
ip => {0, 0, 0, 0},
port => 8043,
transport_opts => #{
transport => ranch_ssl,
socket_opts => [
{cacertfile, ?ca_cert(C)},
{certfile, ?server_cert(C)},
{verify, verify_peer},
{fail_if_no_peer_cert, true}
]
}
}),
supervisor:start_child(Sup, Server).
get_weapon(Id, Gun, SSLOptions) ->
Context = woody_context:new(to_binary(Id)),
{Url, Service} = get_service_endpoint('Weapons'),
Options = #{
url => Url,
event_handler => ?MODULE,
transport_opts => #{
ssl_options => [
{server_name_indication, "Test Server"},
{verify, verify_peer} |
SSLOptions
]
}
},
woody_client:call({Service, get_weapon, [Gun, <<>>]}, Options, Context).
get_service_endpoint('Weapons') ->
{
"https://localhost:8043" ?PATH,
{?THRIFT_DEFS, 'Weapons'}
}.
to_binary(Atom) when is_atom(Atom) ->
erlang:atom_to_binary(Atom, utf8);
to_binary(Binary) when is_binary(Binary) ->
Binary.

View File

@ -0,0 +1,82 @@
-----BEGIN CERTIFICATE-----
MIIFYjCCA0oCCQDz6dHZOku5ejANBgkqhkiG9w0BAQsFADByMQswCQYDVQQGEwJS
VTEPMA0GA1UECAwGTW9zY293MQ8wDQYDVQQHDAZNb3Njb3cxEjAQBgNVBAoMCVJC
Sy5Nb25leTEWMBQGA1UECwwNRGV2RGVwYXJ0bWVudDEVMBMGA1UEAwwMVGVzdCBS
b290IENBMCAXDTE5MDUzMDE2MzM0M1oYDzIyMTkwNDEyMTYzMzQzWjByMQswCQYD
VQQGEwJSVTEPMA0GA1UECAwGTW9zY293MQ8wDQYDVQQHDAZNb3Njb3cxEjAQBgNV
BAoMCVJCSy5Nb25leTEWMBQGA1UECwwNRGV2RGVwYXJ0bWVudDEVMBMGA1UEAwwM
V3JvbmcgQ2xpZW50MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0qx8
1rLrFgSgzrpv0A65s1genJGptLkgapWWndvjCAtWpx0mW30sYsxQiKjqGD2LqV3e
DWoSwSxajcl5QbS1C4SV92Cjm8nVM2kQxA7QQXr5843VEyNPQcqP5jo8NysgtxXh
iHAyEEEUsmL4/KLgUpEQspsLOBjQbvifJcG7RxfQlE2whU2aXXMi0I//N2F34jLn
o4icJu/Lz2GWR7xeNiVNV2ILMNNnLudYvr8HyR6xV9vCbB7xdO16O1eSexfydjOl
JyuE1/1U8x29/Lya5q6qChdpbpv0b9ZVCC0x3hFWnGEICuiT6iSh1QJPp/XBLzpE
FZkeC+THnMuc1v5JKGA/WN+XV+iElgOSSVSNlsnen7UcvM2Fu2ftwv1tfYiSfuNr
1pP6qNsCxJ7ZQTOIb4+t/mWi7ILJnHjf5HEvNE/vSY/++6VdnuHyWuo44/0S4VQX
g7QCB1c0F7v3PRDlon5z+3TWOE9YobQZ68q1cOBB7vz7nnxH4mosIz+Pgkh2mSXh
aGX6GOjOnseXKeks5ZAIKRYv6SaAHqwwCjEZ6+eYO1x+zGhQOBeR2SWcs4En1Jey
pHtV7FRi2XVw9kNQay3iufBbix9SrkfHchPDPdEq+uG5agI91BxZniGz+cLDK1QT
hA6UO9WNzLLc03X93EYnUVmnuRjifyX71VbBUW0CAwEAATANBgkqhkiG9w0BAQsF
AAOCAgEAAYX6UblkH4neDn0lPdPPEXMdyMLXZud7W3zzPhMWvqvk0BbFmtfH6qIg
FxI38lMmPec8v9se6+qWm4IHzvL9LNlmajZLi6uCQw9bNgWIyZ+EMwT92X0lJ9DZ
zUrH06lW5AOHYQLEPYOmbO0jOcJGcTkd8IyTkYjq37hYEjoFAUKwyOjAL0iW+WU6
8aN+czLjb1tOPF88y2WghgXQaY9Sw2a95n9e1M/NGU8k2mTvcgWsrRY8TW+Nm3Tl
9nJs+CUVGTYZkW/QvuphnNXD4tFnfP0GXXZsFsrBavjupkTCzweU4eymfwISwRTP
FVawjFZaeVFZTZ4ZRHQ80/i4K+gxY6jbpLqbqt4ln2gpIuZ1606VghKWYcyPNsYm
avZ6W4CaaDJAW3FWOqbW/91O2iqgFjEupKwApsqK0uzIw2Bie9+IdNfVmHlFbIO9
es6gCJgDSmsmhEiIOKTN4a1l9MSEC62r31+L48lxyaO3reVwa62LH0w+6Hb/W5IZ
FVIMOc8BdqXGA7adIU0u5/7e2TANnCtye3ifaWFmtntTNxCkWviu1sjXf1Uv7QYR
qdJT4ng5CCROnREKhCrJIKmXHE3FkG2oqLeY4OR4QYxMh1FRvXxYXZKEFmbGQj4V
iEZ/4h44OEDjMjMPEULXZIG0yaLiRBP1tdeCAoC/XyG8TTyotC0=
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----

View File

@ -0,0 +1,33 @@
-----BEGIN CERTIFICATE-----
MIIFvDCCA6SgAwIBAgIJAPquYKKbPZEmMA0GCSqGSIb3DQEBCwUAMHIxCzAJBgNV
BAYTAlJVMQ8wDQYDVQQIDAZNb3Njb3cxDzANBgNVBAcMBk1vc2NvdzESMBAGA1UE
CgwJUkJLLk1vbmV5MRYwFAYDVQQLDA1EZXZEZXBhcnRtZW50MRUwEwYDVQQDDAxU
ZXN0IFJvb3QgQ0EwIBcNMTkwNTMwMTY0NjU5WhgPMjIxOTA0MTIxNjQ2NTlaMHIx
CzAJBgNVBAYTAlJVMQ8wDQYDVQQIDAZNb3Njb3cxDzANBgNVBAcMBk1vc2NvdzES
MBAGA1UECgwJUkJLLk1vbmV5MRYwFAYDVQQLDA1EZXZEZXBhcnRtZW50MRUwEwYD
VQQDDAxUZXN0IFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
AQDX/DSwgyxbN0p7llBhvhzm2kdtKeb6SCjnzlFP62Oq/EoOztwEJybMCL4jKgoa
fmgxn2ysfwFpnbjV75UVsC1O/gDgnE7nvZWHdDsKc+RRn1r71C4B/Awp+Db0PD79
I0MdlhjSltVN8FcuY4ZU59K0O9WAJ5W8xQAgD41D4YycUJVR7rH2KLr1yimbJObm
2iBXHN+BAY/aggQ6ofzg9HqclzACpEO2YEXwNbE3vDSqUAcO+yxMGpQ+9z/O1VzG
9qO56CM6REf8lF6AEqfODauxtlHWhqyTPF+l30uYRYsTj5uZedavZq1ehfLuArDG
Se+gjzBzUj/sZBs6J+TkVk9oJ16IVxu3N4eWIYTh+a2V1fkSRvjOeOtiJQp1gJ7i
cM6kD+6i3WBrXM0zLBnGY5eyxfxU/jf4+LJfHAo5Pyl9lW4R7hUQmROzkStvLPml
v0xofMI52g2CVVt9ArP0+ykFXnXDoRRBBcRhGuQDJnzRv8+Eqbi7TcHavHi8e5YV
6RDrQp9rFOsK7kWHsmpWOSdxkPnnOEq0uyoMgXZNuLNx5SDaf9YD2TXQWA0B8DlL
KWh+FCdUY10hfFC9RBTP0oAlRgC+EtXsNBgdiflqDRBRtDBvjrKqGPrMGJ+xgsTa
Id/ijHhHr0CocFh1XfPSFP5xg9G9nTyEgoQQh73cdngllwIDAQABo1MwUTAdBgNV
HQ4EFgQUSKIuHuE/bwVT0TtHPZ1Ti3fcHHgwHwYDVR0jBBgwFoAUSKIuHuE/bwVT
0TtHPZ1Ti3fcHHgwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEA
ho/bLXG1y/zLlIxdxjE2KtNlPTRdtq9tVaJBjXO3RgRpCGOQNrFDThIk41sFRPdx
22ttDrR3ezkuze9abVT8A0kTylSepvov4sb8pIsmdtSQc5uchVwmnVQJcRUTnPlT
/WMJA72tGHLopHw9Ar/SAUxEJxMuv+dSzuZFPOnitFc4Opp7v00TDp0fhovQ1gbp
UJzL2PhICvyFGmeMg9ZkVphMEW0SCzpd0+C7uyq2gTHJpAAK/sr6CaFLSbuwWGUz
Jwn+3fFBObHT944f499zEt8O9Co4E/Bp4w2AlwlzSyYzGWP3IuAH+DaA3xHqtbcO
1JoWmgCFsJVvqgPm0junoPMnYKgEhEVqRFTvodeSXUH+Nw7BJ/IqUsxyslfVJXic
csoj+D0C6P7udvCIPqxNmZWYxAuSDs0tLLTqGyFV6SJMFGlxqPmGnyGqQryUzIbM
CljeTgQZLPM04WC1Nc+upPlOE/vzLkmVZ/Y1zOcvRUOC4Da+aC2N5yynrOj8bXqT
94l7o5TIK4c6xKU2bg6uj2imNZ7pQqt3xNDPmYEpMyPHcqqWYMfZfzUWthN64weI
nMMYqHJWvTp0iB4Btbqp+vD/RLY93rJiYQ/5NJUZ85VstadV07iJQ4gYEwH+wwtN
B/LGE1bCdcBSWqmDLf/yonUEC4aas9Dnsw6uk/XNG4U=
-----END CERTIFICATE-----

View File

@ -0,0 +1,82 @@
-----BEGIN CERTIFICATE-----
MIIFZzCCA08CCQDuBstLoij7wTANBgkqhkiG9w0BAQsFADByMQswCQYDVQQGEwJS
VTEPMA0GA1UECAwGTW9zY293MQ8wDQYDVQQHDAZNb3Njb3cxEjAQBgNVBAoMCVJC
Sy5Nb25leTEWMBQGA1UECwwNRGV2RGVwYXJ0bWVudDEVMBMGA1UEAwwMVGVzdCBS
b290IENBMCAXDTE5MDUzMTA5MDMyMloYDzIyMTkwNDEzMDkwMzIyWjB3MQswCQYD
VQQGEwJSVTEPMA0GA1UECAwGTW9zY293MQ8wDQYDVQQHDAZNb3Njb3cxEjAQBgNV
BAoMCVJCSy5Nb25leTEWMBQGA1UECwwNRGV2RGVwYXJ0bWVudDEaMBgGA1UEAwwR
VmFsaWQgVGVzdCBDbGllbnQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
AQDj0HOn3MqCeCY4taWrrEF9U8FN/sxpNoVUjHBfqs8q90VhSvt+X0ps5XmT83kp
gbjIMPT/GwmI7mOjRGJt4tDKfpe08x0Z8vWZR0mVimWemNjO+qm/LV/5ILRey96j
sasWDFglG05IMhTCXTU+v5jog0MGNLxOsbgke78tu/vxDbqkAiprrO4BEMbHauZj
5C2/JlZ4Eabm9v+lDM9xhZFGjnhjW2WpM70grDGzrovtjeGAPnqwGtRFyqwV554C
XeUf9JJnP4gnfpi64TQgYFmMNPIca1UK/Ao/1dJI6BmDU5B/sISqzbC4gHLJFTdX
OzqB4EUUDPOu0hDE0oA6NyuCMs0oVcNfbwYc372VwbOfUcw/fMIYKZ9s1YbQv+Dp
fbwQFGti8bCpop0SFXRMwjhaLhVkgF6GWyOCdN94Ab5lA/xXm2neZJANKFIhS0l9
LPtBNhWBwbhlpq1DwhW0u2wCP9iexsO5Repx+IdgRTEcyyk35PkDjBUbVk4WYaXv
65quGu+paLn71KwLhmdW1F3vepBOG1kjgpGAfxssLdjbpmDBlinFCZvaJyp0mVAw
pRkwf8zy5sPiWidPwYtVz2CCFu4ktSSjq7TAIA76GUTzf300SdmhrUABgM7jAze5
nBP+SeW/WLYZl4pQ7/Cy/iX0WztDwzsAMq5BzTFgi04xqQIDAQABMA0GCSqGSIb3
DQEBCwUAA4ICAQBj5QJktBJsNtK6MWzxCuKuHH7ZkReFW4otOqw1gAGs7FWE7eOT
mADG3MdbrncTLvEqH8WpFDKt8ppNl8kG6Qbu26R9bZQjFg3uUDiTtnHTG8UZ5jfA
hDsmPU4t2n/VGkThdCzMgCiCSqVjMJoSEblBahHiIrqAKkRX04L+WFu/NWa1nDWl
zuYArTmRw0q3jxLQnfuFJiibUvqcBt+EbpT6PB3jIo7QxnNCe+lHZt84zMuP1lV2
nsE5LzYuNV8cktVAArbFF+VIrEd4rfrGaEwx1sx3YYOuL0kk7mfvr+UBLneKijDT
kk7GTE4vNE0U34FtphVKvGCeB2AGXdZZSRxA2lAEv3DE18sga8tuVXX1X5nowCYI
NpbVXCcEYs3HTPMzfVvdjiE1VzKB+YxY2eJYp/A//IL8Z+lH3djowqCkROyiMBa3
ABlMLZs1B7ck0G1QM9FJxaLxxm50TPXZvgoXWJC7dq2XB3p4de8mHV5JD0Sc+NqW
TM6MHhLUWsCqTFLDhliw5oWlDpqdjURwfnH0xHibQIamie8nn7BhmkFmPXulbdrd
9CpMOpaYmKvJgBXmahcUOg4b0SdDAT31lmu7zNmzT2UUOVS9smEUU7NXrJ8UOwQ7
nAwFNN6zT5CEmDW30v38DqTdXjKU9U4cXD2jFN6sMbN5swc95Wgh5BWJdw==
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----

View File

@ -0,0 +1,82 @@
-----BEGIN CERTIFICATE-----
MIIFYTCCA0kCCQDuBstLoij7wDANBgkqhkiG9w0BAQsFADByMQswCQYDVQQGEwJS
VTEPMA0GA1UECAwGTW9zY293MQ8wDQYDVQQHDAZNb3Njb3cxEjAQBgNVBAoMCVJC
Sy5Nb25leTEWMBQGA1UECwwNRGV2RGVwYXJ0bWVudDEVMBMGA1UEAwwMVGVzdCBS
b290IENBMCAXDTE5MDUzMDE2NDgwOFoYDzIyMTkwNDEyMTY0ODA4WjBxMQswCQYD
VQQGEwJSVTEPMA0GA1UECAwGTW9zY293MQ8wDQYDVQQHDAZNb3Njb3cxEjAQBgNV
BAoMCVJCSy5Nb25leTEWMBQGA1UECwwNRGV2RGVwYXJ0bWVudDEUMBIGA1UEAwwL
VGVzdCBTZXJ2ZXIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjOd4B
mFEgWoEKx3B2+59XsSXZ4HXKUqOvbTeu6TsvyYJxgLKeCapfA25XTlGtNtdouO70
paL4q5vvB4sTeTU9Ya4WYEmnN1fS0ZrkPsN8Hefehink9kD+m9nU0X7TvSgiTFy3
wQPCqJ6lGYg0SB7Fxuhx+6wP+J+nCTG5wf/78ZAl4TPa4Ckt63C/kD1xNG48Fu4J
y+djn6GNDl4IuodGUibBu6u1oddWzSgjZgzK1mWJ9naYe276d243eeL8d1UwTX1j
VT3gZBQCMattydyPUg63kH3D4xBJHG2A2a9TMfDbvmjcMvpshPPeRGjQ3mOQRG12
awWaJ+DtQoPx/D09emWt6zezx89ysXRlj8BGTfyfbzaiWu3fb1DuX2VlQyIH7oPK
MVwPKm/e3u5sPU3/od7rm/qPKqZwchI5DrPMb0UDt9zRbBEH1bzfBOBjye76hKwV
BaX8ozyxU0MZeAia1GfeT9WGzTiTRjC+sDSZa1gUhlS/F68UfSVCctpUUHVAYO+P
VloM3hOcBhsImFB+YgvbUtLQUEK/0oM6a2SYPhrRjpEgnpvoVWrw15iWoJICGf5H
DS2al+av0FPJp4jEeDNQyMA622TCW5zlJHTFgkRIH13se7UUa29fUfzqLR3GQOZq
9I0x8s35A/IKJNy7Z9685VCCtapqBXch/2tEswIDAQABMA0GCSqGSIb3DQEBCwUA
A4ICAQBCe8GQQMTZuNU+M7rZeVTeZghs84xg2MfON2nxEfsMVbbTfkvLb3coInnb
QBEht1t8zuwy6KzvzTd3XBnYjHX9LOE/9KQKo381PABy+qn74f/GJp2zx0dbYmJH
nAXbYMMpfqIw7Exc+mjy3OgRyaNa9kqFWEOwLQHauFIj0iuVZo5EuxsfULa45L1W
u9cUIr/XL22PcHPiuysAETnjyBYWwIe/odHdqLRyhh2VcX4ADZdhaSfXYSR53oxv
SRyb1IK3ylIRbyXsaB+hvvUG9zXp5eESKaTh6JGNILQ4MDnKGLWchAqRBgKCZ+v1
6fFJZR/AbTQ1uuTnJ/HX8rjQtm+ON7Pgb9qRQzmRoUZvMJGX9ylr6jmL5qg60dDx
z4+ZG3LW2Y65eqmSzAr64L8MJ80EPAgCGjQx9SuGZGXYKPTNe9Y+WpTiAKSmsl1R
ocQTP9ktrTS5xAwJz6dlLk8a4nIFX2JuMEfScI9y0YC3zxUYThPzREXY+/Ta5EAc
o+kvrgHNX2wHEZ5RRSHYJZR/o8qkSNviXNA7Mth6KhzXX1FDwlNPQp+qGREXAxhK
H7/jLTnsfUkNl+PU64OPeZanbM/D5XR/s+1npy02+nW+yktS2Q+22sKM5Nv8BvdJ
I8PMnoar7pAs9wr40sq4rRU1R32Al4+OyTCErva7etKWEVDEYg==
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----

View File

@ -31,7 +31,7 @@
init_per_group/2,
end_per_group/2,
init_per_testcase/2,
end_per_test_case/2
end_per_testcase/2
]).
-export([
context_add_put_get_meta_ok_test/1,
@ -184,7 +184,7 @@
-spec init_per_group(group_name(), config()) -> config().
-spec end_per_group(group_name(), config()) -> any().
-spec init_per_testcase(case_name(), config()) -> config().
-spec end_per_test_case(case_name(), config()) -> any().
-spec end_per_testcase(case_name(), config()) -> any().
-spec context_add_put_get_meta_ok_test(config()) -> any().
-spec context_get_meta_by_key_ok_test(config()) -> any().
@ -490,21 +490,12 @@ get_fail_code(call_no_headers_502_test) -> 502;
get_fail_code(call_no_headers_503_test) -> 503;
get_fail_code(call_no_headers_504_test) -> 504.
end_per_test_case(_, C) ->
end_per_testcase(_, C) ->
case proplists:get_value(sup, C, undefined) of
undefined ->
ok;
Sup ->
exit(Sup, shutdown),
Ref = monitor(process, Sup),
receive
{'DOWN', Ref, process, Sup, _Reason} ->
demonitor(Ref),
ok
after 1000 ->
demonitor(Ref, [flush]),
error(exit_timeout)
end
ok = proc_lib:stop(Sup)
end.
%%

View File

@ -53,7 +53,7 @@ all() ->
init_per_suite(C) ->
% dbg:tracer(), dbg:p(all, c),
% dbg:tpl({ranch_server, '_', '_'}, x),
Apps = genlib_app:start_application_with(woody, [{acceptors_pool_size, 1}]),
{ok, Apps} = application:ensure_all_started(woody),
[{suite_apps, Apps} | C].
end_per_suite(C) ->
@ -94,7 +94,7 @@ respects_max_connections(C) ->
% timeout is 5000 ms which is the same as the default woody request timeout.
% I wonder how this behavior affects production traffic as most of woody servers there configured with
% keepalive timeout of 60 s.
TransportOpts = #{max_connections => MaxConns},
TransportOpts = #{max_connections => MaxConns, num_acceptors => 1},
ProtocolOpts = #{max_keepalive => 1},
ReadBodyOpts = #{},
{ok, ServerPid} = start_woody_server(Handler, TransportOpts, ProtocolOpts, ReadBodyOpts, C),