mirror of
https://github.com/v2fly/v2ray-core.git
synced 2026-05-31 16:29:08 -04:00
refine stream handling
This commit is contained in:
@@ -3,7 +3,6 @@ package blackhole
|
||||
|
||||
import (
|
||||
"v2ray.com/core/app"
|
||||
"v2ray.com/core/common/buf"
|
||||
v2net "v2ray.com/core/common/net"
|
||||
"v2ray.com/core/proxy"
|
||||
"v2ray.com/core/transport/ray"
|
||||
@@ -28,9 +27,7 @@ func New(space app.Space, config *Config, meta *proxy.OutboundHandlerMeta) (prox
|
||||
}
|
||||
|
||||
// Dispatch implements OutboundHandler.Dispatch().
|
||||
func (v *Handler) Dispatch(destination v2net.Destination, payload *buf.Buffer, ray ray.OutboundRay) {
|
||||
payload.Release()
|
||||
|
||||
func (v *Handler) Dispatch(destination v2net.Destination, ray ray.OutboundRay) {
|
||||
v.response.WriteTo(ray.OutboundOutput())
|
||||
ray.OutboundOutput().Close()
|
||||
|
||||
|
||||
@@ -67,10 +67,9 @@ func (v *Handler) ResolveIP(destination v2net.Destination) v2net.Destination {
|
||||
return newDest
|
||||
}
|
||||
|
||||
func (v *Handler) Dispatch(destination v2net.Destination, payload *buf.Buffer, ray ray.OutboundRay) {
|
||||
func (v *Handler) Dispatch(destination v2net.Destination, ray ray.OutboundRay) {
|
||||
log.Info("Freedom: Opening connection to ", destination)
|
||||
|
||||
defer payload.Release()
|
||||
input := ray.OutboundInput()
|
||||
output := ray.OutboundOutput()
|
||||
defer input.ForceClose()
|
||||
@@ -96,13 +95,6 @@ func (v *Handler) Dispatch(destination v2net.Destination, payload *buf.Buffer, r
|
||||
|
||||
conn.SetReusable(false)
|
||||
|
||||
if !payload.IsEmpty() {
|
||||
if _, err := conn.Write(payload.Bytes()); err != nil {
|
||||
log.Warning("Freedom: Failed to write to destination: ", destination, ": ", err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
requestDone := signal.ExecuteAsync(func() error {
|
||||
defer input.ForceClose()
|
||||
|
||||
|
||||
@@ -53,9 +53,10 @@ func TestSinglePacket(t *testing.T) {
|
||||
data2Send := "Data to be sent to remote"
|
||||
payload := buf.NewLocal(2048)
|
||||
payload.Append([]byte(data2Send))
|
||||
traffic.InboundInput().Write(payload)
|
||||
|
||||
fmt.Println(tcpServerAddr.Network, tcpServerAddr.Address, tcpServerAddr.Port)
|
||||
go freedom.Dispatch(tcpServerAddr, payload, traffic)
|
||||
go freedom.Dispatch(tcpServerAddr, traffic)
|
||||
traffic.InboundInput().Close()
|
||||
|
||||
respPayload, err := traffic.InboundOutput().Read()
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
package proxy
|
||||
|
||||
import (
|
||||
"v2ray.com/core/common/buf"
|
||||
v2net "v2ray.com/core/common/net"
|
||||
"v2ray.com/core/common/protocol"
|
||||
"v2ray.com/core/transport/internet"
|
||||
@@ -58,5 +57,5 @@ type InboundHandler interface {
|
||||
// An OutboundHandler handles outbound network connection for V2Ray.
|
||||
type OutboundHandler interface {
|
||||
// Dispatch sends one or more Packets to its destination.
|
||||
Dispatch(destination v2net.Destination, payload *buf.Buffer, ray ray.OutboundRay)
|
||||
Dispatch(destination v2net.Destination, ray ray.OutboundRay)
|
||||
}
|
||||
|
||||
@@ -35,9 +35,7 @@ func NewClient(config *ClientConfig, space app.Space, meta *proxy.OutboundHandle
|
||||
}
|
||||
|
||||
// Dispatch implements OutboundHandler.Dispatch().
|
||||
func (v *Client) Dispatch(destination v2net.Destination, payload *buf.Buffer, ray ray.OutboundRay) {
|
||||
defer payload.Release()
|
||||
|
||||
func (v *Client) Dispatch(destination v2net.Destination, ray ray.OutboundRay) {
|
||||
network := destination.Network
|
||||
|
||||
var server *protocol.ServerSpec
|
||||
@@ -99,13 +97,6 @@ func (v *Client) Dispatch(destination v2net.Destination, payload *buf.Buffer, ra
|
||||
return
|
||||
}
|
||||
|
||||
if !payload.IsEmpty() {
|
||||
if err := bodyWriter.Write(payload); err != nil {
|
||||
log.Info("Shadowsocks|Client: Failed to write payload: ", err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
bufferedWriter.SetBuffered(false)
|
||||
|
||||
requestDone := signal.ExecuteAsync(func() error {
|
||||
@@ -143,12 +134,6 @@ func (v *Client) Dispatch(destination v2net.Destination, payload *buf.Buffer, ra
|
||||
Writer: conn,
|
||||
Request: request,
|
||||
}
|
||||
if !payload.IsEmpty() {
|
||||
if err := writer.Write(payload); err != nil {
|
||||
log.Info("Shadowsocks|Client: Failed to write payload: ", err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
requestDone := signal.ExecuteAsync(func() error {
|
||||
defer ray.OutboundInput().ForceClose()
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
package outbound
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"v2ray.com/core/app"
|
||||
"v2ray.com/core/common"
|
||||
"v2ray.com/core/common/buf"
|
||||
"v2ray.com/core/common/bufio"
|
||||
"v2ray.com/core/common/errors"
|
||||
"v2ray.com/core/common/log"
|
||||
v2net "v2ray.com/core/common/net"
|
||||
"v2ray.com/core/common/protocol"
|
||||
@@ -26,10 +29,9 @@ type VMessOutboundHandler struct {
|
||||
}
|
||||
|
||||
// Dispatch implements OutboundHandler.Dispatch().
|
||||
func (v *VMessOutboundHandler) Dispatch(target v2net.Destination, payload *buf.Buffer, ray ray.OutboundRay) {
|
||||
defer payload.Release()
|
||||
defer ray.OutboundInput().ForceClose()
|
||||
defer ray.OutboundOutput().Close()
|
||||
func (v *VMessOutboundHandler) Dispatch(target v2net.Destination, outboundRay ray.OutboundRay) {
|
||||
defer outboundRay.OutboundInput().ForceClose()
|
||||
defer outboundRay.OutboundOutput().Close()
|
||||
|
||||
var rec *protocol.ServerSpec
|
||||
var conn internet.Connection
|
||||
@@ -77,8 +79,8 @@ func (v *VMessOutboundHandler) Dispatch(target v2net.Destination, payload *buf.B
|
||||
request.Option.Set(protocol.RequestOptionConnectionReuse)
|
||||
}
|
||||
|
||||
input := ray.OutboundInput()
|
||||
output := ray.OutboundOutput()
|
||||
input := outboundRay.OutboundInput()
|
||||
output := outboundRay.OutboundOutput()
|
||||
|
||||
session := encoding.NewClientSession(protocol.DefaultIDHash)
|
||||
|
||||
@@ -93,11 +95,17 @@ func (v *VMessOutboundHandler) Dispatch(target v2net.Destination, payload *buf.B
|
||||
bodyWriter := session.EncodeRequestBody(request, writer)
|
||||
defer bodyWriter.Release()
|
||||
|
||||
if !payload.IsEmpty() {
|
||||
if err := bodyWriter.Write(payload); err != nil {
|
||||
return err
|
||||
}
|
||||
firstPayload, err := input.ReadTimeout(time.Millisecond * 500)
|
||||
if err != nil && err != ray.ErrReadTimeout {
|
||||
return errors.Base(err).Message("VMess|Outbound: Failed to get first payload.")
|
||||
}
|
||||
if !firstPayload.IsEmpty() {
|
||||
if err := bodyWriter.Write(firstPayload); err != nil {
|
||||
return errors.Base(err).Message("VMess|Outbound: Failed to write first payload.")
|
||||
}
|
||||
firstPayload.Release()
|
||||
}
|
||||
|
||||
writer.SetBuffered(false)
|
||||
|
||||
if err := buf.PipeUntilEOF(input, bodyWriter); err != nil {
|
||||
|
||||
Reference in New Issue
Block a user