【问题标题】:Force http proxy use with module that already uses LWP::UserAgent?对已经使用 LWP::UserAgent 的模块强制使用 http 代理?
【发布时间】:2019-07-03 19:31:02
【问题描述】:

我想将代理服务器与第三方 SDK 结合使用,但 SDK 在内部使用 LWP::UserAgent,并且未在其 API 中公开任何代理设置。我尝试设置适当的环境变量,但模块似乎无法识别它。有没有办法解决这个问题(不修改模块本身)?

$ENV{HTTPS_PROXY} = 'http://$proxyip:$proxyport';

my $s = NaServer->new ($filer, 1, 20);
$s->set_style(LOGIN);
$s->set_transport_type(HTTPS);
$s->set_server_type(FILER);
$s->set_port(443);
$s->set_admin_user($user, $pass);
$s->env_proxy;

[john0839@478261-apps ~]$ ./netapp_command_proxy.pl filerip myuser mypass 在 netapp-manageability-sdk-9.4/lib/perl/NetApp/OntapClusterAPI.pm 第 109445 行中找不到 API env-proxy 的定义。

【问题讨论】:

  • 尝试查找源代码中是否有类似$s->ua 的lwp ua 对象或类似的东西,这可能是您唯一的机会或查看LWP::UA 如何与此组件一起使用的文档

标签: perl


【解决方案1】:

您已经确定需要在 UserAgent 对象上调用 env_proxy()。但似乎NaServer 不是LWP::UserAgent 的子类,因此您不能像在示例代码中尝试的那样调用该类的方法。

让我们看看the documentation for LWP::UserAgent 的线索。 section for new() 有一些有趣的文字。

如果未提供env_proxy,则PERL_LWP_ENV_PROXY 环境变量控制是否在初始化期间调用LWP::UserAgent 中的“env_proxy”。

在我看来,此功能正是针对这种情况提供的。如果您无权访问对象的构造函数,则可以使用此环境变量来控制代理的使用。构造函数中的代码如下所示:

my $env_proxy = exists $cnf{env_proxy} ? delete $cnf{env_proxy} : $ENV{PERL_LWP_ENV_PROXY};

然后,

$self->env_proxy if $env_proxy;

所以修复似乎是添加:

$ENV{PERL_LWP_ENV_PROXY} = 1;

到代码的顶部。

(注意,我没有时间测试这个。)

【讨论】:

  • 如果可行,那就太棒了!等我回到办公室去测试。祝大家第四天快乐!
  • @JohnHelms:第四个什么?
  • 抱歉,7 月 4 日。美国人在这里。
  • 好吧,我有一些坏消息要报告。设置该环境变量似乎不会强制使用代理。我在端点上使用 ACL 模拟防火墙配置,并且在没有代理变量的情况下得到相同的 503 错误:
  • @JohnHelms:您使用的是哪个版本的 LWP::UserAgent?自动运行 env_proxy() 的代码是在 6.03 版本中添加的。我从Changes file 获得了该信息。
猜你喜欢
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
  • 2016-06-16
相关资源
最近更新 更多