diff options
author | Nick Vatamaniuc <vatamane@apache.org> | 2021-06-30 03:32:39 -0400 |
---|---|---|
committer | Nick Vatamaniuc <nickva@users.noreply.github.com> | 2021-06-30 12:46:05 -0400 |
commit | cf71d00cb4b41da5527230d62b63e714c7777cf2 (patch) | |
tree | d54e6a49e5530d83a9e0d1c6580466d9611d7252 | |
parent | f78162743e5455984e276e94b7566a6d02808a43 (diff) | |
download | couchdb-cf71d00cb4b41da5527230d62b63e714c7777cf2.tar.gz |
Use correct socks5 proxy ibrowse options
This is a port of the 3.x PR https://github.com/apache/couchdb/pull/3634 to main
-rw-r--r-- | src/couch_replicator/src/couch_replicator_api_wrap.erl | 14 | ||||
-rw-r--r-- | src/couch_replicator/test/eunit/couch_replicator_proxy_tests.erl | 34 |
2 files changed, 47 insertions, 1 deletions
diff --git a/src/couch_replicator/src/couch_replicator_api_wrap.erl b/src/couch_replicator/src/couch_replicator_api_wrap.erl index f182ecd10..2fa9feb20 100644 --- a/src/couch_replicator/src/couch_replicator_api_wrap.erl +++ b/src/couch_replicator/src/couch_replicator_api_wrap.erl @@ -1035,6 +1035,10 @@ db_from_json(#{} = DbMap) -> [], Headers0 ), + Socks5 = case maps:get(<<"proxy_protocol">>, IBrowseOptions0, undefined) of + <<"socks5">> -> true; + _ -> false + end, IBrowseOptions = maps:fold( fun (<<"socket_options">>, #{} = SockOpts, Acc) -> @@ -1043,6 +1047,16 @@ db_from_json(#{} = DbMap) -> (<<"ssl_options">>, #{} = SslOpts, Acc) -> SslOptsKVs = maps:fold(fun ssl_opts_fold/3, [], SslOpts), [{ssl_options, SslOptsKVs} | Acc]; + (<<"proxy_protocol">>, _Val, Acc) -> + Acc; + (<<"proxy_host">>, Val, Acc) when Socks5, is_binary(Val) -> + [{socks5_host, binary_to_list(Val)} | Acc]; + (<<"proxy_port">>, Val, Acc) when Socks5, is_integer(Val) -> + [{socks5_port, Val} | Acc]; + (<<"proxy_user">>, Val, Acc) when Socks5, is_binary(Val) -> + [{socks5_user, binary_to_list(Val)} | Acc]; + (<<"proxy_password">>, Val, Acc) when Socks5, is_binary(Val) -> + [{socks5_password, binary_to_list(Val)} | Acc]; (K, V, Acc) when is_binary(V) -> [{binary_to_atom(K, utf8), binary_to_list(V)} | Acc]; (K, V, Acc) -> diff --git a/src/couch_replicator/test/eunit/couch_replicator_proxy_tests.erl b/src/couch_replicator/test/eunit/couch_replicator_proxy_tests.erl index 8cbaf151c..fdfb57929 100644 --- a/src/couch_replicator/test/eunit/couch_replicator_proxy_tests.erl +++ b/src/couch_replicator/test/eunit/couch_replicator_proxy_tests.erl @@ -14,6 +14,7 @@ -include_lib("couch/include/couch_eunit.hrl"). -include_lib("couch_replicator/src/couch_replicator.hrl"). +-include_lib("couch_replicator/include/couch_replicator_api_wrap.hrl"). -include_lib("fabric/test/fabric2_test.hrl"). replicator_proxy_test_() -> @@ -28,7 +29,8 @@ replicator_proxy_test_() -> ?TDEF(parse_rep_doc_with_proxy), ?TDEF(parse_rep_source_target_proxy), ?TDEF(mutually_exclusive_proxy_and_source_proxy), - ?TDEF(mutually_exclusive_proxy_and_target_proxy) + ?TDEF(mutually_exclusive_proxy_and_target_proxy), + ?TDEF(sock5_proxy_in_db_from_json) ]) } }. @@ -100,3 +102,33 @@ mutually_exclusive_proxy_and_target_proxy(_) -> {bad_rep_doc, _}, couch_replicator_parse:parse_rep_doc(ProxyDoc) ). + +sock5_proxy_in_db_from_json(_) -> + SrcProxyURL = <<"socks5://u1:p1@mysrcproxy.com:1234">>, + TgtProxyURL = <<"http://u2:p2@mytgtproxy.com:9999">>, + ProxyDoc = + {[ + {<<"source">>, <<"http://unproxied.com">>}, + {<<"target">>, <<"http://otherunproxied.com">>}, + {<<"source_proxy">>, SrcProxyURL}, + {<<"target_proxy">>, TgtProxyURL} + ]}, + Rep = couch_replicator_parse:parse_rep_doc(ProxyDoc), + Src = maps:get(?SOURCE, Rep), + Tgt = maps:get(?TARGET, Rep), + ?assertEqual(SrcProxyURL, maps:get(<<"proxy_url">>, Src)), + ?assertEqual(TgtProxyURL, maps:get(<<"proxy_url">>, Tgt)), + SrcHttpDb = couch_replicator_api_wrap:db_from_json(Src), + TgtHttpDb = couch_replicator_api_wrap:db_from_json(Tgt), + SrcOpts = SrcHttpDb#httpdb.ibrowse_options, + TgtOpts = TgtHttpDb#httpdb.ibrowse_options, + ?assertEqual(undefined, couch_util:get_value(proxy_protocol, SrcOpts)), + ?assertEqual(undefined, couch_util:get_value(proxy_protocol, TgtOpts)), + ?assertEqual("mysrcproxy.com", couch_util:get_value(socks5_host, SrcOpts)), + ?assertEqual("mytgtproxy.com", couch_util:get_value(proxy_host, TgtOpts)), + ?assertEqual(1234, couch_util:get_value(socks5_port, SrcOpts)), + ?assertEqual(9999, couch_util:get_value(proxy_port, TgtOpts)), + ?assertEqual("u1", couch_util:get_value(socks5_user, SrcOpts)), + ?assertEqual("u2", couch_util:get_value(proxy_user, TgtOpts)), + ?assertEqual("p1", couch_util:get_value(socks5_password, SrcOpts)), + ?assertEqual("p2", couch_util:get_value(proxy_password, TgtOpts)). |