Name: RequestLog FullName: Logging HTTP Header Field Body Value in the Request URI: IW:SuikaWiki:"Wiki//Log" Description: Implementation of this module is temporary. Reimplementation is needed! MODULE: our $LoggingName; sub add ($$) { my ($name, $s) = @_; return unless length $s; $s =~ s/([^\x20-\x24\x26-\x5A\x5C-\x7E])/sprintf '%%%02X', unpack 'C', $1/ge; $s =~ s/(bypass-client=\d+\.\d+\.)(\d+)\.(\d+)/$1.'[VAR['.('*' x length $2).']].[VAR['.('*' x length $3).']]'/ge; $s =~ s/[0-5]\d:[0-5]\d:[0-5]\d GMT/[VAR[**]]:[VAR[**]]:[VAR[**]] GMT/g; $s =~ s/, (?:[012]\d|3[01])(?=[ -][JFMASOND])/, [VAR[**]] /g; $s =~ s/; length=([0-9]+)/'; length=[VAR['.('*' x length $1).']]'/ge; my %ua; for (split /\n/, $main::database{$main::PageName{'Log_'.$name}}) { if (/^-\{(\d+)\} (.+)$/) { my ($t, $n) = ($1, $2); $n =~ tr/\x0A\x0D//d; $ua{$n} = $t; } } $ua{$s}++; my $s = qq(#?SuikaWiki/0.9 interactive="yes"\n); for (sort {$ua{$a} <=> $ua{$b}} keys %ua) { $s .= sprintf qq(-{%d} %s\n), $ua{$_}, $_; } SuikaWiki::Plugin->_database->STORE ($main::PageName{'Log_'.$name} => $s, -touch => 0); } my $year = (gmtime)[5] + 1900; my @fields = ( [qw/ACCEPT AcceptType/], [qw/ACCEPT_CHARSET AcceptCharset/], [qw/ACCEPT_ENCODING AcceptEncoding/], [qw/ACCEPT_LANGUAGE AcceptLanguage/], [qw/TE AcceptTransferEncoding/], [qw/CONNECTION Connection/], [qw/ACCEPT_GEO AcceptGeo/], [qw/KEEP_ALIVE KeepAlive/], [qw/MIME_VERSION MIMEVersion/], [qw/UA_COLOR UserAgentDisplayColor/], [qw/UA_CPU UserAgentCPU/], [qw/UA_OS UserAgentOS/], [qw/UA_PIXELS UserAgentDisplaySize/], [qw/CACHE_CONTROL CacheControl/], [qw/PRAGMA Pragma/], [qw/IF_MODIFIED_SINCE IMS/], [qw/XONNECTION Xonnection:/], [qw/XROXY_CONNECTION Xroxy-Connection:/], [qw/UNLESS_MODIFIED_SINCE Unless-Modified-Since/], [qw/XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX:/], [qw/XXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX:/], [qw/RANGE Range:/], [qw/REQUEST_RANGE Request-Range/], [qw/FROM From:/], [qw/DATE Date:/], [qw/CONTENT_TRANSFER_ENCODING CTE/], [qw/CONTENT_LANGUAGE Content-Language/], [qw/CONTENT_DISPOSITION Content-Disposition/], [qw/REFERRER Referrer/], [qw/CONTENT_ENCODING Content-Encoding/], [qw/CONTENT_FEATURES Content-Feature/], [qw/ACCEPT_FEATURES Accept-Features/], [qw/TRANSFER_ENCODING Transfer-Encoding/], [qw/CONTENT_VERSION Content-Version/], [qw/DERIVED_FROM Derived-From/], [qw/IF_MATCH If-Match/], [qw/IF_NONE_MATCH If-None-Match/], # [qw/ /], # [qw/ /], # [qw/ /], ); for (@fields) { $main::PageName{'Log_'.$_->[0]} = 'Wiki//Log//'.$_->[1].'//'.$year; } $main::PageName{Log_CONTENT_TYPE} = 'Wiki//Log//ContentType//'.$year; $main::PageName{Log_REQUEST_METHOD} = 'Wiki//Log//RequestMethod//'.$year; push @{$SuikaWiki::Plugin::On{WikiDatabaseLoaded}}, sub { for (map {$_->[0]} @fields) { my $v = $main::ENV{'HTTP_'.$_}; add ($_ => $v); } add ('CONTENT_TYPE' => $main::ENV{CONTENT_TYPE}); add ('REQUEST_METHOD' => $main::ENV{REQUEST_METHOD}); }; POD:TO DO: - better storing format - Logging method should be more customizable (what mode? what's except?...) POD:LICENSE: Copyright 2003 Wakaba <w@suika.fam.cx> %%GNUGPL2%%