68 lines
1.7 KiB
Ruby
68 lines
1.7 KiB
Ruby
|
module ApplicationController::LogsHttpAccess
|
||
|
extend ActiveSupport::Concern
|
||
|
|
||
|
included do
|
||
|
after_action :http_log
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def http_log_config(config)
|
||
|
@http_log_support = config
|
||
|
end
|
||
|
|
||
|
# log http access
|
||
|
def http_log
|
||
|
return if !@http_log_support
|
||
|
|
||
|
# request
|
||
|
request_data = {
|
||
|
content: '',
|
||
|
content_type: request.headers['Content-Type'],
|
||
|
content_encoding: request.headers['Content-Encoding'],
|
||
|
source: request.headers['User-Agent'] || request.headers['Server'],
|
||
|
}
|
||
|
request.headers.each { |key, value|
|
||
|
next if key[0, 5] != 'HTTP_'
|
||
|
request_data[:content] += if key == 'HTTP_COOKIE'
|
||
|
"#{key}: xxxxx\n"
|
||
|
else
|
||
|
"#{key}: #{value}\n"
|
||
|
end
|
||
|
}
|
||
|
body = request.body.read
|
||
|
if body
|
||
|
request_data[:content] += "\n" + body
|
||
|
end
|
||
|
request_data[:content] = request_data[:content].slice(0, 8000)
|
||
|
|
||
|
# response
|
||
|
response_data = {
|
||
|
code: response.status = response.code,
|
||
|
content: '',
|
||
|
content_type: nil,
|
||
|
content_encoding: nil,
|
||
|
source: nil,
|
||
|
}
|
||
|
response.headers.each { |key, value|
|
||
|
response_data[:content] += "#{key}: #{value}\n"
|
||
|
}
|
||
|
body = response.body
|
||
|
if body
|
||
|
response_data[:content] += "\n" + body
|
||
|
end
|
||
|
response_data[:content] = response_data[:content].slice(0, 8000)
|
||
|
record = {
|
||
|
direction: 'in',
|
||
|
facility: @http_log_support[:facility],
|
||
|
url: url_for(only_path: false, overwrite_params: {}),
|
||
|
status: response.status,
|
||
|
ip: request.remote_ip,
|
||
|
request: request_data,
|
||
|
response: response_data,
|
||
|
method: request.method,
|
||
|
}
|
||
|
HttpLog.create(record)
|
||
|
end
|
||
|
end
|