Compare commits

..

3 Commits

Author SHA1 Message Date
Fangliding
56cd5643d8 fix 2024-12-27 02:16:02 +08:00
Fangliding
d0911cec88 Set a short timeout for dns 2024-12-27 02:12:05 +08:00
RPRX
2782f13279 Dokodemo TPROXY: Move "defer pw.Close()" into "responseDone()"
Fixes https://github.com/XTLS/Xray-core/issues/4194
2024-12-26 14:17:13 +00:00
3 changed files with 22 additions and 20 deletions

View File

@@ -19,7 +19,7 @@ import (
var ( var (
Version_x byte = 24 Version_x byte = 24
Version_y byte = 12 Version_y byte = 12
Version_z byte = 28 Version_z byte = 18
) )
var ( var (

View File

@@ -287,8 +287,8 @@ func (c *SplitHTTPConfig) Build() (proto.Message, error) {
if c.Xmux == (XmuxConfig{}) { if c.Xmux == (XmuxConfig{}) {
c.Xmux.MaxConcurrency.From = 16 c.Xmux.MaxConcurrency.From = 16
c.Xmux.MaxConcurrency.To = 32 c.Xmux.MaxConcurrency.To = 32
c.Xmux.CMaxReuseTimes.From = 256 c.Xmux.CMaxReuseTimes.From = 64
c.Xmux.CMaxReuseTimes.To = 512 c.Xmux.CMaxReuseTimes.To = 128
c.Xmux.HMaxRequestTimes.From = 800 c.Xmux.HMaxRequestTimes.From = 800
c.Xmux.HMaxRequestTimes.To = 900 c.Xmux.HMaxRequestTimes.To = 900
} }

View File

@@ -2,8 +2,8 @@ package dokodemo
import ( import (
"context" "context"
"runtime"
"sync/atomic" "sync/atomic"
"time"
"github.com/xtls/xray-core/common" "github.com/xtls/xray-core/common"
"github.com/xtls/xray-core/common/buf" "github.com/xtls/xray-core/common/buf"
@@ -115,7 +115,14 @@ func (d *DokodemoDoor) Process(ctx context.Context, network net.Network, conn st
plcy := d.policy() plcy := d.policy()
ctx, cancel := context.WithCancel(ctx) ctx, cancel := context.WithCancel(ctx)
timer := signal.CancelAfterInactivity(ctx, cancel, plcy.Timeouts.ConnectionIdle)
var timer *signal.ActivityTimer
// if dns req, set a short timeout value
if dest.Port == 53 {
timer = signal.CancelAfterInactivity(ctx, cancel, 10*time.Second)
} else {
timer = signal.CancelAfterInactivity(ctx, cancel, plcy.Timeouts.ConnectionIdle)
}
if inbound != nil { if inbound != nil {
inbound.Timer = timer inbound.Timer = timer
@@ -148,6 +155,10 @@ func (d *DokodemoDoor) Process(ctx context.Context, network net.Network, conn st
return nil return nil
} }
tproxyRequest := func() error {
return nil
}
var writer buf.Writer var writer buf.Writer
if network == net.Network_TCP { if network == net.Network_TCP {
writer = buf.NewWriter(conn) writer = buf.NewWriter(conn)
@@ -177,12 +188,6 @@ func (d *DokodemoDoor) Process(ctx context.Context, network net.Network, conn st
return err return err
} }
writer = NewPacketWriter(pConn, &dest, mark, back) writer = NewPacketWriter(pConn, &dest, mark, back)
defer func() {
runtime.Gosched()
common.Interrupt(link.Reader) // maybe duplicated
runtime.Gosched()
writer.(*PacketWriter).Close() // close fake UDP conns
}()
/* /*
sockopt := &internet.SocketConfig{ sockopt := &internet.SocketConfig{
Tproxy: internet.SocketConfig_TProxy, Tproxy: internet.SocketConfig_TProxy,
@@ -221,9 +226,8 @@ func (d *DokodemoDoor) Process(ctx context.Context, network net.Network, conn st
responseDone := func() error { responseDone := func() error {
defer timer.SetTimeout(plcy.Timeouts.UplinkOnly) defer timer.SetTimeout(plcy.Timeouts.UplinkOnly)
if network == net.Network_UDP && destinationOverridden { if pw, ok := writer.(*PacketWriter); ok {
buf.Copy(link.Reader, writer) // respect upload's timeout defer pw.Close()
return nil
} }
if err := buf.Copy(link.Reader, writer, buf.UpdateActivity(timer)); err != nil { if err := buf.Copy(link.Reader, writer, buf.UpdateActivity(timer)); err != nil {
@@ -232,13 +236,11 @@ func (d *DokodemoDoor) Process(ctx context.Context, network net.Network, conn st
return nil return nil
} }
if err := task.Run(ctx, if err := task.Run(ctx, task.OnSuccess(func() error {
task.OnSuccess(func() error { return task.Run(ctx, requestDone) }, task.Close(link.Writer)), return task.Run(ctx, requestDone, tproxyRequest)
responseDone); err != nil { }, task.Close(link.Writer)), responseDone); err != nil {
runtime.Gosched()
common.Interrupt(link.Writer)
runtime.Gosched()
common.Interrupt(link.Reader) common.Interrupt(link.Reader)
common.Interrupt(link.Writer)
return errors.New("connection ends").Base(err) return errors.New("connection ends").Base(err)
} }