Skip to content

Commit 8f61ace

Browse files
Update erlang-server sample
1 parent 0549e73 commit 8f61ace

File tree

9 files changed

+80
-105
lines changed

9 files changed

+80
-105
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3.3.2-SNAPSHOT
1+
3.3.3-SNAPSHOT

samples/server/petstore/erlang-server/src/openapi_api.erl

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -649,7 +649,7 @@ validate(Rule = {pattern, Pattern}, Name, Value, _ValidatorState) ->
649649
end;
650650

651651
validate(Rule = schema, Name, Value, ValidatorState) ->
652-
Definition = list_to_binary("#/definitions/" ++ openapi_utils:to_list(Name)),
652+
Definition = list_to_binary("#/components/schemas/" ++ openapi_utils:to_list(Name)),
653653
try
654654
_ = validate_with_schema(Value, Definition, ValidatorState),
655655
ok
@@ -688,27 +688,26 @@ validation_error(ViolatedRule, Name, Info) ->
688688
{Value :: any(), Req :: cowboy_req:req()} |
689689
{error, Reason :: any(), Req :: cowboy_req:req()}.
690690
get_value(body, _Name, Req0) ->
691-
{ok, Body, Req} = cowboy_req:body(Req0),
691+
{ok, Body, Req} = cowboy_req:read_body(Req0),
692692
case prepare_body(Body) of
693693
{error, Reason} ->
694694
{error, Reason, Req};
695695
Value ->
696696
{Value, Req}
697697
end;
698698

699-
get_value(qs_val, Name, Req0) ->
700-
{QS, Req} = cowboy_req:qs_vals(Req0),
699+
get_value(qs_val, Name, Req) ->
700+
QS = cowboy_req:parse_qs(Req),
701701
Value = openapi_utils:get_opt(openapi_utils:to_qs(Name), QS),
702702
{Value, Req};
703703

704-
get_value(header, Name, Req0) ->
705-
{Headers, Req} = cowboy_req:headers(Req0),
706-
Value = openapi_utils:get_opt(openapi_utils:to_header(Name), Headers),
704+
get_value(header, Name, Req) ->
705+
Headers = cowboy_req:headers(Req),
706+
Value = maps:get(openapi_utils:to_header(Name), Headers, undefined),
707707
{Value, Req};
708708

709-
get_value(binding, Name, Req0) ->
710-
{Bindings, Req} = cowboy_req:bindings(Req0),
711-
Value = openapi_utils:get_opt(openapi_utils:to_binding(Name), Bindings),
709+
get_value(binding, Name, Req) ->
710+
Value = cowboy_req:binding(openapi_utils:to_binding(Name), Req),
712711
{Value, Req}.
713712

714713
prepare_body(Body) ->

samples/server/petstore/erlang-server/src/openapi_auth.erl

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,19 @@ authorize_api_key(LogicHandler, OperationID, From, KeyParam, Req0) ->
3232
end
3333
end.
3434

