erlang: Don't use a separate process for http_transport
git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@990996 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/erl/src/thrift_http_transport.erl b/lib/erl/src/thrift_http_transport.erl
index 44f2313..6345af8 100644
--- a/lib/erl/src/thrift_http_transport.erl
+++ b/lib/erl/src/thrift_http_transport.erl
@@ -19,20 +19,11 @@
-module(thrift_http_transport).
--behaviour(gen_server).
-behaviour(thrift_transport).
%% API
-export([new/2, new/3]).
-%% gen_server callbacks
--export([init/1,
- handle_call/3,
- handle_cast/2,
- handle_info/2,
- terminate/2,
- code_change/3]).
-
%% thrift_transport callbacks
-export([write/2, read/2, flush/1, close/1]).
@@ -46,13 +37,6 @@
-type state() :: pid().
-include("thrift_transport_impl.hrl").
-%%====================================================================
-%% API
-%%====================================================================
-%%--------------------------------------------------------------------
-%% Function: new() -> {ok, Transport} | ignore | {error,Error}
-%% Description: Starts the server
-%%--------------------------------------------------------------------
new(Host, Path) ->
new(Host, Path, _Options = []).
@@ -62,54 +46,6 @@
%% {extra_headers, ExtraHeaders} = List of extra HTTP headers
%%--------------------------------------------------------------------
new(Host, Path, Options) ->
- case gen_server:start_link(?MODULE, {Host, Path, Options}, []) of
- {ok, Pid} ->
- thrift_transport:new(?MODULE, Pid);
- Else ->
- Else
- end.
-
-%%--------------------------------------------------------------------
-%% Function: write(Transport, Data) -> ok
-%%
-%% Data = iolist()
-%%
-%% Description: Writes data into the buffer
-%%--------------------------------------------------------------------
-write(Transport, Data) ->
- {Transport, gen_server:call(Transport, {write, Data})}.
-
-%%--------------------------------------------------------------------
-%% Function: flush(Transport) -> ok
-%%
-%% Description: Flushes the buffer, making a request
-%%--------------------------------------------------------------------
-flush(Transport) ->
- {Transport, gen_server:call(Transport, flush)}.
-
-%%--------------------------------------------------------------------
-%% Function: close(Transport) -> ok
-%%
-%% Description: Closes the transport
-%%--------------------------------------------------------------------
-close(Transport) ->
- {Transport, gen_server:cast(Transport, close)}.
-
-%%--------------------------------------------------------------------
-%% Function: Read(Transport, Len) -> {ok, Data}
-%%
-%% Data = binary()
-%%
-%% Description: Reads data through from the wrapped transoprt
-%%--------------------------------------------------------------------
-read(Transport, Len) when is_integer(Len) ->
- {Transport, gen_server:call(Transport, {read, Len})}.
-
-%%====================================================================
-%% gen_server callbacks
-%%====================================================================
-
-init({Host, Path, Options}) ->
State1 = #http_transport{host = Host,
path = Path,
read_buffer = [],
@@ -129,50 +65,17 @@
end,
case lists:foldl(ApplyOption, State1, Options) of
State2 = #http_transport{} ->
- {ok, State2};
+ thrift_transport:new(?MODULE, State2);
Else ->
- {stop, Else}
+ {error, Else}
end.
-handle_call({write, Data}, _From, State = #http_transport{write_buffer = WBuf}) ->
- {reply, ok, State#http_transport{write_buffer = [WBuf, Data]}};
+%% Writes data into the buffer
+write(State = #http_transport{write_buffer = WBuf}, Data) ->
+ {State#http_transport{write_buffer = [WBuf, Data]}, ok}.
-handle_call({read, Len}, _From, State = #http_transport{read_buffer = RBuf}) ->
- %% Pull off Give bytes, return them to the user, leave the rest in the buffer.
- Give = min(iolist_size(RBuf), Len),
- case iolist_to_binary(RBuf) of
- <<Data:Give/binary, RBuf1/binary>> ->
- Response = {ok, Data},
- State1 = State#http_transport{read_buffer=RBuf1},
- {reply, Response, State1};
- _ ->
- {reply, {error, 'EOF'}, State}
- end;
-
-handle_call(flush, _From, State) ->
- {Response, State1} = do_flush(State),
- {reply, Response, State1}.
-
-handle_cast(close, State) ->
- {_, State1} = do_flush(State),
- {stop, normal, State1};
-
-handle_cast(_Msg, State=#http_transport{}) ->
- {noreply, State}.
-
-handle_info(_Info, State) ->
- {noreply, State}.
-
-terminate(_Reason, _State) ->
- ok.
-
-code_change(_OldVsn, State, _Extra) ->
- {ok, State}.
-
-%%--------------------------------------------------------------------
-%%% Internal functions
-%%--------------------------------------------------------------------
-do_flush(State = #http_transport{host = Host,
+%% Flushes the buffer, making a request
+flush(State = #http_transport{host = Host,
path = Path,
read_buffer = Rbuf,
write_buffer = Wbuf,
@@ -181,7 +84,7 @@
case iolist_to_binary(Wbuf) of
<<>> ->
%% Don't bother flushing empty buffers.
- {ok, State};
+ {State, ok};
WBinary ->
{ok, {{_Version, 200, _ReasonPhrase}, _Headers, Body}} =
http:request(post,
@@ -194,7 +97,22 @@
State1 = State#http_transport{read_buffer = [Rbuf, Body],
write_buffer = []},
- {ok, State1}
+ {State1, ok}
+ end.
+
+close(State) ->
+ {State, ok}.
+
+read(State = #http_transport{read_buffer = RBuf}, Len) when is_integer(Len) ->
+ %% Pull off Give bytes, return them to the user, leave the rest in the buffer.
+ Give = min(iolist_size(RBuf), Len),
+ case iolist_to_binary(RBuf) of
+ <<Data:Give/binary, RBuf1/binary>> ->
+ Response = {ok, Data},
+ State1 = State#http_transport{read_buffer=RBuf1},
+ {State1, Response};
+ _ ->
+ {State, {error, 'EOF'}}
end.
min(A,B) when A<B -> A;