我相信我有一个普遍的Perl问题,而不是LWP :: UserAgent问题......但它有点复杂。
任务是编写一个执行SWORD存款的测试脚本。
我通过首先编写代码来证明事情是有效的,然后添加Test::More
包装器来进行测试来创建测试。
背景
SWORD存款只是一个带有一堆已定义标题的http发布请求,而正文的内容是要被摄取的内容。这一切都很好,我可以通过CURL执行操作,并且我已经编写了脚本来执行此操作....但是在一个更大的应用程序环境中(那将是EPrints。)
CODE
我相信,当我尝试在磁盘上附加文件内容时,我的问题就出现了。
#!/home/cpan/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
##use WWW::Mechanize;
use File::Slurp;
use MIME::Base64;
my $auth = 'username:password';
my $domain = 'devel.example.com';
my $ua = LWP::UserAgent->new();
my $basedir = "./test_files";
my $package = 'http://opendepot.org/europePMC/2.0';
my $filename = "$basedir/PMC165035.zip";
my $mime = 'application/zip';
print "filename: $filename\n";
my $deposit_url = $domain . '/sword-app/deposit/archive';
my $file = read_file( $filename, { binmode => ':raw' } );
# Set up the SWORD deposit
my $autho = "Basic " . MIME::Base64::encode( $auth, '' );
my %headers = (
'X-Packaging' => $package,
'X-No-Op' => 'false',
'X-Verbose' => 'true',
'Content-Disposition' => "filename=$filename",
'Content-Type' => $mime,
'User-Agent' => 'Broker Test Harness',
'Authorization' => $autho,
);
my $r = $ua->post( $deposit_url, %headers, Content => $file );
# DEBUG TEST
write_file('foo.zip', $file);
my $ret = $r->decoded_content;
print "Content: $ret\n";
if ( $r->is_success ) { print "Deposited $package successfully" }
什么工作,什么是
这段代码几乎直接取决于我的工作代码 - 唯一的区别是工作代码通过EPrints中的对象调用获取$file
的内容。
我知道磁盘上存在该文件,如果我打印了文件名ls -l
,我可以看到该文件,并且可读
在上面的代码中,有一行write_file('foo.zip', $file);
- 写一个unzip -l foo.zip
愉快地告诉我其中有3个文件的文件。
行print "Content: $ret\n";
应该打印 atom 响应 - 对我来说,它什么都不打印....
访问日志报告错误500,但错误日志中已经蹲下了。
帮助
我需要知道的是如何将.zip文件的实际内容放入LWP :: UserAgent帖子请求的content
部分......
(我将花费大量时间不去挖掘EPrints,追踪错误500来自何处,以及为什么日志文件中没有出现任何内容......但是那些' s可能会遇到“发布”
的问题答案 0 :(得分:1)
解决方案在于实现LWP POST正在做什么。
my $filename = "$basedir/PMC165035.zip";
my $file = read_file( $filename, { binmode => ':raw' } );
my %headers = (
'X-Packaging' => $package,
'X-No-Op' => 'false',
'X-Verbose' => 'true',
'Content-Disposition' => "filename=$filename",
'Content-Type' => $mime,
'User-Agent' => 'Broker Test Harness',
'Authorization' => $autho,
);
所有工作都是将$filename
设置为/home/services/foo/testing/test_files/PMC165035.zip
,并将此(完整)文件名传递给服务器 example.com 。
问题是服务器正在查找文件名,而不是文件名与路径...所以当服务通过将内容转储到其临时上载中来处理文件时位置,然后查找~~~temp_location/home/services/foo/testing/test_files/PMC165035.zip
,它无法找到它!
解决方法是读入文件,但确保标题中给出的文件名只是文件名,而不是 with-a-path