35-
get_api_key(header, KeyParam, Req0) ->
36-
{Headers, Req} = cowboy_req:headers(Req0),
35+
get_api_key(header, KeyParam, Req) ->
36+
Headers = cowboy_req:headers(Req),
3737
{
38-
openapi_utils:get_opt(
38+
maps:get(
3939
openapi_utils:to_header(KeyParam),
40-
Headers
40+
Headers,
41+
undefined
4142
),
4243
Req
4344
};
4445

45-
get_api_key(qs_val, KeyParam, Req0) ->
46-
{QS, Req} = cowboy_req:qs_vals(Req0),
46+
get_api_key(qs_val, KeyParam, Req) ->
47+
QS = cowboy_req:parse_qs(Req),
4748
{ openapi_utils:get_opt(KeyParam, QS), Req}.
4849

4950

samples/server/petstore/erlang-server/src/openapi_default_logic_handler.erl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ authorize_api_key(_, _) -> {true, #{}}.
1414
Req :: cowboy_req:req(),
1515
Context :: #{}
1616
) ->
17-
{Status :: cowboy:http_status(), Headers :: cowboy:http_headers(), Body :: #{}}.
17+
{Status :: cowboy:http_status(), Headers :: cowboy:http_headers(), Body :: jsx:json_term()}.
1818

1919
handle_request(OperationID, Req, Context) ->
2020
error_logger:error_msg(
2121
"Got not implemented request to process: ~p~n",
2222
[{OperationID, Req, Context}]
2323
),
24-
{501, [], #{}}.
24+
{501, #{}, #{}}.

samples/server/petstore/erlang-server/src/openapi_logic_handler.erl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@
1818
Result :: boolean() | {boolean(), context()}.
1919

2020

21-
-callback handle_request(OperationID :: openapi_api:operation_id(), Request :: any(), Context :: context()) ->
21+
-callback handle_request(OperationID :: openapi_api:operation_id(), cowboy_req:req(), Context :: context()) ->
2222
handler_response().
2323

2424
-spec handle_request(
2525
Handler :: atom(),
2626
OperationID :: openapi_api:operation_id(),
27-
Request :: any(),
27+
Request :: cowboy_req:req(),
2828
Context :: context()
2929
) ->
3030
handler_response().

samples/server/petstore/erlang-server/src/openapi_pet_handler.erl

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33

44
%% Cowboy REST callbacks
55
-export([allowed_methods/2]).
6-
-export([init/3]).
7-
-export([rest_init/2]).
6+
-export([init/2]).
87
-export([allow_missing_post/2]).
98
-export([content_types_accepted/2]).
109
-export([content_types_provided/2]).
@@ -27,17 +26,11 @@
2726

2827
-type state() :: state().
2928

30-
-spec init(TransportName :: atom(), Req :: cowboy_req:req(), Opts :: openapi_router:init_opts()) ->
31-
{upgrade, protocol, cowboy_rest, Req :: cowboy_req:req(), Opts :: openapi_router:init_opts()}.
29+
-spec init(Req :: cowboy_req:req(), Opts :: openapi_router:init_opts()) ->
30+
{cowboy_rest, Req :: cowboy_req:req(), State :: state()}.
3231

33-
init(_Transport, Req, Opts) ->
34-
{upgrade, protocol, cowboy_rest, Req, Opts}.
35-
36-
-spec rest_init(Req :: cowboy_req:req(), Opts :: openapi_router:init_opts()) ->
37-
{ok, Req :: cowboy_req:req(), State :: state()}.
38-
39-
rest_init(Req0, {Operations, LogicHandler, ValidatorState}) ->
40-
{Method, Req} = cowboy_req:method(Req0),
32+
init(Req, {Operations, LogicHandler, ValidatorState}) ->
33+
Method = cowboy_req:method(Req),
4134
OperationID = maps:get(Method, Operations, undefined),
4235

4336
error_logger:info_msg("Attempt to process operation: ~p", [OperationID]),
@@ -47,7 +40,7 @@ rest_init(Req0, {Operations, LogicHandler, ValidatorState}) ->
4740
logic_handler = LogicHandler,
4841
validator_state = ValidatorState
4942
},
50-
{ok, Req, State}.
43+
{cowboy_rest, Req, State}.
5144

5245
-spec allowed_methods(Req :: cowboy_req:req(), State :: state()) ->
5346
{Value :: [binary()], Req :: cowboy_req:req(), State :: state()}.
@@ -423,49 +416,47 @@ valid_entity_length(Req, State) ->
423416
{true, Req, State}.
424417

425418
%%%%
426-
427419
-type result_ok() :: {
428420
ok,
429421
{Status :: cowboy:http_status(), Headers :: cowboy:http_headers(), Body :: iodata()}
430422
}.
431423

432424
-type result_error() :: {error, Reason :: any()}.
433425

434-
-type processed_response() :: {halt, cowboy_req:req(), state()}.
426+
-type processed_response() :: {stop, cowboy_req:req(), state()}.
435427

436428
-spec process_response(result_ok() | result_error(), cowboy_req:req(), state()) ->
437429
processed_response().
438430

439431
process_response(Response, Req0, State = #state{operation_id = OperationID}) ->
440432
case Response of
441433
{ok, {Code, Headers, Body}} ->
442-
{ok, Req} = cowboy_req:reply(Code, Headers, Body, Req0),
443-
{halt, Req, State};
434+
Req = cowboy_req:reply(Code, Headers, Body, Req0),
435+
{stop, Req, State};
444436
{error, Message} ->
445437
error_logger:error_msg("Unable to process request for ~p: ~p", [OperationID, Message]),
446438

447-
{ok, Req} = cowboy_req:reply(400, Req0),
448-
{halt, Req, State}
439+
Req = cowboy_req:reply(400, Req0),
440+
{stop, Req, State}
449441
end.
450442

451-
-spec handle_request_json(cowboy_req:req(), state()) -> {halt, cowboy_req:req(), state()}.
443+
-spec handle_request_json(cowboy_req:req(), state()) -> {cowboy_req:resp_body(), cowboy_req:req(), state()}.
452444

453445
handle_request_json(
454446
Req0,
455447
State = #state{
456448
operation_id = OperationID,
457449
logic_handler = LogicHandler,
458-
validator_state = ValidatorState,
459-
context = Context
450+
validator_state = ValidatorState
460451
}
461452
) ->
462453
case openapi_api:populate_request(OperationID, Req0, ValidatorState) of
463454
{ok, Populated, Req1} ->
464455
{Code, Headers, Body} = openapi_logic_handler:handle_request(
465456
LogicHandler,
466457
OperationID,
467-
Populated,
468-
Context
458+
Req1,
459+
Populated
469460
),
470461
_ = openapi_api:validate_response(
471462
OperationID,

samples/server/petstore/erlang-server/src/openapi_server.erl

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,32 @@
11
-module(openapi_server).
22

33

4-
-define(DEFAULT_ACCEPTORS_POOLSIZE, 100).
54
-define(DEFAULT_LOGIC_HANDLER, openapi_default_logic_handler).
65

7-
-export([child_spec/2]).
6+
-export([start/2]).
87

9-
-spec child_spec( ID :: any(), #{
8+
-spec start( ID :: any(), #{
109
ip => inet:ip_address(),
1110
port => inet:port_number(),
1211
logic_handler => module(),
1312
net_opts => []
14-
}) -> supervisor:child_spec().
13+
}) -> {ok, pid()} | {error, any()}.
1514

16-
child_spec(ID, #{
15+
start(ID, #{
1716
ip := IP ,
1817
port := Port,
1918
net_opts := NetOpts
2019
} = Params) ->
21-
AcceptorsPool = ?DEFAULT_ACCEPTORS_POOLSIZE,
2220
{Transport, TransportOpts} = get_socket_transport(IP, Port, NetOpts),
2321
LogicHandler = maps:get(logic_handler, Params, ?DEFAULT_LOGIC_HANDLER),
2422
ExtraOpts = maps:get(cowboy_extra_opts, Params, []),
2523
CowboyOpts = get_cowboy_config(LogicHandler, ExtraOpts),
26-
ranch:child_spec({?MODULE, ID}, AcceptorsPool,
27-
Transport, TransportOpts, cowboy_protocol, CowboyOpts).
24+
case Transport of
25+
ssl ->
26+
cowboy:start_tls(ID, TransportOpts, CowboyOpts);
27+
tcp ->
28+
cowboy:start_clear(ID, TransportOpts, CowboyOpts)
29+
end.
2830

2931
get_socket_transport(IP, Port, Options) ->
3032
Opts = [
@@ -33,9 +35,9 @@ get_socket_transport(IP, Port, Options) ->
3335
],
3436
case openapi_utils:get_opt(ssl, Options) of
3537
SslOpts = [_|_] ->
36-
{ranch_ssl, Opts ++ SslOpts};
38+
{ssl, Opts ++ SslOpts};
3739
undefined ->
38-
{ranch_tcp, Opts}
40+
{tcp, Opts}
3941
end.
4042

4143
get_cowboy_config(LogicHandler, ExtraOpts) ->
@@ -56,10 +58,10 @@ get_cowboy_config(LogicHandler, [{Key, Value}| Rest], Opts) ->
5658

5759
get_default_dispatch(LogicHandler) ->
5860
Paths = openapi_router:get_paths(LogicHandler),
59-
{dispatch, cowboy_router:compile(Paths)}.
61+
#{dispatch => cowboy_router:compile(Paths)}.
6062

6163
get_default_opts(LogicHandler) ->
62-
[{env, [get_default_dispatch(LogicHandler)]}].
64+
#{env => get_default_dispatch(LogicHandler)}.
6365

6466
store_key(Key, Value, Opts) ->
6567
lists:keystore(Key, 1, Opts, {Key, Value}).

samples/server/petstore/erlang-server/src/openapi_store_handler.erl

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33

44
%% Cowboy REST callbacks
55
-export([allowed_methods/2]).
6-
-export([init/3]).
7-
-export([rest_init/2]).
6+
-export([init/2]).
87
-export([allow_missing_post/2]).
98
-export([content_types_accepted/2]).
109
-export([content_types_provided/2]).
@@ -27,17 +26,11 @@
2726

2827
-type state() :: state().
2928

30-
-spec init(TransportName :: atom(), Req :: cowboy_req:req(), Opts :: openapi_router:init_opts()) ->
31-
{upgrade, protocol, cowboy_rest, Req :: cowboy_req:req(), Opts :: openapi_router:init_opts()}.
29+
-spec init(Req :: cowboy_req:req(), Opts :: openapi_router:init_opts()) ->
30+
{cowboy_rest, Req :: cowboy_req:req(), State :: state()}.
3231

33-
init(_Transport, Req, Opts) ->
34-
{upgrade, protocol, cowboy_rest, Req, Opts}.
35-
36-
-spec rest_init(Req :: cowboy_req:req(), Opts :: openapi_router:init_opts()) ->
37-
{ok, Req :: cowboy_req:req(), State :: state()}.
38-
39-
rest_init(Req0, {Operations, LogicHandler, ValidatorState}) ->
40-
{Method, Req} = cowboy_req:method(Req0),
32+
init(Req, {Operations, LogicHandler, ValidatorState}) ->
33+
Method = cowboy_req:method(Req),
4134
OperationID = maps:get(Method, Operations, undefined),
4235

4336
error_logger:info_msg("Attempt to process operation: ~p", [OperationID]),
@@ -47,7 +40,7 @@ rest_init(Req0, {Operations, LogicHandler, ValidatorState}) ->
4740
logic_handler = LogicHandler,
4841
validator_state = ValidatorState
4942
},
50-
{ok, Req, State}.
43+
{cowboy_rest, Req, State}.
5144

5245
-spec allowed_methods(Req :: cowboy_req:req(), State :: state()) ->
5346
{Value :: [binary()], Req :: cowboy_req:req(), State :: state()}.
@@ -218,49 +211,47 @@ valid_entity_length(Req, State) ->
218211
{true, Req, State}.
219212

220213
%%%%
221-
222214
-type result_ok() :: {
223215
ok,
224216
{Status :: cowboy:http_status(), Headers :: cowboy:http_headers(), Body :: iodata()}
225217
}.
226218

227219
-type result_error() :: {error, Reason :: any()}.
228220

229-
-type processed_response() :: {halt, cowboy_req:req(), state()}.
221+
-type processed_response() :: {stop, cowboy_req:req(), state()}.
230222

231223
-spec process_response(result_ok() | result_error(), cowboy_req:req(), state()) ->
232224
processed_response().
233225

234226
process_response(Response, Req0, State = #state{operation_id = OperationID}) ->
235227
case Response of
236228
{ok, {Code, Headers, Body}} ->
237-
{ok, Req} = cowboy_req:reply(Code, Headers, Body, Req0),
238-
{halt, Req, State};
229+
Req = cowboy_req:reply(Code, Headers, Body, Req0),
230+
{stop, Req, State};
239231
{error, Message} ->
240232
error_logger:error_msg("Unable to process request for ~p: ~p", [OperationID, Message]),
241233

242-
{ok, Req} = cowboy_req:reply(400, Req0),
243-
{halt, Req, State}
234+
Req = cowboy_req:reply(400, Req0),
235+
{stop, Req, State}
244236
end.
245237

246-
-spec handle_request_json(cowboy_req:req(), state()) -> {halt, cowboy_req:req(), state()}.
238+
-spec handle_request_json(cowboy_req:req(), state()) -> {cowboy_req:resp_body(), cowboy_req:req(), state()}.
247239

248240
handle_request_json(
249241
Req0,
250242
State = #state{
251243
operation_id = OperationID,
252244
logic_handler = LogicHandler,
253-
validator_state = ValidatorState,
254-
context = Context
245+
validator_state = ValidatorState
255246
}
256247
) ->
257248
case openapi_api:populate_request(OperationID, Req0, ValidatorState) of
258249
{ok, Populated, Req1} ->
259250
{Code, Headers, Body} = openapi_logic_handler:handle_request(
260251
LogicHandler,
261252
OperationID,
262-
Populated,
263-
Context
253+
Req1,
254+
Populated
264255
),
265256
_ = openapi_api:validate_response(
266257
OperationID,

0 commit comments

Comments
 (0)