From 6ed25fd60b0cc502ae79baf20456bb2d2b02973e Mon Sep 17 00:00:00 2001 From: Drew Varner Date: Fri, 6 Jun 2014 02:37:24 -0400 Subject: Allow users to pass a raw binary() as the expires header. --- manual/cowboy_rest.md | 2 +- src/cowboy_rest.erl | 6 +++++- test/http_SUITE.erl | 8 ++++++++ test/http_SUITE_data/rest_expires_binary.erl | 18 ++++++++++++++++++ 4 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 test/http_SUITE_data/rest_expires_binary.erl diff --git a/manual/cowboy_rest.md b/manual/cowboy_rest.md index 7a38bb7..a2abf3a 100644 --- a/manual/cowboy_rest.md +++ b/manual/cowboy_rest.md @@ -275,7 +275,7 @@ REST callbacks description ### expires > * Methods: GET, HEAD -> * Value type: calendar:datetime() | undefined +> * Value type: calendar:datetime() | binary() | undefined > * Default value: undefined > > Return the date of expiration of the resource. diff --git a/src/cowboy_rest.erl b/src/cowboy_rest.erl index 63e4dd9..d7f76a4 100644 --- a/src/cowboy_rest.erl +++ b/src/cowboy_rest.erl @@ -52,7 +52,7 @@ %% Cached resource calls. etag :: undefined | no_call | {strong | weak, binary()}, last_modified :: undefined | no_call | calendar:datetime(), - expires :: undefined | no_call | calendar:datetime() + expires :: undefined | no_call | calendar:datetime() | binary() }). -spec upgrade(Req, Env, module(), any()) @@ -896,6 +896,10 @@ set_resp_expires(Req, State) -> case Expires of Expires when is_atom(Expires) -> {Req2, State2}; + Expires when is_binary(Expires) -> + Req3 = cowboy_req:set_resp_header( + <<"expires">>, Expires, Req2), + {Req3, State2}; Expires -> ExpiresBin = cowboy_clock:rfc1123(Expires), Req3 = cowboy_req:set_resp_header( diff --git a/test/http_SUITE.erl b/test/http_SUITE.erl index 8ab99cb..0e115e0 100644 --- a/test/http_SUITE.erl +++ b/test/http_SUITE.erl @@ -207,6 +207,7 @@ init_dispatch(Config) -> {"/patch", rest_patch_resource, []}, {"/resetags", rest_resource_etags, []}, {"/rest_expires", rest_expires, []}, + {"/rest_expires_binary", rest_expires_binary, []}, {"/rest_empty_resource", rest_empty_resource, []}, {"/loop_stream_recv", http_loop_stream_recv, []}, {"/", http_handler, []} @@ -687,6 +688,13 @@ rest_expires(Config) -> Expires = LastModified = <<"Fri, 21 Sep 2012 22:36:14 GMT">>, ok. +rest_expires_binary(Config) -> + ConnPid = gun_open(Config), + Ref = gun:get(ConnPid, "/rest_expires_binary"), + {response, nofin, 200, Headers} = gun:await(ConnPid, Ref), + {_, <<"0">>} = lists:keyfind(<<"expires">>, 1, Headers), + ok. + rest_keepalive(Config) -> ConnPid = gun_open(Config), Refs = [gun:get(ConnPid, "/simple") || _ <- lists:seq(1, 10)], diff --git a/test/http_SUITE_data/rest_expires_binary.erl b/test/http_SUITE_data/rest_expires_binary.erl new file mode 100644 index 0000000..4cbd001 --- /dev/null +++ b/test/http_SUITE_data/rest_expires_binary.erl @@ -0,0 +1,18 @@ +-module(rest_expires_binary). + +-export([init/3]). +-export([content_types_provided/2]). +-export([get_text_plain/2]). +-export([expires/2]). + +init(_Transport, _Req, _Opts) -> + {upgrade, protocol, cowboy_rest}. + +content_types_provided(Req, State) -> + {[{{<<"text">>, <<"plain">>, []}, get_text_plain}], Req, State}. + +get_text_plain(Req, State) -> + {<<"This is REST!">>, Req, State}. + +expires(Req, State) -> + {<<"0">>, Req, State}. -- cgit v1.2.3