我相信我有一個普通的Perl問題,而不是LWP :: UserAgent問題......但它有點複雜。添加一個.zip文件到LWP :: UserAgent POST請求的主體
任務是編寫一個測試腳本,該測試腳本確實存儲了一個SWORD。 我通過首先編寫代碼來創建測試來證明這件事情有效,然後在Test::More
中添加包裝以使其成爲測試。
背景
劍存款是簡單的HTTP POST請求與一羣定義首部,和主體是所述事的內容被攝入。這一切工作正常,我可以通過捲曲執行的操作,和我寫的腳本來做到這一點....但AA更大的應用程序環境中(那將是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" }
什麼可行,什麼不可行
這段代碼是從工作中我有解除非常直接 - 唯一不同的是,工作代碼通過一種對象 - 將獲取$file
內容在EPrints中調用。
我知道該文件在盤上是否存在,如果我在印刷的文件名做一個ls -l
,看得出該文件,其可讀
在上面的代碼,有一個線write_file('foo.zip', $file);
- 寫入一個其中unzip -l foo.zip
高興告訴我的文件中有3個文件。
線print "Content: $ret\n";
打印一份原子迴應 - 對我來說,不打印輸出.... 訪問日誌報告錯誤500,但有diddly,蹲在錯誤日誌。
幫助
我需要知道的是我怎麼弄的.zip文件的實際內容到LWP :: UserAgent的POST請求的content
部分...
(我要花很多時間不去嘗試挖掘EPrints,跟蹤錯誤500來自何處,以及爲什麼沒有出現在日誌文件中......但是這可能會降低到與已發生的問題有關的問題已發佈)
沒有協議(HTTP'://')在'$ deposit_url'開始時 – Borodin
你在'write_file'的調用中還需要'binmode =>':raw'' – Borodin
最好使用'unzip -t foo.zip'來驗證你的zip文件。另外,如果你只是複製一個zip文件到另一個,那麼爲什麼不使用'File :: Copy? – Borodin