LINUX.ORG.RU

Как перловым CGI скриптом поймать файл посланный wget-ом методом POST?


0

0

Гугль не вырулил

максимум чего удалось добится: Следующий код сохраняет в массиве @data начало и конец файла, выбрасывая при этом середину

$query = new CGI;

@data = $query->param;

wget дёргал так:

wget --post-file=/etc/inittab http://localhost/cvv/recv_file.cgi

★★★★★

Re: Как перловым CGI скриптом поймать файл посланный wget-ом методом POST?

use strict;
use LWP;
use URI::Escape;

use constant RFC_SEARCH => 'http://www.faqs.org/cgi-bin/rfcsearch';
use constant RFC_REFERER => 'http://www.faqs.org/rfcs/';

die "Usage: rfc_search.pl term1 term2...\n" unless @ARGV;

my $ua = LWP::UserAgent->new;
my $newagent = 'search_rfc/1.0 (' . $ua->agent .')';
$ua->agent($newagent);

my $search_terms = "@ARGV";
my $query_string = uri_escape("query=$search_terms&archive=rfcindex");

my $request = HTTP::Request->new(POST => RFC_SEARCH);
$request->content($query_string);
$request->referer(RFC_REFERER);

my $response = $ua->request($request);
die $response->message unless $response->is_success;

my $content = $response->content;
while ($content =~ /(RFC \d+).*<STRONG>(.+)<\/STRONG>/g) {
print "$1\t$2\n";
}

kto_tama ★★★★★ ()

Re: Как перловым CGI скриптом поймать файл посланный wget-ом методом POST?

насколько я понял твой код ты посылаеш файл а мне нужно принять файл посланный чужим приложением

cvv ★★★★★ ()

Re: Как перловым CGI скриптом поймать файл посланный wget-ом методом POST?

посылаю файл я при помощи html кода, т.е. браузера мозиллы или интернет эксплорера, а принимаю на серверной стороне перловым скриптом. Но это lzk протокола httpd. Если для любого вида протокола, то тут надо писать.

vilfred ☆☆ ()

Re: Как перловым CGI скриптом поймать файл посланный wget-ом методом POST?

Проблем с ловлей файлов от браузеров нету. Вопросы возникают при пользовании wget.

он не выставляет header Content-Disposition

cvv ★★★★★ ()

Re: Как перловым CGI скриптом поймать файл посланный wget-ом методом POST?

попробуй введи это: wget --post-file=some_image.gif http://212.152.36.162/cgi-bin/fecam.pl

ибо у меня

[root@observ root]# wget --post-file=/etc/inittab http://212.152.36.162/cgi-bin/fecam.pl
wget: unrecognized option `--post-file=/etc/inittab'
Использование: wget [КЛЮЧ]... [URL]...

Запустите `wget --help' для получения более подробной справки.

а из броузера грузит файлы. соответственно смотреть результат тут:

http://212.152.36.162/fecam/up/

vilfred ☆☆ ()

Re: Как перловым CGI скриптом поймать файл посланный wget-ом методом POST?

bash-3.1# wget -S -d --post-file=/root/13118.jpg http://212.152.36.162/cgi-bin/fecam.pl
Setting --post-file (postfile) to /root/13118.jpg
DEBUG output created by Wget 1.10.2 on linux-gnu.

--14:53:03--  http://212.152.36.162/cgi-bin/fecam.pl
           => `fecam.pl'
Connecting to 212.152.36.162:80... connected.
Created socket 3.
Releasing 0x080841c0 (new refcount 0).
Deleting unused 0x080841c0.

---request begin---
POST /cgi-bin/fecam.pl HTTP/1.0
User-Agent: Wget/1.10.2
Accept: */*
Host: 212.152.36.162
Connection: Keep-Alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 2018

---request end---
[writing POST file /root/13118.jpg ... done]
HTTP request sent, awaiting response... 
---response begin---
HTTP/1.1 302 Found
Date: Thu, 09 Aug 2007 11:55:09 GMT
Server: Apache/2.0.40 (ASPLinux)
Location: http://observ.inetcomm.ru/fecam/up/
Content-Length: 292
Connection: close
Content-Type: text/html; charset=iso-8859-1

---response end---

  HTTP/1.1 302 Found
  Date: Thu, 09 Aug 2007 11:55:09 GMT
  Server: Apache/2.0.40 (ASPLinux)
  Location: http://observ.inetcomm.ru/fecam/up/
  Content-Length: 292
  Connection: close
  Content-Type: text/html; charset=iso-8859-1
Location: http://observ.inetcomm.ru/fecam/up/ [following]
Closed fd 3
--14:53:04--  http://observ.inetcomm.ru/fecam/up/
           => `index.html.5'
