|
|
@@ -66,24 +66,24 @@ func (handler *VMessOutboundHandler) Start(ray core.OutboundRay) error {
|
|
|
}
|
|
|
|
|
|
func startCommunicate(request *vmessio.VMessRequest, dest v2net.Address, ray core.OutboundRay) error {
|
|
|
- input := ray.OutboundInput()
|
|
|
+ input := ray.OutboundInput()
|
|
|
output := ray.OutboundOutput()
|
|
|
-
|
|
|
+
|
|
|
conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{dest.IP, int(dest.Port), ""})
|
|
|
log.Debug("VMessOutbound dialing tcp: %s", dest.String())
|
|
|
if err != nil {
|
|
|
log.Error("Failed to open tcp (%s): %v", dest.String(), err)
|
|
|
- close(output)
|
|
|
+ close(output)
|
|
|
return err
|
|
|
}
|
|
|
defer conn.Close()
|
|
|
- defer close(output)
|
|
|
-
|
|
|
- requestFinish := make(chan bool)
|
|
|
- responseFinish := make(chan bool)
|
|
|
-
|
|
|
- go handleRequest(conn, request, input, requestFinish)
|
|
|
- go handleResponse(conn, request, output, responseFinish)
|
|
|
+ defer close(output)
|
|
|
+
|
|
|
+ requestFinish := make(chan bool)
|
|
|
+ responseFinish := make(chan bool)
|
|
|
+
|
|
|
+ go handleRequest(conn, request, input, requestFinish)
|
|
|
+ go handleResponse(conn, request, output, responseFinish)
|
|
|
|
|
|
<-requestFinish
|
|
|
conn.CloseWrite()
|
|
|
@@ -92,27 +92,27 @@ func startCommunicate(request *vmessio.VMessRequest, dest v2net.Address, ray cor
|
|
|
}
|
|
|
|
|
|
func handleRequest(conn *net.TCPConn, request *vmessio.VMessRequest, input <-chan []byte, finish chan<- bool) error {
|
|
|
- defer close(finish)
|
|
|
- requestWriter := vmessio.NewVMessRequestWriter()
|
|
|
+ defer close(finish)
|
|
|
+ requestWriter := vmessio.NewVMessRequestWriter()
|
|
|
err := requestWriter.Write(conn, request)
|
|
|
if err != nil {
|
|
|
log.Error("Failed to write VMess request: %v", err)
|
|
|
return err
|
|
|
}
|
|
|
-
|
|
|
- encryptRequestWriter, err := v2io.NewAesEncryptWriter(request.RequestKey[:], request.RequestIV[:], conn)
|
|
|
+
|
|
|
+ encryptRequestWriter, err := v2io.NewAesEncryptWriter(request.RequestKey[:], request.RequestIV[:], conn)
|
|
|
if err != nil {
|
|
|
log.Error("Failed to create encrypt writer: %v", err)
|
|
|
return err
|
|
|
}
|
|
|
-
|
|
|
- v2net.ChanToWriter(encryptRequestWriter, input)
|
|
|
- return nil
|
|
|
+
|
|
|
+ v2net.ChanToWriter(encryptRequestWriter, input)
|
|
|
+ return nil
|
|
|
}
|
|
|
|
|
|
func handleResponse(conn *net.TCPConn, request *vmessio.VMessRequest, output chan<- []byte, finish chan<- bool) error {
|
|
|
- defer close(finish)
|
|
|
- responseKey := md5.Sum(request.RequestKey[:])
|
|
|
+ defer close(finish)
|
|
|
+ responseKey := md5.Sum(request.RequestKey[:])
|
|
|
responseIV := md5.Sum(request.RequestIV[:])
|
|
|
|
|
|
response := vmessio.VMessResponse{}
|
|
|
@@ -129,9 +129,9 @@ func handleResponse(conn *net.TCPConn, request *vmessio.VMessRequest, output cha
|
|
|
log.Error("Failed to create decrypt reader: %v", err)
|
|
|
return err
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
v2net.ReaderToChan(output, decryptResponseReader)
|
|
|
- return nil
|
|
|
+ return nil
|
|
|
}
|
|
|
|
|
|
type VMessOutboundHandlerFactory struct {
|