2003-07-23 12:51:36 -04:00
|
|
|
#
|
|
|
|
# accesslog.rb -- Access log handling utilities
|
|
|
|
#
|
|
|
|
# Author: IPR -- Internet Programming with Ruby -- writers
|
|
|
|
# Copyright (c) 2002 keita yamaguchi
|
|
|
|
# Copyright (c) 2002 Internet Programming with Ruby writers
|
|
|
|
#
|
|
|
|
# $IPR: accesslog.rb,v 1.1 2002/10/01 17:16:32 gotoyuzo Exp $
|
|
|
|
|
|
|
|
module WEBrick
|
|
|
|
module AccessLog
|
|
|
|
class AccessLogError < StandardError; end
|
|
|
|
|
|
|
|
CLF_TIME_FORMAT = "[%d/%b/%Y:%H:%M:%S %Z]"
|
|
|
|
COMMON_LOG_FORMAT = "%h %l %u %t \"%r\" %s %b"
|
|
|
|
CLF = COMMON_LOG_FORMAT
|
|
|
|
REFERER_LOG_FORMAT = "%{Referer}i -> %U"
|
|
|
|
AGENT_LOG_FORMAT = "%{User-Agent}i"
|
|
|
|
COMBINED_LOG_FORMAT = "#{CLF} \"%{Referer}i\" \"%{User-agent}i\""
|
|
|
|
|
|
|
|
module_function
|
|
|
|
|
|
|
|
# This format specification is a subset of mod_log_config of Apache.
|
|
|
|
# http://httpd.apache.org/docs/mod/mod_log_config.html#formats
|
|
|
|
def setup_params(config, req, res)
|
|
|
|
params = Hash.new("")
|
|
|
|
params["a"] = req.peeraddr[3]
|
|
|
|
params["b"] = res.sent_size
|
|
|
|
params["e"] = ENV
|
|
|
|
params["f"] = res.filename || ""
|
|
|
|
params["h"] = req.peeraddr[2]
|
|
|
|
params["i"] = req
|
|
|
|
params["l"] = "-"
|
|
|
|
params["m"] = req.request_method
|
2004-12-15 03:47:49 -05:00
|
|
|
params["n"] = req.attributes
|
2003-07-23 12:51:36 -04:00
|
|
|
params["o"] = res
|
2003-09-08 05:52:34 -04:00
|
|
|
params["p"] = req.port
|
2003-07-23 12:51:36 -04:00
|
|
|
params["q"] = req.query_string
|
|
|
|
params["r"] = req.request_line.sub(/\x0d?\x0a\z/o, '')
|
|
|
|
params["s"] = res.status # won't support "%>s"
|
|
|
|
params["t"] = req.request_time
|
|
|
|
params["T"] = Time.now - req.request_time
|
|
|
|
params["u"] = req.user || "-"
|
|
|
|
params["U"] = req.unparsed_uri
|
|
|
|
params["v"] = config[:ServerName]
|
|
|
|
params
|
|
|
|
end
|
|
|
|
|
|
|
|
def format(format_string, params)
|
2004-12-15 03:47:49 -05:00
|
|
|
format_string.gsub(/\%(?:\{(.*?)\})?>?([a-zA-Z%])/){
|
2003-07-23 12:51:36 -04:00
|
|
|
param, spec = $1, $2
|
|
|
|
case spec[0]
|
2004-12-15 03:47:49 -05:00
|
|
|
when ?e, ?i, ?n, ?o
|
2003-07-23 12:51:36 -04:00
|
|
|
raise AccessLogError,
|
|
|
|
"parameter is required for \"#{spec}\"" unless param
|
2010-01-10 23:30:37 -05:00
|
|
|
(param = params[spec][param]) ? escape(param) : "-"
|
2003-07-23 12:51:36 -04:00
|
|
|
when ?t
|
|
|
|
params[spec].strftime(param || CLF_TIME_FORMAT)
|
2004-12-15 03:47:49 -05:00
|
|
|
when ?%
|
|
|
|
"%"
|
2003-07-23 12:51:36 -04:00
|
|
|
else
|
2010-01-10 04:33:47 -05:00
|
|
|
escape(params[spec].to_s)
|
2003-07-23 12:51:36 -04:00
|
|
|
end
|
|
|
|
}
|
|
|
|
end
|
2010-01-10 04:33:47 -05:00
|
|
|
|
|
|
|
def escape(data)
|
|
|
|
if data.tainted?
|
|
|
|
data.gsub(/[[:cntrl:]\\]+/) {$&.dump[1...-1]}.untaint
|
|
|
|
else
|
|
|
|
data
|
|
|
|
end
|
|
|
|
end
|
2003-07-23 12:51:36 -04:00
|
|
|
end
|
|
|
|
end
|