2005-01-19
■ fileformat.info
すばらしいです。
■ [HTTP][Perl] httpdump.pl
#!/usr/bin/perl -w
# httpdump.pl
#
# ブラウザが送信してきたリクエストヘッダをそのまま送り返すHTTPサーバです。
# 同時に標準出力にもリクエストヘッダを出力します。
#
# $ httpdump.pl [ポート番号]
# のようにして起動します。ポート番号を省略すると80番を使用します。
#
# スクリプトのほとんどは、
# http://x68000.startshop.co.jp/~68user/net/echo-2.html
# からお借りしました。素晴らしい解説ページをありがとうございます。
use Socket;
$VERSION = "0.4";
$port = $ARGV[0] ? $ARGV[0] : 80;
socket(CLIENT_WAITING, PF_INET, SOCK_STREAM, 0)
or die "ソケットを生成できません。$!";
setsockopt(CLIENT_WAITING, SOL_SOCKET, SO_REUSEADDR, 1)
or die "setsockopt に失敗しました。$!";
bind(CLIENT_WAITING, pack_sockaddr_in($port, INADDR_ANY))
or die "bind に失敗しました。$!";
listen(CLIENT_WAITING, SOMAXCONN)
or die "listen: $!";
print "----------------------------------------------------------------\n";
print "HTTP Request Dump Server $VERSION (port:$port)\n";
print "----------------------------------------------------------------\n\n";
while (1) {
$paddr = accept(CLIENT, CLIENT_WAITING);
($client_port, $client_iaddr) = unpack_sockaddr_in($paddr);
$client_hostname = gethostbyaddr($client_iaddr, AF_INET);
$client_ip = inet_ntoa($client_iaddr);
print "接続: $client_hostname ($client_ip) ポート $client_port\n\n";
select(CLIENT); $|=1; select(STDOUT);
my $request = "";
my $content_length = 0;
my $content = "";
while (<CLIENT>){
print "$_";
$request .= $_;
if (/^Content-Length:\s*(\d+)/i) {
$content_length = $1;
}
if (/^\r?\n$/) {
if ($content_length) {
read(CLIENT, $content, $content_length);
print $content, "[EOF]\n";
}
print CLIENT "HTTP/1.1 200 OK\n";
print CLIENT "Content-type: text/plain\n\n";
print CLIENT $request;
if ($content_length) {
print CLIENT $content, "[EOF]\n";
}
last;
}
}
close(CLIENT);
print "----------------------------------------------------------------\n\n";
}
POST内容を確認するためのフォーム。
<html> <head><title>httpdump form</title> <body> <form method="POST" action="http://localhost/"> <textarea name="test" rows="10" cols="60"> </textarea><br/><br/> <input type="submit" name="submit" value="send"/> </form> </html>
コメント