Skip to content

Instantly share code, notes, and snippets.

@kellymclaughlin
Created January 21, 2013 23:47
Show Gist options
  • Save kellymclaughlin/4590669 to your computer and use it in GitHub Desktop.
Save kellymclaughlin/4590669 to your computer and use it in GitHub Desktop.
diff --git a/rebar.config b/rebar.config
index dc5bd68..b475012 100644
--- a/rebar.config
+++ b/rebar.config
@@ -4,6 +4,6 @@
{edoc_opts, [{preprocess, true}]}.
{deps, [
- {mochiweb, "1.5.1", {git, "git://github.com/basho/mochiweb",
- {tag, "1.5.1-riak-1.0.x-fixes"}}}
+ {mochiweb, "1.5.1p3", {git, "git://github.com/basho/mochiweb",
+ {tag, "1.5.1p3"}}}
]}.
diff --git a/src/webmachine_decision_core.erl b/src/webmachine_decision_core.erl
index 0989110..80df469 100644
--- a/src/webmachine_decision_core.erl
+++ b/src/webmachine_decision_core.erl
@@ -633,6 +633,8 @@ encode_body(Body) ->
case Body of
{stream, StreamBody} ->
{stream, make_encoder_stream(Encoder, Charsetter, StreamBody)};
+ {known_length_stream, Size, StreamBody} ->
+ {known_length_stream, Size, make_encoder_stream(Encoder, Charsetter, StreamBody)};
{stream, Size, Fun} ->
{stream, Size, make_size_encoder_stream(Encoder, Charsetter, Fun)};
{writer, BodyFun} ->
diff --git a/src/webmachine_request.erl b/src/webmachine_request.erl
index 6365fb9..53aeb89 100644
--- a/src/webmachine_request.erl
+++ b/src/webmachine_request.erl
@@ -279,6 +279,12 @@ send_stream_body(Socket, {Data, Next}, SoFar) ->
Size = send_chunk(Socket, Data),
send_stream_body(Socket, Next(), Size + SoFar).
+send_stream_body_no_chunk(Socket, {Data, done}) ->
+ send(Socket, Data);
+send_stream_body_no_chunk(Socket, {Data, Next}) ->
+ send(Socket, Data),
+ send_stream_body_no_chunk(Socket, Next()).
+
send_writer_body(Socket, {Encoder, Charsetter, BodyFun}) ->
put(bytes_written, 0),
Writer = fun(Data) ->
@@ -326,6 +332,7 @@ send_response(Code, PassedState=#wm_reqstate{reqdata=RD}) ->
Body0 = wrq:resp_body(RD),
{Body,Length} = case Body0 of
{stream, StreamBody} -> {{stream, StreamBody}, chunked};
+ {known_length_stream, Size, StreamBody} -> {{known_length_stream, StreamBody}, Size};
{stream, Size, Fun} -> {{stream, Fun(0, Size-1)}, chunked};
{writer, WriteBody} -> {{writer, WriteBody}, chunked};
_ -> {Body0, iolist_size([Body0])}
@@ -340,6 +347,9 @@ send_response(Code, PassedState=#wm_reqstate{reqdata=RD}) ->
case Body of
{stream, Body2} ->
send_stream_body(PassedState#wm_reqstate.socket, Body2);
+ {known_length_stream, Body2} ->
+ send_stream_body_no_chunk(PassedState#wm_reqstate.socket, Body2),
+ Length;
{writer, Body2} ->
send_writer_body(PassedState#wm_reqstate.socket, Body2);
_ ->
diff --git a/src/webmachine_util.erl b/src/webmachine_util.erl
index 39de15c..26749db 100644
--- a/src/webmachine_util.erl
+++ b/src/webmachine_util.erl
@@ -36,7 +36,7 @@
-endif.
convert_request_date(Date) ->
- try
+ try
case httpd_util:convert_request_date(Date) of
ReqDate -> ReqDate
end
@@ -174,7 +174,7 @@ media_params_match(Req,Prov) ->
prioritize_media(TyParam) ->
{Type, Params} = TyParam,
- prioritize_media(Type,Params,[]).
+ prioritize_media(Type,Params,[]).
prioritize_media(Type,Params,Acc) ->
case Params of
[] ->
@@ -188,7 +188,7 @@ prioritize_media(Type,Params,Acc) ->
1;
[$.|_] ->
%% handle strange FeedBurner Accept
- list_to_float([$0|Val]);
+ list_to_float([$0|Val]);
_ -> list_to_float(Val)
end,
{QVal, Type, Rest ++ Acc};
@@ -290,7 +290,7 @@ do_choose(Default, DefaultOkay, AnyOkay, Choices, [AccPair|AccRest]) ->
% doing this a little more work than needed in
% order to be easily insensitive but preserving
case lists:member(LAcc, LChoices) of
- true ->
+ true ->
hd([X || X <- Choices,
string:to_lower(X) =:= LAcc]);
false -> do_choose(Default, DefaultOkay, AnyOkay,
diff --git a/src/wrq.erl b/src/wrq.erl
index f0d5c9e..aec71ce 100644
--- a/src/wrq.erl
+++ b/src/wrq.erl
@@ -141,6 +141,7 @@ resp_headers(_RD = #wm_reqdata{resp_headers=RespH}) -> RespH. % mochiheaders
resp_body(_RD = #wm_reqdata{resp_body=undefined}) -> undefined;
resp_body(_RD = #wm_reqdata{resp_body={stream,X}}) -> {stream,X};
+resp_body(_RD = #wm_reqdata{resp_body={known_length_stream,X,Y}}) -> {known_length_stream,X,Y};
resp_body(_RD = #wm_reqdata{resp_body={stream,X,Y}}) -> {stream,X,Y};
resp_body(_RD = #wm_reqdata{resp_body={writer,X}}) -> {writer,X};
resp_body(_RD = #wm_reqdata{resp_body=RespB}) when is_binary(RespB) -> RespB;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment