You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by da...@apache.org on 2014/02/12 07:22:16 UTC

[44/50] [abbrv] COUCHDB-1696 import mochiweb from tag v2.4.2

http://git-wip-us.apache.org/repos/asf/couchdb-mochiweb/blob/11e1522f/mochiweb_response.erl
----------------------------------------------------------------------
diff --git a/mochiweb_response.erl b/mochiweb_response.erl
index ab8ee61..c2a94d9 100644
--- a/mochiweb_response.erl
+++ b/mochiweb_response.erl
@@ -3,39 +3,47 @@
 
 %% @doc Response abstraction.
 
--module(mochiweb_response, [Request, Code, Headers]).
+-module(mochiweb_response).
 -author('bob@mochimedia.com').
 
 -define(QUIP, "Any of you quaids got a smint?").
 
--export([get_header_value/1, get/1, dump/0]).
--export([send/1, write_chunk/1]).
+-export([new/3, get_header_value/2, get/2, dump/1]).
+-export([send/2, write_chunk/2]).
 
-%% @spec get_header_value(string() | atom() | binary()) -> string() | undefined
+%% @type response() = {atom(), [Request, Code, Headers]}
+
+%% @spec new(Request, Code, Headers) -> response()
+%% @doc Create a new mochiweb_response instance.
+new(Request, Code, Headers) ->
+    {?MODULE, [Request, Code, Headers]}.
+
+%% @spec get_header_value(string() | atom() | binary(), response()) ->
+%%           string() | undefined
 %% @doc Get the value of the given response header.
-get_header_value(K) ->
+get_header_value(K, {?MODULE, [_Request, _Code, Headers]}) ->
     mochiweb_headers:get_value(K, Headers).
 
-%% @spec get(request | code | headers) -> term()
+%% @spec get(request | code | headers, response()) -> term()
 %% @doc Return the internal representation of the given field.
-get(request) ->
+get(request, {?MODULE, [Request, _Code, _Headers]}) ->
     Request;
-get(code) ->
+get(code, {?MODULE, [_Request, Code, _Headers]}) ->
     Code;
-get(headers) ->
+get(headers, {?MODULE, [_Request, _Code, Headers]}) ->
     Headers.
 
-%% @spec dump() -> {mochiweb_request, [{atom(), term()}]}
+%% @spec dump(response()) -> {mochiweb_request, [{atom(), term()}]}
 %% @doc Dump the internal representation to a "human readable" set of terms
 %%      for debugging/inspection purposes.
-dump() ->
+dump({?MODULE, [Request, Code, Headers]}) ->
     [{request, Request:dump()},
      {code, Code},
      {headers, mochiweb_headers:to_list(Headers)}].
 
-%% @spec send(iodata()) -> ok
+%% @spec send(iodata(), response()) -> ok
 %% @doc Send data over the socket if the method is not HEAD.
-send(Data) ->
+send(Data, {?MODULE, [Request, _Code, _Headers]}) ->
     case Request:get(method) of
         'HEAD' ->
             ok;
@@ -43,22 +51,22 @@ send(Data) ->
             Request:send(Data)
     end.
 
-%% @spec write_chunk(iodata()) -> ok
+%% @spec write_chunk(iodata(), response()) -> ok
 %% @doc Write a chunk of a HTTP chunked response. If Data is zero length,
 %%      then the chunked response will be finished.
-write_chunk(Data) ->
+write_chunk(Data, {?MODULE, [Request, _Code, _Headers]}=THIS) ->
     case Request:get(version) of
         Version when Version >= {1, 1} ->
             Length = iolist_size(Data),
-            send([io_lib:format("~.16b\r\n", [Length]), Data, <<"\r\n">>]);
+            send([io_lib:format("~.16b\r\n", [Length]), Data, <<"\r\n">>], THIS);
         _ ->
-            send(Data)
+            send(Data, THIS)
     end.
 
 
 %%
 %% Tests
 %%
--include_lib("eunit/include/eunit.hrl").
 -ifdef(TEST).
+-include_lib("eunit/include/eunit.hrl").
 -endif.

http://git-wip-us.apache.org/repos/asf/couchdb-mochiweb/blob/11e1522f/mochiweb_socket.erl
----------------------------------------------------------------------
diff --git a/mochiweb_socket.erl b/mochiweb_socket.erl
index ad27204..76b018c 100644
--- a/mochiweb_socket.erl
+++ b/mochiweb_socket.erl
@@ -4,11 +4,10 @@
 
 -module(mochiweb_socket).
 
