access.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package log
  2. import (
  3. "strings"
  4. "context"
  5. "v2ray.com/core/common/serial"
  6. )
  7. type logKey int
  8. const (
  9. accessMessageKey logKey = iota
  10. )
  11. type AccessStatus string
  12. const (
  13. AccessAccepted = AccessStatus("accepted")
  14. AccessRejected = AccessStatus("rejected")
  15. )
  16. type AccessMessage struct {
  17. From interface{}
  18. To interface{}
  19. Status AccessStatus
  20. Reason interface{}
  21. Detour interface{}
  22. }
  23. func (m *AccessMessage) String() string {
  24. builder := strings.Builder{}
  25. builder.WriteString(serial.ToString(m.From))
  26. builder.WriteByte(' ')
  27. builder.WriteString(string(m.Status))
  28. builder.WriteByte(' ')
  29. builder.WriteString(serial.ToString(m.To))
  30. builder.WriteByte(' ')
  31. builder.WriteString(serial.ToString(m.Detour))
  32. builder.WriteByte(' ')
  33. builder.WriteString(serial.ToString(m.Reason))
  34. return builder.String()
  35. }
  36. func ContextWithAccessMessage(ctx context.Context, accessMessage *AccessMessage) context.Context {
  37. return context.WithValue(ctx, accessMessageKey, accessMessage)
  38. }
  39. func AccessMessageFromContext(ctx context.Context) *AccessMessage {
  40. if accessMessage, ok := ctx.Value(accessMessageKey).(*AccessMessage); ok {
  41. return accessMessage
  42. }
  43. return nil
  44. }