|
|
|
@ -60,36 +60,34 @@ func (handler *VMessInboundHandler) HandleConnection(connection net.Conn) error
|
|
|
|
|
}
|
|
|
|
|
log.Debug("Received request for %s", request.Address.String())
|
|
|
|
|
|
|
|
|
|
response := vmessio.NewVMessResponse(request)
|
|
|
|
|
nBytes, err := connection.Write(response[:])
|
|
|
|
|
if err != nil {
|
|
|
|
|
return log.Error("Failed to write VMess response (%d bytes): %v", nBytes, err)
|
|
|
|
|
}
|
|
|
|
|
ray := handler.vPoint.NewInboundConnectionAccepted(request.Address)
|
|
|
|
|
input := ray.InboundInput()
|
|
|
|
|
output := ray.InboundOutput()
|
|
|
|
|
|
|
|
|
|
requestKey := request.RequestKey[:]
|
|
|
|
|
requestIV := request.RequestIV[:]
|
|
|
|
|
responseKey := md5.Sum(requestKey)
|
|
|
|
|
responseIV := md5.Sum(requestIV)
|
|
|
|
|
readFinish := make(chan bool)
|
|
|
|
|
writeFinish := make(chan bool)
|
|
|
|
|
|
|
|
|
|
requestReader, err := v2io.NewAesDecryptReader(requestKey, requestIV, connection)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return log.Error("Failed to create decrypt reader: %v", err)
|
|
|
|
|
}
|
|
|
|
|
go handleInput(request, connection, input, readFinish)
|
|
|
|
|
|
|
|
|
|
responseKey := md5.Sum(request.RequestKey[:])
|
|
|
|
|
responseIV := md5.Sum(request.RequestIV[:])
|
|
|
|
|
|
|
|
|
|
response := vmessio.NewVMessResponse(request)
|
|
|
|
|
responseWriter, err := v2io.NewAesEncryptWriter(responseKey[:], responseIV[:], connection)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return log.Error("Failed to create encrypt writer: %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ray := handler.vPoint.NewInboundConnectionAccepted(request.Address)
|
|
|
|
|
input := ray.InboundInput()
|
|
|
|
|
output := ray.InboundOutput()
|
|
|
|
|
|
|
|
|
|
readFinish := make(chan bool)
|
|
|
|
|
writeFinish := make(chan bool)
|
|
|
|
|
// Optimize for small response packet
|
|
|
|
|
buffer := make([]byte, 0, 1024)
|
|
|
|
|
buffer = append(buffer, response[:]...)
|
|
|
|
|
data, open := <-output
|
|
|
|
|
if open {
|
|
|
|
|
buffer = append(buffer, data...)
|
|
|
|
|
}
|
|
|
|
|
responseWriter.Write(buffer)
|
|
|
|
|
|
|
|
|
|
go handler.dumpInput(requestReader, input, readFinish)
|
|
|
|
|
go handler.dumpOutput(responseWriter, output, writeFinish)
|
|
|
|
|
go handleOutput(request, responseWriter, output, writeFinish)
|
|
|
|
|
|
|
|
|
|
<-writeFinish
|
|
|
|
|
if tcpConn, ok := connection.(*net.TCPConn); ok {
|
|
|
|
@ -101,17 +99,22 @@ func (handler *VMessInboundHandler) HandleConnection(connection net.Conn) error
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (handler *VMessInboundHandler) dumpInput(reader io.Reader, input chan<- []byte, finish chan<- bool) {
|
|
|
|
|
v2net.ReaderToChan(input, reader)
|
|
|
|
|
close(input)
|
|
|
|
|
log.Debug("VMessIn closing input")
|
|
|
|
|
finish <- true
|
|
|
|
|
func handleInput(request *vmessio.VMessRequest, reader io.Reader, input chan<- []byte, finish chan<- bool) {
|
|
|
|
|
defer close(input)
|
|
|
|
|
defer close(finish)
|
|
|
|
|
|
|
|
|
|
requestReader, err := v2io.NewAesDecryptReader(request.RequestKey[:], request.RequestIV[:], reader)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Error("Failed to create decrypt reader: %v", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
v2net.ReaderToChan(input, requestReader)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (handler *VMessInboundHandler) dumpOutput(writer io.Writer, output <-chan []byte, finish chan<- bool) {
|
|
|
|
|
func handleOutput(request *vmessio.VMessRequest, writer io.Writer, output <-chan []byte, finish chan<- bool) {
|
|
|
|
|
v2net.ChanToWriter(writer, output)
|
|
|
|
|
log.Debug("VMessOut closing output")
|
|
|
|
|
finish <- true
|
|
|
|
|
close(finish)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type VMessInboundHandlerFactory struct {
|
|
|
|
|