Advertisement
Guest User

goproxy public server

a guest
Aug 17th, 2016
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 3.54 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "log"
  5.     "io"
  6.     "net"
  7.     "fmt"
  8.     "flag"
  9.     "sync"
  10. )
  11.  
  12. type Server struct {
  13.     QuitChan chan bool
  14.     CltChan chan net.Conn
  15.     UsrChan chan net.Conn
  16.     CltServer net.Listener
  17.     UsrServer net.Listener
  18.     ProxyClient net.Conn
  19.     ProxyClientStatus bool
  20.     ProxyUser net.Conn
  21.     LsClt string
  22.     LsUsr string
  23. }
  24.  
  25. func (s *Server) Init(lsClt string, lsUsr string) {
  26.    
  27.     s.QuitChan = make(chan bool, 2)
  28.     s.CltChan = make(chan net.Conn)
  29.     s.UsrChan = make(chan net.Conn)
  30.    
  31.     s.LsClt = lsClt
  32.     s.LsUsr = lsUsr
  33.    
  34.     var errClt, errUsr error
  35.    
  36.     s.CltServer, errClt = net.Listen("tcp", s.LsClt) // listener for proxy client behind NAT
  37.     s.UsrServer, errUsr = net.Listen("tcp", s.LsUsr) // listener for proxy users
  38.    
  39.     if errClt != nil {
  40.         log.Fatalln(errClt)
  41.     }
  42.     if errUsr != nil {
  43.         log.Fatalln(errUsr)
  44.     }
  45.     s.Serve()
  46. }
  47.  
  48. func (s *Server) AcceptUserConn(wg sync.WaitGroup) {
  49.     for {
  50.        
  51.         conn, err := s.UsrServer.Accept()
  52.         if err != nil {
  53.             log.Fatalln(err)
  54.             fmt.Println("*** New user connection error *** ", err)
  55.         }
  56.         fmt.Println("*** New user connection ***")
  57.         s.UsrChan <- conn
  58.     }
  59.     s.QuitChan <- true
  60.    
  61. }
  62.  
  63. func (s *Server) AcceptClientConn(wg sync.WaitGroup) {
  64.    
  65.     for {              
  66.         if s.ProxyClientStatus == false {
  67.             cltConn, err := s.CltServer.Accept()
  68.             if err != nil {
  69.                 log.Fatalln(err)
  70.                 fmt.Println("*** New client connection error *** ", err)
  71.                 continue
  72.             }
  73.             fmt.Println("*** New client connection ***")
  74.             s.ProxyClient = cltConn
  75.             s.ProxyClientStatus = true
  76.         }
  77.         s.Tunnel(wg)
  78.     }
  79.     s.QuitChan <- true
  80. }
  81.  
  82. func (s *Server) Tunnel(wg sync.WaitGroup) {
  83.    
  84.     fmt.Println("*** TUNNEL User <--> Client ***")
  85.    
  86.     usrConn := <- s.UsrChan
  87.    
  88.     wg.Add(1)
  89.     go func(wg sync.WaitGroup) {
  90.     fmt.Println("*** Waiting  to copy to client ***")
  91.         _, err := io.Copy(s.ProxyClient, usrConn)// !!!!This io.Copy seems not to block!!!!
  92.         fmt.Println("*** Copied to client ***")
  93.         if err != nil {
  94.             fmt.Println("*** Handle request - error ***", err)
  95.             usrConn.Close()
  96.         }
  97.         wg.Done()
  98.     }(wg)
  99.     // wg.Wait() // If this is uncommented I dont get any response to the user
  100.     fmt.Println("*** Waiting  to copy to user ***")
  101.     _, err := io.Copy(usrConn, s.ProxyClient) // !!!!This io.Copy blocks!!!!
  102.     fmt.Println("*** Copied to user ***")
  103.     if err != nil {
  104.         mt.Println("*** Handle ProxyClient - error ***", err)
  105.        usrConn.Close() // Is this required?
  106.     }
  107.     fmt.Println("*** Handle request - close user conn ***")
  108.     usrConn.Close()
  109.        
  110. }
  111.  
  112. func (s *Server) Serve() {
  113.    
  114.     var wg sync.WaitGroup
  115.     go s.AcceptClientConn(wg)
  116.     go s.AcceptUserConn(wg)
  117.    
  118.     <- s.QuitChan
  119. }
  120.  
  121. func main() {
  122.    
  123.     fmt.Println("*********** Startet ncsocks reverse proxy v3 ***********")
  124.  
  125.     flgListenClients := flag.String("lc", "", "Client listener")
  126.     flgListenUsers := flag.String("lu", "", "User listenere")
  127.     flag.Parse()
  128.  
  129.     if *flgListenClients == "" {
  130.         fmt.Println("Invalid client listener")
  131.         return
  132.     }
  133.  
  134.     if *flgListenUsers == "" {
  135.         fmt.Println("Invalid user listener")
  136.         return
  137.     }
  138.  
  139.     s := Server{}
  140.     s.Init(*flgListenClients, *flgListenUsers)
  141.     s.Serve()
  142.    
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement