Skip to content

Commit 8c1a7c1

Browse files
committed
Add test for cowboy middle protocol support
1 parent 3a923e6 commit 8c1a7c1

3 files changed

Lines changed: 96 additions & 16 deletions

File tree

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ ct: compile test_deps
1313
-@ct_run -noshell -pa ebin \
1414
-pa deps/*/ebin \
1515
-pa test/deps/*/ebin \
16-
-name test \
16+
-sname test \
1717
-logdir ./logs \
1818
-env TEST_DIR ./test \
1919
-spec ./test/test_specs.spec \

test/soap_SUITE.erl

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,12 @@ groups() ->
112112
,{soap_11_client, [sequence], [client_11_ok ,client_11_fault]}
113113
,{soap_12_client, [sequence], [client_12_ok ,client_12_fault]}
114114
]}
115+
,{cowboy_middle_protocol, [sequence],
116+
[correct_sms
117+
,sms_fault
118+
,sms_invalid_xml
119+
,sms_wrong_method
120+
]}
115121
,{mochi_server, [sequence],
116122
[correct_sms
117123
,sms_fault
@@ -197,6 +203,15 @@ init_per_group(cowboy_server, Config) ->
197203
{"[0-9]{13,}", throw},
198204
{http_server, cowboy_version()}]),
199205
Config;
206+
init_per_group(cowboy_middle_protocol, Config) ->
207+
{ok, _} = soap:start_server(sendService_test_server,
208+
[{"[a-zA-Z]+", invalid},
209+
{"^\\+?[0-9]{4,12}$", valid},
210+
{"[0-9]{13,}", throw},
211+
{http_server, test_cowboy_middle_protocol},
212+
{cowboy_version, cowboy_version()}
213+
]),
214+
Config;
200215
init_per_group(inets_server, Config) ->
201216
{ok, _} = soap:start_server(sendService_test_server,
202217
[{http_server, soap_server_inets},
@@ -298,6 +313,9 @@ end_per_group(inets_server, _Config) ->
298313
end_per_group(cowboy_server, _Config) ->
299314
soap:stop_server(sendService_test_server),
300315
ok;
316+
end_per_group(cowboy_middle_protocol, _Config) ->
317+
soap:stop_server(sendService_test_server),
318+
ok;
301319
end_per_group(tempconvert_local, _Config) ->
302320
soap:stop_server(tempconvert_server),
303321
ok;
@@ -325,21 +343,22 @@ end_per_group(_, _Config) ->
325343
%%--------------------------------------------------------------------
326344
all() ->
327345
[{group, cowboy_server},
328-
{group, inets_server},
329-
{group, tempconvert},
330-
{group, tempconvert_12},
331-
{group, client},
332-
{group, soap_req},
333-
{group, wsdls}, %% takes a long time
334-
{group, erlang2wsdl},
335-
{group, wsdl2erlang},
336-
{group, attachments},
337-
{group, wsdl_2_0},
338-
%% for some reason the mochi server
339-
%% seems to continue answering requests after shutdown
340-
%% for a while, therefore put it last.
341-
{group, mochi_server},
342-
issue_4_encoded
346+
{group, cowboy_middle_protocol},
347+
{group, inets_server},
348+
{group, tempconvert},
349+
{group, tempconvert_12},
350+
{group, client},
351+
{group, soap_req},
352+
{group, wsdls}, %% takes a long time
353+
{group, erlang2wsdl},
354+
{group, wsdl2erlang},
355+
{group, attachments},
356+
{group, wsdl_2_0},
357+
%% for some reason the mochi server
358+
%% seems to continue answering requests after shutdown
359+
%% for a while, therefore put it last.
360+
{group, mochi_server},
361+
issue_4_encoded
343362
].
344363

345364
%%-------------------------------------------------------------------------
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
-module(test_cowboy_middle_protocol).
2+
3+
-export([start/1]).
4+
-export([start/2]).
5+
-export([stop/0]).
6+
-export([init/3, init/2]).
7+
-export([on_request/1]).
8+
-export([upgrade/4, upgrade/6]).
9+
10+
start(Module) ->
11+
start(Module, []).
12+
13+
start(Module, Options) ->
14+
15+
Port = proplists:get_value(port, Options, 8080),
16+
Acceptors = proplists:get_value(nr_acceptors, Options, 100),
17+
{ok, _} = application:ensure_all_started(cowboy),
18+
Dispatch = cowboy_router:compile([
19+
{'_', [{'_', ?MODULE, {Module, Options}}]}]),
20+
{ok, _} = cowboy:start_http(http, Acceptors, [{port, Port}],
21+
[ {env, [{dispatch, Dispatch}]},
22+
{onrequest, fun ?MODULE:on_request/1}
23+
]).
24+
25+
stop() ->
26+
cowboy:stop_listener(http),
27+
application:stop(cowboy),
28+
application:stop(ranch).
29+
30+
on_request(Req0) ->
31+
{ok, Body, Req1} = cowboy_req:body(Req0),
32+
cowboy_req:set_meta(body, Body, Req1).
33+
34+
%% cowboy 1 callback
35+
init(_, _Req, {_Module, Options}) ->
36+
%% The module 'soap_cowboy_protocol' will be called
37+
%% for each request, with Module (= the handler module) and
38+
%% the options as parameter.
39+
soap_server_cowboy_1 = proplists:get_value(cowboy_version, Options),
40+
{upgrade, protocol, ?MODULE}.
41+
42+
%% cowboy 1 callback
43+
upgrade(Cowboy_req, Env, Soap_handler, {Handler, Options}) ->
44+
Options2 = proplists:delete(cowboy_version, Options),
45+
{Message, Cowboy_req2} = cowboy_req:meta(body, Cowboy_req),
46+
47+
soap_cowboy_1_protocol:upgrade(
48+
Cowboy_req2, Env, Soap_handler, {Handler, Options2}, Message).
49+
50+
%% cowboy 2 callback
51+
init(Req, {Module, Options}) ->
52+
soap_server_cowboy_2 = proplists:get_value(cowboy_version, Options),
53+
{?MODULE, Req, {Module, Options}}.
54+
55+
%% cowboy 2 callback
56+
upgrade(Cowboy_req, Env, Soap_handler, {Handler, Options}, Timeout, Hibernate) ->
57+
Options2 = proplists:delete(cowboy_version, Options),
58+
{Message, Cowboy_req2} = cowboy_req:meta(body, Cowboy_req),
59+
60+
soap_cowboy_2_protocol:upgrade(
61+
Cowboy_req2, Env, Soap_handler, {Handler, Options2}, Timeout, Hibernate, Message).

0 commit comments

Comments
 (0)