Skip to content

Commit

Permalink
fix synchronous requests.
Browse files Browse the repository at this point in the history
  • Loading branch information
benoitc committed Dec 1, 2013
1 parent a5f9e34 commit a3af52c
Show file tree
Hide file tree
Showing 9 changed files with 142 additions and 109 deletions.
53 changes: 25 additions & 28 deletions examples/test.ebin
Expand Up @@ -9,41 +9,38 @@
main(_) ->
hackney:start(),

{ok, _, _, Client} = hackney:request(<<"https://friendpaste.com">>),
{ok, Body, Client1} = hackney:body(Client),

io:format("step 1~n", []),
{ok, Ref} = hackney:connect(<<"https://friendpaste.com">>),
{ok, _, _, Ref} = hackney:send_request(Ref, {get, <<"/">>, [],
<<>>}),
{ok, Body} = hackney:body(Ref),
io:format("body: ~p~n~n", [Body]),

{ok, _, _, Client2} = hackney:send_request(Client1, {get,
<<"/_all_languages">>,
[],
<<>>}),

{ok, Body1, Client3} = hackney:body(Client2),

io:format("step 2~n", []),
{ok, _, _, Ref} = hackney:send_request(Ref, {get,
<<"/_all_languages">>,
[],
<<>>}),
{ok, Body1} = hackney:body(Ref),
io:format("body: ~p~n~n", [Body1]),


ReqBody = << "{
\"id\": \"some_paste_id\",
\"rev\": \"some_revision_id\",
\"changeset\": \"changeset in unidiff format\"
}" >>,

io:format("step 3~n", []),
ReqBody = << "{\"snippet\": \"test.ebin\" }" >>,
ReqHeaders = [{<<"Content-Type">>, <<"application/json">>}],

{ok, _, _, Client4} = hackney:send_request(Client3, {post, <<"/">>,
ReqHeaders,
ReqBody}),
{ok, Body2, Client5} = hackney:body(Client4),
{ok, _, _, Ref} = hackney:send_request(Ref, {post, <<"/">>,
ReqHeaders,
ReqBody}),
{ok, Body2} = hackney:body(Ref),
io:format("body: ~p~n~n", [Body2]),

io:format("step 4~n", []),
ReqBody1 = {file, "./examples/test.json"},

{ok, _, _, Client6} = hackney:send_request(Client5, {post, <<"/">>,
ReqHeaders,
ReqBody1}),
{ok, Body3, Client7} = hackney:body(Client6),
{ok, _, _, Ref} = hackney:send_request(Ref, {post, <<"/">>,
ReqHeaders,
ReqBody1}),
{ok, Body3} = hackney:body(Ref),
io:format("body: ~p~n~n", [Body3]),

hackney:close(Client7).
hackney:close(Ref),
IsClosed = hackney_manager:get_state(Ref) =:= req_not_found,
io:format("has been closed: ~p~n", [IsClosed]).
42 changes: 19 additions & 23 deletions examples/test1.erl
Expand Up @@ -9,42 +9,38 @@
main(_) ->
hackney:start(),

{ok, _, _, Client} = hackney:request(get, <<"https://friendpaste.com">>,
io:format("step 1~n", []),
{ok, _, _, Ref} = hackney:request(get, <<"https://friendpaste.com">>,
[], <<>>, [{pool, default}]),
{ok, Body, Client1} = hackney:body(Client),

{ok, Body} = hackney:body(Ref),
io:format("body: ~p~n~n", [Body]),

{ok, _, _, Client2} = hackney:send_request(Client1, {get,
<<"/_all_languages">>,
[],
<<>>}),

{ok, Body1, Client3} = hackney:body(Client2),

io:format("step 1~n", []),
{ok, _, _, Ref2} = hackney:request(get,
<<"https://friendpaste.com/_all_languages">>,
[],
<<>>),
{ok, Body1} = hackney:body(Ref2),
io:format("body: ~p~n~n", [Body1]),


io:format("step 3~n", []),
ReqBody = << "{
\"id\": \"some_paste_id\",
\"rev\": \"some_revision_id\",
\"changeset\": \"changeset in unidiff format\"
}" >>,

ReqHeaders = [{<<"Content-Type">>, <<"application/json">>}],

{ok, _, _, Client4} = hackney:send_request(Client3, {post, <<"/">>,
ReqHeaders,
ReqBody}),
{ok, Body2, Client5} = hackney:body(Client4),
{ok, _, _, Ref3} = hackney:request(post, <<"https://friendpaste.com">>,
ReqHeaders, ReqBody),
{ok, Body2} = hackney:body(Ref3),
io:format("body: ~p~n~n", [Body2]),

io:format("step 4~n", []),
ReqBody1 = {file, "./examples/test.json"},

