access.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package log
  2. import (
  3. "context"
  4. "fmt"
  5. "strings"
  6. "v2ray.com/core/common/serial"
  7. )
  8. type logKey int
  9. const (
  10. accessMessageKey logKey = iota
  11. )
  12. type AccessStatus string
  13. const (
  14. AccessAccepted = AccessStatus("accepted")
  15. AccessRejected = AccessStatus("rejected")
  16. )
  17. type AccessMessage struct {
  18. From interface{}
  19. To interface{}
  20. Status AccessStatus
  21. Reason interface{}
  22. Email string
  23. Detour string
  24. BytesSent int64
  25. BytesReceived int64
  26. }
  27. func (m *AccessMessage) String() string {
  28. builder := strings.Builder{}
  29. builder.WriteString(serial.ToString(m.From))
  30. builder.WriteByte(' ')
  31. builder.WriteString(string(m.Status))
  32. builder.WriteByte(' ')
  33. builder.WriteString(serial.ToString(m.To))
  34. if len(m.Detour) > 0 {
  35. builder.WriteString(" [")
  36. builder.WriteString(m.Detour)
  37. builder.WriteByte(']')
  38. }
  39. if reason := serial.ToString(m.Reason); len(reason) > 0 {
  40. builder.WriteString(" ")
  41. builder.WriteString(reason)
  42. }
  43. if len(m.Email) > 0 {
  44. builder.WriteString(" email: ")
  45. builder.WriteString(m.Email)
  46. }
  47. builder.WriteString(fmt.Sprintf(" bytes_sent: %d bytes_received: %d", m.BytesSent, m.BytesReceived))
  48. return builder.String()
  49. }
  50. func ContextWithAccessMessage(ctx context.Context, accessMessage *AccessMessage) context.Context {
  51. return context.WithValue(ctx, accessMessageKey, accessMessage)
  52. }
  53. func AccessMessageFromContext(ctx context.Context) *AccessMessage {
  54. if accessMessage, ok := ctx.Value(accessMessageKey).(*AccessMessage); ok {
  55. return accessMessage
  56. }
  57. return nil
  58. }