URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1460
[ Назад ]

Исходное сообщение
"HTTP запрос (GET)"

Отправлено BulbaBoy , 05-Мрт-03 23:28 
Как лучше (желательно без модулей)
направить запрос и корректно все получить
У меня проблема с нахождением начала запрашиваемой картинки
"GET /1.gif HTTP/1.0"

Точнее первий раз я все хорошо получаю (и распознаю) а последующие
рази что-то не так - может надо закривать поток или еще что...
Вот взгляните на ето:
------------------------------ CUT -------------------------------------
sub HTTPQuery()
   {
# Ето все с соответствующей библиотеки!!!

    my $socket=IO::Socket::INET->new(
            PeerAddr => (defined $_[0] ? $_[0] : ""),
            PeerPort => (defined $_[1] ? $_[1] : "80"),
            Proto    => "tcp",
            Type     => SOCK_STREAM,
            Timeout  => $cfg_param{$HTTP_TIMEOUT}) || return "";
    $socket->print($_[2]." ".$_[3]." HTTP/".$_[4]."\n\n");
    return \$socket;
   }

sub GetBanner()
   {
    print "Content-type: text/html\n\n";

    my $a2="";
    my  $a3="";
    if ($_[0] =~ /^(?:http:\/\/)?([^:\/\\]*)(?::(\d+))?(\/?[^\\]*)$/)
      {
       if (($fh=${&HTTPQuery($1,$2,"GET",$3,"1.0")}) eq "")
         { return 1; }
       while (<$fh>)
            { $a2.=$_;
              if ($_ =~ m/^[Cc]ontent-[Ll]ength:[\ ]*(\d+)/)
                { ${$_[1]}[0]=$1; }
              if (($_ =~ m/^GIF8[7,9]a/) || ($_ =~ m/^\xFF\xD8/))
                { $q1=1;
                }
              if ($q1)
              { $a3.=$_; }
            }
       $fh2=IO::File->new_tmpfile || return 1;
       $fh2->autoflush(1);

       print $fh2 $a3;
       (${$_[1]}[2], ${$_[1]}[3], ${$_[1]}[4]) = &imgsize($fh2);

# imgsize() - FROM LIBRARY - Работает отлично!!!

       seek($fh2,0,0);
       ${$_[1]}[1] = crc32(*$fh2);
       close($fh);
       return 0;
      }
    else
      {
       return 1; #Error
      }
   }


# MAIN PROGRAM

@fs=('http://192.168.11.4/real.gif','http://192.168.11.4/1.gif','http://192.168.11.4/3.gif');
print "Content-type: text/html\n\n";
foreach $i (@fs)
{
print "Result: [".&GetBanner($i,\@a1)."]\n";
print"Data:[".$a1[0]."-".$a1[1]."-".$a1[2]."-".$a1[3]."-".$a1[4]."]<br>\n";
}
exit 0;

# а вот результати работи :
# Content-type: text/html Result: [0] Data: [4548 - 1291864271 - 42 - 37 # - JPG]
# Content-type: text/html Result: [0] Data: [267 - 2972524420 - - - Data # stream is not a known image file format]
# Content-type: text/html Result: [0] Data: [293 - 2778158077 - - -
# Datas tream is not a known image file format]


буду благодарен за подсказку.


Содержание

Сообщения в этом обсуждении
"RE: HTTP запрос (GET)"
Отправлено BulbaBoy , 06-Мрт-03 04:41 
А вот уже и ответ....

------------------------------ CUT ------------------------------------

use Socket;

sub HTTPQuery()
   {
    unless (socket(HTTP, PF_INET, SOCK_STREAM, getprotobyname('tcp')))
      {
       #print("\n\n\n".(defined $_[0] ? $_[0] : "").":".(defined $_[1] ? $_[1] : "80")." ($!)\n");
       return "";
      }
    select( (select(HTTP), $| = 1)[0] );

    unless (connect(HTTP, sockaddr_in((defined $_[1] ? $_[1] : "80"), inet_aton((defined $_[0] ? $_[0] : "")))))
          {
           #print("\n\n\n".(defined $_[0] ? $_[0] : "").":".(defined $_[1] ? $_[1] : "80")." ($!)\n");
           return "";
          }
    print HTTP $_[2]." ".$_[3]." HTTP/".$_[4]."\nHost: ".(defined $_[0] ? $_[0] : "")."\n\n";
    $answer = <HTTP>;
    ($status, $reason) = ($answer =~ m!HTTP/1.[01] (\d+) (.*)!);
    unless ($status == 200)
          {
           #print("\n\n\n".(defined $_[0] ? $_[0] : "").":".(defined $_[1] ? $_[1] : "80")." ($!)\n");
           return "";
          }
    while (<HTTP>)
         {
          ${$_[5]}=$1 if /^[Cc]ontent-[Ll]ength:[\ ]*(\d+)/;
          last if /^\s*$/;
         }
    return \HTTP;
   }

sub GetBanner()
   {
    print "Content-type: text/html\n\n";

    my $a2="";
    my  $a3="";
    if ($_[0] =~ /^(?:http:\/\/)?([^:\/\\]*)(?::(\d+))?(\/?[^\\]*)$/)
      {
       if (($fh=${&HTTPQuery($1,$2,"GET",$3,"1.0",\${$_[1]}[0])}) eq "")
         { return 1; }
       while (<$fh>)
            {
              if (($_ =~ m/^GIF8[7,9]a/) || ($_ =~ m/^\xFF\xD8/))
                { $q1=1; }
              if ($q1)
                { $a3.=$_; }
            }
       $fh2=IO::File->new_tmpfile || return 1;
       $fh2->autoflush(1);
       print $fh2 $a3;
       (${$_[1]}[2], ${$_[1]}[3], ${$_[1]}[4]) = &imgsize($fh2);
       seek($fh2,0,0);
       ${$_[1]}[1] = crc32(*$fh2);
       close($fh);
       return 0;
      }
    else
      {
       return 1; #Error
      }
   }
....... а дальше все как обично .........

РАБОТАЕТ!!!