comparison mod_log_http/mod_log_http.lua @ 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
children 3f44abfe7264
comparison
equal deleted inserted replaced
2699:dae655657a92 2700:7a5dae85f26f
1 module:set_global();
2
3 local http = require "net.http";
4 local codes = require "net.http.codes";
5 local json = require "util.json";
6
7 local log = assert(io.open(assert(module:get_option_string("log_http_file"), "Please supply log_http_file in the config"), "a+"));
8
9 local function append_request(id, req)
10 local headers = {};
11 for k, v in pairs(req.headers) do
12 table.insert(headers, { name = k, value = v });
13 end
14 local queryString = {};
15 if req.query then
16 for _, pair in ipairs(http.formdecode(req.query)) do
17 table.insert(queryString, pair);
18 end
19 end
20 log:write("<<<", json.encode({
21 id = id;
22 type = "request";
23 method = req.method;
24 url = req.url;
25 httpVersion = "HTTP/1.1";
26 cookies = {};
27 headers = headers;
28 queryString = queryString;
29 postData = req.body and {
30 mimeType = req.headers["Content-Type"];
31 text = req.body;
32 } or nil;
33 headersSize = -1;
34 bodySize = -1;
35 }), "\n");
36 end
37
38 local function append_response(id, resp)
39 local headers = {};
40 for k, v in pairs(resp.headers) do
41 table.insert(headers, { name = k, value = v });
42 end
43 log:write(">>>", json.encode({
44 id = id;
45 type = "response";
46 status = resp.code;
47 statusText = codes[resp.code];
48 httpVersion = resp.httpversion;
49 cookies = {};
50 headers = headers;
51 content = resp.body and {
52 size = #resp.body;
53 mimeType = resp.headers.content_type;
54 text = resp.body;
55 } or nil;
56 headersSize = -1;
57 bodySize = -1;
58 }), "\n");
59 end
60
61 module:hook_object_event(http.events, "request", function (event)
62 module:log("warn", "Request to %s!", event.url);
63 append_request(event.request.id, event.request);
64 end);
65
66 module:hook_object_event(http.events, "request-connection-error", function (event)
67 module:log("warn", "Failed to make request to %s!", event.url);
68 end);
69
70 module:hook_object_event(http.events, "response", function (event)
71 module:log("warn", "Received response %d from %s!", event.code, event.url);
72 for k,v in pairs(event.response) do print("=====", k, v) end
73 append_response(event.request.id, event.response);
74 end);
75
76 function module.unload()
77 log:close();
78 end