# HG changeset patch # User Matthew Wild # Date 1492789569 -3600 # Node ID 7a5dae85f26f0b5c9f2049d20d87e0b5b09f45e0 # Parent dae655657a926c9c80b7b30b21bc4610b2f887ba mod_log_http: Add new module for logging outgoing HTTP request diff -r dae655657a92 -r 7a5dae85f26f mod_log_http/README.markdown --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_log_http/README.markdown Fri Apr 21 16:46:09 2017 +0100 @@ -0,0 +1,22 @@ +--- +summary: HTTP request logging +... + +Introduction +============ + +This module logs *outgoing* requests that go via the internal net.http API. + +Output format liable to change. + +Configuration +============= + +One option is required, set `log_http_file` to the file path you would like to log to. + +Compatibility +============= + + ----- ------- + 0.10 Works (requires 375cf924fce1 or later) + ----- ------- diff -r dae655657a92 -r 7a5dae85f26f mod_log_http/mod_log_http.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_log_http/mod_log_http.lua Fri Apr 21 16:46:09 2017 +0100 @@ -0,0 +1,78 @@ +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+")); + +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); + for k,v in pairs(event.response) do print("=====", k, v) end + append_response(event.request.id, event.response); +end); + +function module.unload() + log:close(); +end