{ok, _, _, Client6} = hackney:send_request(Client5, {post, <<"/">>,
ReqHeaders,
ReqBody1}),
{ok, Body3, Client7} = hackney:body(Client6),
{ok, _, _, Ref4} = hackney:request(post, <<"https://friendpaste.com">>,
ReqHeaders, ReqBody1),
{ok, Body3} = hackney:body(Ref4),
io:format("body: ~p~n~n", [Body3]),

hackney:close(Client7).
IsClosed = hackney_manager:get_state(Ref4) =:= req_not_found,
io:format("has been closed: ~p~n", [IsClosed]).
42 changes: 19 additions & 23 deletions examples/test1_disp.erl
Expand Up @@ -9,42 +9,38 @@
main(_) ->
hackney:start(hackney_disp),

{ok, _, _, Client} = hackney:request(get, <<"https://friendpaste.com">>,
io:format("step 1~n", []),
{ok, _, _, Ref} = hackney:request(get, <<"https://friendpaste.com">>,
[], <<>>, [{pool, default}]),
{ok, Body, Client1} = hackney:body(Client),

{ok, Body} = hackney:body(Ref),
io:format("body: ~p~n~n", [Body]),

{ok, _, _, Client2} = hackney:send_request(Client1, {get,
<<"/_all_languages">>,
[],
<<>>}),

{ok, Body1, Client3} = hackney:body(Client2),

io:format("step 1~n", []),
{ok, _, _, Ref2} = hackney:request(get,
<<"https://friendpaste.com/_all_languages">>,
[],
<<>>),
{ok, Body1} = hackney:body(Ref2),
io:format("body: ~p~n~n", [Body1]),


io:format("step 3~n", []),
ReqBody = << "{
\"id\": \"some_paste_id\",
\"rev\": \"some_revision_id\",
\"changeset\": \"changeset in unidiff format\"
}" >>,

ReqHeaders = [{<<"Content-Type">>, <<"application/json">>}],

{ok, _, _, Client4} = hackney:send_request(Client3, {post, <<"/">>,
ReqHeaders,
ReqBody}),
{ok, Body2, Client5} = hackney:body(Client4),
{ok, _, _, Ref3} = hackney:request(post, <<"https://friendpaste.com">>,
ReqHeaders, ReqBody),
{ok, Body2} = hackney:body(Ref3),
io:format("body: ~p~n~n", [Body2]),

io:format("step 4~n", []),
ReqBody1 = {file, "./examples/test.json"},

{ok, _, _, Client6} = hackney:send_request(Client5, {post, <<"/">>,
ReqHeaders,
ReqBody1}),
{ok, Body3, Client7} = hackney:body(Client6),
{ok, _, _, Ref4} = hackney:request(post, <<"https://friendpaste.com">>,
ReqHeaders, ReqBody1),
{ok, Body3} = hackney:body(Ref4),
io:format("body: ~p~n~n", [Body3]),

hackney:close(Client7).
IsClosed = hackney_manager:get_state(Ref4) =:= req_not_found,
io:format("has been closed: ~p~n", [IsClosed]).
32 changes: 19 additions & 13 deletions examples/test2.erl
Expand Up @@ -6,19 +6,25 @@

main(_) ->
hackney:start(),
ReqBody = << "{
\"id\": \"some_paste_id2\",
\"rev\": \"some_revision_id\",
\"changeset\": \"changeset in unidiff format\"
}" >>,
ReqHeaders = [{<<"Content-Type">>, <<"application/json">>}],
Path = <<"https://friendpaste.com/">>,
ReqBody = << "{\"snippet\": \"test2.erl\" }" >>,

io:format("Req body ~p~n", [ReqBody]),

