Главная страница


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Artem Chuprina                       2:5020/400     25 Nov 2001  14:22:30
 To : Maxim Kuchuk
 Subject : Re: http
 -------------------------------------------------------------------------------- 
 
 Здравствуй, Maxim Kuchuk.
 
 MK> Hарод! Заранее извиняюсь за глупый вопрос, но как из строчки можно вырезать
 MK> подстроку типа - 'http://'
 
 Глупый ответ: $string =~ s#http://##;
 Мудрый ответ: perldoc perlop, perldoc perlre.
 
 MK> Также появилась проблема проверки мёртвой ссылки, попытался решить таким
 MK> образом :
 MK> $PF_INET = 2;
 MK> $AF_INET = 2;
 MK> $SOCK_STREAM = 1;
 MK> $IPPROTO_TCP = 6;
 MK> $sockaddr_in = 'S n a4 x8';
 
 MK> ###########################
 MK> sub httpget
 MK> {
 MK>     local ($remote,$doc)=@_;
 MK>     local ($header,$body,$line,$isbody);
 MK>     local $port=80;
 MK>     local($thisaddr,$thataddr);
 MK>     local($this,$that);
 MK>     local($proto,$hostname);
 MK>     ($thisaddr) = (gethostbyname($hostname))[4];
 MK>     ($thataddr) = (gethostbyname($remote))[4];
 MK>     $this = pack($sockaddr_in, $PF_INET, 0, $thisaddr);
 MK>     $that = pack($sockaddr_in, $PF_INET, $port, $thataddr);
 MK>     socket(SOCK, $PF_INET,$SOCK_STREAM,$IPPROTO_TCP)||return ();
 MK>     bind(SOCK,$this)||return ();
 MK>     connect(SOCK,$that)||return ();
 MK>     select(SOCK);$|=1;select(STDOUT);
 MK>     print SOCK "GET $doc HTTP/1.1\n\n";
 
 Так вот сходу вижу здесь лишний \n и предсказываю код 400 в ответ, ибо
 HTTP/1.1. Далее, если ты не под виндой, то рекомендуется выдавать в запросе не
 \n, а \x0d\x0a, как положено по стандарту. Если под виндой, то тоже можно...
 Hе то чтобы было много серверов, которые не едят просто \x0a, но мне
 попадалось.
 
 MK>     print SOCK "Host: $remote\n";
 MK>     print SOCK "\n";
 MK>     while(defined($line=<SOCK>)){
 MK>         if($isbody){$body.=$line;}
 MK>         else{
 MK>             if($line=~/^$/){$isbody=1;}
 MK>             else{$header.=$line;}
 MK>             }
 MK>         }
 MK>     close (SOCK);
 MK>     return ($header,$body);
 MK> }
 MK> sub Is_Url_Good
 MK> {
 MK>     local($URL)=@_;
 MK>     local($remotehost,$doc);
 MK>     local($code,$codetext);
 MK>     ($remotehost,$doc)=($URL=~/http:\/\/([^\/]+)(.*)/);
 MK>     unless($doc){$doc="/";}
 MK>     ($header,$body)=httpget($remotehost,$doc);
 MK>     unless($header){return 0;}
 MK>     ($code,$codetext)=($header=~/^HTTP\S+\s+(\d+)\s+(.*)/);
 MK>     if($code!=404){return 0;}
 
 И тут наблюдаю неверную логику определения, живая ли ссылка.
 
 MK>     return 1;
 MK> }
 
 MK> но ответ приходит 0 на любые ссылки, что мертвые, что живые.
 
 Остальное лениво исследовать. Сам ищи. Я предпочитаю подобные вещи делать
 посредством специально обученных модулей, вроде LWP::UserAgent, про которые
 известно, что они работают, и не заморачиваться ловлей багов в велосипеде
 собственного изобретения. Если есть причины заморачиваться - perl -d и вперед.
 Hеочевидно у тебя, правильно ли делается pack, и очевидно, что отсутствует
 проверка части кодов завершения.
 
 -- 
 Artem Chuprina
 RFC2822: <ran@ran.pp.ru>, FIDO: 2:5020/358.49, ICQ: 13038757
 
 Отправлено через сервер Talk.Ru - http://www.talk.ru
 --- ifmail v.2.15dev5
  * Origin: Talk.Ru (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 http   Maxim Kuchuk   24 Nov 2001 21:00:26 
 Re: http   Artem Chuprina   25 Nov 2001 14:22:30 
Архивное /ru.perl/6359919f96f2.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional