|
4 | 4 | assertGatewayAuthConfigured, |
5 | 5 | authorizeGatewayConnect, |
6 | 6 | authorizeHttpGatewayConnect, |
| 7 | + hasForwardedRequestHeaders, |
| 8 | + isLocalDirectRequest, |
7 | 9 | resolveEffectiveSharedGatewayAuth, |
8 | 10 | authorizeWsControlUiGatewayConnect, |
9 | 11 | resolveGatewayAuth, |
@@ -137,6 +139,32 @@ describe("gateway auth", () => { |
137 | 139 | }); |
138 | 140 | }); |
139 | 141 |
|
| 142 | + it.each([ |
| 143 | + { name: "Forwarded", headers: { forwarded: "for=203.0.113.10;proto=https" } }, |
| 144 | + { name: "X-Forwarded-For", headers: { "x-forwarded-for": "203.0.113.10" } }, |
| 145 | + { name: "X-Forwarded-Proto", headers: { "x-forwarded-proto": "https" } }, |
| 146 | + { name: "X-Forwarded-Host", headers: { "x-forwarded-host": "gateway.example" } }, |
| 147 | + { name: "X-Real-IP", headers: { "x-real-ip": "203.0.113.10" } }, |
| 148 | + ])("treats $name as forwarded request evidence", ({ headers }) => { |
| 149 | + const req = { |
| 150 | + socket: { remoteAddress: "127.0.0.1" }, |
| 151 | + headers, |
| 152 | + } as never; |
| 153 | + |
| 154 | + expect(hasForwardedRequestHeaders(req)).toBe(true); |
| 155 | + expect(isLocalDirectRequest(req)).toBe(false); |
| 156 | + }); |
| 157 | + |
| 158 | + it("keeps clean loopback requests eligible for direct-local handling", () => { |
| 159 | + const req = { |
| 160 | + socket: { remoteAddress: "127.0.0.1" }, |
| 161 | + headers: { host: "127.0.0.1:18789" }, |
| 162 | + } as never; |
| 163 | + |
| 164 | + expect(hasForwardedRequestHeaders(req)).toBe(false); |
| 165 | + expect(isLocalDirectRequest(req)).toBe(true); |
| 166 | + }); |
| 167 | + |
140 | 168 | it("returns null for non-shared gateway auth modes", () => { |
141 | 169 | expect( |
142 | 170 | resolveEffectiveSharedGatewayAuth({ |
|
0 commit comments