This is an automated email from the ASF dual-hosted git repository.

rnewson pushed a commit to branch replicator-ibrowse-options
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit 477123eb3c8aacb00788c4989fd3e64410cd7bbd
Author: Robert Newson <[email protected]>
AuthorDate: Mon Jul 10 16:06:44 2023 +0100

    allow setting of some ibrowse options
---
 .../src/couch_replicator_parse.erl                 | 26 +++++++++++++++++-----
 1 file changed, 21 insertions(+), 5 deletions(-)

diff --git a/src/couch_replicator/src/couch_replicator_parse.erl 
b/src/couch_replicator/src/couch_replicator_parse.erl
index 8184c30ff..18663386f 100644
--- a/src/couch_replicator/src/couch_replicator_parse.erl
+++ b/src/couch_replicator/src/couch_replicator_parse.erl
@@ -34,6 +34,10 @@
     recbuf,
     sndbuf
 ]).
+-define(DEFAULT_IBROWSE_OPTS, []).
+-define(VALID_IBROWSE_OPTS, [
+    prefer_ipv6
+]).
 -define(VALID_PROTOCOLS, #{
     endpoint => [http, https],
     proxy => [http, https, socks5]
@@ -50,6 +54,7 @@ default_options() ->
         {checkpoint_interval, cfg_int("checkpoint_interval", 30000)},
         {use_checkpoints,     cfg_boolean("use_checkpoints", true)},
         {use_bulk_get,        cfg_boolean("use_bulk_get", true)},
+        {ibrowse_options,     cfg_ibrowse_opts()},
         {socket_options,      cfg_sock_opts()}
     ].
 
@@ -196,6 +201,7 @@ parse_rep_db({Props}, Proxy, Options) ->
     {BinHeaders} = get_value(<<"headers">>, Props, {[]}),
     Headers = lists:ukeysort(1, [{?b2l(K), ?b2l(V)} || {K, V} <- BinHeaders]),
     DefaultHeaders = (#httpdb{})#httpdb.headers,
+    IbrowseOptions = get_value(ibrowse_options, Options),
     HttpDb = #httpdb{
         url = Url,
         auth_props = AuthProps,
@@ -204,7 +210,7 @@ parse_rep_db({Props}, Proxy, Options) ->
             1,
             [
                 {socket_options, get_value(socket_options, Options)}
-                | ProxyParams ++ ssl_params(Url)
+                | ProxyParams ++ ssl_params(Url) ++ IbrowseOptions
             ]
         ),
         timeout = get_value(connection_timeout, Options),
@@ -288,14 +294,18 @@ cfg_atoms(Cfg, Default) ->
 
 cfg_sock_opts() ->
     CfgTerm = cfg("socket_options"),
-    parse_sock_opts(CfgTerm, ?DEFAULT_SOCK_OPTS, ?VALID_SOCK_OPTS).
+    parse_opts(CfgTerm, ?DEFAULT_SOCK_OPTS, ?VALID_SOCK_OPTS).
+
+cfg_ibrowse_opts() ->
+    CfgTerm = cfg("ibrowse_options"),
+    parse_opts(CfgTerm, ?DEFAULT_IBROWSE_OPTS, ?VALID_IBROWSE_OPTS).
 
 cfg(Var) ->
     config:get("replicator", Var).
 
-parse_sock_opts(undefined, Defaults, _) ->
+parse_opts(undefined, Defaults, _) ->
     Defaults;
-parse_sock_opts(Term, _Defaults, ValidOpts) ->
+parse_opts(Term, _Defaults, ValidOpts) ->
     SocketOptions =
         case couch_util:parse_term(Term) of
             {ok, Opts} -> Opts;
@@ -306,7 +316,11 @@ parse_sock_opts(Term, _Defaults, ValidOpts) ->
 
 sock_opts(CfgTerm) ->
     ValidOpts = cfg_atoms("valid_socket_options", ?VALID_SOCK_OPTS),
-    parse_sock_opts(CfgTerm, ?DEFAULT_SOCK_OPTS, ValidOpts).
+    parse_opts(CfgTerm, ?DEFAULT_SOCK_OPTS, ValidOpts).
+
+ibrowse_opts(CfgTerm) ->
+    ValidOpts = cfg_atoms("valid_ibrowse_options", ?VALID_IBROWSE_OPTS),
+    parse_opts(CfgTerm, ?DEFAULT_IBROWSE_OPTS, ValidOpts).
 
 -spec convert_options([_]) -> [_].
 convert_options([]) ->
@@ -368,6 +382,8 @@ convert_options([{<<"retries_per_request">>, V} | R]) ->
     [{retries, couch_util:to_integer(V)} | convert_options(R)];
 convert_options([{<<"socket_options">>, V} | R]) ->
     [{socket_options, sock_opts(V)} | convert_options(R)];
+convert_options([{<<"ibrowse_options">>, V} | R]) ->
+    [{ibrowse_options, ibrowse_opts(V)} | convert_options(R)];
 convert_options([{<<"since_seq">>, V} | R]) ->
     [{since_seq, V} | convert_options(R)];
 convert_options([{<<"use_checkpoints">>, V} | R]) ->

Reply via email to