Как отключить или удалить параметр прокси в профиле по умолчанию клиента Erlang httpc после его установки?

Прокси изначально не установлен и отображается как неопределенный:

httpc:get_options(all).
{ok,[{proxy,{undefined,[]}},
     {https_proxy,{undefined,[]}},
     {pipeline_timeout,0},
     {max_pipeline_length,2},
     {max_keep_alive_length,5},
     {keep_alive_timeout,120000},
     {max_sessions,2},
     {cookies,disabled},
     {verbose,false},
     {ipfamily,inet},
     {ip,default},
     {port,default},
     {socket_opts,[]},
     {unix_socket,undefined}]}

Я могу установить параметр прокси без проблем:

httpc:set_options([{proxy, {{"www-proxy.mycompany.com", 8000},["localhost"]}}]).

Как отключить прокси обратно не undefined (или без прокси), когда он не нужен? Я старался:

httpc:set_options([{proxy,{undefined, []}}]).
But it throws an exception:
** exception throw: {error,{bad_option,proxy,{undefined,[]}}}
     in function  httpc:bad_option/2 (httpc.erl, line 1102)
     in call from httpc:validate_options/2 (httpc.erl, line 932)
     in call from httpc:validate_options/1 (httpc.erl, line 922)
     in call from httpc:set_options/2 (httpc.erl, line 236)

Что я делаю не так?


person casillic    schedule 05.03.2019    source источник
comment
Ну, я думаю, я всегда мог просто использовать: exit(whereis(httpc_manager), kill). И пусть надзиратель сделает новый. Но надеялся найти способ очистить информацию о прокси, не прибегая к ее уничтожению.   -  person casillic    schedule 06.03.2019


Ответы (1)


Что вы делаете неправильно, так это формат аргумента, который вы передаете функции. Правильный формат

httpc:set_options([{proxy, {{"", 0},[]}}]).

Теперь прокси-хост будет "":0. Но не знаю, приемлемо ли это для вашей задачи.

Ответ на комментарий: Попробуйте установить опцию «прокси» непосредственно для http_manager, а не убивать его:

httpc_manager:set_options([{proxy,{undefined, []}}],httpc_manager).

Посмотрите на оболочку erlang:

1> inets:start().
ok
2> httpc:set_options([{proxy, {{"www-proxy.mycompany.com", 8000},["localhost"]}}]).
ok
3> httpc:get_options(all).
{ok,[{proxy,{{"www-proxy.mycompany.com",8000},
             ["localhost"]}},
     {https_proxy,{undefined,[]}},
     {pipeline_timeout,0},
     {max_pipeline_length,2},
     {max_keep_alive_length,5},
     {keep_alive_timeout,120000},
     {max_sessions,2},
     {cookies,disabled},
     {verbose,false},
     {ipfamily,inet},
     {ip,default},
     {port,default},
     {socket_opts,[]},
     {unix_socket,undefined}]}
4> httpc_manager:set_options([{proxy,{undefined, []}}],httpc_manager).
ok
5> httpc:get_options(all).                                            
{ok,[{proxy,{undefined,[]}},
     {https_proxy,{undefined,[]}},
     {pipeline_timeout,0},
     {max_pipeline_length,2},
     {max_keep_alive_length,5},
     {keep_alive_timeout,120000},
     {max_sessions,2},
     {cookies,disabled},
     {verbose,false},
     {ipfamily,inet},
     {ip,default},
     {port,default},
     {socket_opts,[]},
     {unix_socket,undefined}]}
person Alexei K    schedule 06.03.2019
comment
Да, глядя на код, они ищут {{::list(), ::non_neg_integer()}, ::list()}, как вы указываете. Но не уверен, что это предложение работает. Это эквивалентно отсутствию прокси-сервера? Он может попытаться направить в никуда. Я попробую, и мы посмотрим, что произойдет. Скоро сообщим. - person casillic; 07.03.2019
comment
Это не сработало. Единственный обходной путь, который я нашел, - это убить менеджера httpc с помощью exit(whereis(httpc_manager),kill), когда мне нужен сброс прокси. Что начинается с неопределенных настроек прокси. - person casillic; 07.03.2019
comment
Я добавляю к моему ответу другое решение. Это работает сейчас? - person Alexei K; 09.03.2019
comment
Да, это сработало! Мне также пришлось добавить сброс для https_proxy. например httpc_manager:set_options([{https_proxy,{undefined, []}}],httpc_manager). - person casillic; 09.03.2019