Skip to main content
Glama
enhanced-middleware.test.ts4.7 kB
import { expect, test, describe, beforeEach, afterEach } from "bun:test"; import { SecurityMiddleware } from "../enhanced-middleware"; describe("Enhanced Security Middleware", () => { describe("Security Headers", () => { test("applies security headers correctly", () => { const request = new Request("http://localhost"); SecurityMiddleware.applySecurityHeaders(request); expect(request.headers.get("content-security-policy")).toBeDefined(); expect(request.headers.get("x-frame-options")).toBe("DENY"); expect(request.headers.get("strict-transport-security")).toBeDefined(); expect(request.headers.get("x-xss-protection")).toBe("1; mode=block"); }); }); describe("Request Validation", () => { test("validates request size", async () => { const largeBody = "x".repeat(2 * 1024 * 1024); // 2MB const request = new Request("http://localhost", { method: "POST", headers: { "content-type": "application/json", "content-length": largeBody.length.toString(), }, body: JSON.stringify({ data: largeBody }), }); await expect(SecurityMiddleware.validateRequest(request)).rejects.toThrow( "Request body too large", ); }); test("validates URL length", async () => { const longUrl = "http://localhost/" + "x".repeat(3000); const request = new Request(longUrl); await expect(SecurityMiddleware.validateRequest(request)).rejects.toThrow("URL too long"); }); test("validates and sanitizes POST request body", async () => { const request = new Request("http://localhost", { method: "POST", headers: { "content-type": "application/json", }, body: JSON.stringify({ name: '<script>alert("xss")</script>Hello', age: 25, }), }); await SecurityMiddleware.validateRequest(request); const body = await request.json(); expect(body.name).not.toContain("<script>"); expect(body.age).toBe(25); }); }); describe("Input Sanitization", () => { test("sanitizes string input", () => { const input = '<script>alert("xss")</script>Hello<img src="x" onerror="alert(1)">'; const sanitized = SecurityMiddleware.sanitizeInput(input); expect(sanitized).toBe("Hello"); }); test("sanitizes nested object input", () => { const input = { name: '<script>alert("xss")</script>John', details: { bio: '<img src="x" onerror="alert(1)">Web Developer', }, }; const sanitized = SecurityMiddleware.sanitizeInput(input) as any; expect(sanitized.name).toBe("John"); expect(sanitized.details.bio).toBe("Web Developer"); }); test("sanitizes array input", () => { const input = ["<script>alert(1)</script>Hello", '<img src="x" onerror="alert(1)">World']; const sanitized = SecurityMiddleware.sanitizeInput(input) as string[]; expect(sanitized[0]).toBe("Hello"); expect(sanitized[1]).toBe("World"); }); }); describe("Rate Limiting", () => { beforeEach(() => { // Reset rate limit stores before each test (SecurityMiddleware as any).rateLimitStore.clear(); (SecurityMiddleware as any).authLimitStore.clear(); }); test("enforces regular rate limits", () => { const ip = "127.0.0.1"; // Should allow up to 100 requests for (let i = 0; i < 100; i++) { expect(() => SecurityMiddleware.checkRateLimit(ip, false)).not.toThrow(); } // Should block the 101st request expect(() => SecurityMiddleware.checkRateLimit(ip, false)).toThrow("Too many requests"); }); test("enforces stricter auth rate limits", () => { const ip = "127.0.0.1"; // Should allow up to 5 auth requests for (let i = 0; i < 5; i++) { expect(() => SecurityMiddleware.checkRateLimit(ip, true)).not.toThrow(); } // Should block the 6th auth request expect(() => SecurityMiddleware.checkRateLimit(ip, true)).toThrow( "Too many authentication requests", ); }); test("resets rate limits after window expires", async () => { const ip = "127.0.0.1"; // Make max requests for (let i = 0; i < 100; i++) { SecurityMiddleware.checkRateLimit(ip, false); } // Wait for rate limit window to expire const store = (SecurityMiddleware as any).rateLimitStore.get(ip); store.resetTime = Date.now() - 1000; // Set reset time to the past // Should allow requests again expect(() => SecurityMiddleware.checkRateLimit(ip, false)).not.toThrow(); }); }); });

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jango-blockchained/advanced-homeassistant-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server