0
Fork 0
mirror of https://github.com/ninenines/cowboy.git synced 2025-07-14 20:30:23 +00:00

adds webmachine format content type handling

This commit is contained in:
alisdair sullivan 2011-12-09 22:58:15 -08:00 committed by Loïc Hoguin
parent 168405830d
commit 62bdb7d9a2

View file

@ -176,25 +176,39 @@ options(Req, State) ->
%%
%% An example of such return value would be:
%% {{<<"text">>, <<"html">>, []}, to_html}
%%
%% Note that it is also possible to return a binary content type that will
%% then be parsed by Cowboy. However note that while this may make your
%% resources a little more readable, this is a lot less efficient. An example
%% of such a return value would be:
%% {<<"text/html">>, to_html}
content_types_provided(Req, State) ->
case call(Req, State, content_types_provided) of
no_call ->
not_acceptable(Req, State);
{[], Req2, HandlerState2} ->
not_acceptable(Req2, State#state{handler_state=HandlerState2});
{CTP, Req2, HandlerState2} ->
State2 = State#state{handler_state=HandlerState2, content_types_p=CTP},
{[], Req2, HandlerState} ->
not_acceptable(Req2, State#state{handler_state=HandlerState});
{CTP, Req2, HandlerState} ->
CTP2 = [normalize_content_types_provided(P) || P <- CTP],
State2 = State#state{
handler_state=HandlerState, content_types_p=CTP2},
{Accept, Req3} = cowboy_http_req:parse_header('Accept', Req2),
case Accept of
undefined ->
languages_provided(Req3,
State2#state{content_type_a=hd(CTP)});
State2#state{content_type_a=hd(CTP2)});
Accept ->
Accept2 = prioritize_accept(Accept),
choose_media_type(Req3, State2, Accept2)
end
end.
normalize_content_types_provided({ContentType, Handler})
when is_binary(ContentType) ->
{cowboy_http:content_type(ContentType), Handler};
normalize_content_types_provided(Provided) ->
Provided.
prioritize_accept(Accept) ->
lists:sort(
fun ({MediaTypeA, Quality, _AcceptParamsA},