package chkurl; #------------------------------------------------------------- # chkurl # URL をチェックする # # 1997/11/21 Ver.0.00 # 1997/12/08 Ver.0.01 # 1998/02/08 Ver.0.02 # 1998/02/16 Ver.0.03 ホストの IP アドレスでの指定に対応。 # chkurl.pl ファイル名の変更 # 1998/04/07 Ver.0.04 package 化 # 1998/09/25 Ver.0.05 内部エラーでの Message # http:// のチェックなど # 1998/12/16 Ver.0.06 HTTP1.1 対応 # 1999/02/23 Ver.0.07 response を1行だけ読むように変更 # 1999/05/02 Ver.0.08 # 1999/06/30 Ver.0.10 500 のとき GET でリトライ # 1999/07/08 Ver.0.11 # # Copyright (C) 1997-99 がま # e-mail addr : gama@mvg.biglobe.ne.jp # # USAGE # &chkurl'chkurl($url); #------------------------------------------------------------- $user_agent = 'chkurl/0.11' .' (http://www2d.biglobe.ne.jp/~gama/cgi/index.cgi)'; #------------------------------------------------------------- use Socket; $CRLF = "\r\n"; #------------------------------------------------------------- sub chkurl { #------------------------------------------------------------- $url = $_[0]; $url =~ s/^(http\:\/\/)//i; # http:// を削除 unless ( $1 ) { return ("Format Error in chkurl"); } ($hostname, $filename) = split('/', $url, 2); # / で区切る $filename = '/'.$filename; #------------------------------------------------------------- $Inet = &AF_INET; $Stream = &SOCK_STREAM; $Port = 80; #------------------------------------------------------------- # ホスト名からアドレスへ変換する if ( $hostname =~ /^[0-9]+(\.[0-9]+)+$/) { my(@temp)=split('\.', $hostname); $destaddr = pack('C4',@temp); } else { unless ($destaddr = gethostbyname($hostname)) { return ("Can't get Host Address in chkurl"); } } $Proto = getprotobyname('tcp'); $destproc = pack('S n a4 x8', $Inet, $Port, $destaddr); # Request & Response ----------------------------------------- $_= &req("HEAD"); # ------------------------------------------------------------ # 500 のとき GET でリトライ if ($_=~ /500/) { $_= &req("GET"); $_ .= "(Retry by GET method)"; } else { $_ .= "(first request)"; } # ------------------------------------------------------------ # 200 が含まれなければエラー 呼び出し側で判断する return($_); } #------------------------------------------------------------- sub req{ my($method)=$_[0]; #------------------------------------------------------------- unless (socket(SOCK, $Inet, $Stream, $Proto)) { return ("Can't open socket in chkurl"); } unless (connect(SOCK, $destproc)) { return ("Can't connect in chkurl"); } # SOCK を バッファリングしないようにする --------------------- select(SOCK); $|=1; select(STDOUT); my($request) = "$method $filename HTTP/1.1$CRLF" . "Host: $hostname$CRLF" . "User-Agent: $user_agent$CRLF" . $CRLF; print SOCK $request; $_ = <SOCK>; # 最初の1行だけ読む chomp; close(SOCK); return($_); } 1;