Advertisement
Guest User

Untitled

a guest
Jan 21st, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.50 KB | None | 0 0
  1. package proxy
  2.  
  3. import (
  4. "net"
  5. "strings"
  6. "time"
  7. "io"
  8. )
  9.  
  10. type (
  11. TCPProxy interface {
  12. LocalPort() int
  13. }
  14.  
  15. tcpProxy struct {
  16. listener *net.TCPListener
  17. remoteAddress *net.TCPAddr
  18. }
  19. )
  20.  
  21. func NewTCPProxy(local, remote string) (TCPProxy, error) {
  22. if strings.Index(local, ":") >= 0 {
  23. host, _, err := net.SplitHostPort(local)
  24. if err != nil {
  25. return nil, err
  26. }
  27. local = host
  28. }
  29.  
  30. localResolved, err := net.ResolveTCPAddr("tcp", net.JoinHostPort(local, "0"))
  31. if err != nil {
  32. return nil, err
  33. }
  34.  
  35. remoteResolved, err := net.ResolveTCPAddr("tcp", remote)
  36. if err != nil {
  37. return nil, err
  38. }
  39.  
  40. listener, err := net.ListenTCP("tcp", localResolved)
  41. if err != nil {
  42. return nil, err
  43. }
  44.  
  45. p := &tcpProxy{
  46. listener: listener,
  47. remoteAddress: remoteResolved,
  48. }
  49.  
  50. go p.listen()
  51.  
  52. return p, nil
  53. }
  54.  
  55. func (p *tcpProxy) listen() {
  56. defer p.listener.Close()
  57.  
  58. for {
  59. conn, err := p.listener.AcceptTCP()
  60.  
  61. if err != nil {
  62. if ne, ok := err.(net.Error); ok && ne.Temporary() {
  63. time.Sleep(10 * time.Millisecond)
  64. continue
  65. }
  66. return
  67. }
  68.  
  69. go p.handleConnection(conn)
  70. }
  71. }
  72.  
  73. func (p *tcpProxy) handleConnection(conn *net.TCPConn) {
  74. defer conn.Close()
  75.  
  76. rc, err := net.DialTCP("tcp", nil, p.remoteAddress)
  77. if err != nil {
  78. return
  79. }
  80.  
  81. defer rc.Close()
  82.  
  83. go p.pipe(conn, rc)
  84. p.pipe(rc, conn)
  85. }
  86.  
  87. func (p *tcpProxy) pipe(dst io.Writer, src io.Reader) {
  88. for {
  89. if _, err := io.Copy(dst, src); err != nil {
  90. break
  91. }
  92. }
  93. }
  94.  
  95. func (p *tcpProxy) LocalPort() int {
  96. return p.listener.Addr().(*net.TCPAddr).Port
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement