|
|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/6359919f96f2.html, оценка из 5, голосов 10
|