こせきの技術日記

2005-01-19

[][] 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>