UNPKG

@push.rocks/smartproxy

Version:

A powerful proxy package with unified route-based configuration for high traffic management. Features include SSL/TLS support, flexible routing patterns, WebSocket handling, advanced security options, and automatic ACME certificate management.

94 lines 7.49 kB
/** * HeaderMatcher provides HTTP header matching functionality * Supporting exact matches, patterns, and case-insensitive matching */ export class HeaderMatcher { /** * Match a header value against a pattern * @param pattern The pattern to match * @param value The header value to test * @param options Matching options * @returns true if the value matches the pattern */ static match(pattern, value, options = {}) { // Handle missing header if (value === undefined || value === null) { return pattern === '' || pattern === null || pattern === undefined; } // Convert to string and normalize const normalizedPattern = String(pattern); const normalizedValue = String(value); // Apply case sensitivity const comparePattern = options.caseInsensitive !== false ? normalizedPattern.toLowerCase() : normalizedPattern; const compareValue = options.caseInsensitive !== false ? normalizedValue.toLowerCase() : normalizedValue; // Exact match if (options.exactMatch !== false) { return comparePattern === compareValue; } // Pattern matching (simple wildcard support) if (comparePattern.includes('*')) { const regex = new RegExp('^' + comparePattern.replace(/\*/g, '.*') + '$', options.caseInsensitive !== false ? 'i' : ''); return regex.test(normalizedValue); } // Contains match (if not exact match mode) return compareValue.includes(comparePattern); } /** * Match multiple headers against a set of required headers * @param requiredHeaders Headers that must match * @param actualHeaders Actual request headers * @param options Matching options * @returns true if all required headers match */ static matchAll(requiredHeaders, actualHeaders, options = {}) { for (const [name, pattern] of Object.entries(requiredHeaders)) { const headerName = options.caseInsensitive !== false ? name.toLowerCase() : name; // Find the actual header (case-insensitive search if needed) let actualValue; if (options.caseInsensitive !== false) { const actualKey = Object.keys(actualHeaders).find(key => key.toLowerCase() === headerName); const rawValue = actualKey ? actualHeaders[actualKey] : undefined; // Handle array values (multiple headers with same name) actualValue = Array.isArray(rawValue) ? rawValue.join(', ') : rawValue; } else { const rawValue = actualHeaders[name]; // Handle array values (multiple headers with same name) actualValue = Array.isArray(rawValue) ? rawValue.join(', ') : rawValue; } // Check if this header matches if (!this.match(pattern, actualValue, options)) { return false; } } return true; } /** * Calculate the specificity of header requirements * More headers = more specific */ static calculateSpecificity(headers) { const count = Object.keys(headers).length; let score = count * 10; // Bonus for headers without wildcards (more specific) for (const value of Object.values(headers)) { if (!value.includes('*')) { score += 5; } } return score; } /** * Instance method for interface compliance */ match(pattern, value, options) { return HeaderMatcher.match(pattern, value, options); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvY29yZS9yb3V0aW5nL21hdGNoZXJzL2hlYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sYUFBYTtJQUN4Qjs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUNWLE9BQWUsRUFDZixLQUF5QixFQUN6QixVQUErQixFQUFFO1FBRWpDLHdCQUF3QjtRQUN4QixJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzFDLE9BQU8sT0FBTyxLQUFLLEVBQUUsSUFBSSxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxTQUFTLENBQUM7UUFDckUsQ0FBQztRQUVELGtDQUFrQztRQUNsQyxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdEMseUJBQXlCO1FBQ3pCLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxlQUFlLEtBQUssS0FBSztZQUN0RCxDQUFDLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFO1lBQ2pDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztRQUN0QixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsZUFBZSxLQUFLLEtBQUs7WUFDcEQsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUU7WUFDL0IsQ0FBQyxDQUFDLGVBQWUsQ0FBQztRQUVwQixjQUFjO1FBQ2QsSUFBSSxPQUFPLENBQUMsVUFBVSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ2pDLE9BQU8sY0FBYyxLQUFLLFlBQVksQ0FBQztRQUN6QyxDQUFDO1FBRUQsNkNBQTZDO1FBQzdDLElBQUksY0FBYyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0s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