view mod_http_stats_stream/mod_http_stats_stream.lua @ 5616:59d5fc50f602

mod_http_oauth2: Implement refresh token rotation Makes refresh tokens one-time-use, handing out a new refresh token with each access token. Thus if a refresh token is stolen and used by an attacker, the next time the legitimate client tries to use the previous refresh token, it will not work and the attack will be noticed. If the attacker does not use the refresh token, it becomes invalid after the legitimate client uses it. This behavior is recommended by draft-ietf-oauth-security-topics
author Kim Alvefur <zash@zash.se>
date Sun, 23 Jul 2023 02:56:08 +0200
parents bac3dae031ee
children
line wrap: on
line source

module:set_global();

local statsman = require "core.statsmanager";
local http = require "net.http.server";
local json = require "util.json";

assert(statsman.get_stats, "not compatible with trunk based on openmetrics");

local sessions = {};

local function updates_client_closed(response)
	module:log("debug", "Streamstats client closed");
	sessions[response] = nil;
end

local function get_updates(event)
	local request, response = event.request, event.response;

	response.on_destroy = updates_client_closed;

	response.headers.content_type = "text/event-stream";
	response.headers.x_accel_buffering = "no"; -- for nginx maybe?
	local resp = http.prepare_header(response);
	table.insert(resp, "event: stats-full\r\n");
	table.insert(resp, "data: ");
	table.insert(resp, json.encode(statsman.get_stats()));
	table.insert(resp, "\r\n\r\n");
	response.conn:write(table.concat(resp));

	sessions[response] = request;
	return true;
end


module:hook("stats-updated", function (event)
	local data = table.concat({
		"event: stats-updated";
		"data: "..json.encode(event.changed_stats);
		"";
		"";
	}, "\r\n")
	for response in pairs(sessions) do
		response.conn:write(data);
	end
end);


module:depends("http");
module:provides("http", {
	route = {
		GET = get_updates;
	}
});