ginuerzh
c246a1d4fa
feat(handler/http,http2): support comma-separated hostnames in probeResistance knock
...
Knock previously accepted a single hostname. Now it accepts multiple
comma-separated hostnames; probe resistance is bypassed if the request
hostname matches any entry in the list. Matching is case-insensitive
and whitespace around entries is trimmed.
2026-05-28 23:20:27 +08:00
ginuerzh
3246b39c93
refactor(handler/http): split handler monolith into 7 focused files with 96 unit tests
...
Extract the 1024-line handler.go into concern-focused files:
util.go — 5 pure functions (decodeServerName, basicProxyAuth, upgradeType,
normalizeHostPort, buildConnectResponse) — 100% coverage
auth.go — authenticate (5 probe-resistance strategies + knock) + checkRateLimit
connect.go — handleConnect, sniffAndHandle, dial, setupTrafficLimiter
proxy.go — handleProxy keep-alive loop, proxyRoundTrip, handleUpgradeResponse
websocket.go — WebSocket frame sniffing/recording with rate-limited sampling
udp.go — UDP-over-HTTP relay with SOCKS5 tunnel
metadata.go — metadata struct, parseMetadata, probeResistance type
Key improvements:
- Transport injection (http.RoundTripper field) enables testing without real network
- Nil Router guards in dial, handleUDP, and nil Addr guard in checkRateLimit
- Pure functions converted from methods to package-level (no state dependency)
- setupTrafficLimiter returns cleanup closure to preserve defer lifetime
- handleConnect accepts caller's resp for correct recorder status capture
- Comprehensive package doc with full request-flow documentation
96 tests: 100% on pure functions, 86% on metadata parsing, 55% overall (integration
paths verified by e2e tests).
2026-05-28 23:06:37 +08:00
Andrew Beresford
290e9c37d5
Make pipe read timeout configurable via idleTimeout metadata
...
The 30s hardcoded readTimeout in Pipe() caused all CONNECT tunnel
connections to be hard-closed after 30s of inactivity, breaking
WebSocket and long-polling connections through the proxy.
Pipe() now accepts a WithReadTimeout(d) option. When d is 0 (the
default) no read deadline is set, relying on TCP keepalives or context
cancellation to detect dead connections instead.
The HTTP handler exposes this as the idleTimeout metadata key.
Fixes: https://github.com/go-gost/x/issues/91
2026-05-08 11:31:53 +01:00
ginuerzh
a5309eee97
add buffer size option for udp connection
2025-07-30 21:40:53 +08:00
ginuerzh
afcf4a5252
parse real client IP
2025-07-15 19:59:10 +08:00
ginuerzh
379d9a73ad
service: add limiter.scope option
2025-01-20 23:22:58 +08:00
ginuerzh
06d993023f
add traffic reset for stats
2024-12-24 20:11:22 +08:00
ginuerzh
79b6b9138e
add limiterRefreshInterval option for limiter
2024-11-14 20:16:09 +08:00
ginuerzh
a12870e766
add compression flag option for http request
2024-11-02 20:41:23 +08:00
ginuerzh
6b932e35bf
sniffing websocket frame
2024-10-19 19:36:06 +08:00
ginuerzh
a0cbee8817
use http.transport for non-connect http tunnel
2024-10-17 21:57:20 +08:00
ginuerzh
9a56c8fba3
add keepalive option for http handler
2024-10-10 16:52:01 +08:00
ginuerzh
c42a44abb6
add sniffer utility
2024-10-02 22:51:23 +08:00
ginuerzh
3c8add4b82
add traffic sniffing for handler
2024-09-27 15:55:28 +08:00
ginuerzh
74dc03bd66
fix http proxy response
2024-06-25 22:09:00 +08:00
ginuerzh
6d819a0c06
add observePeriod option for observer
2024-06-13 21:22:29 +08:00
ginuerzh
3e35a7b761
add authBasicRealm metadata for HTTP/HTTP2 handler
2023-01-31 13:42:55 +08:00
ginuerzh
a1255e52d8
fix proxy protocol
2022-09-28 11:47:56 +08:00
ginuerzh
09dbdbb03c
add backup filter
2022-09-02 11:52:44 +08:00
ginuerzh
d7b56871a9
customize random-generated certificate information
2022-07-27 16:58:49 +08:00
ginuerzh
dca2a79c54
update sni handler
2022-04-14 14:53:13 +08:00
ginuerzh
a3346ad246
add pkgs from core
2022-04-04 12:44:35 +08:00