小编xen*_*ide的帖子

使用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 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万
查看次数

有没有一种方法可以只为yarn2 monorepo中的一个包安装依赖项?

要对yarn 2推荐的所有软件包进行yarn不可变安装yarn workspaces focus --production --all,有没有一种方法可以只对一个工作区执行此操作?原因是我不想将所有依赖项安装到不同应用程序的 docker 容器中。

yarn-workspaces yarnpkg-v2

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

在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
查看次数

为Moose应用程序构建插件系统的最佳选择是什么?

我想编写一个可以通过插件扩展的应用程序,使用Perl和Moose.我知道有一些用于编写插件的Moose模块,我知道还有其他方法.

我有什么选择?我应该怎么知道他们?在实现插件系统之前我应该​​考虑什么?

perl moose

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

为什么我们使用Catalyst的Context对象?它的目的是什么?

我以为我真的不明白为什么催化剂中的所有东西都使用了上下文对象.似乎一切都从一开始

my ( $self, $c ) = @_;
Run Code Online (Sandbox Code Playgroud)

我们用催化剂模型包装DBIC并最终得到

$c->model('DBIC::Table') ...
Run Code Online (Sandbox Code Playgroud)

或许我们这样做

$c->log->warn('foo');
Run Code Online (Sandbox Code Playgroud)

但我不明白为什么我们不这样做

log('warn', 'foo'); # or whatever the API for some log library is.
Run Code Online (Sandbox Code Playgroud)

为什么我们通过上下文对象做所有事情?是什么让它与众不同?

perl catalyst

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

如何为 Moose 中的属性提供备用 init arg?

init_arg我当然知道我可以通过设置(例如)重命名属性的 init arg

package Test {
    use Moose;
    has attr => (
       is => 'ro',
       isa => 'Str',
       init_arg => 'attribute'
    );
}
Run Code Online (Sandbox Code Playgroud)

这将使我能够

Test->new({ attribute => 'foo' });
Run Code Online (Sandbox Code Playgroud)

但不是

Test->new({ attr => 'foo' });
Run Code Online (Sandbox Code Playgroud)

同时

MooseX::Aliases实际上有这种行为,但创建别名也会创建访问器。我目前正在尝试理解该模块中的代码,看看我是否无法确定它是如何实现的,以便我可以复制所述功能(以我理解的方式)。如果有人可以在这里用一个例子解释如何做到这一点,那就太好了。

更新看起来 MX::Aliases 是通过替换实际传递给构造函数的方式来做到这一点的,around initialize_instance_slot但我仍然不确定它实际上是如何被调用的,因为在我的测试代码中,我的周围实际上并没有被执行。

update munging inBUILDARGS并不是真正的选项,因为我试图做的事情是允许通过我通过Meta Recipe3添加到属性的标签名称来设置访问器。你可能会说我在做

has attr => (
   is => 'ro',
   isa => 'Str',
   alt_init_arg => 'attribute'
);
Run Code Online (Sandbox Code Playgroud)

更新

这是我到目前为止所尝试做的事情。

use 5.014;
use warnings;

package MooseX::Meta::Attribute::Trait::OtherName {
    use …
Run Code Online (Sandbox Code Playgroud)

perl moose

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

测试集合的顺序

给定一个对象列表,我想测试它们是否以正确的顺序返回,但我不想断言整个对象。

例如,我想验证它们是否按顺序排列

id 1, 
id 2,
id 3,
Run Code Online (Sandbox Code Playgroud)

或者在另一种情况下

date mostRecent
date older
date oldest
Run Code Online (Sandbox Code Playgroud)

或者在另一种情况下

enum ValueA
enum ValueB
enum ValueC
Run Code Online (Sandbox Code Playgroud)

基本上我想测试我指定的排序是否正确通过,但对象上只有一个属性实际上会影响这一点,所以我想用某些变体来指定我的测试hasFirstItem( withPropertyEqualTo ... has secondItem( withPropertyEqualTo

我知道我可以写

 assertEquals( property, list.get(0).id )
 assertEquals( property, list.get(1).id )
Run Code Online (Sandbox Code Playgroud)

但我宁愿做一些事情,使失败更加明显,因为这是一个排序问题,也许是声明性的,立即测试整个集合。这可能吗?

java junit unit-testing hamcrest junit4

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

为什么我不能在使用browserify的循环中要求(...)?

这有效

require( './AppCtrl' );
Run Code Online (Sandbox Code Playgroud)

但如果我这样做

[ './AppCtrl' ].forEach( function( name ) {
    require( name );
});
Run Code Online (Sandbox Code Playgroud)

它会导致错误

_prelude.js:1 Uncaught Error: Cannot find module './AppCtrl's @  _prelude.js:1s @ _prelude.js:1(anonymous function) @ _prelude.js:1(anonymous function) @ index.js:48 @ index.js:3s @ _prelude.js:1(anonymous function) @ _prelude.js:11../config @ app.js:22s @ _prelude.js:1e @ _prelude.js:1(anonymous function) @ _prelude.js:1
 angular.js:12416 Error: [ng:areq] Argument 'AppCtrl' is not a function, got undefined
 http://errors.angularjs.org/1.4.5/ng/areq?p0=AppCtrl&p1=not%20a%20function%2C%20got%20undefined
at REGEX_STRING_REGEXP (angular.js:68)
at assertArg (angular.js:1795)
at assertArgFn (angular.js:1805)
at angular.js:9069
at setupControllers (angular.js:8133)
at nodeLinkFn (angular.js:8173)
at …
Run Code Online (Sandbox Code Playgroud)

javascript browserify

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

如何在Gradle中为测试禁用Checkstyle规则?

使用Maven我禁用了checkstyle进行测试,如何禁用checkstyleTestgradle中的任务?

我已经尝试过这些变化

checkstyle {
  toolVersion = '6.10.1'
  exclude '**/*Test.java'
}
checkstyleTest {
   sourceSets = []
}
Run Code Online (Sandbox Code Playgroud)

都以错误告终

checkstyle gradle

5
推荐指数
3
解决办法
8022
查看次数