Mercurial > prosody-modules
changeset 2700:7a5dae85f26f
mod_log_http: Add new module for logging outgoing HTTP request
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Fri, 21 Apr 2017 16:46:09 +0100 |
parents | dae655657a92 |
children | caabb980d1d8 3e97dae28215 |
files | mod_log_http/README.markdown mod_log_http/mod_log_http.lua |
diffstat | 2 files changed, 100 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /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) + ----- -------
--- /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