]> Cypherpunks.ru repositories - govpn.git/blobdiff - src/govpn/cmd/govpn-client/tcp.go
Ability to use HTTP proxies for accessing server
[govpn.git] / src / govpn / cmd / govpn-client / tcp.go
index aa868da3d861a7c87e86c3cca1716518e9b31936..373789af8be5f9c7f64ecf8df320c04bef20528c 100644 (file)
@@ -50,46 +50,50 @@ func startTCP() (io.Writer, chan []byte, chan struct{}) {
        }
        sink := make(chan []byte)
        ready := make(chan struct{})
-       go func() {
-               var err error
-               var n int
-               var sizeNbuf int
-               sizeBuf := make([]byte, 2)
-               var sizeNeed uint16
-               var bufN uint16
-               buf := make([]byte, govpn.MTU)
-               for {
-                       <-ready
+       go handleTCP(c, sink, ready)
+       go func() { ready <- struct{}{} }()
+       return conn, sink, ready
+}
+
+func handleTCP(conn *net.TCPConn, sink chan []byte, ready chan struct{}) {
+       var err error
+       var n int
+       var sizeNbuf int
+       sizeBuf := make([]byte, 2)
+       var sizeNeed uint16
+       var bufN uint16
+       buf := make([]byte, govpn.MTU)
+       for {
+               <-ready
+               if sizeNbuf != 2 {
+                       n, err = conn.Read(sizeBuf[sizeNbuf:2])
+                       if err != nil {
+                               break
+                       }
+                       sizeNbuf += n
                        if sizeNbuf != 2 {
-                               n, err = c.Read(sizeBuf[sizeNbuf:2])
-                               if err != nil {
-                                       break
-                               }
-                               sizeNbuf += n
-                               if sizeNbuf == 2 {
-                                       sizeNeed = binary.BigEndian.Uint16(sizeBuf)
-                                       if sizeNeed > uint16(govpn.MTU)-2 {
-                                               log.Println("Invalid TCP size, skipping")
-                                               sizeNbuf = 0
-                                               sink <- nil
-                                               continue
-                                       }
-                                       bufN = 0
-                               }
+                               sink <- nil
+                               continue
                        }
-               ReadMore:
-                       if sizeNeed != bufN {
-                               n, err = c.Read(buf[bufN:sizeNeed])
-                               if err != nil {
-                                       break
-                               }
-                               bufN += uint16(n)
-                               goto ReadMore
+                       sizeNeed = binary.BigEndian.Uint16(sizeBuf)
+                       if int(sizeNeed) > govpn.MTU-2 {
+                               log.Println("Invalid TCP size, skipping")
+                               sizeNbuf = 0
+                               sink <- nil
+                               continue
                        }
-                       sizeNbuf = 0
-                       sink <- buf[:sizeNeed]
+                       bufN = 0
                }
-       }()
-       go func() { ready <- struct{}{} }()
-       return conn, sink, ready
+       ReadMore:
+               if sizeNeed != bufN {
+                       n, err = conn.Read(buf[bufN:sizeNeed])
+                       if err != nil {
+                               break
+                       }
+                       bufN += uint16(n)
+                       goto ReadMore
+               }
+               sizeNbuf = 0
+               sink <- buf[:sizeNeed]
+       }
 }