Browse Source

Allow users to pass a raw binary() as the expires header.

Drew Varner 11 years ago
parent
commit
6ed25fd60b
4 changed files with 32 additions and 2 deletions
  1. 1 1
      manual/cowboy_rest.md
  2. 5 1
      src/cowboy_rest.erl
  3. 8 0
      test/http_SUITE.erl
  4. 18 0
      test/http_SUITE_data/rest_expires_binary.erl

+ 1 - 1
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.

+ 5 - 1
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(

+ 8 - 0
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)],

+ 18 - 0
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}.