Skip to content

Commit

Permalink
Fix dialyzer warnings
Browse files Browse the repository at this point in the history
Also added missing possible return values for the
request/4,5,6,9 functions. Those were the values
that can be returned when the partial_download and
partial_upload options are used.
  • Loading branch information
fdmanana committed Apr 20, 2012
1 parent 595f35c commit b4b0abc
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 67 deletions.
120 changes: 57 additions & 63 deletions src/lhttpc.erl
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,15 @@
-include("lhttpc_types.hrl").
-include("lhttpc.hrl").

-type result() :: {ok, {{pos_integer(), string()}, headers(), binary()}} |
{error, atom()}.
-type upload_state() :: {pid(), window_size()}.
-type body() :: binary() |
'undefined' | % HEAD request.
pid(). % When partial_download option is used.

-type result() ::
{ok, {{pos_integer(), string()}, headers(), body()}} |
{ok, upload_state()} |
{error, atom()}.

%% @hidden
-spec start(normal | {takeover, node()} | {failover, node()}, any()) ->
Expand Down Expand Up @@ -346,7 +353,7 @@ request(URL, Method, Hdrs, Body, Timeout, Options) ->
-spec request(string(), 1..65535, true | false, string(), atom() | string(),
headers(), iolist(), pos_integer(), [option()]) -> result().
request(Host, Port, Ssl, Path, Method, Hdrs, Body, Timeout, Options) ->
verify_options(Options, []),
verify_options(Options),
Args = [self(), Host, Port, Ssl, Path, Method, Hdrs, Body, Options],
Pid = spawn_link(lhttpc_client, request, Args),
receive
Expand All @@ -373,8 +380,7 @@ request(Host, Port, Ssl, Path, Method, Hdrs, Body, Timeout, Options) ->
%% Would be the same as calling
%% `send_body_part(UploadState, BodyPart, infinity)'.
%% @end
-spec send_body_part({pid(), window_size()}, iolist()) ->
{pid(), window_size()} | result().
-spec send_body_part(upload_state(), iolist() | 'http_eob') -> result().
send_body_part({Pid, Window}, IoList) ->
send_body_part({Pid, Window}, IoList, infinity).

Expand All @@ -399,8 +405,7 @@ send_body_part({Pid, Window}, IoList) ->
%% there is no response within `Timeout' milliseconds, the request is
%% canceled and `{error, timeout}' is returned.
%% @end
-spec send_body_part({pid(), window_size()}, iolist(), timeout()) ->
{ok, {pid(), window_size()}} | result().
-spec send_body_part(upload_state(), iolist() | 'http_eob', timeout()) -> result().
send_body_part({Pid, _Window}, http_eob, Timeout) when is_pid(Pid) ->
Pid ! {body_part, self(), http_eob},
read_response(Pid, Timeout);
Expand Down Expand Up @@ -485,7 +490,9 @@ send_trailers({Pid, _Window}, Trailers, Timeout)
%% Would be the same as calling
%% `get_body_part(HTTPClient, infinity)'.
%% @end
-spec get_body_part(pid()) -> {ok, binary()} | {ok, {http_eob, headers()}}.
-spec get_body_part(pid()) -> {ok, binary()} |
{ok, {http_eob, headers()}} |
{error, term()}.
get_body_part(Pid) ->
get_body_part(Pid, infinity).

