diff options
author | Péter Dimitrov <[email protected]> | 2018-04-17 11:20:06 +0200 |
---|---|---|
committer | Péter Dimitrov <[email protected]> | 2018-04-17 11:20:06 +0200 |
commit | 46a89739ebe59bb2d2b44639c9ea9869757d4b58 (patch) | |
tree | 3ad94db35d388dd97418647abdd7d0dff18623a5 /lib/inets/src | |
parent | e2dadbf64f36f4f05347d0ef9c22adf350a23365 (diff) | |
parent | 19256441771c191bcc971377e438cfa859246c55 (diff) | |
download | otp-46a89739ebe59bb2d2b44639c9ea9869757d4b58.tar.gz otp-46a89739ebe59bb2d2b44639c9ea9869757d4b58.tar.bz2 otp-46a89739ebe59bb2d2b44639c9ea9869757d4b58.zip |
Merge branch 'maint'
* maint:
inets: Fix broken httpc options handling
Change-Id: I9e44f0e53237a390048cab3aaf52ea0e1a5358a2
Diffstat (limited to 'lib/inets/src')
-rw-r--r-- | lib/inets/src/http_client/httpc_manager.erl | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/lib/inets/src/http_client/httpc_manager.erl b/lib/inets/src/http_client/httpc_manager.erl index 7b8d7875de..c3404dbb37 100644 --- a/lib/inets/src/http_client/httpc_manager.erl +++ b/lib/inets/src/http_client/httpc_manager.erl @@ -750,8 +750,26 @@ handle_request(#request{settings = start_handler(NewRequest#request{headers = NewHeaders}, State), {reply, {ok, NewRequest#request.id}, State}; -handle_request(Request, State = #state{options = Options}) -> +%% Simple socket options handling (ERL-441). +%% +%% TODO: Refactor httpc to enable sending socket options in requests +%% using persistent connections. This workaround opens a new +%% connection for each request with non-empty socket_opts. +handle_request(Request0 = #request{socket_opts = SocketOpts}, + State0 = #state{options = Options0}) + when is_list(SocketOpts) andalso length(SocketOpts) > 0 -> + Request = handle_cookies(generate_request_id(Request0), State0), + Options = convert_options(SocketOpts, Options0), + State = State0#state{options = Options}, + Headers = + (Request#request.headers)#http_request_h{connection + = "close"}, + %% Reset socket_opts to avoid setopts failure. + start_handler(Request#request{headers = Headers, socket_opts = []}, State), + %% Do not change the state + {reply, {ok, Request#request.id}, State0}; +handle_request(Request, State = #state{options = Options}) -> NewRequest = handle_cookies(generate_request_id(Request), State), SessionType = session_type(Options), case select_session(Request#request.method, @@ -775,6 +793,18 @@ handle_request(Request, State = #state{options = Options}) -> {reply, {ok, NewRequest#request.id}, State}. +%% Convert Request options to State options +convert_options([], Options) -> + Options; +convert_options([{ipfamily, Value}|T], Options) -> + convert_options(T, Options#options{ipfamily = Value}); +convert_options([{ip, Value}|T], Options) -> + convert_options(T, Options#options{ip = Value}); +convert_options([{port, Value}|T], Options) -> + convert_options(T, Options#options{port = Value}); +convert_options([Option|T], Options = #options{socket_opts = SocketOpts}) -> + convert_options(T, Options#options{socket_opts = SocketOpts ++ [Option]}). + start_handler(#request{id = Id, from = From} = Request, #state{profile_name = ProfileName, |