view mod_log_http/mod_log_http.lua @ 5401:c8d04ac200fc

mod_http_oauth2: Reject loopback URIs as client_uri This really should be a proper website with info, https://localhost is not good enough. Ideally we'd validate that it's got proper DNS and is actually reachable, but triggering HTTP or even DNS lookups seems like it would carry abuse potential that would best to avoid.
author Kim Alvefur <zash@zash.se>
date Tue, 02 May 2023 16:20:55 +0200
parents 3bd725430f40
children
line wrap: on
line source

module:set_global();

local http = require "net.http";
local codes = require "net.http.codes";
local json = require "util.json";

local log = assert(io.open(assert(module:get_option_string("log_http_file"), "Please supply log_http_file in the config"), "a+"));
log:setvbuf("line");

local function append_request(id, req)
	local headers = {};
	for k, v in pairs(req.headers) do
		table.insert(headers, { name = k, value = v });
	end
	local queryString = {};
	if req.query then
		for _, pair in ipairs(http.formdecode(req.query)) do
			table.insert(queryString, pair);
		end
	end
	log:write("<<<", json.encode({
		id = id;
		type = "request";
		method = req.method;
		url = req.url;
		httpVersion = "HTTP/1.1";
		cookies = {};
		headers = headers;
		queryString = queryString;
		postData = req.body and {
			mimeType = req.headers["Content-Type"];
			text = req.body;
		} or nil;
		headersSize = -1;
		bodySize = -1;
	}), "\n");
end

local function append_response(id, resp)
	local headers = {};
	for k, v in pairs(resp.headers) do
		table.insert(headers, { name = k, value = v });
	end
	log:write(">>>", json.encode({
		id = id;
		type = "response";
		status = resp.code;
		statusText = codes[resp.code];
		httpVersion = resp.httpversion;
		cookies = {};
		headers = headers;
		content = resp.body and {
			size = #resp.body;
			mimeType = resp.headers.content_type;
			text = resp.body;
		} or nil;
		headersSize = -1;
		bodySize = -1;
	}), "\n");
end

module:hook_object_event(http.events, "request", function (event)
	module:log("warn", "Request to %s!", event.url);
	append_request(event.request.id, event.request);
end);

module:hook_object_event(http.events, "request-connection-error", function (event)
	module:log("warn", "Failed to make request to %s!", event.url);
end);

module:hook_object_event(http.events, "response", function (event)
	module:log("warn", "Received response %d from %s!", event.code, event.url);
	append_response(event.request.id, event.response);
end);

function module.unload()
	log:close();
end