Resolving observ.inetcomm.ru... 212.152.36.162
Caching observ.inetcomm.ru => 212.152.36.162
Connecting to observ.inetcomm.ru|212.152.36.162|:80... connected.
Created socket 3.
Releasing 0x08084b50 (new refcount 1).

---request begin---
GET /fecam/up/ HTTP/1.0
User-Agent: Wget/1.10.2
Accept: */*
Host: observ.inetcomm.ru
Connection: Keep-Alive

---request end---
HTTP request sent, awaiting response... 
---response begin---
HTTP/1.1 200 OK
Date: Thu, 09 Aug 2007 11:55:09 GMT
Server: Apache/2.0.40 (ASPLinux)
Content-Length: 707
Connection: close
Content-Type: text/html; charset=koi8-r

---response end---

  HTTP/1.1 200 OK
  Date: Thu, 09 Aug 2007 11:55:09 GMT
  Server: Apache/2.0.40 (ASPLinux)
  Content-Length: 707
  Connection: close
  Content-Type: text/html; charset=koi8-r
Length: 707 [text/html]

100%[======================================================================>] 707           --.--K/s             

Closed fd 3
14:53:04 (17.88 MB/s) - `index.html.5' saved [707/707]

bash-3.1#

cvv ★★★★★ ()

Re: Как перловым CGI скриптом поймать файл посланный wget-ом методом POST?

жесть, чето не хочет... я пытаюсь вот так еще

curl -F upload=@/mnt/data/mnt/work/11_warrior.mp3 -F Upload! http://212.152.36.162/cgi-bin/f.pl

но все равно не хочет =(

vilfred ☆☆ ()

Re: Как перловым CGI скриптом поймать файл посланный wget-ом методом POST?

вобщем при помощи курла файл засылается нормально:

curl -F photo=@/etc/inittab http://localhost/cvv/recv_file.cgi

что-то я начинаю считать что толи wget неправильно формирует POST-запрос толи CGI только частично реализует спецификацию http

cvv ★★★★★ ()

Re: Как перловым CGI скриптом поймать файл посланный wget-ом методом POST?

короче, я поступил вот так, это скрипт отправляющий файл:

#!/usr/bin/perl

use HTTP::Request::Common;
use LWP::UserAgent;
use CGI qw(header -no_debug);
my $URL = $ARGV[1];
my $req = POST $URL,
Content_Type => 'form-data',
Content => [
FILE => [$ARGV[0]], # this file will be uploaded
];
my $res = LWP::UserAgent->new->request($req);
print header, $res->is_success ? $res->content : $res->status_line;

с командной строки запускать его вот так:

perl s.pl rs485-4.2.0.tar http://212.152.36.162/cgi-bin/f.pl

Скрипт, который у меня принимает файл выглядит вот так:

#!/usr/bin/perl -w

$basedir = "/var/www/html/fecam/up1";

use CGI;

my $req = new CGI;
my $file = $req->param("FILE");

if ($file ne "") {
print STDERR "AAAAA\n";
my $fileName = $file;
$fileName =~ s!^.*(\\|\/)!!;
open (OUTFILE, ">$basedir/$fileName");
while (my $bytesread = read($file, my $buffer, 1024)) {
print OUTFILE $buffer;
}
close (OUTFILE);
}

print "Content-type: text/html\n\n";
print "ok";

попробуй ченнить подгрузить и посмотри в директорию http://212.152.36.162/fecam/up1 на предмет подгрузилось ли

vilfred ☆☆ ()

Re: Как перловым CGI скриптом поймать файл посланный wget-ом методом POST?

мнде, а я так и не воткнул как курлом засылать, проще оказалось закачку на перле написать. жесть одним словом

vilfred ☆☆ ()

Re: Как перловым CGI скриптом поймать файл посланный wget-ом методом POST?

>>возможно срывает крышу -F Upload!

>знак вопроса может сорвать крышу башу

извиняюсь, знак восклицания

cvv ★★★★★ ()

Re: Как перловым CGI скриптом поймать файл посланный wget-ом методом POST?

Попробовал, подгрузилось :-)

Мне кажется что, Просто LWP формирует именно такой запрос который ожидает CGI, в отличие от wget.

cvv ★★★★★ ()

Re: Как перловым CGI скриптом поймать файл посланный wget-ом методом POST?

с какой-то стороны это все костыли, т.к. wget and curl - стандартные программы, а свое чегото лабать это конешно можно... А в пакеты multipart-mixed http протокола я ваще боюсь лазить, бо стремно.

vilfred ☆☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.