将.zip文件添加到LWP :: UserAgent POST请求的正文中

时间:2014-03-14 08:43:51

标签: perl lwp-useragent

我相信我有一个普遍的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可能会遇到“发布

的问题

1 个答案:

答案 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