|
|
@@ -48,7 +48,7 @@ func (vconn *FreedomConnection) Start(ray core.OutboundRay) error {
|
|
|
go dumpInput(conn, input, &writeMutex)
|
|
|
}
|
|
|
|
|
|
- go dumpOutput(conn, output, &readMutex)
|
|
|
+ go dumpOutput(conn, output, &readMutex, vconn.packet.Destination().IsUDP())
|
|
|
|
|
|
go func() {
|
|
|
writeMutex.Lock()
|
|
|
@@ -67,8 +67,20 @@ func dumpInput(conn net.Conn, input <-chan []byte, finish *sync.Mutex) {
|
|
|
finish.Unlock()
|
|
|
}
|
|
|
|
|
|
-func dumpOutput(conn net.Conn, output chan<- []byte, finish *sync.Mutex) {
|
|
|
+func dumpOutput(conn net.Conn, output chan<- []byte, finish *sync.Mutex, udp bool) {
|
|
|
+ defer finish.Unlock()
|
|
|
+ defer close(output)
|
|
|
+
|
|
|
+ response, err := v2net.ReadFrom(conn)
|
|
|
+ if len(response) > 0 {
|
|
|
+ output <- response
|
|
|
+ }
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if udp {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
v2net.ReaderToChan(output, conn)
|
|
|
- finish.Unlock()
|
|
|
- close(output)
|
|
|
}
|