Просмотр исходного кода

Merge branch 'pr-381-fix' of git://github.com/seletskiy/cowboy

Loïc Hoguin 12 лет назад
Родитель
Сommit
e73780975c
3 измененных файлов с 42 добавлено и 4 удалено
  1. 16 4
      src/cowboy_rest.erl
  2. 12 0
      test/http_SUITE.erl
  3. 14 0
      test/rest_postonly_resource.erl

+ 16 - 4
src/cowboy_rest.erl

@@ -219,13 +219,25 @@ options(Req, State) ->
 content_types_provided(Req, State) ->
 	case call(Req, State, content_types_provided) of
 		no_call ->
-			not_acceptable(Req, State);
+			State2 = State#state{
+				content_types_p=[{{<<"text">>, <<"html">>, '*'}, to_html}]},
+			case cowboy_req:parse_header(<<"accept">>, Req) of
+				{error, badarg} ->
+					respond(Req, State2, 400);
+				{ok, undefined, Req2} ->
+					languages_provided(
+						cowboy_req:set_meta(media_type, {<<"text">>, <<"html">>, []}, Req2),
+						State2#state{content_type_a={{<<"text">>, <<"html">>, []}, to_html}});
+				{ok, Accept, Req2} ->
+					Accept2 = prioritize_accept(Accept),
+					choose_media_type(Req2, State2, Accept2)
+			end;
 		{halt, Req2, HandlerState} ->
 			terminate(Req2, State#state{handler_state=HandlerState});
 		{[], Req2, HandlerState} ->
 			not_acceptable(Req2, State#state{handler_state=HandlerState});
 		{CTP, Req2, HandlerState} ->
-		    CTP2 = [normalize_content_types(P) || P <- CTP],
+			CTP2 = [normalize_content_types(P) || P <- CTP],
 			State2 = State#state{
 				handler_state=HandlerState, content_types_p=CTP2},
 			case cowboy_req:parse_header(<<"accept">>, Req2) of
@@ -244,7 +256,7 @@ content_types_provided(Req, State) ->
 
 normalize_content_types({ContentType, Callback})
 		when is_binary(ContentType) ->
-    {cowboy_http:content_type(ContentType), Callback};
+	{cowboy_http:content_type(ContentType), Callback};
 normalize_content_types(Normalized) ->
 	Normalized.
 
@@ -779,7 +791,7 @@ accept_resource(Req, State) ->
 		{halt, Req2, HandlerState} ->
 			terminate(Req2, State#state{handler_state=HandlerState});
 		{CTA, Req2, HandlerState} ->
-		    CTA2 = [normalize_content_types(P) || P <- CTA],
+			CTA2 = [normalize_content_types(P) || P <- CTA],
 			State2 = State#state{handler_state=HandlerState},
 			case cowboy_req:parse_header(<<"content-type">>, Req2) of
 				{ok, ContentType, Req3} ->

+ 12 - 0
test/http_SUITE.erl

@@ -64,6 +64,7 @@
 -export([rest_options_default/1]).
 -export([rest_param_all/1]).
 -export([rest_patch/1]).
+-export([rest_postonly/1]).
 -export([rest_resource_etags/1]).
 -export([rest_resource_etags_if_none_match/1]).
 -export([set_env_dispatch/1]).
@@ -135,6 +136,7 @@ groups() ->
 		rest_options_default,
 		rest_param_all,
 		rest_patch,
+		rest_postonly,
 		rest_resource_etags,
 		rest_resource_etags_if_none_match,
 		set_resp_body,
@@ -366,6 +368,7 @@ init_dispatch(Config) ->
 			{"/missing_get_callbacks", rest_missing_callbacks, []},
 			{"/missing_put_callbacks", rest_missing_callbacks, []},
 			{"/nodelete", rest_nodelete_resource, []},
+			{"/postonly", rest_postonly_resource, []},
 			{"/patch", rest_patch_resource, []},
 			{"/resetags", rest_resource_etags, []},
 			{"/rest_expires", rest_expires, []},
@@ -992,6 +995,15 @@ rest_patch(Config) ->
 		ok
 	end || {Status, Headers, Body} <- Tests].
 
+rest_postonly(Config) ->
+	Client = ?config(client, Config),
+	Headers = [
+		{<<"content-type">>, <<"text/plain">>}
+	],
+	{ok, Client2} = cowboy_client:request(<<"POST">>,
+		build_url("/postonly", Config), Headers, "12345", Client),
+	{ok, 204, _, _} = cowboy_client:response(Client2).
+
 rest_resource_get_etag(Config, Type) ->
 	rest_resource_get_etag(Config, Type, []).
 

+ 14 - 0
test/rest_postonly_resource.erl

@@ -0,0 +1,14 @@
+-module(rest_postonly_resource).
+-export([init/3, allowed_methods/2, content_types_accepted/2, from_text/2]).
+
+init(_Transport, _Req, _Opts) ->
+	{upgrade, protocol, cowboy_rest}.
+
+allowed_methods(Req, State) ->
+	{[<<"POST">>], Req, State}.
+
+content_types_accepted(Req, State) ->
+	{[{{<<"text">>, <<"plain">>, '*'}, from_text}], Req, State}.
+
+from_text(Req, State) ->
+	{true, Req, State}.