The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"HTTP запрос (GET)"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"HTTP запрос (GET)"
Сообщение от BulbaBoy emailИскать по авторуВ закладки on 05-Мрт-03, 23:28  (MSK)
Как лучше (желательно без модулей)
направить запрос и корректно все получить
У меня проблема с нахождением начала запрашиваемой картинки
"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]


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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "RE: HTTP запрос (GET)"
Сообщение от BulbaBoy emailИскать по авторуВ закладки on 06-Мрт-03, 04:41  (MSK)
А вот уже и ответ....

------------------------------ 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
      }
   }
....... а дальше все как обично .........

РАБОТАЕТ!!!

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру