feat: логирование заголовков запроса и заголовков в апстрим; маскировка секретов; Content-Type прокси-овнер

This commit is contained in:
2026-09-11 04:44:05 +03:00
parent e251ca5326
commit efdce75ee9
2 changed files with 67 additions and 1 deletions
@@ -289,6 +289,7 @@ class ConfigLogicTest {
"Proxy-Connection" to listOf("keep-alive"),
"Upgrade" to listOf("h2c"),
"Authorization" to listOf("Bearer client-secret"),
"Content-Type" to listOf("application/x-www-form-urlencoded"),
"Accept" to listOf("*/*"),
)
val out = headersToForward(req)
@@ -297,6 +298,7 @@ class ConfigLogicTest {
assertEquals(listOf("*/*"), out["Accept"])
assertEquals(3, out.size)
assertEquals(null, out["Authorization"])
assertEquals(null, out["Content-Type"])
}
@Test
@@ -312,6 +314,32 @@ class ConfigLogicTest {
assertEquals(listOf("s"), out["x-opencode-session"])
}
@Test
fun formatHeadersForLogMasksSecretsAndKeepsOthers() {
val line = formatHeadersForLog(
headersOf(
"X-Opencode-Session" to listOf("abc-123"),
"Authorization" to listOf("Bearer super-secret"),
"x-api-key" to listOf("key-1"),
"Cookie" to listOf("session=deadbeef"),
),
)
assertTrue(line.contains("X-Opencode-Session=abc-123"))
assertTrue(line.contains("Authorization=***"))
assertTrue(line.contains("x-api-key=***"))
assertTrue(line.contains("Cookie=***"))
assertFalse(line.contains("super-secret"))
assertFalse(line.contains("deadbeef"))
}
@Test
fun formatHeadersForLogJoinsMultipleValues() {
val line = formatHeadersForLog(
headersOf("X-Custom" to listOf("a", "b")),
)
assertEquals("X-Custom=a|b", line)
}
@Test
fun rebuildFromChunksPreservesAllUpstreamFields() {
val sse = """