0
Fork 0
mirror of https://github.com/ninenines/cowboy.git synced 2025-07-16 05:00:24 +00:00

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

This commit is contained in:
Loïc Hoguin 2013-04-26 13:45:47 +02:00
commit e73780975c
3 changed files with 42 additions and 4 deletions

View file

@ -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} ->

View file

@ -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, []).

View file

@ -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}.