--export([listen/4, accept/1, after_accept/1, recv/3, send/2, close/1, port/1, peername/1,
+-export([listen/4, accept/1, recv/3, send/2, close/1, port/1, peername/1,
          setopts/2, type/1]).
 
 -define(ACCEPT_TIMEOUT, 2000).
--define(SSL_ACCEPT_TIMEOUT, 30000).
 
 listen(Ssl, Port, Opts, SslOpts) ->
     case Ssl of
@@ -26,9 +25,14 @@ listen(Ssl, Port, Opts, SslOpts) ->
 accept({ssl, ListenSocket}) ->
     % There's a bug in ssl:transport_accept/2 at the moment, which is the
     % reason for the try...catch block. Should be fixed in OTP R14.
-    try ssl:transport_accept(ListenSocket, ?ACCEPT_TIMEOUT) of
+    try ssl:transport_accept(ListenSocket) of
         {ok, Socket} ->
-            {ok, {ssl, Socket}};
+            case ssl:ssl_accept(Socket) of
+                ok ->
+                    {ok, {ssl, Socket}};
+                {error, _} = Err ->
+                    Err
+            end;
         {error, _} = Err ->
             Err
     catch
@@ -38,9 +42,6 @@ accept({ssl, ListenSocket}) ->
 accept(ListenSocket) ->
     gen_tcp:accept(ListenSocket, ?ACCEPT_TIMEOUT).
 
-after_accept({ssl, Socket}) -> ssl:ssl_accept(Socket, ?SSL_ACCEPT_TIMEOUT);
-after_accept(_Socket) -> ok.
-
 recv({ssl, Socket}, Length, Timeout) ->
     ssl:recv(Socket, Length, Timeout);
 recv(Socket, Length, Timeout) ->

http://git-wip-us.apache.org/repos/asf/couchdb-mochiweb/blob/11e1522f/mochiweb_socket_server.erl
----------------------------------------------------------------------
diff --git a/mochiweb_socket_server.erl b/mochiweb_socket_server.erl
index ff0d8f3..029f195 100644
--- a/mochiweb_socket_server.erl
+++ b/mochiweb_socket_server.erl
@@ -9,7 +9,7 @@
 
 -include("internal.hrl").
 
--export([start/1, stop/1]).
+-export([start/1, start_link/1, stop/1]).
 -export([init/1, handle_call/3, handle_cast/2, terminate/2, code_change/3,
          handle_info/2]).
 -export([get/2, set/3]).
@@ -33,10 +33,22 @@
 
 -define(is_old_state(State), not is_record(State, mochiweb_socket_server)).
 
-start(State=#mochiweb_socket_server{}) ->
-    start_server(State);
+start_link(Options) ->
+    start_server(start_link, parse_options(Options)).
+
 start(Options) ->
-    start(parse_options(Options)).
+    case lists:keytake(link, 1, Options) of
+        {value, {_Key, false}, Options1} ->
+            start_server(start, parse_options(Options1));
+        _ ->
+            %% TODO: https://github.com/mochi/mochiweb/issues/58
+            %%   [X] Phase 1: Add new APIs (Sep 2011)
+            %%   [_] Phase 2: Add deprecation warning
+            %%   [_] Phase 3: Change default to {link, false} and ignore link
+            %%   [_] Phase 4: Add deprecation warning for {link, _} option
+            %%   [_] Phase 5: Remove support for {link, _} option
+            start_link(Options)
+    end.
 
 get(Name, Property) ->
     gen_server:call(Name, {get, Property}).
@@ -61,6 +73,8 @@ stop(Options) ->
 
 %% Internal API
 
+parse_options(State=#mochiweb_socket_server{}) ->
+    State;
 parse_options(Options) ->
     parse_options(Options, #mochiweb_socket_server{}).
 
@@ -116,22 +130,22 @@ parse_options([{profile_fun, ProfileFun} | Rest], State) when is_function(Profil
     parse_options(Rest, State#mochiweb_socket_server{profile_fun=ProfileFun}).
 
 
-start_server(State=#mochiweb_socket_server{ssl=Ssl, name=Name}) ->
-    case Ssl of
-        true ->
-            application:start(crypto),
-            application:start(public_key),
-            application:start(ssl);
-        false ->
-            void
-    end,
+start_server(F, State=#mochiweb_socket_server{ssl=Ssl, name=Name}) ->
+    ok = prep_ssl(Ssl),
     case Name of
         undefined ->
-            gen_server:start_link(?MODULE, State, []);
+            gen_server:F(?MODULE, State, []);
         _ ->
-            gen_server:start_link(Name, ?MODULE, State, [])
+            gen_server:F(Name, ?MODULE, State, [])
     end.
 
+prep_ssl(true) ->
+    ok = mochiweb:ensure_started(crypto),
+    ok = mochiweb:ensure_started(public_key),
+    ok = mochiweb:ensure_started(ssl);
+prep_ssl(false) ->
+    ok.
+
 ensure_int(N) when is_integer(N) ->
     N;
 ensure_int(S) when is_list(S) ->
@@ -165,27 +179,7 @@ init(State=#mochiweb_socket_server{ip=Ip, port=Port, backlog=Backlog, nodelay=No
         {_, _, _, _, _, _, _, _} -> % IPv6
             [inet6, {ip, Ip} | BaseOpts]
     end,
-    case listen(Port, Opts, State) of
-        {stop, eacces} ->
-            case Port < 1024 of
-                true ->
-                    case catch fdsrv:start() of
-                        {ok, _} ->
-                            case fdsrv:bind_socket(tcp, Port) of
-                                {ok, Fd} ->
-                                    listen(Port, [{fd, Fd} | Opts], State);
-                                _ ->
-                                    {stop, fdsrv_bind_failed}
-                            end;
-                        _ ->
-                            {stop, fdsrv_start_failed}
-                    end;
-                false ->
-                    {stop, eacces}
-            end;
-        Other ->
-            Other
-    end.
+    listen(Port, Opts, State).
 
 new_acceptor_pool(Listen,
                   State=#mochiweb_socket_server{acceptor_pool=Pool,
@@ -271,15 +265,8 @@ handle_cast(stop, State) ->
 
 terminate(Reason, State) when ?is_old_state(State) ->
     terminate(Reason, upgrade_state(State));
-terminate(_Reason, #mochiweb_socket_server{listen=Listen, port=Port}) ->
-    mochiweb_socket:close(Listen),
-    case Port < 1024 of
-        true ->
-            catch fdsrv:stop(),
-            ok;
-        false ->
-            ok
-    end.
+terminate(_Reason, #mochiweb_socket_server{listen=Listen}) ->
+    mochiweb_socket:close(Listen).
 
 code_change(_OldVsn, State, _Extra) ->
     State.
@@ -337,8 +324,8 @@ handle_info(Info, State) ->
 %%
 %% Tests
 %%
--include_lib("eunit/include/eunit.hrl").
 -ifdef(TEST).
+-include_lib("eunit/include/eunit.hrl").
 
 upgrade_state_test() ->
     OldState = {mochiweb_socket_server,
@@ -361,4 +348,3 @@ upgrade_state_test() ->
     ?assertEqual(CmpState, State).
 
 -endif.
-

http://git-wip-us.apache.org/repos/asf/couchdb-mochiweb/blob/11e1522f/mochiweb_util.erl
----------------------------------------------------------------------
diff --git a/mochiweb_util.erl b/mochiweb_util.erl
index 6b88818..4d39990 100644
--- a/mochiweb_util.erl
+++ b/mochiweb_util.erl
@@ -9,7 +9,7 @@
 -export([path_split/1]).
 -export([urlsplit/1, urlsplit_path/1, urlunsplit/1, urlunsplit_path/1]).
 -export([guess_mime/1, parse_header/1]).
--export([shell_quote/1, cmd/1, cmd_string/1, cmd_port/2, cmd_status/1]).
+-export([shell_quote/1, cmd/1, cmd_string/1, cmd_port/2, cmd_status/1, cmd_status/2]).
 -export([record_to_proplist/2, record_to_proplist/3]).
 -export([safe_relative_path/1, partition/2]).
 -export([parse_qvalues/1, pick_accepted_encodings/3]).
@@ -124,11 +124,17 @@ cmd_string(Argv) ->
     string:join([shell_quote(X) || X <- Argv], " ").
 
 %% @spec cmd_status([string()]) -> {ExitStatus::integer(), Stdout::binary()}
-%% @doc Accumulate the output and exit status from the given application, will be
-%%      spawned with cmd_port/2.
+%% @doc Accumulate the output and exit status from the given application,
+%%      will be spawned with cmd_port/2.
 cmd_status(Argv) ->
+    cmd_status(Argv, []).
+
+%% @spec cmd_status([string()], [atom()]) -> {ExitStatus::integer(), Stdout::binary()}
+%% @doc Accumulate the output and exit status from the given application,
+%%      will be spawned with cmd_port/2.
+cmd_status(Argv, Options) ->
     Port = cmd_port(Argv, [exit_status, stderr_to_stdout,
-                           use_stdio, binary]),
+                           use_stdio, binary | Options]),
     try cmd_loop(Port, [])
     after catch port_close(Port)
     end.
@@ -578,8 +584,8 @@ make_io(Io) when is_list(Io); is_binary(Io) ->
 %%
 %% Tests
 %%
--include_lib("eunit/include/eunit.hrl").
 -ifdef(TEST).
+-include_lib("eunit/include/eunit.hrl").
 
 make_io_test() ->
     ?assertEqual(

http://git-wip-us.apache.org/repos/asf/couchdb-mochiweb/blob/11e1522f/reloader.erl
----------------------------------------------------------------------
diff --git a/reloader.erl b/reloader.erl
index c0f5de8..8266b33 100644
--- a/reloader.erl
+++ b/reloader.erl
@@ -59,7 +59,7 @@ handle_cast(_Req, State) ->
 %% @doc gen_server callback.
 handle_info(doit, State) ->
     Now = stamp(),
-    doit(State#state.last, Now),
+    _ = doit(State#state.last, Now),
     {noreply, State#state{last = Now}};
 handle_info(_Info, State) ->
     {noreply, State}.
@@ -156,6 +156,6 @@ stamp() ->
 %%
 %% Tests
 %%
--include_lib("eunit/include/eunit.hrl").
 -ifdef(TEST).
+-include_lib("eunit/include/eunit.hrl").
 -endif.