标签: lwp

使用LWP,Apache和mod_deflate压缩HTTP请求

我有一个客户端/服务器系统,使用通过使用Perl的LWP的客户端使用HTTP请求和响应传输的XML以及通过Apache运行Perl的CGI.pm的服务器来执行通信.此外,流使用SSL加密,并为服务器和所有客户端提供证书.

该系统运行良好,但客户端需要定期发送大量数据.一个明显的解决方案是压缩客户端上的数据,将其发送出去,然后在服务器上解压缩.而不是这样的实现我自己,我希望能使用Apache的mod_deflate模块的"输入减压"描述这里.

描述警告:

如果您自己评估请求正文,请不要相信Content-Length标头!Content-Length标头反映了来自客户端的传入数据的长度,而不是解压缩数据流的字节数.

因此,如果我提供与压缩数据大小匹配的Content-Length值,则会截断数据.这是因为mod_deflate解压缩了流,但CGI.pm只读取Content-Length限制.

或者,如果我试图超越它并用解压缩的数据大小覆盖Content-Length标头,LWP会抱怨并将值重置为压缩长度,从而给我留下同样的问题.

最后,我试图破解LWP中进行修正的部分.原始代码是:

    # Set (or override) Content-Length header
    my $clen = $request_headers->header('Content-Length');
    if (defined($$content_ref) && length($$content_ref)) {
        $has_content = length($$content_ref);
        if (!defined($clen) || $clen ne $has_content) {
            if (defined $clen) {
                warn "Content-Length header value was wrong, fixed";
                hlist_remove(\@h, 'Content-Length');
            }
            push(@h, 'Content-Length' => $has_content);
        }
    }
    elsif ($clen) {
        warn "Content-Length set when there is no content, fixed";
        hlist_remove(\@h, 'Content-Length');
    }
Run Code Online (Sandbox Code Playgroud)

我把推线改为:

  push(@h, 'Content-Length' => $clen);
Run Code Online (Sandbox Code Playgroud)

不幸的是,这会导致一些问题,即内容(截断或不截断)甚至无法访问我的CGI脚本.

有没有人做过这项工作?我发现在上传之前对文件进行了压缩,但没有压缩通用请求.

apache perl mod-deflate lwp

6
推荐指数
1
解决办法
2421
查看次数

如何在不使用Perl和LWP获取页面的情况下获取最终URL?

我正在使用Perl的LWP 做一些网页抓取.我需要处理一组URL,其中一些可能会重定向(1次或更多次).

如何使用HEAD方法获取解析所有重定向的终极URL?

perl redirect lwp

6
推荐指数
2
解决办法
8095
查看次数

perl Client-SSL-Warning:未验证对等证书

我在使用perl screenscraper到HTTPS站点时遇到问题.在调试中,我运行了以下内容:

print $res->headers_as_string;
Run Code Online (Sandbox Code Playgroud)

在输出中,我有以下行:

Client-SSL-Warning: Peer certificate not verified
Run Code Online (Sandbox Code Playgroud)

有没有办法可以自动接受这个证书,或者这不是问题吗?

#!/usr/bin/perl 
use LWP::UserAgent; 
use Crypt::SSLeay::CTX; 
use Crypt::SSLeay::Conn; 
use Crypt::SSLeay::X509; 
use LWP::Simple qw(get);

my $ua  = LWP::UserAgent->new; 
my $req = HTTP::Request->new(GET => 'https://vzw-cat.sun4.lightsurf.net/vzwcampaignadmin/');
my $res = $ua->request($req);

print $res->headers_as_string;
Run Code Online (Sandbox Code Playgroud)

输出:

Cache-Control: no-cache
Connection: close
Date: Tue, 01 Jun 2010 19:28:08 GMT
Pragma: No-cache
Server: Apache
Content-Type: text/html
Expires: Wed, 31 Dec 1969 16:00:00 PST
Client-Date: Tue, 01 Jun 2010 19:28:09 GMT
Client-Peer: 64.152.68.114:443
Client-Response-Num: 1
Client-SSL-Cert-Issuer: /O=VeriSign Trust Network/OU=VeriSign, Inc./OU=VeriSign …
Run Code Online (Sandbox Code Playgroud)

perl ssl http certificate lwp

6
推荐指数
1
解决办法
2万
查看次数

Perl相当于PHP的get_file_contents()?

