2014-03-14 56 views
1

我相信我有一個普通的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來自何處,以及爲什麼沒有出現在日誌文件中......但是這可能會降低到與已發生的問題有關的問題已發佈

+0

沒有協議(HTTP'://')在'$ deposit_url'開始時 – Borodin

+1

你在'write_file'的調用中還需要'binmode =>':raw'' – Borodin

+0

最好使用'unzip -t foo.zip'來驗證你的zip文件。另外,如果你只是複製一個zip文件到另一個,那麼爲什麼不使用'File :: Copy? – Borodin

回答

1

The solu重點在於實現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,它找不到它!

的解決方案是在該文件中讀取,但保證在頭信息中給出的文件名是不僅是文件名,而不是與-A-路徑

相關問題