File size: 1,893 Bytes
bf48b89 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | // Worker-compatible fetch wrapper
// Simplified version without proxy, rate limiting, or header-generator
import { config } from '@/config';
import logger from '@/utils/logger';
// Static browser headers (Chrome-like fingerprint)
const STATIC_BROWSER_HEADERS: Record<string, string> = {
accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8',
'accept-language': 'en-US,en;q=0.9',
'sec-ch-ua': '"Chromium";v="122", "Not(A:Brand";v="24", "Google Chrome";v="122"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
};
const originalFetch = globalThis.fetch;
const wrappedFetch = (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {
const request = new Request(input, init);
logger.debug(`Outgoing request: ${request.method} ${request.url}`);
// Set User-Agent if not provided
if (!request.headers.has('user-agent')) {
request.headers.set('user-agent', config.ua);
}
// Set browser headers if not provided
for (const [header, value] of Object.entries(STATIC_BROWSER_HEADERS)) {
if (!request.headers.has(header)) {
request.headers.set(header, value);
}
}
// Set Referer if not provided
if (!request.headers.get('referer')) {
try {
const urlHandler = new URL(request.url);
request.headers.set('referer', urlHandler.origin);
} catch {
// ignore
}
}
// Remove x-prefer-proxy header (not supported in Workers)
if (request.headers.has('x-prefer-proxy')) {
request.headers.delete('x-prefer-proxy');
}
return originalFetch(request);
};
export default wrappedFetch;
|