Better documentation of server configuration, add error reporting server

This commit is contained in:
Pieter Vander Vennet 2024-06-20 14:22:33 +02:00
parent cd0d275965
commit 13ea16317f
5 changed files with 127 additions and 15 deletions

View file

@ -1,17 +1,36 @@
import http from "node:http"
export interface Handler {
mustMatch: string | RegExp
mimetype: string
addHeaders?: Record<string, string>
handle: (path: string, queryParams: URLSearchParams, req: http.IncomingMessage) => Promise<string>
}
class ServerUtils {
public static getBody(req: http.IncomingMessage): Promise<string> {
return new Promise<string>((resolve) => {
let body = '';
req.on('data', (chunk) => {
body += chunk;
});
req.on('end', () => {
resolve(body)
});
})
}
}
export class Server {
constructor(
port: number,
options: {
ignorePathPrefix?: string[]
},
handle: {
mustMatch: string | RegExp
mimetype: string
addHeaders?: Record<string, string>
handle: (path: string, queryParams: URLSearchParams) => Promise<string>
}[]
handle: Handler[]
) {
handle.push({
mustMatch: "",
@ -81,8 +100,9 @@ export class Server {
res.end()
return
}
let body = undefined
if (req.method === "POST" || req.method === "UPDATE") {
return
body = await ServerUtils.getBody(req)
}
if (req.method === "DELETE") {
@ -90,7 +110,7 @@ export class Server {
}
try {
const result = await handler.handle(path, url.searchParams)
const result = await handler.handle(path, url.searchParams, req, body)
if (result === undefined) {
res.writeHead(500)
res.write("Could not fetch this website, probably blocked by them")

View file

@ -0,0 +1,52 @@
import { Handler, Server } from "./server"
import Script from "./Script"
import { appendFileSync, existsSync, mkdirSync, writeFileSync } from "fs"
import { mkdir } from "node:fs"
import ScriptUtils from "./ScriptUtils"
class ServerErrorReport extends Script {
constructor() {
super("A server which receives and logs error reports")
}
async main(args: string[]): Promise<void> {
const logDirectory = args[0] ?? "./error_logs"
console.log("Logging to directory", logDirectory)
if (!existsSync(logDirectory)) {
mkdirSync(logDirectory)
console.log("Created this directory")
}
let errorReport = 0
new Server(2348, {},
[<Handler>{
mustMatch: "report",
mimetype: "application/json",
handle: async (_, queryParams, req, body) => {
if (!body) {
throw "{\"error\": \"No body; use a post request\"}"
}
console.log(body)
const ip = <string>req.headers["x-forwarded-for"]
const d = new Date()
const date = d.toISOString()
const file = logDirectory + "/" + d.getUTCFullYear() + "_" + d.getUTCMonth() + "_" + d.getUTCDay() + ".lines.json"
try{
body = JSON.parse(body)
}catch (e) {
// could not parse, we'll save it as is
}
const contents = "\n"+JSON.stringify({ ip, index: errorReport, date, message: body })
if (!existsSync(file)) {
writeFileSync(file, contents)
} else {
appendFileSync(file, contents)
}
errorReport++
return `{"status":"ok", "nr": ${errorReport}}`
},
}])
}
}
new ServerErrorReport().run()