Expand All @@ -503,7 +510,9 @@ get_body_part(Pid) ->
%% response those are returned with `http_eob' as well.
%% @end
-spec get_body_part(pid(), timeout()) ->
{ok, binary()} | {ok, {http_eob, headers()}}.
{ok, binary()} |
{ok, {http_eob, headers()}} |
{error, term()}.
get_body_part(Pid, Timeout) ->
receive
{body_part, Pid, Bin} ->
Expand Down Expand Up @@ -544,64 +553,49 @@ kill_client(Pid) ->
erlang:error(Reason)
end.

-spec verify_options(options(), options()) -> ok.
verify_options([{send_retry, N} | Options], Errors)
when is_integer(N), N >= 0 ->
verify_options(Options, Errors);
verify_options([{connect_timeout, infinity} | Options], Errors) ->
verify_options(Options, Errors);
verify_options([{connect_timeout, MS} | Options], Errors)
-spec verify_options(options()) -> ok.
verify_options([{send_retry, N} | Options]) when is_integer(N), N >= 0 ->
verify_options(Options);
verify_options([{connect_timeout, infinity} | Options]) ->
verify_options(Options);
verify_options([{connect_timeout, MS} | Options])
when is_integer(MS), MS >= 0 ->
verify_options(Options, Errors);
verify_options([{partial_upload, WindowSize} | Options], Errors)
verify_options(Options);
verify_options([{partial_upload, WindowSize} | Options])
when is_integer(WindowSize), WindowSize >= 0 ->
verify_options(Options, Errors);
verify_options([{partial_upload, infinity} | Options], Errors) ->
verify_options(Options, Errors);
verify_options([{partial_download, DownloadOptions} | Options], Errors)
verify_options(Options);
verify_options([{partial_upload, infinity} | Options]) ->
verify_options(Options);
verify_options([{partial_download, DownloadOptions} | Options])
when is_list(DownloadOptions) ->
case verify_partial_download(DownloadOptions, []) of
[] ->
verify_options(Options, Errors);
OptionErrors ->
NewErrors = [{partial_download, OptionErrors} | Errors],
verify_options(Options, NewErrors)
end;
verify_options([{connect_options, List} | Options], Errors)
when is_list(List) ->
verify_options(Options, Errors);
verify_options([{proxy, List} | Options], Errors)
when is_list(List) ->
verify_options(Options, Errors);
verify_options([{proxy_ssl_options, List} | Options], Errors)
when is_list(List) ->
verify_options(Options, Errors);
verify_options([{pool, PidOrName} | Options], Errors)
verify_partial_download(DownloadOptions),
verify_options(Options);
verify_options([{connect_options, List} | Options]) when is_list(List) ->
verify_options(Options);
verify_options([{proxy, List} | Options]) when is_list(List) ->
verify_options(Options);
verify_options([{proxy_ssl_options, List} | Options]) when is_list(List) ->
verify_options(Options);
verify_options([{pool, PidOrName} | Options])
when is_pid(PidOrName); is_atom(PidOrName) ->
verify_options(Options, Errors);
verify_options([Option | Options], Errors) ->
verify_options(Options, [Option | Errors]);
verify_options([], []) ->
ok;
verify_options([], Errors) ->
bad_options(Errors).

-spec bad_options(options()) -> no_return().
bad_options(Errors) ->
erlang:error({bad_options, Errors}).
verify_options(Options);
verify_options([Option | _Rest]) ->
erlang:error({bad_option, Option});
verify_options([]) ->
ok.

-spec verify_partial_download(options(), options()) -> options().
verify_partial_download([{window_size, infinity} | Options], Errors)->
verify_partial_download(Options, Errors);
verify_partial_download([{window_size, Size} | Options], Errors) when
-spec verify_partial_download(options()) -> ok.
verify_partial_download([{window_size, infinity} | Options])->
verify_partial_download(Options);
verify_partial_download([{window_size, Size} | Options]) when
is_integer(Size), Size >= 0 ->
verify_partial_download(Options, Errors);
verify_partial_download([{part_size, Size} | Options], Errors) when
verify_partial_download(Options);
verify_partial_download([{part_size, Size} | Options]) when
is_integer(Size), Size >= 0 ->
verify_partial_download(Options, Errors);
verify_partial_download([{part_size, infinity} | Options], Errors) ->
verify_partial_download(Options, Errors);
verify_partial_download([Option | Options], Errors) ->
verify_partial_download(Options, [Option | Errors]);
verify_partial_download([], Errors) ->
Errors.
verify_partial_download(Options);
verify_partial_download([{part_size, infinity} | Options]) ->
verify_partial_download(Options);
verify_partial_download([Option | _Options]) ->
erlang:error({bad_option, {partial_download, Option}});
verify_partial_download([]) ->
ok.
14 changes: 13 additions & 1 deletion src/lhttpc_types.hrl
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,23 @@

-type socket() :: _.

-type invalid_option() :: any().

-type partial_download_option() ::
{window_size, window_size()} |
{part_size, non_neg_integer() | infinity} |
invalid_option().

-type option() ::
{connect_timeout, timeout()} |
{send_retry, non_neg_integer()} |
{partial_upload, non_neg_integer() | infinity} |
{partial_download, pid(), non_neg_integer() | infinity}.
{partial_download, [partial_download_option()]} |
{connect_options, socket_options()} |
{proxy, string()} |
{proxy_ssl_options, socket_options()} |
{pool, pid() | atom()} |
invalid_option().

-type options() :: [option()].

Expand Down
9 changes: 6 additions & 3 deletions test/lhttpc_tests.erl
Original file line number Diff line number Diff line change
Expand Up @@ -552,7 +552,7 @@ partial_upload_chunked_no_trailer() ->
lhttpc_lib:header_value("x-test-orig-body", headers(Response))).

partial_download_illegal_option() ->
?assertError({bad_options, [{partial_download, [{foo, bar}]}]},
?assertError({bad_option, {partial_download, {foo, bar}}},
lhttpc:request("http://localhost/", get, [], <<>>, 1000,
[{partial_download, [{foo, bar}]}])).

Expand Down Expand Up @@ -729,9 +729,12 @@ connection_count() ->
?assertEqual(0, lhttpc_manager:connection_count(lhttpc_manager)).

invalid_options() ->
?assertError({bad_options, [{foo, bar}, bad_option]},
?assertError({bad_option, bad_option},
lhttpc:request("http://localhost/", get, [], <<>>, 1000,
[bad_option, {foo, bar}])).
[bad_option, {foo, bar}])),
?assertError({bad_option, {foo, bar}},
lhttpc:request("http://localhost/", get, [], <<>>, 1000,
[{foo, bar}, bad_option])).

%%% Helpers functions

Expand Down

0 comments on commit b4b0abc

Please sign in to comment.