const { checkRateLimit } = require('../../infrastructure/rate_limit'); const { trackRequest } = require('../../maintenance/metrics'); const { handleStaticRoutes } = require('./static'); const { handleDomainsRoutes } = require('./domains'); const { handleEntriesRoutes } = require('./entries'); const { handlePeersRoutes } = require('./peers'); const { handleCertsRoutes } = require('./certs'); const { handleInterfacesRoutes } = require('./interfaces'); const { handleLocalDnsRoutes } = require('./local-dns'); const { handleStatusRoutes } = require('./status'); const { handleStatsRoutes } = require('./stats'); const { handleHolesailRoutes } = require('./holesail'); const { handleSettingsRoutes } = require('./settings'); async function handleAdminRequest(req, res) { const url = new URL(req.url, `https://${req.headers.host}`); const urlPath = url.pathname; const method = req.method; // Check rate limit for API endpoints (GET requests and local IPs are exempt) // Only rate limit POST requests, GET requests are safe and expected to be frequent if (urlPath.startsWith('/api/') && method === 'POST') { const rateLimitError = checkRateLimit(req); if (rateLimitError) { res.writeHead(rateLimitError.statusCode, rateLimitError.headers); res.end(rateLimitError.body); trackRequest(urlPath, false); return; } } // Attach urlPath to req for route handlers req.urlPath = urlPath; // Try each route handler in order if (await handleStaticRoutes(req, res)) return; if (await handleDomainsRoutes(req, res)) return; if (await handleEntriesRoutes(req, res)) return; if (await handlePeersRoutes(req, res)) return; if (await handleCertsRoutes(req, res)) return; if (await handleInterfacesRoutes(req, res)) return; if (await handleLocalDnsRoutes(req, res)) return; if (await handleStatusRoutes(req, res)) return; if (await handleStatsRoutes(req, res)) return; if (await handleHolesailRoutes(req, res)) return; if (await handleSettingsRoutes(req, res)) return; // No route matched res.writeHead(404); res.end('Not Found'); } module.exports = { handleAdminRequest };