使用Net::Curl::Easy的pushopt设置PROXYHEADER时出现curl未知错误
问题解决:Perl中Net::Curl仅向代理发送自定义头
问题分析
你遇到的问题是:使用Perl的Net::Curl::Easy设置CURLOPT_PROXYHEADER时运行报错,换成HTTPHEADER虽能正常执行,但自定义头会同时发送给代理和目标服务器,不符合仅向代理传递授权信息的需求;而Python的pycurl用PROXYHEADER却能正常工作。
解决方案
问题出在Perl代码中pushopt的使用方式上。Net::Curl::Easy的pushopt用于追加选项值,但CURLOPT_PROXYHEADER需要用setopt来设置完整的头列表,而非追加。修改后的代码如下:
#!/usr/bin/perl -w $| = 1; use Net::Curl::Easy qw(:constants); my $easy = Net::Curl::Easy->new(); $easy->setopt( CURLOPT_URL, "https://checkip.amazonaws.com/" ); $easy->setopt( CURLOPT_VERBOSE, 1 ); $easy->setopt( CURLOPT_PROXY_SSL_VERIFYPEER , 0 ); $easy->setopt(CURLOPT_PROXY_SSL_VERIFYHOST, 0); $easy->setopt(CURLOPT_SSL_VERIFYPEER, 0); $easy->setopt(CURLOPT_USERAGENT, "curl"); $easy->setopt(CURLOPT_PROXY, "http://35.244.25.186:3128"); # 代理地址 $easy->setopt(CURLOPT_HEADER, 1); # 使用setopt而非pushopt设置PROXYHEADER $easy->setopt(CURLOPT_PROXYHEADER, ['username: apikey']); $easy->perform();
原理说明
Net::Curl中,CURLOPT_PROXYHEADER属于设置型选项,需要用setopt直接赋值完整的头数组;pushopt适用于类似CURLOPT_HTTPHEADER这种需要多次追加头的场景,但即使是HTTPHEADER,用setopt也会覆盖原有头列表。CURLOPT_PROXYHEADER的作用是仅将指定头发送给代理服务器,不会传递给目标站点,完全匹配你传递授权信息的需求。
内容的提问来源于stack exchange,提问作者glen danzig
相关产品推荐
相关产品推荐

