mirror of
https://github.com/p4gefau1t/trojan-go.git
synced 2026-10-19 16:15:38 +00:00
make packets more sticky
This commit is contained in:
+24
-1
@@ -126,8 +126,8 @@ func ReadByte(r io.Reader) (byte, error) {
|
||||
}
|
||||
|
||||
type RewindConn struct {
|
||||
R *RewindReader
|
||||
net.Conn
|
||||
R *RewindReader
|
||||
}
|
||||
|
||||
func (c *RewindConn) Read(p []byte) (int, error) {
|
||||
@@ -140,3 +140,26 @@ func NewRewindConn(conn net.Conn) *RewindConn {
|
||||
R: NewRewindReader(conn),
|
||||
}
|
||||
}
|
||||
|
||||
type StickyWriter struct {
|
||||
io.Writer
|
||||
|
||||
rawWriter io.Writer
|
||||
writeBuffer []byte
|
||||
MaxBuffered int
|
||||
}
|
||||
|
||||
func (w *StickyWriter) Write(p []byte) (int, error) {
|
||||
if w.MaxBuffered > 0 {
|
||||
w.MaxBuffered--
|
||||
w.writeBuffer = append(w.writeBuffer, p...)
|
||||
if w.MaxBuffered != 0 {
|
||||
return len(p), nil
|
||||
}
|
||||
w.MaxBuffered = 0
|
||||
_, err := w.rawWriter.Write(w.writeBuffer)
|
||||
w.writeBuffer = nil
|
||||
return len(p), err
|
||||
}
|
||||
return w.rawWriter.Write(p)
|
||||
}
|
||||
|
||||
@@ -7,9 +7,9 @@ require (
|
||||
github.com/cenkalti/backoff/v4 v4.0.2 // indirect
|
||||
github.com/go-acme/lego/v3 v3.5.0
|
||||
github.com/go-sql-driver/mysql v1.5.0
|
||||
github.com/golang/protobuf v1.4.1
|
||||
github.com/golang/protobuf v1.4.2
|
||||
github.com/mattn/go-sqlite3 v2.0.3+incompatible // indirect
|
||||
github.com/mediocregopher/radix/v3 v3.5.0
|
||||
github.com/mediocregopher/radix/v3 v3.5.1
|
||||
github.com/miekg/dns v1.1.29 // indirect
|
||||
github.com/onsi/ginkgo v1.10.1 // indirect
|
||||
github.com/onsi/gomega v1.7.0 // indirect
|
||||
@@ -17,16 +17,15 @@ require (
|
||||
github.com/proullon/ramsql v0.0.0-20181213202341-817cee58a244
|
||||
github.com/refraction-networking/utls v0.0.0-20190909200633-43c36d3c1f57
|
||||
github.com/smartystreets/goconvey v1.6.4
|
||||
github.com/xtaci/smux v1.5.12
|
||||
github.com/xtaci/smux v1.5.14
|
||||
github.com/ziutek/mymysql v1.5.4 // indirect
|
||||
go.starlark.net v0.0.0-20200330013621-be5394c419b6 // indirect
|
||||
golang.org/x/crypto v0.0.0-20200429183012-4b2356b1ed79
|
||||
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f
|
||||
golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f
|
||||
go.starlark.net v0.0.0-20200519165436-0aa95694c768 // indirect
|
||||
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37
|
||||
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2
|
||||
golang.org/x/sys v0.0.0-20200523222454-059865788121
|
||||
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1
|
||||
google.golang.org/genproto v0.0.0-20200507105951-43844f6eee31 // indirect
|
||||
google.golang.org/grpc v1.29.1
|
||||
google.golang.org/protobuf v1.22.0
|
||||
google.golang.org/protobuf v1.24.0
|
||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
|
||||
gopkg.in/square/go-jose.v2 v2.5.1 // indirect
|
||||
v2ray.com/core v4.19.1+incompatible
|
||||
|
||||
@@ -128,6 +128,8 @@ github.com/golang/protobuf v1.4.0 h1:oOuy+ugB+P/kBdUnG5QaMXSIyJ1q38wWSojYCb3z5VQ
|
||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||
github.com/golang/protobuf v1.4.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0=
|
||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
||||
github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
|
||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w=
|
||||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
@@ -197,8 +199,8 @@ github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJK
|
||||
github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
|
||||
github.com/mattn/go-tty v0.0.0-20180219170247-931426f7535a/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||
github.com/mediocregopher/radix/v3 v3.5.0 h1:8QHQmNh2ne9aFxTD3z63u/bkPPiOtknHoz80oP8EA/E=
|
||||
github.com/mediocregopher/radix/v3 v3.5.0/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8=
|
||||
github.com/mediocregopher/radix/v3 v3.5.1 h1:IOYgQUMA380N4khaL5eNT4v/P2LnHa8b0wnVdwZMFsY=
|
||||
github.com/mediocregopher/radix/v3 v3.5.1/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8=
|
||||
github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
||||
github.com/miekg/dns v1.1.27 h1:aEH/kqUzUxGJ/UHcEKdJY+ugH6WEzsEBBSPa8zuy1aM=
|
||||
github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
|
||||
@@ -290,8 +292,8 @@ github.com/vultr/govultr v0.1.4/go.mod h1:9H008Uxr/C4vFNGLqKx232C206GL0PBHzOP080
|
||||
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
|
||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
|
||||
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
|
||||
github.com/xtaci/smux v1.5.12 h1:n9OGjdqQuVZXLh46+L4IR5tR2wvuUFwRABnN/V55bIY=
|
||||
github.com/xtaci/smux v1.5.12/go.mod h1:OMlQbT5vcgl2gb49mFkYo6SMf+zP3rcjcwQz7ZU7IGY=
|
||||
github.com/xtaci/smux v1.5.14 h1:1j+zJYDZRv9FHaWqCJfH5RPizIm0fSzJIFbfVn8zsfg=
|
||||
github.com/xtaci/smux v1.5.14/go.mod h1:OMlQbT5vcgl2gb49mFkYo6SMf+zP3rcjcwQz7ZU7IGY=
|
||||
github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs=
|
||||
github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
|
||||
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
|
||||
@@ -302,8 +304,8 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.starlark.net v0.0.0-20190919145610-979af19b165c h1:WR7X1xgXJlXhQBdorVc9Db3RhwG+J/kp6bLuMyJjfVw=
|
||||
go.starlark.net v0.0.0-20190919145610-979af19b165c/go.mod h1:c1/X6cHgvdXj6pUlmWKMkuqRnW4K8x2vwt6JAaaircg=
|
||||
go.starlark.net v0.0.0-20200330013621-be5394c419b6 h1:S2s+dYPyDg/vF7KbcRIB2831xVimJoR4zebfoVBzn7Q=
|
||||
go.starlark.net v0.0.0-20200330013621-be5394c419b6/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o=
|
||||
go.starlark.net v0.0.0-20200519165436-0aa95694c768 h1:p1NBjkIS2bHXntFxS9zhyFmZ9VKtazqNnsn5r7okSTo=
|
||||
go.starlark.net v0.0.0-20200519165436-0aa95694c768/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o=
|
||||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/ratelimit v0.0.0-20180316092928-c15da0234277/go.mod h1:2X8KaoNd1J0lZV+PxJk/5+DGbO/tpwLR1m++a7FnB/Y=
|
||||
golang.org/x/crypto v0.0.0-20180621125126-a49355c7e3f8/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
@@ -315,8 +317,8 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U
|
||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200429183012-4b2356b1ed79 h1:IaQbIIB2X/Mp/DKctl6ROxz1KyMlKp4uyvL6+kQ7C88=
|
||||
golang.org/x/crypto v0.0.0-20200429183012-4b2356b1ed79/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10Rvpy94aQh3LT/ShoCpkHw=
|
||||
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||
@@ -371,8 +373,8 @@ golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLL
|
||||
golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f h1:QBjCr1Fz5kw158VqdE9JfI9cJnl/ymnJWAdMuinqL7Y=
|
||||
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 h1:eDrdRpKgkcCqKZQwyZRyeFZgfqt37SL7Kv3tok06cKE=
|
||||
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
@@ -416,8 +418,8 @@ golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f h1:mOhmO9WsBaJCNmaZHPtHs9wOcdqdKCjF6OPJlmDM3KI=
|
||||
golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200523222454-059865788121 h1:rITEj+UZHYC927n8GT97eC3zrpzXdb/voyeOuVKS46o=
|
||||
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
@@ -503,8 +505,8 @@ google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfG
|
||||
google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200305110556-506484158171 h1:xes2Q2k+d/+YNXVw0FpZkIDJiaux4OVrRKXRAzH6A0U=
|
||||
google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200507105951-43844f6eee31 h1:Bz1qTn2YRWV+9OKJtxHJiQKCiXIdf+kwuKXdt9cBxyU=
|
||||
google.golang.org/genproto v0.0.0-20200507105951-43844f6eee31/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY=
|
||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
@@ -526,6 +528,10 @@ google.golang.org/protobuf v1.21.0 h1:qdOKuR/EIArgaWNjetjgTzgVTAZ+S/WXVrq9HW9zim
|
||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
||||
google.golang.org/protobuf v1.22.0 h1:cJv5/xdbk1NnMPR1VP9+HU6gupuG9MLBoH1r6RHZ2MY=
|
||||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA=
|
||||
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package simplesocks
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
|
||||
"github.com/p4gefau1t/trojan-go/common"
|
||||
@@ -15,6 +16,7 @@ type SimpleSocksConnSession struct {
|
||||
rwc io.ReadWriteCloser
|
||||
recv uint64
|
||||
sent uint64
|
||||
header []byte
|
||||
}
|
||||
|
||||
func (m *SimpleSocksConnSession) Read(p []byte) (int, error) {
|
||||
@@ -24,6 +26,11 @@ func (m *SimpleSocksConnSession) Read(p []byte) (int, error) {
|
||||
}
|
||||
|
||||
func (m *SimpleSocksConnSession) Write(p []byte) (int, error) {
|
||||
if m.header != nil {
|
||||
_, err := m.rwc.Write(append(m.header, p...))
|
||||
m.header = nil
|
||||
return len(p), err
|
||||
}
|
||||
n, err := m.rwc.Write(p)
|
||||
m.sent += uint64(n)
|
||||
return n, err
|
||||
@@ -43,9 +50,11 @@ func (m *SimpleSocksConnSession) parseRequest() error {
|
||||
return m.request.Marshal(m.rwc)
|
||||
}
|
||||
|
||||
func (m *SimpleSocksConnSession) writeRequest(req *protocol.Request) error {
|
||||
func (m *SimpleSocksConnSession) writeRequest(req *protocol.Request) {
|
||||
m.request = req
|
||||
return m.request.Unmarshal(m.rwc)
|
||||
buf := bytes.NewBuffer(make([]byte, 0, 128))
|
||||
m.request.Unmarshal(buf)
|
||||
m.header = buf.Bytes()
|
||||
}
|
||||
|
||||
func NewInboundConnSession(conn io.ReadWriteCloser) (protocol.ConnSession, *protocol.Request, error) {
|
||||
@@ -62,8 +71,6 @@ func NewOutboundConnSession(req *protocol.Request, conn io.ReadWriteCloser) (pro
|
||||
m := &SimpleSocksConnSession{
|
||||
rwc: conn,
|
||||
}
|
||||
if err := m.writeRequest(req); err != nil {
|
||||
return nil, common.NewError("Failed to write mux request").Base(err)
|
||||
}
|
||||
m.writeRequest(req)
|
||||
return m, nil
|
||||
}
|
||||
|
||||
+15
-21
@@ -14,30 +14,24 @@ import (
|
||||
type TrojanOutboundConnSession struct {
|
||||
protocol.ConnSession
|
||||
|
||||
config *conf.GlobalConfig
|
||||
rwc io.ReadWriteCloser
|
||||
request *protocol.Request
|
||||
sent uint64
|
||||
recv uint64
|
||||
auth stat.Authenticator
|
||||
meter stat.TrafficMeter
|
||||
trojanHeader []byte
|
||||
config *conf.GlobalConfig
|
||||
rwc io.ReadWriteCloser
|
||||
request *protocol.Request
|
||||
sent uint64
|
||||
recv uint64
|
||||
auth stat.Authenticator
|
||||
meter stat.TrafficMeter
|
||||
header []byte
|
||||
}
|
||||
|
||||
func (o *TrojanOutboundConnSession) Write(p []byte) (int, error) {
|
||||
if o.trojanHeader != nil {
|
||||
if o.header != nil {
|
||||
//send the payload after the trojan request header
|
||||
headerLen := len(o.trojanHeader)
|
||||
n, err := o.rwc.Write(append(o.trojanHeader, p...))
|
||||
if n >= headerLen {
|
||||
n -= headerLen
|
||||
} else {
|
||||
n = 0
|
||||
}
|
||||
o.meter.AddTraffic(n, 0)
|
||||
o.sent += uint64(n)
|
||||
o.trojanHeader = nil
|
||||
return n, err
|
||||
_, err := o.rwc.Write(append(o.header, p...))
|
||||
o.meter.AddTraffic(len(p)+len(o.header), 0)
|
||||
o.sent += uint64(len(p) + len(o.header))
|
||||
o.header = nil
|
||||
return len(p), err
|
||||
}
|
||||
n, err := o.rwc.Write(p)
|
||||
o.meter.AddTraffic(n, 0)
|
||||
@@ -67,7 +61,7 @@ func (o *TrojanOutboundConnSession) writeRequest() {
|
||||
buf.Write(crlf)
|
||||
o.request.Unmarshal(buf)
|
||||
buf.Write(crlf)
|
||||
o.trojanHeader = buf.Bytes()
|
||||
o.header = buf.Bytes()
|
||||
}
|
||||
|
||||
func NewOutboundConnSession(req *protocol.Request, rwc io.ReadWriteCloser, config *conf.GlobalConfig, auth stat.Authenticator) (protocol.ConnSession, error) {
|
||||
|
||||
@@ -36,7 +36,7 @@ func (i *TrojanPacketSession) ReadPacket() (*protocol.Request, []byte, error) {
|
||||
}
|
||||
|
||||
func (i *TrojanPacketSession) WritePacket(req *protocol.Request, packet []byte) (int, error) {
|
||||
buf := bytes.NewBuffer(make([]byte, 0, 128))
|
||||
buf := bytes.NewBuffer(make([]byte, 0, 512))
|
||||
common.Must(req.Address.Unmarshal(buf))
|
||||
length := len(packet)
|
||||
lengthBuf := [2]byte{}
|
||||
|
||||
+36
-10
@@ -16,14 +16,36 @@ import (
|
||||
"github.com/xtaci/smux"
|
||||
)
|
||||
|
||||
type MuxID uint32
|
||||
// HACK stick the smux 8 bytes header to the payload
|
||||
type smuxStickyReadWriteCloser struct {
|
||||
io.ReadWriteCloser
|
||||
smuxHeader []byte
|
||||
}
|
||||
|
||||
func generateMuxID() MuxID {
|
||||
return MuxID(rand.Uint32())
|
||||
func (rwc *smuxStickyReadWriteCloser) Write(p []byte) (int, error) {
|
||||
if len(p) == 8 && rwc.smuxHeader == nil {
|
||||
// check version and command, cmdPSH = 2
|
||||
if (p[0] == 1 || p[0] == 2) && (p[1] == 2) {
|
||||
rwc.smuxHeader = p
|
||||
return 8, nil
|
||||
}
|
||||
}
|
||||
if rwc.smuxHeader != nil {
|
||||
_, err := rwc.ReadWriteCloser.Write(append(rwc.smuxHeader, p...))
|
||||
rwc.smuxHeader = nil
|
||||
return len(p), err
|
||||
}
|
||||
return rwc.ReadWriteCloser.Write(p)
|
||||
}
|
||||
|
||||
type muxID uint32
|
||||
|
||||
func generateMuxID() muxID {
|
||||
return muxID(rand.Uint32())
|
||||
}
|
||||
|
||||
type muxClientInfo struct {
|
||||
id MuxID
|
||||
id muxID
|
||||
client *smux.Session
|
||||
lastActiveTime time.Time
|
||||
}
|
||||
@@ -32,7 +54,7 @@ type MuxManager struct {
|
||||
TransportManager
|
||||
|
||||
sync.Mutex
|
||||
muxPool map[MuxID]*muxClientInfo
|
||||
muxPool map[muxID]*muxClientInfo
|
||||
config *conf.GlobalConfig
|
||||
auth stat.Authenticator
|
||||
ctx context.Context
|
||||
@@ -55,14 +77,18 @@ func (m *MuxManager) newMuxClient() (*muxClientInfo, error) {
|
||||
if err != nil {
|
||||
return nil, common.NewError("Failed to dail to remote server").Base(err)
|
||||
}
|
||||
conn, err := trojan.NewOutboundConnSession(req, rwc, m.config, m.auth)
|
||||
trojanConn, err := trojan.NewOutboundConnSession(req, rwc, m.config, m.auth)
|
||||
if err != nil {
|
||||
rwc.Close()
|
||||
log.Error(common.NewError("Failed to dial tls tunnel").Base(err))
|
||||
return nil, err
|
||||
}
|
||||
|
||||
client, err := smux.Client(conn, nil)
|
||||
smuxRWC := &smuxStickyReadWriteCloser{
|
||||
ReadWriteCloser: trojanConn,
|
||||
}
|
||||
|
||||
client, err := smux.Client(smuxRWC, nil)
|
||||
common.Must(err)
|
||||
log.Info("Mux TLS tunnel established, client id:", id)
|
||||
return &muxClientInfo{
|
||||
@@ -94,7 +120,7 @@ func (m *MuxManager) pickMuxClient() (*muxClientInfo, error) {
|
||||
default:
|
||||
}
|
||||
|
||||
//not found
|
||||
// not found
|
||||
info, err := m.newMuxClient()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -114,7 +140,7 @@ func (m *MuxManager) DialToServer() (io.ReadWriteCloser, error) {
|
||||
defer m.Unlock()
|
||||
delete(m.muxPool, info.id)
|
||||
info.client.Close()
|
||||
log.Info("Somthing wrong with mux client", info.id, ", closing")
|
||||
log.Warn("Somthing wrong with mux client", info.id, ", closing")
|
||||
return nil, err
|
||||
}
|
||||
log.Info("New mux conn established with client", info.id)
|
||||
@@ -165,7 +191,7 @@ func NewMuxPoolManager(ctx context.Context, config *conf.GlobalConfig, auth stat
|
||||
m := &MuxManager{
|
||||
ctx: ctx,
|
||||
config: config,
|
||||
muxPool: make(map[MuxID]*muxClientInfo),
|
||||
muxPool: make(map[muxID]*muxClientInfo),
|
||||
transport: NewTLSManager(config),
|
||||
auth: auth,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user