#!/usr/local/bin/perl -w # $Id: http-client-2.pl,v 1.2 2002/02/05 17:53:09 68user Exp $ use Socket; # Socketモジュールを使う #----------------引数解析-------------------- # メソッドを解析。-HEADか-GET以外ならエラー if ( $ARGV[0] eq "-HEAD" || $ARGV[0] eq "-head" ){ $method = "HEAD"; } elsif ( $ARGV[0] eq "-GET" || $ARGV[0] eq "-get" ){ $method = "GET"; } else { print "methodはGETかHEADを指定してください。\n"; exit; } # URLを解析。http://host/pathという形式でなければエラー if ( $ARGV[1] =~ m|^http://([-_\.a-zA-Z0-9]+)/?(.*)$| ){ $host = $1; $path = $2; } else { print "URLは http://host/path という形式で指定してください。\n"; exit; } # 引数が3つあるならProxyを解析 if ( $#ARGV == 2 ){ if ( $ARGV[2] =~ m|^([-_\.a-zA-Z0-9]+):(\d+)$| ){ $proxy = $1; $port = $2; $connect_host = $proxy; } else { print "Proxy は host:port という形式で指定してください。\n"; exit; } $connect_host = $proxy; # 引数が2つしかないなら } else { $connect_host = $host; $port = getservbyname('http', 'tcp'); } #----------------接続処理------------------- # ホスト名を、IPアドレスの構造体に変換 $iaddr = inet_aton($connect_host) || die "$connect_hostは存在しないホストです。\n"; # portとIPアドレスとまとめて構造体に変換 $sock_addr = pack_sockaddr_in($port, $iaddr); # ソケット生成 socket(SOCKET, PF_INET, SOCK_STREAM, 0) || die "ソケットを生成できません。\n"; # 指定のホストの指定のportに接続 connect(SOCKET, $sock_addr) || die "$connect_host の ポート$portに接続できません。\n"; # ファイルハンドルSOCKETをバッファリングしない select(SOCKET); $|=1; select(STDOUT); #------------HTTPリクエスト送信----------------- # Proxyサーバに接続するなら if ( defined $proxy ){ print SOCKET "$method http://$host/$path HTTP/1.0\r\n"; # 直接WWWサーバに接続するなら } else { print SOCKET "$method /$path HTTP/1.0\r\n"; } # User-Agentを送信 print SOCKET "User-Agent: httptalker/0.10 (HTTP client sample)\r\n"; print SOCKET "\r\n"; #------------サーバからのデータを受信 ----------------- if ( $method eq "GET" ){ # GETメソッドならヘッダ部分は表示せず while (){ m/^\r\n$/ && last; } # ボディ部分だけを表示する while (){ print $_; } } else { # HEADメソッドなら全文表示 while (){ print $_; } }