|
|
@ -1,4 +1,5 @@ |
|
|
import { logger } from "@/utils/logger"; |
|
|
import { logger } from "@/utils/logger"; |
|
|
|
|
|
import { createHash } from "crypto"; |
|
|
|
|
|
|
|
|
const SENSITIVE_KEY_PATTERN = /authorization|token|api[-_]?key|apikey|secret|password/i; |
|
|
const SENSITIVE_KEY_PATTERN = /authorization|token|api[-_]?key|apikey|secret|password/i; |
|
|
const MAX_STRING_LENGTH = 500; |
|
|
const MAX_STRING_LENGTH = 500; |
|
|
@ -13,7 +14,16 @@ type JsonLike = |
|
|
|
|
|
|
|
|
function redactValue(value: string): string { |
|
|
function redactValue(value: string): string { |
|
|
if (!value) return "[empty]"; |
|
|
if (!value) return "[empty]"; |
|
|
return `[redacted:${value.length}]`; |
|
|
const match = value.match(/^(\S+)\s+(.+)$/); |
|
|
|
|
|
const scheme = match?.[1]; |
|
|
|
|
|
const secret = match?.[2] ?? value; |
|
|
|
|
|
const hash = createHash("sha256").update(secret).digest("hex").slice(0, 12); |
|
|
|
|
|
const preview = |
|
|
|
|
|
secret.length <= 10 |
|
|
|
|
|
? `${secret.slice(0, 2)}...${secret.slice(-2)}` |
|
|
|
|
|
: `${secret.slice(0, 6)}...${secret.slice(-4)}`; |
|
|
|
|
|
const prefix = scheme ? `${scheme} ` : ""; |
|
|
|
|
|
return `${prefix}${preview} (len=${secret.length}, sha256=${hash})`; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function summarizeString(value: string): string | { type: string; length: number; prefix?: string } { |
|
|
function summarizeString(value: string): string | { type: string; length: number; prefix?: string } { |
|
|
@ -83,6 +93,11 @@ function sanitizeBody(body?: BodyInit | null): JsonLike | undefined { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function stringifyForLog(value: JsonLike | undefined): string { |
|
|
|
|
|
if (value === undefined) return ""; |
|
|
|
|
|
return JSON.stringify(value); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
export function logGatewayRequest( |
|
|
export function logGatewayRequest( |
|
|
label: string, |
|
|
label: string, |
|
|
url: string, |
|
|
url: string, |
|
|
@ -93,7 +108,7 @@ export function logGatewayRequest( |
|
|
...(context || {}), |
|
|
...(context || {}), |
|
|
url, |
|
|
url, |
|
|
method: init.method || "GET", |
|
|
method: init.method || "GET", |
|
|
headers: sanitizeHeaders(init.headers), |
|
|
headers: stringifyForLog(sanitizeHeaders(init.headers)), |
|
|
params: sanitizeBody(init.body), |
|
|
params: stringifyForLog(sanitizeBody(init.body)), |
|
|
}); |
|
|
}); |
|
|
} |
|
|
} |
|
|
|