fix handler sniffing

This commit is contained in:
ginuerzh
2024-10-16 23:01:12 +08:00
parent 618d042001
commit 7e51404ae5
7 changed files with 113 additions and 89 deletions
+26 -22
View File
@@ -303,30 +303,34 @@ func (h *httpHandler) handleRequest(ctx context.Context, conn net.Conn, req *htt
} }
defer cc.Close() defer cc.Close()
rw := traffic_wrapper.WrapReadWriter( {
h.limiter, rw := traffic_wrapper.WrapReadWriter(
conn, h.limiter,
clientID, conn,
limiter.ScopeOption(limiter.ScopeClient), clientID,
limiter.ServiceOption(h.options.Service), limiter.ScopeOption(limiter.ScopeClient),
limiter.NetworkOption(network), limiter.ServiceOption(h.options.Service),
limiter.AddrOption(addr), limiter.NetworkOption(network),
limiter.ClientOption(clientID), limiter.AddrOption(addr),
limiter.SrcOption(conn.RemoteAddr().String()), limiter.ClientOption(clientID),
) limiter.SrcOption(conn.RemoteAddr().String()),
if h.options.Observer != nil { )
pstats := h.stats.Stats(clientID) if h.options.Observer != nil {
pstats.Add(stats.KindTotalConns, 1) pstats := h.stats.Stats(clientID)
pstats.Add(stats.KindCurrentConns, 1) pstats.Add(stats.KindTotalConns, 1)
defer pstats.Add(stats.KindCurrentConns, -1) pstats.Add(stats.KindCurrentConns, 1)
rw = stats_wrapper.WrapReadWriter(rw, pstats) defer pstats.Add(stats.KindCurrentConns, -1)
rw = stats_wrapper.WrapReadWriter(rw, pstats)
}
conn = xnet.NewReadWriteConn(rw, rw, conn)
} }
if req.Method != http.MethodConnect { if req.Method != http.MethodConnect {
ro2 := &xrecorder.HandlerRecorderObject{} ro2 := &xrecorder.HandlerRecorderObject{}
*ro2 = *ro *ro2 = *ro
ro.Time = time.Time{} ro.Time = time.Time{}
return h.handleProxy(ctx, rw, cc, req, ro2, log) return h.handleProxy(ctx, conn, cc, req, ro2, log)
} }
resp.StatusCode = http.StatusOK resp.StatusCode = http.StatusOK
@@ -336,7 +340,7 @@ func (h *httpHandler) handleRequest(ctx context.Context, conn net.Conn, req *htt
dump, _ := httputil.DumpResponse(resp, false) dump, _ := httputil.DumpResponse(resp, false)
log.Trace(string(dump)) log.Trace(string(dump))
} }
if err = resp.Write(rw); err != nil { if err = resp.Write(conn); err != nil {
log.Error(err) log.Error(err)
return err return err
} }
@@ -346,7 +350,7 @@ func (h *httpHandler) handleRequest(ctx context.Context, conn net.Conn, req *htt
conn.SetReadDeadline(time.Now().Add(h.md.sniffingTimeout)) conn.SetReadDeadline(time.Now().Add(h.md.sniffingTimeout))
} }
br := bufio.NewReader(rw) br := bufio.NewReader(conn)
proto, _ := sniffing.Sniff(ctx, br) proto, _ := sniffing.Sniff(ctx, br)
ro.Proto = proto ro.Proto = proto
@@ -371,7 +375,7 @@ func (h *httpHandler) handleRequest(ctx context.Context, conn net.Conn, req *htt
ReadTimeout: h.md.readTimeout, ReadTimeout: h.md.readTimeout,
} }
conn = xnet.NewReadWriteConn(br, rw, conn) conn = xnet.NewReadWriteConn(br, conn, conn)
switch proto { switch proto {
case sniffing.ProtoHTTP: case sniffing.ProtoHTTP:
return sniffer.HandleHTTP(ctx, conn, return sniffer.HandleHTTP(ctx, conn,
@@ -392,7 +396,7 @@ func (h *httpHandler) handleRequest(ctx context.Context, conn net.Conn, req *htt
start := time.Now() start := time.Now()
log.Infof("%s <-> %s", conn.RemoteAddr(), addr) log.Infof("%s <-> %s", conn.RemoteAddr(), addr)
xnet.Transport(rw, cc) xnet.Transport(conn, cc)
log.WithFields(map[string]any{ log.WithFields(map[string]any{
"duration": time.Since(start), "duration": time.Since(start),
}).Infof("%s >-< %s", conn.RemoteAddr(), addr) }).Infof("%s >-< %s", conn.RemoteAddr(), addr)
+25 -21
View File
@@ -121,24 +121,28 @@ func (h *relayHandler) handleConnect(ctx context.Context, conn net.Conn, network
} }
} }
clientID := ctxvalue.ClientIDFromContext(ctx) {
rw := traffic_wrapper.WrapReadWriter( clientID := ctxvalue.ClientIDFromContext(ctx)
h.limiter, rw := traffic_wrapper.WrapReadWriter(
conn, h.limiter,
string(clientID), conn,
limiter.ScopeOption(limiter.ScopeClient), string(clientID),
limiter.ServiceOption(h.options.Service), limiter.ScopeOption(limiter.ScopeClient),
limiter.NetworkOption(network), limiter.ServiceOption(h.options.Service),
limiter.AddrOption(address), limiter.NetworkOption(network),
limiter.ClientOption(string(clientID)), limiter.AddrOption(address),
limiter.SrcOption(conn.RemoteAddr().String()), limiter.ClientOption(string(clientID)),
) limiter.SrcOption(conn.RemoteAddr().String()),
if h.options.Observer != nil { )
pstats := h.stats.Stats(string(clientID)) if h.options.Observer != nil {
pstats.Add(stats.KindTotalConns, 1) pstats := h.stats.Stats(string(clientID))
pstats.Add(stats.KindCurrentConns, 1) pstats.Add(stats.KindTotalConns, 1)
defer pstats.Add(stats.KindCurrentConns, -1) pstats.Add(stats.KindCurrentConns, 1)
rw = stats_wrapper.WrapReadWriter(rw, pstats) defer pstats.Add(stats.KindCurrentConns, -1)
rw = stats_wrapper.WrapReadWriter(rw, pstats)
}
conn = xnet.NewReadWriteConn(rw, rw, conn)
} }
if h.md.sniffing { if h.md.sniffing {
@@ -146,7 +150,7 @@ func (h *relayHandler) handleConnect(ctx context.Context, conn net.Conn, network
conn.SetReadDeadline(time.Now().Add(h.md.sniffingTimeout)) conn.SetReadDeadline(time.Now().Add(h.md.sniffingTimeout))
} }
br := bufio.NewReader(rw) br := bufio.NewReader(conn)
proto, _ := sniffing.Sniff(ctx, br) proto, _ := sniffing.Sniff(ctx, br)
ro.Proto = proto ro.Proto = proto
@@ -171,7 +175,7 @@ func (h *relayHandler) handleConnect(ctx context.Context, conn net.Conn, network
ReadTimeout: h.md.readTimeout, ReadTimeout: h.md.readTimeout,
} }
conn = xnet.NewReadWriteConn(br, rw, conn) conn = xnet.NewReadWriteConn(br, conn, conn)
switch proto { switch proto {
case sniffing.ProtoHTTP: case sniffing.ProtoHTTP:
return sniffer.HandleHTTP(ctx, conn, return sniffer.HandleHTTP(ctx, conn,
@@ -192,7 +196,7 @@ func (h *relayHandler) handleConnect(ctx context.Context, conn net.Conn, network
t := time.Now() t := time.Now()
log.Infof("%s <-> %s", conn.RemoteAddr(), address) log.Infof("%s <-> %s", conn.RemoteAddr(), address)
xnet.Transport(rw, cc) xnet.Transport(conn, cc)
log.WithFields(map[string]any{ log.WithFields(map[string]any{
"duration": time.Since(t), "duration": time.Since(t),
}).Infof("%s >-< %s", conn.RemoteAddr(), address) }).Infof("%s >-< %s", conn.RemoteAddr(), address)
+25 -21
View File
@@ -230,24 +230,28 @@ func (h *socks4Handler) handleConnect(ctx context.Context, conn net.Conn, req *g
return err return err
} }
clientID := ctxvalue.ClientIDFromContext(ctx) {
rw := traffic_wrapper.WrapReadWriter( clientID := ctxvalue.ClientIDFromContext(ctx)
h.limiter, rw := traffic_wrapper.WrapReadWriter(
conn, h.limiter,
string(clientID), conn,
limiter.ScopeOption(limiter.ScopeClient), string(clientID),
limiter.ServiceOption(h.options.Service), limiter.ScopeOption(limiter.ScopeClient),
limiter.NetworkOption("tcp"), limiter.ServiceOption(h.options.Service),
limiter.AddrOption(addr), limiter.NetworkOption("tcp"),
limiter.ClientOption(string(clientID)), limiter.AddrOption(addr),
limiter.SrcOption(conn.RemoteAddr().String()), limiter.ClientOption(string(clientID)),
) limiter.SrcOption(conn.RemoteAddr().String()),
if h.options.Observer != nil { )
pstats := h.stats.Stats(string(clientID)) if h.options.Observer != nil {
pstats.Add(stats.KindTotalConns, 1) pstats := h.stats.Stats(string(clientID))
pstats.Add(stats.KindCurrentConns, 1) pstats.Add(stats.KindTotalConns, 1)
defer pstats.Add(stats.KindCurrentConns, -1) pstats.Add(stats.KindCurrentConns, 1)
rw = stats_wrapper.WrapReadWriter(rw, pstats) defer pstats.Add(stats.KindCurrentConns, -1)
rw = stats_wrapper.WrapReadWriter(rw, pstats)
}
conn = xnet.NewReadWriteConn(rw, rw, conn)
} }
if h.md.sniffing { if h.md.sniffing {
@@ -255,7 +259,7 @@ func (h *socks4Handler) handleConnect(ctx context.Context, conn net.Conn, req *g
conn.SetReadDeadline(time.Now().Add(h.md.sniffingTimeout)) conn.SetReadDeadline(time.Now().Add(h.md.sniffingTimeout))
} }
br := bufio.NewReader(rw) br := bufio.NewReader(conn)
proto, _ := sniffing.Sniff(ctx, br) proto, _ := sniffing.Sniff(ctx, br)
ro.Proto = proto ro.Proto = proto
@@ -280,7 +284,7 @@ func (h *socks4Handler) handleConnect(ctx context.Context, conn net.Conn, req *g
ReadTimeout: h.md.readTimeout, ReadTimeout: h.md.readTimeout,
} }
conn = xnet.NewReadWriteConn(br, rw, conn) conn = xnet.NewReadWriteConn(br, conn, conn)
switch proto { switch proto {
case sniffing.ProtoHTTP: case sniffing.ProtoHTTP:
return sniffer.HandleHTTP(ctx, conn, return sniffer.HandleHTTP(ctx, conn,
@@ -301,7 +305,7 @@ func (h *socks4Handler) handleConnect(ctx context.Context, conn net.Conn, req *g
t := time.Now() t := time.Now()
log.Infof("%s <-> %s", conn.RemoteAddr(), ro.Host) log.Infof("%s <-> %s", conn.RemoteAddr(), ro.Host)
xnet.Transport(rw, cc) xnet.Transport(conn, cc)
log.WithFields(map[string]any{ log.WithFields(map[string]any{
"duration": time.Since(t), "duration": time.Since(t),
}).Infof("%s >-< %s", conn.RemoteAddr(), ro.Host) }).Infof("%s >-< %s", conn.RemoteAddr(), ro.Host)
+25 -21
View File
@@ -58,24 +58,28 @@ func (h *socks5Handler) handleConnect(ctx context.Context, conn net.Conn, networ
return err return err
} }
clientID := ctxvalue.ClientIDFromContext(ctx) {
rw := traffic_wrapper.WrapReadWriter( clientID := ctxvalue.ClientIDFromContext(ctx)
h.limiter, rw := traffic_wrapper.WrapReadWriter(
conn, h.limiter,
string(clientID), conn,
limiter.ServiceOption(h.options.Service), string(clientID),
limiter.ScopeOption(limiter.ScopeClient), limiter.ServiceOption(h.options.Service),
limiter.NetworkOption(network), limiter.ScopeOption(limiter.ScopeClient),
limiter.AddrOption(address), limiter.NetworkOption(network),
limiter.ClientOption(string(clientID)), limiter.AddrOption(address),
limiter.SrcOption(conn.RemoteAddr().String()), limiter.ClientOption(string(clientID)),
) limiter.SrcOption(conn.RemoteAddr().String()),
if h.options.Observer != nil { )
pstats := h.stats.Stats(string(clientID)) if h.options.Observer != nil {
pstats.Add(stats.KindTotalConns, 1) pstats := h.stats.Stats(string(clientID))
pstats.Add(stats.KindCurrentConns, 1) pstats.Add(stats.KindTotalConns, 1)
defer pstats.Add(stats.KindCurrentConns, -1) pstats.Add(stats.KindCurrentConns, 1)
rw = stats_wrapper.WrapReadWriter(rw, pstats) defer pstats.Add(stats.KindCurrentConns, -1)
rw = stats_wrapper.WrapReadWriter(rw, pstats)
}
conn = xnet.NewReadWriteConn(rw, rw, conn)
} }
if h.md.sniffing { if h.md.sniffing {
@@ -83,7 +87,7 @@ func (h *socks5Handler) handleConnect(ctx context.Context, conn net.Conn, networ
conn.SetReadDeadline(time.Now().Add(h.md.sniffingTimeout)) conn.SetReadDeadline(time.Now().Add(h.md.sniffingTimeout))
} }
br := bufio.NewReader(rw) br := bufio.NewReader(conn)
proto, _ := sniffing.Sniff(ctx, br) proto, _ := sniffing.Sniff(ctx, br)
ro.Proto = proto ro.Proto = proto
@@ -108,7 +112,7 @@ func (h *socks5Handler) handleConnect(ctx context.Context, conn net.Conn, networ
ReadTimeout: h.md.readTimeout, ReadTimeout: h.md.readTimeout,
} }
conn = xnet.NewReadWriteConn(br, rw, conn) conn = xnet.NewReadWriteConn(br, conn, conn)
switch proto { switch proto {
case sniffing.ProtoHTTP: case sniffing.ProtoHTTP:
return sniffer.HandleHTTP(ctx, conn, return sniffer.HandleHTTP(ctx, conn,
@@ -129,7 +133,7 @@ func (h *socks5Handler) handleConnect(ctx context.Context, conn net.Conn, networ
t := time.Now() t := time.Now()
log.Infof("%s <-> %s", conn.RemoteAddr(), address) log.Infof("%s <-> %s", conn.RemoteAddr(), address)
xnet.Transport(rw, cc) xnet.Transport(conn, cc)
log.WithFields(map[string]any{ log.WithFields(map[string]any{
"duration": time.Since(t), "duration": time.Since(t),
}).Infof("%s >-< %s", conn.RemoteAddr(), address) }).Infof("%s >-< %s", conn.RemoteAddr(), address)
+6 -2
View File
@@ -100,7 +100,9 @@ func (ep *entrypoint) Handle(ctx context.Context, conn net.Conn) (err error) {
} }
log.WithFields(map[string]any{ log.WithFields(map[string]any{
"duration": time.Since(ro.Time), "duration": time.Since(ro.Time),
"inputBytes": ro.InputBytes,
"outputBytes": ro.OutputBytes,
}).Infof("%s >< %s", conn.RemoteAddr(), conn.LocalAddr()) }).Infof("%s >< %s", conn.RemoteAddr(), conn.LocalAddr())
}() }()
@@ -192,7 +194,9 @@ func (ep *entrypoint) httpRoundTrip(ctx context.Context, rw io.ReadWriter, req *
} }
log.WithFields(map[string]any{ log.WithFields(map[string]any{
"duration": time.Since(ro.Time), "duration": time.Since(ro.Time),
"inputBytes": ro.InputBytes,
"outputBytes": ro.OutputBytes,
}).Infof("%s >-< %s", ro.RemoteAddr, req.Host) }).Infof("%s >-< %s", ro.RemoteAddr, req.Host)
}() }()
+3 -1
View File
@@ -364,7 +364,9 @@ func (h *Sniffer) httpRoundTrip(ctx context.Context, rw, cc io.ReadWriter, node
} }
log.WithFields(map[string]any{ log.WithFields(map[string]any{
"duration": time.Since(ro.Time), "duration": time.Since(ro.Time),
"inputBytes": ro.InputBytes,
"outputBytes": ro.OutputBytes,
}).Infof("%s >-< %s", ro.RemoteAddr, req.Host) }).Infof("%s >-< %s", ro.RemoteAddr, req.Host)
}() }()
+3 -1
View File
@@ -272,7 +272,9 @@ func (h *Sniffer) httpRoundTrip(ctx context.Context, rw, cc io.ReadWriter, req *
} }
log.WithFields(map[string]any{ log.WithFields(map[string]any{
"duration": time.Since(ro.Time), "duration": time.Since(ro.Time),
"inputBytes": ro.InputBytes,
"outputBytes": ro.OutputBytes,
}).Infof("%s >-< %s", ro.RemoteAddr, req.Host) }).Infof("%s >-< %s", ro.RemoteAddr, req.Host)
}() }()