Реализуйте простой HTTP-сервер на Node.js (без фреймворков), который обрабатывает GET-запросы и возвращает "Hello, client!"
.
Но с одним условием: если IP-адрес клиента делает больше 5 запросов за 10 секунд, сервер должен временно блокировать этот IP на 30 секунд и отвечать ему "429 Too Many Requests"
.
Решение задачи
const http = require('http');
const PORT = 3000;
const requestLog = {}; // { ip: [timestamps] }
const bannedIPs = {}; // { ip: unblockTimestamp }
function cleanupOldRequests(ip) {
const now =Date.now ();
requestLog[ip] = (requestLog[ip] || []).filter(ts => now - ts < 10000);
}
const server = http.createServer((req, res) => {
const ip = req.socket.remoteAddress;
if (bannedIPs[ip] &&Date.now () < bannedIPs[ip]) {
res.writeHead(429, { 'Content-Type': 'text/plain' });
return res.end('429 Too Many Requests');
}
cleanupOldRequests(ip);
requestLog[ip].push(Date.now ());
if (requestLog[ip].length > 5) {
bannedIPs[ip] =Date.now () + 30000; // блок на 30 сек
requestLog[ip] = [];
res.writeHead(429, { 'Content-Type': 'text/plain' });
return res.end('429 Too Many Requests');
}
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello, client!');
});
server.listen(PORT, () => {
console.log(`Server listening on http://localhost:${PORT}`);
});