http_proxy_base_hosttracker.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package http_proxy
  2. import (
  3. "net"
  4. "sync"
  5. )
  6. type Host struct {
  7. Hostname string
  8. Address net.IP
  9. Resolved sync.WaitGroup
  10. }
  11. func NewHost(name string) *Host {
  12. h := &Host{
  13. Hostname: name,
  14. Address: nil,
  15. Resolved: sync.WaitGroup{},
  16. }
  17. h.Resolved.Add(1)
  18. go func(ph *Host) {
  19. defer ph.Resolved.Done()
  20. if addrs, err := net.LookupIP(ph.Hostname); err == nil && len(addrs) > 0 {
  21. ph.Address = make(net.IP, len(addrs[0]))
  22. copy(ph.Address, addrs[0])
  23. } else {
  24. ph.Address = nil
  25. }
  26. }(h)
  27. return h
  28. }
  29. type HostTracker struct {
  30. sync.RWMutex
  31. uhosts map[string]*Host
  32. shosts map[string]*Host
  33. }
  34. func NewHostTracker() *HostTracker {
  35. return &HostTracker{
  36. uhosts: make(map[string]*Host),
  37. shosts: make(map[string]*Host),
  38. }
  39. }
  40. func (t *HostTracker) Track(host, stripped string) {
  41. t.Lock()
  42. defer t.Unlock()
  43. t.uhosts[stripped] = NewHost(host)
  44. t.shosts[host] = NewHost(stripped)
  45. }
  46. func (t *HostTracker) Unstrip(stripped string) *Host {
  47. t.RLock()
  48. defer t.RUnlock()
  49. if host, found := t.uhosts[stripped]; found {
  50. return host
  51. }
  52. return nil
  53. }
  54. func (t *HostTracker) Strip(unstripped string) *Host {
  55. t.RLock()
  56. defer t.RUnlock()
  57. if host, found := t.shosts[unstripped]; found {
  58. return host
  59. }
  60. return nil
  61. }