From: David Reiss Date: Mon, 30 Aug 2010 22:05:51 +0000 (+0000) Subject: erlang: Don't use a separate process for http_transport X-Git-Tag: 0.5.0~109 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=3a292b444177a63fa127cfb32fae7188d6c8f17d;p=common%2Fthrift.git 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 44f23138..6345af8e 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 @@ new(Host, Path) -> %% {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 @@ init({Host, Path, Options}) -> 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 - <> -> - 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 @@ do_flush(State = #http_transport{host = Host, 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 @@ do_flush(State = #http_transport{host = Host, 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 + <> -> + Response = {ok, Data}, + State1 = State#http_transport{read_buffer=RBuf1}, + {State1, Response}; + _ -> + {State, {error, 'EOF'}} end. min(A,B) when A A;