Browse Source

Merge pull request #5 from fcying/access_detour_log

access log add detour tag
Kslr 6 years ago
parent
commit
087415850b

+ 7 - 0
app/dispatcher/default.go

@@ -14,6 +14,7 @@ import (
 	"v2ray.com/core/common"
 	"v2ray.com/core/common/buf"
 	"v2ray.com/core/common/net"
+	"v2ray.com/core/common/log"
 	"v2ray.com/core/common/protocol"
 	"v2ray.com/core/common/session"
 	"v2ray.com/core/features/outbound"
@@ -281,5 +282,11 @@ func (d *DefaultDispatcher) routedDispatch(ctx context.Context, link *transport.
 		return
 	}
 
+	accessMessage := log.AccessMessageFromContext(ctx)
+	if accessMessage != nil {
+		accessMessage.Detour = "[" + handler.Tag() + "]"
+		log.Record(accessMessage)
+	}
+
 	handler.Dispatch(ctx, link)
 }

+ 21 - 0
common/log/access.go

@@ -2,10 +2,17 @@ package log
 
 import (
 	"strings"
+	"context"
 
 	"v2ray.com/core/common/serial"
 )
 
+type logKey int
+
+const (
+	accessMessageKey logKey = iota
+)
+
 type AccessStatus string
 
 const (
@@ -18,6 +25,7 @@ type AccessMessage struct {
 	To     interface{}
 	Status AccessStatus
 	Reason interface{}
+	Detour interface{}
 }
 
 func (m *AccessMessage) String() string {
@@ -28,6 +36,19 @@ func (m *AccessMessage) String() string {
 	builder.WriteByte(' ')
 	builder.WriteString(serial.ToString(m.To))
 	builder.WriteByte(' ')
+	builder.WriteString(serial.ToString(m.Detour))
+	builder.WriteByte(' ')
 	builder.WriteString(serial.ToString(m.Reason))
 	return builder.String()
 }
+
+func ContextWithAccessMessage(ctx context.Context, accessMessage *AccessMessage) context.Context {
+	return context.WithValue(ctx, accessMessageKey, accessMessage)
+}
+
+func AccessMessageFromContext(ctx context.Context) *AccessMessage {
+	if accessMessage, ok := ctx.Value(accessMessageKey).(*AccessMessage); ok {
+		return accessMessage
+	}
+	return nil 
+}

+ 2 - 1
proxy/http/server.go

@@ -131,10 +131,11 @@ Start:
 	if err != nil {
 		return newError("malformed proxy host: ", host).AtWarning().Base(err)
 	}
-	log.Record(&log.AccessMessage{
+	ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{
 		From:   conn.RemoteAddr(),
 		To:     request.URL,
 		Status: log.AccessAccepted,
+		Reason: "",
 	})
 
 	if strings.EqualFold(request.Method, "CONNECT") {

+ 2 - 2
proxy/shadowsocks/server.go

@@ -134,7 +134,7 @@ func (s *Server) handlerUDPPayload(ctx context.Context, conn internet.Connection
 
 			dest := request.Destination()
 			if inbound.Source.IsValid() {
-				log.Record(&log.AccessMessage{
+				ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{
 					From:   inbound.Source,
 					To:     dest,
 					Status: log.AccessAccepted,
@@ -175,7 +175,7 @@ func (s *Server) handleConnection(ctx context.Context, conn internet.Connection,
 	inbound.User = s.user
 
 	dest := request.Destination()
-	log.Record(&log.AccessMessage{
+	ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{
 		From:   conn.RemoteAddr(),
 		To:     dest,
 		Status: log.AccessAccepted,

+ 2 - 2
proxy/socks/server.go

@@ -117,7 +117,7 @@ func (s *Server) processTCP(ctx context.Context, conn internet.Connection, dispa
 		dest := request.Destination()
 		newError("TCP Connect request to ", dest).WriteToLog(session.ExportIDToError(ctx))
 		if inbound != nil && inbound.Source.IsValid() {
-			log.Record(&log.AccessMessage{
+			ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{
 				From:   inbound.Source,
 				To:     dest,
 				Status: log.AccessAccepted,
@@ -229,7 +229,7 @@ func (s *Server) handleUDPPayload(ctx context.Context, conn internet.Connection,
 
 			newError("send packet to ", request.Destination(), " with ", payload.Len(), " bytes").AtDebug().WriteToLog(session.ExportIDToError(ctx))
 			if inbound := session.InboundFromContext(ctx); inbound != nil && inbound.Source.IsValid() {
-				log.Record(&log.AccessMessage{
+				ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{
 					From:   inbound.Source,
 					To:     request.Destination(),
 					Status: log.AccessAccepted,

+ 1 - 1
proxy/vmess/inbound/inbound.go

@@ -250,7 +250,7 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection i
 	}
 
 	if request.Command != protocol.RequestCommandMux {
-		log.Record(&log.AccessMessage{
+		ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{
 			From:   connection.RemoteAddr(),
 			To:     request.Destination(),
 			Status: log.AccessAccepted,