ReqHeaders = [{<<"Content-Type">>, <<"application/json">>},
{<<"Content-Length">>, size(ReqBody)}],
Path = <<"https://friendpaste.com">>,
Method = post,
{ok, Client} = hackney:request(Method, Path, ReqHeaders, stream,
io:format("start request ~n", []),
{ok, Ref} = hackney:request(Method, Path, ReqHeaders, stream,
[]),

{ok, Client1} = hackney:stream_request_body(ReqBody, Client),
{ok, _Status, _Headers, Client2} = hackney:start_response(Client1),
{ok, Body, Client3} = hackney:body(Client2),
hackney:close(Client3),
io:format(" ** got length ~p~n ** body: ~p~n", [byte_size(Body), Body]).
io:format("~nwant to send body ~n", []),
ok = hackney:send_body(Ref, ReqBody),

io:format("fetch response~n", []),
{ok, _Status, _Headers, Ref} = hackney:start_response(Ref),
{ok, Body} = hackney:body(Ref),
io:format(" ** got length ~p~n ** body: ~p~n", [byte_size(Body),
Body]),
IsClosed = hackney_manager:get_state(Ref) =:= req_not_found,
io:format("has been closed: ~p~n", [IsClosed]).
18 changes: 15 additions & 3 deletions src/hackney.erl
Expand Up @@ -8,7 +8,7 @@

-module(hackney).
-export([start/0, start/1, stop/0]).
-export([connect/3, connect/4,
-export([connect/1, connect/2, connect/3, connect/4,
close/1,
request/1, request/2, request/3, request/4, request/5,
send_request/2,
Expand Down Expand Up @@ -60,13 +60,26 @@ start(PoolHandler) ->
stop() ->
application:stop(hackney).


connect(URL) ->
connect(URL, []).

connect(#hackney_url{}=URL, Options) ->
#hackney_url{transport=Transport,
host=Host,
port=Port} = URL,
connect(Transport, Host, Port, Options);
connect(URL, Options) when is_binary(URL) orelse is_list(URL) ->
connect(hackney_url:parse_url(URL), Options).

%% @doc connect a socket and create a client state.
connect(Transport, Host, Port) ->
hackney_connect:connect(Transport, Host, Port, []).

connect(Transport, Host, Port, Options) ->
hackney_connect:connect(Transport, Host, Port, Options).


%% @doc Assign a new controlling process <em>Pid</em> to <em>Client</em>.
-spec controlling_process(request(), pid())
-> ok | {error, closed | not_owner | atom()}.
Expand All @@ -75,7 +88,7 @@ controlling_process(Ref, Pid) ->

%% @doc close the client
close(Client) ->
hackney_response:close(Client).
hackney_connect:close(Client).

%% @doc make a request
-spec request(binary()|list())
Expand Down Expand Up @@ -566,7 +579,6 @@ redirect(Client0, {Method, NewLocation, Headers, Body}) ->
{ok, S, H, NewClient};
{ok, S, H, RedirectClient} ->
NewRedirect = {Transport, Host, Port, Opts0},
io:format("got ~p~n", [RedirectClient]),
NewClient = RedirectClient#client{redirect=NewRedirect,
options=Opts0},
{ok, S, H, NewClient};
Expand Down
23 changes: 16 additions & 7 deletions src/hackney_connect.erl
Expand Up @@ -11,12 +11,12 @@

-module(hackney_connect).

-export([connect/3, connect/4,
-export([connect/3, connect/4, connect/5,
create_connection/4, create_connection/5,
maybe_connect/1,
reconnect/4,
set_sockopts/2,
close_socket/1,
close/1,
is_pool/1]).

-include("hackney.hrl").
Expand All @@ -26,7 +26,10 @@ connect(Transport, Host, Port) ->
connect(Transport, Host, Port, []).

connect(Transport, Host, Port, Options) ->
case create_connection(Transport, Host, Port, Options) of
connect(Transport, Host, Port, Options, false).

connect(Transport, Host, Port, Options, Dynamic) ->
case create_connection(Transport, Host, Port, Options, Dynamic) of
{ok, #client{request_ref=Ref}} ->
{ok, Ref};
Error ->
Expand Down Expand Up @@ -81,7 +84,7 @@ maybe_connect(#client{redirect=Redirect}=Client) ->
%% and create a new one.
case is_pool(Client) of
false ->
close_socket(Client);
close(Client);
true ->
Handler:checkin(Ref, Socket)
end,
Expand All @@ -98,9 +101,15 @@ set_sockopts(#client{transport=Transport, socket=Skt}, Options) ->


%% @doc close the client
close_socket(#client{transport=Transport, socket=Socket}) ->
Transport:close(Socket).

%%
%%
close(#client{socket=nil}=Client) ->
Client#client{state = closed};
close(#client{transport=Transport, socket=Skt}=Client) ->
Transport:close(Skt),
Client#client{state = closed, socket=nil};
close(Ref) when is_reference(Ref) ->
hackney_manager:close_request(Ref).


%% @doc get current pool pid or name used by a client if needed
Expand Down
2 changes: 1 addition & 1 deletion src/hackney_http_proxy.erl
Expand Up @@ -40,7 +40,7 @@ maybe_proxy(Transport, Host, Port, Options)
Port, Options, true);

_ ->
hackney_connect:connect(Transport, Host, Port, Options)
hackney_connect:connect(Transport, Host, Port, Options, true)
end.


Expand Down
6 changes: 4 additions & 2 deletions src/hackney_manager.erl
Expand Up @@ -172,9 +172,11 @@ handle_call({close_request, Ref}, _From, Children) ->
case Status of
done ->
ok;
_ ->
_ when Socket /= nil ->
Transport:controlling_process(Socket, self()),
Transport:close(Socket)
Transport:close(Socket);
_ ->
ok
end,

{reply, ok, NChildren}
Expand Down

0 comments on commit a3af52c

Please sign in to comment.