以下PHP代码完全符合我的要求.问题是我需要在Perl中重新创建它并且我一直在使用open()sysopen()Perl函数,但不能这样做.有没有人有任何帮助或知道任何可能有帮助的链接?谢谢.

$URL = "http://example.com/api.php?arguments=values";
echo file_get_contents($URL);
Run Code Online (Sandbox Code Playgroud)

php perl get file-get-contents lwp

6
推荐指数
1
解决办法
3828
查看次数

HTTPS代理和LWP :: UserAgent

我已经阅读了很多网站上的一些帖子,但仍然无法完成这项工作.

我有一台运行perl 5.12.4的OpenSSL 0.9.8r客户机(OSX),LWP 6.0.4,更新了Crypt :: SSLeay,Net :: SSL等.我正在尝试连接到HTTPS站点(https:/通过我在Windows VM上运行的WinGate代理,在示例中为/github.com.请注意,我的实际应用程序附加到我无法控制的SSL Web服务.

从Firefox,指向代理一切都是copacetic.页面加载成功,我在代理软件活动监视器中看到了连接.如果我能在Perl中工作,我会很高兴.我从这个Stack Overflow问题的代码开始:如何强制LWP使用Crypt :: SSLeay进行HTTPS请求?并添加了一些调试和额外的输出.我现在站在这里:

#!/usr/bin/perl

use strict;
use warnings;
use Net::SSL (); # From Crypt-SSLeay

BEGIN {
  $Net::HTTPS::HTTPS_SSL_SOCKET_CLASS = "Net::SSL"; # Force use of Net::SSL
  $ENV{HTTPS_PROXY} = 'https://192.168.1.11:80';
#  $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
  $ENV{HTTPS_DEBUG} = 1;  #Add debug output
}

use LWP::UserAgent;
my $ua = LWP::UserAgent->new();
my $req = HTTP::Request->new('GET','https://github.com/');
my $response = $ua->request($req);

print "--\n";
print "$_\n" for grep { $_ =~ /SSL/ …
Run Code Online (Sandbox Code Playgroud)

perl https proxy lwp lwp-useragent

6
推荐指数
1
解决办法
3万
查看次数

通过Perl中的Way2sms自动发送短信

我正在尝试使用Perl LWP通过Way2sms发送短信.登录部分成功,之后我将cookie保存到本地文件.登录后的欢迎页面显示发送短信链接,点击哪一个被重定向到另一个页面,其中有两个用于移动号码和短信文本的输入以及一个用于提交和发送短信的按钮.Firebug显示页面结构,如图所示.从Iframe网址和表单的action属性,我构造了表单操作的绝对URL并相应地提交表单,并将cookie存储在文件中.但是,短信不会被发送.我在这做错了什么?代码如下.(name两个文本输入的属性是正确的,通过观察Firebug中的源代码来获取,尽管图像中未包含该代码)

use LWP::UserAgent;
open f, "> way2sms.txt";
use HTTP::Cookies;
my $cookie_jar = HTTP::Cookies->new(
file => "cookies.txt",
autosave => 1,
);

my $ua = LWP::UserAgent->new(
    agent =>
      'Mozilla/5.0 (X11; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1',
    cookie_jar => $cookie_jar,
);
my $response = $ua->post(
    'http://site2.way2sms.com/contentt/bar/Login1.action',
    {
        username => $user,
        password => $pass,
    }
);

if ( $response->is_redirect ) {
    $response = $ua->get( $response->header('Location') );
    print 5 if $response->decoded_content =~ /Kaustav Mukherjee/i; #prints it, showing that the …
Run Code Online (Sandbox Code Playgroud)

perl lwp lwp-useragent way2sms

6
推荐指数
1
解决办法
4317
查看次数

在Perl中使用不同的出站IP

我们在同一台服务器上运行了几个不同的网站,每个网站都访问1个特定的Web服务,每个网站都有自己独特的API密钥.遗憾的是,Web服务具有基于IP地址(不是API密钥)的每日限制,因此,虽然我们的每个站点都低于其每日限制,但它们超过了IP限制.当通过Web浏览器访问时,每个网站都运行在不同的静态IP地址上,但是当perl脚本在每个网站用户帐户下运行时,它们的出站IP地址是相同的.

我的问题是如何才能使每个perl脚本使用特定站点的正确IP地址,以便每个人都可以保持在Web服务的每日限制内?更简单的说,perl脚本如何使用LWP perl模块更改它正在进行的调用的出站IP地址?解释很好,但代码示例会更好.

在此先感谢您的帮助!

perl ip-address lwp

5
推荐指数
1
解决办法
1586
查看次数

LWP HTTPS GET 连接失败或“证书验证失败”

我昨天在 Perl Monks 上发布了这个问题,但它对尝试过它的每个人都有效(请参阅http://www.perlmonks.org/?node_id=909968)。但是,我使用了不同的 URL,希望能简化问题。

我正在尝试通过 HTTPS 连接到 api.betfair.com,他们拥有我已在浏览器中验证的有效证书。我正在运行 ubuntu 并且有 2 个版本的 Perl。系统一 5.10.0 工作正常,通过 perlbrew 安装的 5.14.0 失败。代码是:

use LWP::UserAgent; 
use strict;
use warnings;

#$ENV{HTTPS_CA_FILE} = "/usr/share/ca-certificates/cacert.org/cacert.org.crt";

my $ua  = LWP::UserAgent->new; 
my $req = HTTP::Request->new(GET => 'https://api.betfair.com');
my $res = $ua->request($req);

print $res->headers_as_string;
print $res->content;
Run Code Online (Sandbox Code Playgroud)

在系统 Perl 5.10.0 下运行它工作正常,我得到:

Date: Fri, 17 Jun 2011 08:33:04 GMT
Accept-Ranges: bytes
ETag: W/"0-1307353787000"
Content-Length: 0
Content-Type: text/html
Last-Modified: Mon, 06 Jun 2011 09:49:47 GMT
Client-Date: Fri, 17 Jun 2011 …
Run Code Online (Sandbox Code Playgroud)

perl https lwp

5
推荐指数
1
解决办法
2万
查看次数

Windows / Perl / Net::SSLeay / OpenSSL:CA 证书从哪些位置加载?

这是一个执行 HTTPS 请求的程序,开头有一些代码,我将在下面解释:

use 5.012;
use LWP::UserAgent;
use HTTP::Request::Common;
use Net::SSLeay;

BEGIN {
    return unless $^O eq 'MSWin32'; # only needed on Windows
    print STDERR "attempting to set HTTPS_CA_FILE to PEM file path\n";
    require Mozilla::CA; # load module to determine PEM file path
    my $pemfile = do {
        my $path = $INC{ 'Mozilla/CA.pm' };
        $path =~ s#\.pm$#/cacert.pem#;
        $path;
    };
    if ( -f $pemfile ) {
        $ENV{HTTPS_CA_FILE} = $pemfile;
        print STDERR "HTTPS_CA_FILE set to $pemfile\n";
    }
    else {
        warn "PEM file …
Run Code Online (Sandbox Code Playgroud)

windows perl openssl ssl-certificate lwp

5
推荐指数
1
解决办法
2676
查看次数

Perl LWP:为什么 IO::Socket::SSL 使用 TLS 1.0,而 Net::SSL 使用 TLS 1.2?

当我运行以下代码时:

use strict;
use warnings;

use IO::Socket::SSL;
use LWP::UserAgent;

my $ua = LWP::UserAgent->new(ssl_opts => {
    verify_hostname => 0,
});

my $res = $ua->get('https://internal.foo.bar.baz:20002');
print $res->as_string;
Run Code Online (Sandbox Code Playgroud)

我从 LWP 收到内部错误:

500 Can't connect to internal.foo.bar.baz:20002 (Bad file descriptor)
Content-Type: text/plain
Client-Date: Fri, 29 Jun 2018 21:23:13 GMT
Client-Warning: Internal response

Can't connect to internal.foo.bar.baz:20002 (Bad file descriptor)

Bad file descriptor at D:/strawberry/perl/site/lib/LWP/Protocol/http.pm line 50.
Run Code Online (Sandbox Code Playgroud)

网络流量显示这是一个“客户端问候”,随后服务器立即重置,并且协议是 TLSv1。服务器仅允许 TLS 1.2 连接,因此这是有道理的。

线鲨1

当我更改代码以指定客户端应使用 TLS 1.2 时,我得到了相同的响应。

my $ua = LWP::UserAgent->new(ssl_opts => {
    verify_hostname …
Run Code Online (Sandbox Code Playgroud)

perl ssl lwp io-socket-ssl

5
推荐指数
1
解决办法
9352
查看次数