From 29952ac2b5b1ff256035fb3c1368bc63ab086421 Mon Sep 17 00:00:00 2001 From: Richard Carlsson Date: Tue, 28 Nov 2017 21:09:38 +0100 Subject: [PATCH 01/24] Eliminate use of module_info to check whether a module exports a function --- include/wm_resource.hrl | 2 +- src/webmachine_resource.erl | 26 ++++++++++++++------------ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/include/wm_resource.hrl b/include/wm_resource.hrl index 588405df..3381669c 100644 --- a/include/wm_resource.hrl +++ b/include/wm_resource.hrl @@ -1 +1 @@ --record(wm_resource, {module, modstate, modexports, trace}). +-record(wm_resource, {module, modstate, trace}). diff --git a/src/webmachine_resource.erl b/src/webmachine_resource.erl index ada1ac1c..fbade6f0 100644 --- a/src/webmachine_resource.erl +++ b/src/webmachine_resource.erl @@ -17,7 +17,7 @@ -module(webmachine_resource). -author('Justin Sheehy '). -author('Andy Gross '). --export([new/4, wrap/2]). +-export([new/3, wrap/2]). -export([do/3,log_d/2,stop/1]). -include("wm_resource.hrl"). @@ -27,11 +27,16 @@ -type t() :: #wm_resource{}. -export_type([t/0]). -new(R_Mod, R_ModState, R_ModExports, R_Trace) -> +-define(CALLBACK_ARITY, 2). + +new(R_Mod, R_ModState, R_Trace) -> + case erlang:module_loaded(R_Mod) of + false -> code:ensure_loaded(R_Mod); + true -> ok + end, #wm_resource{ module = R_Mod, modstate = R_ModState, - modexports = R_ModExports, trace = R_Trace }. @@ -118,15 +123,13 @@ default(_) -> wrap(Mod, Args) -> case Mod:init(Args) of {ok, ModState} -> - {ok, webmachine_resource:new(Mod, ModState, - orddict:from_list(Mod:module_info(exports)), false)}; + {ok, webmachine_resource:new(Mod, ModState, false)}; {{trace, Dir}, ModState} -> {ok, File} = open_log_file(Dir, Mod), log_decision(File, v3b14), log_call(File, attempt, Mod, init, Args), log_call(File, result, Mod, init, {{trace, Dir}, ModState}), - {ok, webmachine_resource:new(Mod, ModState, - orddict:from_list(Mod:module_info(exports)), File)}; + {ok, webmachine_resource:new(Mod, ModState, File)}; _ -> {stop, bad_init_arg} end. @@ -136,7 +139,6 @@ do(#wm_resource{}=Res, Fun, ReqProps) -> do(Fun, ReqProps, #wm_resource{ module=R_Mod, - modexports=R_ModExports, trace=R_Trace }=Req) when is_atom(Fun) andalso is_list(ReqProps) -> @@ -155,21 +157,20 @@ do(Fun, ReqProps, %% Do not need the embedded state anymore TrimData = ReqData#wm_reqdata{wm_state=undefined}, {Reply, - webmachine_resource:new(R_Mod, NewModState, R_ModExports, R_Trace), + webmachine_resource:new(R_Mod, NewModState, R_Trace), ReqState#wm_reqstate{reqdata=TrimData}}. handle_wm_call(Fun, ReqData, #wm_resource{ module=R_Mod, modstate=R_ModState, - modexports=R_ModExports, trace=R_Trace }=Req) -> case default(Fun) of no_default -> resource_call(Fun, ReqData, Req); Default -> - case orddict:is_key(Fun, R_ModExports) of + case erlang:function_exported(R_Mod, Fun, ?CALLBACK_ARITY) of true -> resource_call(Fun, ReqData, Req); false -> @@ -200,12 +201,13 @@ resource_call(F, ReqData, _ -> log_call(R_Trace, attempt, R_Mod, F, [ReqData, R_ModState]) end, Result = try + %% Note: the argument list must match the definition of CALLBACK_ARITY apply(R_Mod, F, [ReqData, R_ModState]) catch C:R -> Reason = {C, R, trim_trace(erlang:get_stacktrace())}, {{error, Reason}, ReqData, R_ModState} end, - case R_Trace of + case R_Trace of false -> nop; _ -> log_call(R_Trace, result, R_Mod, F, Result) end, From 21d0c0517f65bc4bf47d28afa81bdbe66ab9edca Mon Sep 17 00:00:00 2001 From: Richard Carlsson Date: Wed, 29 Nov 2017 14:19:50 +0100 Subject: [PATCH 02/24] Make webmachine_mochiweb loop call use latest version of module --- src/webmachine_mochiweb.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/webmachine_mochiweb.erl b/src/webmachine_mochiweb.erl index 6b59daee..32d3b1d5 100644 --- a/src/webmachine_mochiweb.erl +++ b/src/webmachine_mochiweb.erl @@ -63,7 +63,7 @@ start(Options) -> webmachine_router:init_routes(DGroup, DispatchList), _ = [application_set_unless_env_or_undef(K, V) || {K, V} <- WMOptions], MochiName = list_to_atom(to_list(PName) ++ "_mochiweb"), - LoopFun = fun(X) -> loop(DGroup, X) end, + LoopFun = fun(X) -> ?MODULE:loop(DGroup, X) end, mochiweb_http:start([{name, MochiName}, {loop, LoopFun} | OtherOptions]). stop() -> From b774aea97433e101143a68e092722483f9d23a0d Mon Sep 17 00:00:00 2001 From: "Phil Runninger (mac)" Date: Thu, 5 Apr 2018 17:13:20 -0400 Subject: [PATCH 03/24] Replace -compile(export_all) with -export([...]). --- test/decision_core_test.erl | 11 ++++++++++- test/wm_integration_test.erl | 2 -- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/test/decision_core_test.erl b/test/decision_core_test.erl index 5b3f8eca..51840409 100644 --- a/test/decision_core_test.erl +++ b/test/decision_core_test.erl @@ -20,7 +20,16 @@ -include("wm_reqdata.hrl"). -include_lib("eunit/include/eunit.hrl"). --compile(export_all). +-export([size_stream_raises_error/2, process_post_for_created_p11/3, get_streamed_body/2, send_streamed_body/2, + accept_text/2, writer_response/2, known_length_body/2, range_response/2, stream_content_md5/0, + validate_checksum_for_md5stream/3, process_post_for_md5_stream/3, init/1, service_available/2, + validate_content_checksum/2, is_authorized/2, allowed_methods/2, known_methods/2, uri_too_long/2, + known_content_type/2, valid_entity_length/2, malformed_request/2, forbidden/2, valid_content_headers/2, + content_types_provided/2, content_types_accepted/2, language_available/2, charsets_provided/2, + encodings_provided/2, resource_exists/2, generate_etag/2, last_modified/2, moved_permanently/2, + moved_temporarily/2, previously_existed/2, allow_missing_post/2, post_is_create/2, process_post/2, + create_path/2, is_conflict/2, multiple_choices/2, base_uri/2, base_uri_add_slash/1, expires/2, + delete_resource/2, delete_completed/2, to_html/2]). -define(RESOURCE, atom_to_list(?MODULE)). -define(RESOURCE_PATH, "/" ++ ?RESOURCE). diff --git a/test/wm_integration_test.erl b/test/wm_integration_test.erl index 9aac6413..63b83521 100644 --- a/test/wm_integration_test.erl +++ b/test/wm_integration_test.erl @@ -17,8 +17,6 @@ -include_lib("eunit/include/eunit.hrl"). -include("webmachine.hrl"). --compile([export_all]). - integration_test_() -> {foreach, %% Setup From 0dfb031dc1f56279df5a8e84efbef9196fd3d841 Mon Sep 17 00:00:00 2001 From: "Phil Runninger (mac)" Date: Thu, 5 Apr 2018 17:13:36 -0400 Subject: [PATCH 04/24] Upgrade to mochiweb-2.17.0 and ibrowse-v4.4.0. --- rebar.config | 4 ++-- rebar.lock | 10 ++++------ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/rebar.config b/rebar.config index ea770995..5baaa482 100644 --- a/rebar.config +++ b/rebar.config @@ -5,7 +5,7 @@ {xref_checks, [undefined_function_calls]}. -{deps, [{mochiweb, "2.12.2"}]}. +{deps, [{mochiweb, {git, "https://github.com/mochi/mochiweb", {tag, "v2.17.0"}}}]}. {eunit_opts, [ no_tty, @@ -15,7 +15,7 @@ {profiles, [{test, [{deps, [meck, - {ibrowse, {git, "git://github.com/cmullaparthi/ibrowse.git", {tag, "v4.0.2"}}}, + {ibrowse, {git, "git://github.com/cmullaparthi/ibrowse.git", {tag, "v4.4.0"}}}, {eunit_formatters, {git, "git://github.com/seancribbs/eunit_formatters", {branch, "master"}}} ]}, {erl_opts, [debug_info]} diff --git a/rebar.lock b/rebar.lock index 57d5070b..03830c5e 100644 --- a/rebar.lock +++ b/rebar.lock @@ -1,6 +1,4 @@ -{"1.1.0", -[{<<"mochiweb">>,{pkg,<<"mochiweb">>,<<"2.12.2">>},0}]}. -[ -{pkg_hash,[ - {<<"mochiweb">>, <<"80804AD342AFA3D7F3524040D4EED66CE74B17A555DE454AC85B07C479928E46">>}]} -]. +[{<<"mochiweb">>, + {git,"https://github.com/mochi/mochiweb", + {ref,"23dc11959affd9b0849c2ac0ff4200c1c82aa80c"}}, + 0}]. From c86cc77169f98098a047c41bce4daf08eeb17844 Mon Sep 17 00:00:00 2001 From: "Phil Runninger (mac)" Date: Thu, 5 Apr 2018 17:33:48 -0400 Subject: [PATCH 05/24] Add Erlang 20.0 to the otp_releases to be tested against. --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index adca6b6c..c35906df 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,7 @@ language: erlang sudo: false install: "true" # don't let travis run get-deps otp_release: + - 20.0 - 19.1 - 18.3 - 17.5 From 5546d5a45b62bf2a15f0e3b6f4257f2aa37df906 Mon Sep 17 00:00:00 2001 From: "Phil Runninger (mac)" Date: Thu, 5 Apr 2018 19:32:06 -0400 Subject: [PATCH 06/24] Revert ibrowse version. Will that fix Travis? --- rebar.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rebar.config b/rebar.config index 5baaa482..0306ef72 100644 --- a/rebar.config +++ b/rebar.config @@ -15,7 +15,7 @@ {profiles, [{test, [{deps, [meck, - {ibrowse, {git, "git://github.com/cmullaparthi/ibrowse.git", {tag, "v4.4.0"}}}, + {ibrowse, {git, "git://github.com/cmullaparthi/ibrowse.git", {tag, "v4.0.2"}}}, {eunit_formatters, {git, "git://github.com/seancribbs/eunit_formatters", {branch, "master"}}} ]}, {erl_opts, [debug_info]} From d042c5c1c0786954518142daf8618cc1e7feb580 Mon Sep 17 00:00:00 2001 From: "Phil Runninger (mac)" Date: Thu, 5 Apr 2018 19:34:28 -0400 Subject: [PATCH 07/24] Reinstate new ibrowse version. This reverts commit 5546d5a45b62bf2a15f0e3b6f4257f2aa37df906. --- rebar.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rebar.config b/rebar.config index 0306ef72..5baaa482 100644 --- a/rebar.config +++ b/rebar.config @@ -15,7 +15,7 @@ {profiles, [{test, [{deps, [meck, - {ibrowse, {git, "git://github.com/cmullaparthi/ibrowse.git", {tag, "v4.0.2"}}}, + {ibrowse, {git, "git://github.com/cmullaparthi/ibrowse.git", {tag, "v4.4.0"}}}, {eunit_formatters, {git, "git://github.com/seancribbs/eunit_formatters", {branch, "master"}}} ]}, {erl_opts, [debug_info]} From f0807c9c9286ada9c6eca82bdaf722941ac71a0a Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Sun, 15 Jul 2018 13:29:22 +0200 Subject: [PATCH 08/24] Fix compilation on OTP 21 by suppressing warnings about stacktraces --- src/webmachine_decision_core.erl | 6 ++++++ src/webmachine_resource.erl | 6 ++++++ test/decision_core_test.erl | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/src/webmachine_decision_core.erl b/src/webmachine_decision_core.erl index 4a50d09a..ef6d306d 100644 --- a/src/webmachine_decision_core.erl +++ b/src/webmachine_decision_core.erl @@ -24,6 +24,12 @@ -export([handle_request/2]). -include("webmachine_logger.hrl"). +%% Suppress Erlang/OTP 21 warnings about the new method to retrieve +%% stacktraces. +-ifdef(OTP_RELEASE). +-compile({nowarn_deprecated_function, [{erlang, get_stacktrace, 0}]}). +-endif. + handle_request(Resource, ReqState) -> _ = [erase(X) || X <- [decision, code, req_body, bytes_written, tmp_reqstate]], put(resource, Resource), diff --git a/src/webmachine_resource.erl b/src/webmachine_resource.erl index fbade6f0..ad63a4ba 100644 --- a/src/webmachine_resource.erl +++ b/src/webmachine_resource.erl @@ -29,6 +29,12 @@ -define(CALLBACK_ARITY, 2). +%% Suppress Erlang/OTP 21 warnings about the new method to retrieve +%% stacktraces. +-ifdef(OTP_RELEASE). +-compile({nowarn_deprecated_function, [{erlang, get_stacktrace, 0}]}). +-endif. + new(R_Mod, R_ModState, R_Trace) -> case erlang:module_loaded(R_Mod) of false -> code:ensure_loaded(R_Mod); diff --git a/test/decision_core_test.erl b/test/decision_core_test.erl index 51840409..ccac318f 100644 --- a/test/decision_core_test.erl +++ b/test/decision_core_test.erl @@ -44,6 +44,12 @@ md5(Bin) -> crypto:md5(Bin). -endif. +%% Suppress Erlang/OTP 21 warnings about the new method to retrieve +%% stacktraces. +-ifdef(OTP_RELEASE). +-compile({nowarn_deprecated_function, [{erlang, get_stacktrace, 0}]}). +-endif. + -define(HTTP_1_0_METHODS, ['GET', 'POST', 'HEAD']). -define(HTTP_1_1_METHODS, ['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'TRACE', 'CONNECT', 'OPTIONS']). From 7339f8c4c705acdeca898738b88fbdfab1700fb0 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Sun, 15 Jul 2018 13:30:16 +0200 Subject: [PATCH 09/24] Add Erlang/OTP 21 to the list of releases to build against --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index c35906df..3df2a610 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,7 @@ language: erlang sudo: false install: "true" # don't let travis run get-deps otp_release: + - 21.0 - 20.0 - 19.1 - 18.3 From 4c2009d79bae320a2f1ab40105550d0d1c579a89 Mon Sep 17 00:00:00 2001 From: Sean Cribbs Date: Mon, 23 Jul 2018 22:09:32 -0500 Subject: [PATCH 10/24] Add shim for OTP 21 stacktrace catch patterns. --- include/wm_compat.hrl | 7 +++++++ rebar.config.script | 13 ++++++++++++- src/webmachine_decision_core.erl | 5 +++-- src/webmachine_resource.erl | 5 +++-- test/decision_core_test.erl | 5 +++-- 5 files changed, 28 insertions(+), 7 deletions(-) create mode 100644 include/wm_compat.hrl diff --git a/include/wm_compat.hrl b/include/wm_compat.hrl new file mode 100644 index 00000000..672f2619 --- /dev/null +++ b/include/wm_compat.hrl @@ -0,0 +1,7 @@ +-ifndef(deprecate_stacktrace). +-define(STPATTERN(Pattern), Pattern). +-define(STACKTRACE, erlang:get_stacktrace()). +-else. +-define(STPATTERN(Pattern), Pattern:__STACKTRACE). +-define(STACKTRACE, __STACKTRACE). +-endif. diff --git a/rebar.config.script b/rebar.config.script index 2dba9a9f..9679562d 100644 --- a/rebar.config.script +++ b/rebar.config.script @@ -11,4 +11,15 @@ Config1 = case hd(OtpVersion) =:= $R andalso OtpVersion < "R15B02" of CONFIG ++ [{erl_opts, HashDefine}] end; false -> CONFIG - end. + end, +if + OtpVersion >= "21" -> + case lists:keysearch(erl_opts, 1, Config1) of + {value, {erl_opts, Opts2}} -> + lists:keyreplace(erl_opts, 1, Config1, {erl_opts, [{d, deprecate_stacktrace}|Opts2]}); + false -> + [{erl_opts, [{d, deprecate_stacktrace}]}|Config1] + end; + true -> + Config1 +end. diff --git a/src/webmachine_decision_core.erl b/src/webmachine_decision_core.erl index ef6d306d..34263895 100644 --- a/src/webmachine_decision_core.erl +++ b/src/webmachine_decision_core.erl @@ -23,6 +23,7 @@ -author('Bryan Fink '). -export([handle_request/2]). -include("webmachine_logger.hrl"). +-include("wm_compat.hrl"). %% Suppress Erlang/OTP 21 warnings about the new method to retrieve %% stacktraces. @@ -37,8 +38,8 @@ handle_request(Resource, ReqState) -> try d(v3b13) catch - error:_ -> - error_response(erlang:get_stacktrace()) + ?STPATTERN(error:_Reason) -> + error_response(?STACKTRACE) end. wrcall(X) -> diff --git a/src/webmachine_resource.erl b/src/webmachine_resource.erl index ad63a4ba..e9a072cb 100644 --- a/src/webmachine_resource.erl +++ b/src/webmachine_resource.erl @@ -20,6 +20,7 @@ -export([new/3, wrap/2]). -export([do/3,log_d/2,stop/1]). +-include("wm_compat.hrl"). -include("wm_resource.hrl"). -include("wm_reqdata.hrl"). -include("wm_reqstate.hrl"). @@ -209,8 +210,8 @@ resource_call(F, ReqData, Result = try %% Note: the argument list must match the definition of CALLBACK_ARITY apply(R_Mod, F, [ReqData, R_ModState]) - catch C:R -> - Reason = {C, R, trim_trace(erlang:get_stacktrace())}, + catch ?STPATTERN(C:R) -> + Reason = {C, R, trim_trace(?STACKTRACE)}, {{error, Reason}, ReqData, R_ModState} end, case R_Trace of diff --git a/test/decision_core_test.erl b/test/decision_core_test.erl index ccac318f..39a2b9ae 100644 --- a/test/decision_core_test.erl +++ b/test/decision_core_test.erl @@ -17,6 +17,7 @@ -ifdef(TEST). +-include("wm_compat.hrl"). -include("wm_reqdata.hrl"). -include_lib("eunit/include/eunit.hrl"). @@ -335,8 +336,8 @@ setup() -> meck:new(webmachine_resource, MeckOpts), Ctx catch - T:E -> - io:format(user, "~n~p : ~p : ~p", [T, E, erlang:get_stacktrace()]), + ?STPATTERN(T:E) -> + io:format(user, "~n~p : ~p : ~p", [T, E, ?STACKTRACE]), error(setup_failed) end. From c426b0eb2278479eec157016df3295e99ba31eec Mon Sep 17 00:00:00 2001 From: Sean Cribbs Date: Mon, 23 Jul 2018 22:13:26 -0500 Subject: [PATCH 11/24] Call module directly instead of relying on tuple/pmod. --- src/webmachine_dispatcher.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/webmachine_dispatcher.erl b/src/webmachine_dispatcher.erl index dffa9aa7..280fdbab 100644 --- a/src/webmachine_dispatcher.erl +++ b/src/webmachine_dispatcher.erl @@ -628,7 +628,7 @@ make_reqdata(Path) -> MochiReq = mochiweb_request:new(testing, 'GET', Path, {1, 1}, mochiweb_headers:make([])), Req = webmachine:new_request(mochiweb, MochiReq), - {RD, _} = Req:get_reqdata(), + {RD, _} = webmachine_request:get_reqdata(Req), RD. -endif. From 885f5fb541384e0eb31bc6b3263f8d994564edd6 Mon Sep 17 00:00:00 2001 From: Sean Cribbs Date: Sun, 9 Sep 2018 13:37:32 -0500 Subject: [PATCH 12/24] Version bump --- src/webmachine_app.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/webmachine_app.erl b/src/webmachine_app.erl index 35fa74a3..0c15a08c 100644 --- a/src/webmachine_app.erl +++ b/src/webmachine_app.erl @@ -27,7 +27,7 @@ -include("webmachine_logger.hrl"). --define(QUIP, "cafe not found"). +-define(QUIP, "greased slide to failure"). %% @spec start(_Type, _StartArgs) -> ServerRet %% @doc application start callback for webmachine. From 92225b82fc702f78cf9d23248023ec841272df80 Mon Sep 17 00:00:00 2001 From: Sean Cribbs Date: Sun, 9 Sep 2018 14:32:36 -0500 Subject: [PATCH 13/24] Make available on hexpm --- rebar.config | 5 ++--- rebar.lock | 10 ++++++---- src/webmachine.app.src | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/rebar.config b/rebar.config index 5baaa482..9b04df9e 100644 --- a/rebar.config +++ b/rebar.config @@ -5,7 +5,7 @@ {xref_checks, [undefined_function_calls]}. -{deps, [{mochiweb, {git, "https://github.com/mochi/mochiweb", {tag, "v2.17.0"}}}]}. +{deps, [{mochiweb, "2.18.0"}]}. {eunit_opts, [ no_tty, @@ -15,8 +15,7 @@ {profiles, [{test, [{deps, [meck, - {ibrowse, {git, "git://github.com/cmullaparthi/ibrowse.git", {tag, "v4.4.0"}}}, - {eunit_formatters, {git, "git://github.com/seancribbs/eunit_formatters", {branch, "master"}}} + {ibrowse, "4.4.0"} ]}, {erl_opts, [debug_info]} ]} diff --git a/rebar.lock b/rebar.lock index 03830c5e..4bc80524 100644 --- a/rebar.lock +++ b/rebar.lock @@ -1,4 +1,6 @@ -[{<<"mochiweb">>, - {git,"https://github.com/mochi/mochiweb", - {ref,"23dc11959affd9b0849c2ac0ff4200c1c82aa80c"}}, - 0}]. +{"1.1.0", +[{<<"mochiweb">>,{pkg,<<"mochiweb">>,<<"2.18.0">>},0}]}. +[ +{pkg_hash,[ + {<<"mochiweb">>, <<"EB55F1DB3E6E960FAC4E6DB4E2DB9EC3602CC9F30B86CD1481D56545C3145D2E">>}]} +]. diff --git a/src/webmachine.app.src b/src/webmachine.app.src index ad14f7b1..363e92d0 100644 --- a/src/webmachine.app.src +++ b/src/webmachine.app.src @@ -23,7 +23,7 @@ %% string() for the "Server" response header ]}, - {contributors,["Sean Cribbs", "Joe DeVivo" "Bryan Fink", + {maintainers,["Sean Cribbs", "Joe DeVivo", "Bryan Fink", "Kelly McLaughlin", "Jared Morrow", "Andy Gross", "Steve Vinoski"]}, {licenses,["Apache"]}, From d7475f219bf2e4ae0aa151733e233e5b40f26741 Mon Sep 17 00:00:00 2001 From: Prajakta Purohit Date: Mon, 9 Oct 2017 08:15:11 -0700 Subject: [PATCH 14/24] [SUSTAIN-663] Update Content-Length in header only if the response is not 1xx or 204. Signed-off-by: Prajakta Purohit --- src/webmachine_request.erl | 39 +++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/webmachine_request.erl b/src/webmachine_request.erl index 7b980bc5..3f126dc2 100644 --- a/src/webmachine_request.erl +++ b/src/webmachine_request.erl @@ -724,24 +724,27 @@ make_version({1, 0}) -> make_version(_) -> <<"HTTP/1.1 ">>. +-spec update_header_with_content_length(number(), atom(), term()) -> term(). +update_header_with_content_length(Code, _Length, RD) when (Code >= 100 andalso Code < 200) orelse + Code =:= 204 orelse + Code =:= 304 -> + mochiweb_headers:make(wrq:resp_headers(RD)); +update_header_with_content_length(_Code, Length, RD) -> + case Length of + chunked -> + mochiweb_headers:enter( + "Transfer-Encoding","chunked", + mochiweb_headers:make(wrq:resp_headers(RD))); + _ -> + mochiweb_headers:enter( + "Content-Length",integer_to_list(Length), + mochiweb_headers:make(wrq:resp_headers(RD))) + end. + make_headers({Code, _ReasonPhrase}, Length, RD) -> make_headers(Code, Length, RD); make_headers(Code, Length, RD) when is_integer(Code) -> - Hdrs0 = case Code of - 304 -> - mochiweb_headers:make(wrq:resp_headers(RD)); - _ -> - case Length of - chunked -> - mochiweb_headers:enter( - "Transfer-Encoding","chunked", - mochiweb_headers:make(wrq:resp_headers(RD))); - _ -> - mochiweb_headers:enter( - "Content-Length",integer_to_list(Length), - mochiweb_headers:make(wrq:resp_headers(RD))) - end - end, + Hdrs0 = update_header_with_content_length(Code, Length, RD), %% server_name is guaranteed to be set by %% webmachine_app:load_default_app_config/0 {ok, ServerHeader} = application:get_env(webmachine, server_name), @@ -942,6 +945,12 @@ header_test() -> ?assertEqual({HdrValue, ReqState}, get_header_value(HdrName, ReqState)), ?assertEqual({HdrValue, ReqState}, get_req_header(HdrName, ReqState)). +no_content_length_test() -> + ReqData = #wm_reqdata{req_headers = mochiweb_headers:make([])}, + ?assertEqual(nomatch, re:run(make_headers(100, 56, ReqData), "content-length", [caseless])), + ?assertEqual(nomatch, re:run(make_headers(204, 56, ReqData), "content-length", [caseless])), + ?assertMatch({match, _}, re:run(make_headers(200, 56, ReqData), "content-length", [caseless])). + metadata_test() -> Key = "webmachine", Value = "eunit", From fd19fa0ea2e9e9c78c7e765d547a3c8ff883a3b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81ngel=20Herranz?= Date: Mon, 4 Feb 2019 16:46:04 +0100 Subject: [PATCH 15/24] Fixed type referenc in wm_reqdata.hrl: webmachine_headers:headers() -> webmachine:headers() --- include/wm_reqdata.hrl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/wm_reqdata.hrl b/include/wm_reqdata.hrl index 551c39a6..b6841599 100644 --- a/include/wm_reqdata.hrl +++ b/include/wm_reqdata.hrl @@ -33,10 +33,10 @@ | defined_in_create, req_qs = defined_in_create :: [{string(), string()}] | defined_in_create, - req_headers :: webmachine_headers:headers(), + req_headers :: webmachine:headers(), req_body=not_fetched_yet, resp_redirect = false :: boolean(), - resp_headers = webmachine_headers:empty() :: webmachine_headers:headers(), + resp_headers = webmachine_headers:empty() :: webmachine:headers(), resp_body = <<>> :: webmachine:response_body(), %% follow_request : range responce for range request, normal responce for non-range one %% ignore_request : normal resopnse for either range reuqest or non-range one From 63a4a22d14a641cd7dd942fec4f28f20c822d9b2 Mon Sep 17 00:00:00 2001 From: Adam Lindberg Date: Thu, 31 Oct 2019 18:07:43 +0100 Subject: [PATCH 16/24] Use correct date for L17 test Using httpd_util:rfc1123_date/1 converts the date from local time to GMT. This makes the test case fail in any time zone east of GMT (but pass in GMT or a time zone west of GMT). To avoid this, we have to first convert the time to GMT via that function and then convert it back to Erlang date time. This way, we make sure we use exactly the same date in both Last-Modified and in If-Modified-Since, honoring the original intent of the test case. --- test/decision_core_test.erl | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/test/decision_core_test.erl b/test/decision_core_test.erl index 39a2b9ae..7f0be4bb 100644 --- a/test/decision_core_test.erl +++ b/test/decision_core_test.erl @@ -904,10 +904,15 @@ not_modified_j18_via_h12() -> %% 304 result via L17 not_modified_l17() -> + % Because httpd_util:rfc1123_date converts the date to GMT, it is offset by + % the local time zone. To get a Last-Modified date equal to the + % If-Modified-Since date we must convert it back from the RFC 1123 format. + % This avoids the test case failing in any time zone "east" of GMT :-P + RFC1123LastYear = httpd_util:rfc1123_date(?FIRST_DAY_OF_LAST_YEAR), + DateTimeLastYear = httpd_util:convert_request_date(RFC1123LastYear), put_setting(allowed_methods, ?DEFAULT_ALLOWED_METHODS), - put_setting(last_modified, ?FIRST_DAY_OF_LAST_YEAR), + put_setting(last_modified, DateTimeLastYear), put_setting(expires, ?FIRST_DAY_OF_NEXT_YEAR), - RFC1123LastYear = httpd_util:rfc1123_date(?FIRST_DAY_OF_LAST_YEAR), Headers = [{"If-Modified-Since", RFC1123LastYear}], {ok, Result} = httpc:request(get, {url(), Headers}, [], []), ?assertMatch({{"HTTP/1.1", 304, "Not Modified"}, _, _}, Result), From 691b208bf5b7c632d3676eb7e872b7fc9a1ca9f5 Mon Sep 17 00:00:00 2001 From: Sam Warters Date: Thu, 30 Jan 2020 16:10:06 -0600 Subject: [PATCH 17/24] Update mochiweb dependency to git The latest version of mochiweb can't be found in hex and the current project owner does not have control to publish a new version. In order to have webmachine be more compatible with erlang 21, the mochiweb version needs to be upgraded as the "tuple calls" have officially been removed from the language. --- rebar.config | 2 +- rebar.lock | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/rebar.config b/rebar.config index 9b04df9e..df0eb5e6 100644 --- a/rebar.config +++ b/rebar.config @@ -5,7 +5,7 @@ {xref_checks, [undefined_function_calls]}. -{deps, [{mochiweb, "2.18.0"}]}. +{deps, [{mochiweb, {git, "git://github.com/mochi/mochiweb.git", {tag, "v2.20.0"}}}]}. {eunit_opts, [ no_tty, diff --git a/rebar.lock b/rebar.lock index 4bc80524..852dc008 100644 --- a/rebar.lock +++ b/rebar.lock @@ -1,6 +1,4 @@ -{"1.1.0", -[{<<"mochiweb">>,{pkg,<<"mochiweb">>,<<"2.18.0">>},0}]}. -[ -{pkg_hash,[ - {<<"mochiweb">>, <<"EB55F1DB3E6E960FAC4E6DB4E2DB9EC3602CC9F30B86CD1481D56545C3145D2E">>}]} -]. +[{<<"mochiweb">>, + {git,"git://github.com/mochi/mochiweb.git", + {ref,"cedc22f66a8e3f3885fb06babc0c0582418508f8"}}, + 0}]. From 7da44ab9d825655aec3b163a9f7495da8765e12b Mon Sep 17 00:00:00 2001 From: Mikael Pettersson Date: Wed, 8 Apr 2020 16:39:42 +0200 Subject: [PATCH 18/24] webmachine_mochiweb: change LoopFun to an {M,F,As} tuple --- src/webmachine_mochiweb.erl | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/webmachine_mochiweb.erl b/src/webmachine_mochiweb.erl index 32d3b1d5..35cc6af0 100644 --- a/src/webmachine_mochiweb.erl +++ b/src/webmachine_mochiweb.erl @@ -18,7 +18,7 @@ -module(webmachine_mochiweb). -author('Justin Sheehy '). -author('Andy Gross '). --export([start/1, stop/0, stop/1, loop/2, new_webmachine_req/1]). +-export([start/1, stop/0, stop/1, loop/2, loop2/2, new_webmachine_req/1]). -include("webmachine_logger.hrl"). -include("wm_reqstate.hrl"). @@ -63,7 +63,7 @@ start(Options) -> webmachine_router:init_routes(DGroup, DispatchList), _ = [application_set_unless_env_or_undef(K, V) || {K, V} <- WMOptions], MochiName = list_to_atom(to_list(PName) ++ "_mochiweb"), - LoopFun = fun(X) -> ?MODULE:loop(DGroup, X) end, + LoopFun = {?MODULE, loop2, [DGroup]}, mochiweb_http:start([{name, MochiName}, {loop, LoopFun} | OtherOptions]). stop() -> @@ -74,6 +74,10 @@ stop() -> stop(Name) -> mochiweb_http:stop(Name). +-spec loop2(mochiweb_request(), any()) -> ok. +loop2(MochiReq, DGroup) -> + loop(DGroup, MochiReq). + -spec loop(any(), mochiweb_request()) -> ok. From c20879751b725e7b2519530ab2d877a2257b68f0 Mon Sep 17 00:00:00 2001 From: Mikael Pettersson Date: Thu, 9 Apr 2020 10:28:43 +0200 Subject: [PATCH 19/24] webmachine_mochiweb: loop/2: swap parameter order; loop2/2: replace with loop/2 --- src/webmachine_mochiweb.erl | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/webmachine_mochiweb.erl b/src/webmachine_mochiweb.erl index 35cc6af0..d75ebf9d 100644 --- a/src/webmachine_mochiweb.erl +++ b/src/webmachine_mochiweb.erl @@ -18,7 +18,7 @@ -module(webmachine_mochiweb). -author('Justin Sheehy '). -author('Andy Gross '). --export([start/1, stop/0, stop/1, loop/2, loop2/2, new_webmachine_req/1]). +-export([start/1, stop/0, stop/1, loop/2, new_webmachine_req/1]). -include("webmachine_logger.hrl"). -include("wm_reqstate.hrl"). @@ -63,7 +63,7 @@ start(Options) -> webmachine_router:init_routes(DGroup, DispatchList), _ = [application_set_unless_env_or_undef(K, V) || {K, V} <- WMOptions], MochiName = list_to_atom(to_list(PName) ++ "_mochiweb"), - LoopFun = {?MODULE, loop2, [DGroup]}, + LoopFun = {?MODULE, loop, [DGroup]}, mochiweb_http:start([{name, MochiName}, {loop, LoopFun} | OtherOptions]). stop() -> @@ -74,14 +74,8 @@ stop() -> stop(Name) -> mochiweb_http:stop(Name). --spec loop2(mochiweb_request(), any()) -> ok. -loop2(MochiReq, DGroup) -> - loop(DGroup, MochiReq). - --spec loop(any(), - mochiweb_request()) -> - ok. -loop(Name, MochiReq) -> +-spec loop(mochiweb_request(), any()) -> ok. +loop(MochiReq, Name) -> case new_webmachine_req(MochiReq) of {{error, NewRequestError}, ErrorReq} -> handle_error(500, {error, NewRequestError}, ErrorReq); From 9e0093d13d23aea047a72e99eb077dc6052d655d Mon Sep 17 00:00:00 2001 From: Prajakta Purohit Date: Wed, 18 Mar 2020 17:52:41 -0700 Subject: [PATCH 20/24] Update crypto md5 to erlang:md5 to support FIPS Signed-off-by: Prajakta Purohit --- src/webmachine_decision_core.erl | 2 +- test/decision_core_test.erl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/webmachine_decision_core.erl b/src/webmachine_decision_core.erl index 34263895..767780fa 100644 --- a/src/webmachine_decision_core.erl +++ b/src/webmachine_decision_core.erl @@ -744,7 +744,7 @@ variances() -> -ifndef(old_hash). md5(Bin) -> - crypto:hash(md5, Bin). + erlang:md5(Bin). md5_init() -> crypto:hash_init(md5). diff --git a/test/decision_core_test.erl b/test/decision_core_test.erl index 7f0be4bb..47c0b192 100644 --- a/test/decision_core_test.erl +++ b/test/decision_core_test.erl @@ -39,7 +39,7 @@ -ifndef(old_hash). md5(Bin) -> - crypto:hash(md5,Bin). + erlang:md5(Bin). -else. md5(Bin) -> crypto:md5(Bin). From d626d7e5f2d7517027377eff94e56e6c7fc430d7 Mon Sep 17 00:00:00 2001 From: Prajakta Purohit Date: Thu, 19 Mar 2020 21:32:04 -0700 Subject: [PATCH 21/24] Update using erlang md5 instead of crypto md5 to support FIPS. Delete the conditional for supporting the olderversions of Erlang. Any version > R13 can support this code. Signed-off-by: Prajakta Purohit --- src/webmachine_decision_core.erl | 20 +++----------------- test/decision_core_test.erl | 5 ----- 2 files changed, 3 insertions(+), 22 deletions(-) diff --git a/src/webmachine_decision_core.erl b/src/webmachine_decision_core.erl index 767780fa..4d3b0382 100644 --- a/src/webmachine_decision_core.erl +++ b/src/webmachine_decision_core.erl @@ -742,31 +742,17 @@ variances() -> end, Accept ++ AcceptEncoding ++ AcceptCharset ++ resource_call(variances). --ifndef(old_hash). md5(Bin) -> erlang:md5(Bin). md5_init() -> - crypto:hash_init(md5). + erlang:md5_init(). md5_update(Ctx, Bin) -> - crypto:hash_update(Ctx, Bin). + erlang:md5_update(Ctx, Bin). md5_final(Ctx) -> - crypto:hash_final(Ctx). --else. -md5(Bin) -> - crypto:md5(Bin). - -md5_init() -> - crypto:md5_init(). - -md5_update(Ctx, Bin) -> - crypto:md5_update(Ctx, Bin). - -md5_final(Ctx) -> - crypto:md5_final(Ctx). --endif. + erlang:md5_final(Ctx). compute_body_md5() -> diff --git a/test/decision_core_test.erl b/test/decision_core_test.erl index 47c0b192..ba4ff63a 100644 --- a/test/decision_core_test.erl +++ b/test/decision_core_test.erl @@ -37,13 +37,8 @@ -define(HTML_CONTENT, "Foo"). -define(TEXT_CONTENT, ?HTML_CONTENT). --ifndef(old_hash). md5(Bin) -> erlang:md5(Bin). --else. -md5(Bin) -> - crypto:md5(Bin). --endif. %% Suppress Erlang/OTP 21 warnings about the new method to retrieve %% stacktraces. From 543b18aa46421eeb6fc9123fe2dac7e96d1a8f40 Mon Sep 17 00:00:00 2001 From: Prajakta Purohit Date: Fri, 20 Mar 2020 06:56:33 -0700 Subject: [PATCH 22/24] rebar script was used only to define if the version of erlang was older than R15. Since we don't support versions that old, removing this script. Signed-off-by: Prajakta Purohit --- rebar.config.script | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 rebar.config.script diff --git a/rebar.config.script b/rebar.config.script deleted file mode 100644 index 9679562d..00000000 --- a/rebar.config.script +++ /dev/null @@ -1,25 +0,0 @@ -%% -*- mode: erlang;erlang-indent-level: 4;indent-tabs-mode: nil -*- -%% ex: ft=erlang ts=4 sw=4 et -OtpVersion = erlang:system_info(otp_release), -Config1 = case hd(OtpVersion) =:= $R andalso OtpVersion < "R15B02" of - true -> - HashDefine = [{d,old_hash}], - case lists:keysearch(erl_opts, 1, CONFIG) of - {value, {erl_opts, Opts}} -> - lists:keyreplace(erl_opts,1,CONFIG,{erl_opts,Opts++HashDefine}); - false -> - CONFIG ++ [{erl_opts, HashDefine}] - end; - false -> CONFIG - end, -if - OtpVersion >= "21" -> - case lists:keysearch(erl_opts, 1, Config1) of - {value, {erl_opts, Opts2}} -> - lists:keyreplace(erl_opts, 1, Config1, {erl_opts, [{d, deprecate_stacktrace}|Opts2]}); - false -> - [{erl_opts, [{d, deprecate_stacktrace}]}|Config1] - end; - true -> - Config1 -end. From 4741523d430ccf1d0fbfac4d0bb891c0717eb0c2 Mon Sep 17 00:00:00 2001 From: Lincoln Baker Date: Tue, 17 Dec 2019 18:00:58 -0600 Subject: [PATCH 23/24] updates for erlang 21+ mochiweb -> master ibrowse -> chef/ibrowse ma/revert_ipv6 Signed-off-by: Lincoln Baker --- rebar.config | 5 +++-- rebar.lock | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/rebar.config b/rebar.config index df0eb5e6..84bb4e2e 100644 --- a/rebar.config +++ b/rebar.config @@ -5,7 +5,7 @@ {xref_checks, [undefined_function_calls]}. -{deps, [{mochiweb, {git, "git://github.com/mochi/mochiweb.git", {tag, "v2.20.0"}}}]}. +{deps, [{mochiweb, ".*", {git, "git://github.com/mochi/mochiweb.git", {branch, "master"}}}]}. {eunit_opts, [ no_tty, @@ -15,7 +15,8 @@ {profiles, [{test, [{deps, [meck, - {ibrowse, "4.4.0"} + {ibrowse, {git, "git://github.com/chef/ibrowse.git", {branch, "ma/revert_ipv6"}}}, + {eunit_formatters, {git, "git://github.com/seancribbs/eunit_formatters", {branch, "master"}}} ]}, {erl_opts, [debug_info]} ]} diff --git a/rebar.lock b/rebar.lock index 852dc008..16d0af09 100644 --- a/rebar.lock +++ b/rebar.lock @@ -1,4 +1,5 @@ +{"1.1.0", [{<<"mochiweb">>, {git,"git://github.com/mochi/mochiweb.git", - {ref,"cedc22f66a8e3f3885fb06babc0c0582418508f8"}}, - 0}]. + {ref,"070594e4d66163d662ac7e3bfb75dadcc922dd7c"}}, + 0}]}. From d7b5a10ee2aa59c55e3c8153a1d56a5d3b968880 Mon Sep 17 00:00:00 2001 From: Lincoln Baker Date: Thu, 30 Jul 2020 14:39:11 -0500 Subject: [PATCH 24/24] fix get_stacktrace deprecations ===> Compiling _build/default/lib/webmachine/src/webmachine_resource.erl failed _build/default/lib/webmachine/src/webmachine_resource.erl:205: erlang:get_stacktrace/0: deprecated; use the new try/catch syntax for retrieving the stack backtrace Signed-off-by: Lincoln Baker --- src/webmachine_decision_core.erl | 4 ++-- src/webmachine_resource.erl | 4 ++-- test/decision_core_test.erl | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/webmachine_decision_core.erl b/src/webmachine_decision_core.erl index 4d3b0382..bd618ad0 100644 --- a/src/webmachine_decision_core.erl +++ b/src/webmachine_decision_core.erl @@ -38,8 +38,8 @@ handle_request(Resource, ReqState) -> try d(v3b13) catch - ?STPATTERN(error:_Reason) -> - error_response(?STACKTRACE) + error:_:Stacktrace -> + error_response(Stacktrace) end. wrcall(X) -> diff --git a/src/webmachine_resource.erl b/src/webmachine_resource.erl index e9a072cb..3547097e 100644 --- a/src/webmachine_resource.erl +++ b/src/webmachine_resource.erl @@ -210,8 +210,8 @@ resource_call(F, ReqData, Result = try %% Note: the argument list must match the definition of CALLBACK_ARITY apply(R_Mod, F, [ReqData, R_ModState]) - catch ?STPATTERN(C:R) -> - Reason = {C, R, trim_trace(?STACKTRACE)}, + catch C:R:Stacktrace -> + Reason = {C, R, trim_trace(Stacktrace)}, {{error, Reason}, ReqData, R_ModState} end, case R_Trace of diff --git a/test/decision_core_test.erl b/test/decision_core_test.erl index ba4ff63a..ad5078bf 100644 --- a/test/decision_core_test.erl +++ b/test/decision_core_test.erl @@ -331,8 +331,8 @@ setup() -> meck:new(webmachine_resource, MeckOpts), Ctx catch - ?STPATTERN(T:E) -> - io:format(user, "~n~p : ~p : ~p", [T, E, ?STACKTRACE]), + T:E:Stacktrace -> + io:format(user, "~n~p : ~p : ~p", [T, E, Stacktrace]), error(setup_failed) end.