mirror of
https://github.com/e1732a364fed/v2ray_simple.git
synced 2025-12-24 13:27:56 +08:00
修订代码拼写
This commit is contained in:
@@ -46,17 +46,17 @@ type ClientConn struct {
|
||||
err error
|
||||
}
|
||||
|
||||
func (g *ClientConn) handshake() {
|
||||
response, err := g.transport.RoundTrip(g.request)
|
||||
func (c *ClientConn) handshake() {
|
||||
response, err := c.transport.RoundTrip(c.request)
|
||||
if err != nil {
|
||||
g.err = err
|
||||
g.writer.Close()
|
||||
c.err = err
|
||||
c.writer.Close()
|
||||
return
|
||||
}
|
||||
|
||||
notOK := false
|
||||
|
||||
if g.shouldClose.Load() {
|
||||
if c.shouldClose.Load() {
|
||||
notOK = true
|
||||
} else {
|
||||
//log.Println("response headers", response.Header)
|
||||
@@ -67,8 +67,8 @@ func (g *ClientConn) handshake() {
|
||||
}
|
||||
|
||||
notOK = true
|
||||
} else if g.client != nil && len(g.client.responseHeader) > 0 {
|
||||
if ok, firstNotMatchKey := httpLayer.AllHeadersIn(g.client.responseHeader, response.Header); !ok {
|
||||
} else if c.client != nil && len(c.client.responseHeader) > 0 {
|
||||
if ok, firstNotMatchKey := httpLayer.AllHeadersIn(c.client.responseHeader, response.Header); !ok {
|
||||
|
||||
if ce := utils.CanLogWarn("GRPC Client configured custom header, but the server response doesn't have all of them"); ce != nil {
|
||||
ce.Write(zap.String("firstNotMatchKey", firstNotMatchKey))
|
||||
@@ -82,55 +82,55 @@ func (g *ClientConn) handshake() {
|
||||
|
||||
if notOK {
|
||||
|
||||
g.client.cachedTransport = nil
|
||||
c.client.cachedTransport = nil
|
||||
|
||||
response.Body.Close()
|
||||
} else {
|
||||
g.response = response
|
||||
g.br = bufio.NewReader(response.Body)
|
||||
c.response = response
|
||||
c.br = bufio.NewReader(response.Body)
|
||||
}
|
||||
}
|
||||
|
||||
func (g *ClientConn) Read(b []byte) (n int, err error) {
|
||||
func (c *ClientConn) Read(b []byte) (n int, err error) {
|
||||
|
||||
g.handshakeOnce.Do(g.handshake)
|
||||
c.handshakeOnce.Do(c.handshake)
|
||||
|
||||
if g.err != nil {
|
||||
return 0, g.err
|
||||
if c.err != nil {
|
||||
return 0, c.err
|
||||
}
|
||||
|
||||
if g.response == nil {
|
||||
if c.response == nil {
|
||||
return 0, net.ErrClosed
|
||||
}
|
||||
|
||||
return g.commonPart.Read(b)
|
||||
return c.commonPart.Read(b)
|
||||
|
||||
}
|
||||
|
||||
func (g *ClientConn) Write(b []byte) (n int, err error) {
|
||||
func (c *ClientConn) Write(b []byte) (n int, err error) {
|
||||
|
||||
buf := commonWrite(b)
|
||||
_, err = g.writer.Write(buf.Bytes())
|
||||
_, err = c.writer.Write(buf.Bytes())
|
||||
utils.PutBuf(buf)
|
||||
|
||||
if err == io.ErrClosedPipe && g.err != nil {
|
||||
err = g.err
|
||||
if err == io.ErrClosedPipe && c.err != nil {
|
||||
err = c.err
|
||||
}
|
||||
if err != nil {
|
||||
g.client.dealErr(err)
|
||||
c.client.dealErr(err)
|
||||
|
||||
}
|
||||
|
||||
return len(b), err
|
||||
}
|
||||
|
||||
func (g *ClientConn) Close() error {
|
||||
g.shouldClose.Store(true)
|
||||
if r := g.response; r != nil {
|
||||
func (c *ClientConn) Close() error {
|
||||
c.shouldClose.Store(true)
|
||||
if r := c.response; r != nil {
|
||||
r.Body.Close()
|
||||
}
|
||||
|
||||
return g.writer.Close()
|
||||
return c.writer.Close()
|
||||
}
|
||||
|
||||
//implements advLayer.MuxClient
|
||||
@@ -150,13 +150,13 @@ type Client struct {
|
||||
path string
|
||||
}
|
||||
|
||||
func (g *Client) dealErr(err error) {
|
||||
func (c *Client) dealErr(err error) {
|
||||
//use of closed connection
|
||||
|
||||
if errors.Is(err, net.ErrClosed) {
|
||||
g.cachedTransport = nil
|
||||
c.cachedTransport = nil
|
||||
} else if strings.Contains(err.Error(), "use of closed") {
|
||||
g.cachedTransport = nil
|
||||
c.cachedTransport = nil
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -93,23 +93,23 @@ type timeouter struct {
|
||||
closeFunc func()
|
||||
}
|
||||
|
||||
func (g *timeouter) SetReadDeadline(t time.Time) error { return g.SetDeadline(t) }
|
||||
func (g *timeouter) SetWriteDeadline(t time.Time) error { return g.SetDeadline(t) }
|
||||
func (c *timeouter) SetReadDeadline(t time.Time) error { return c.SetDeadline(t) }
|
||||
func (c *timeouter) SetWriteDeadline(t time.Time) error { return c.SetDeadline(t) }
|
||||
|
||||
func (g *timeouter) SetDeadline(t time.Time) error {
|
||||
func (c *timeouter) SetDeadline(t time.Time) error {
|
||||
|
||||
var d time.Duration
|
||||
|
||||
if g.deadline != nil {
|
||||
if c.deadline != nil {
|
||||
|
||||
if t == (time.Time{}) {
|
||||
g.deadline.Stop()
|
||||
g.deadline = nil
|
||||
c.deadline.Stop()
|
||||
c.deadline = nil
|
||||
return nil
|
||||
}
|
||||
|
||||
d = time.Until(t)
|
||||
g.deadline.Reset(d)
|
||||
c.deadline.Reset(d)
|
||||
|
||||
} else {
|
||||
if t == (time.Time{}) {
|
||||
@@ -117,7 +117,7 @@ func (g *timeouter) SetDeadline(t time.Time) error {
|
||||
}
|
||||
|
||||
d = time.Until(t)
|
||||
g.deadline = time.AfterFunc(d, g.closeFunc)
|
||||
c.deadline = time.AfterFunc(d, c.closeFunc)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
@@ -27,6 +27,7 @@ grpcSimple can fallback to h2c.
|
||||
about h2c
|
||||
|
||||
https://pkg.go.dev/golang.org/x/net/http2/h2c#example-NewHandler
|
||||
|
||||
https://github.com/thrawn01/h2c-golang-example
|
||||
|
||||
test h2c:
|
||||
|
||||
@@ -223,37 +223,37 @@ type ServerConn struct {
|
||||
closed bool
|
||||
}
|
||||
|
||||
func (g *ServerConn) Close() error {
|
||||
g.closeOnce.Do(func() {
|
||||
g.closed = true
|
||||
close(g.closeChan)
|
||||
if g.Closer != nil {
|
||||
g.Closer.Close()
|
||||
func (sc *ServerConn) Close() error {
|
||||
sc.closeOnce.Do(func() {
|
||||
sc.closed = true
|
||||
close(sc.closeChan)
|
||||
if sc.Closer != nil {
|
||||
sc.Closer.Close()
|
||||
|
||||
}
|
||||
})
|
||||
return nil
|
||||
}
|
||||
|
||||
func (g *ServerConn) Write(b []byte) (n int, err error) {
|
||||
func (sc *ServerConn) Write(b []byte) (n int, err error) {
|
||||
|
||||
//the determination of g.closed is necessary, or it might panic when calling Write or Flush
|
||||
|
||||
if g.closed {
|
||||
if sc.closed {
|
||||
return 0, net.ErrClosed
|
||||
} else {
|
||||
|
||||
buf := commonWrite(b)
|
||||
|
||||
if g.closed { //较为谨慎,也许commonWrite 刚调用完, 就 g.closed 了
|
||||
if sc.closed { //较为谨慎,也许commonWrite 刚调用完, 就 g.closed 了
|
||||
utils.PutBuf(buf)
|
||||
return 0, net.ErrClosed
|
||||
}
|
||||
_, err = g.Writer.Write(buf.Bytes())
|
||||
_, err = sc.Writer.Write(buf.Bytes())
|
||||
utils.PutBuf(buf)
|
||||
|
||||
if err == nil && !g.closed {
|
||||
g.Writer.(http.Flusher).Flush() //necessary
|
||||
if err == nil && !sc.closed {
|
||||
sc.Writer.(http.Flusher).Flush() //necessary
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -136,23 +136,23 @@ winFn :=${prefix}_win10
|
||||
#注意调用参数时,逗号前后不能留空格
|
||||
|
||||
linux_amd64:
|
||||
$(call compile, $(linuxAmdFn),linux,amd64)
|
||||
$(call compile,$(linuxAmdFn),linux,amd64)
|
||||
|
||||
linux_arm64:
|
||||
$(call compile, $(linuxArmFn),linux,arm64)
|
||||
$(call compile,$(linuxArmFn),linux,arm64)
|
||||
|
||||
android_arm64:
|
||||
$(call compile, $(androidArm64Fn),android,arm64)
|
||||
$(call compile,$(androidArm64Fn),android,arm64)
|
||||
|
||||
macos:
|
||||
$(call compile, $(macFn),darwin,amd64)
|
||||
$(call compile,$(macFn),darwin,amd64)
|
||||
|
||||
#macos apple silicon
|
||||
macm1:
|
||||
$(call compile, $(macM1Fn),darwin,arm64)
|
||||
$(call compile,$(macM1Fn),darwin,arm64)
|
||||
|
||||
win10:
|
||||
$(call compile, $(winFn),windows,amd64,$(winsuffix))
|
||||
$(call compile,$(winFn),windows,amd64,$(winsuffix))
|
||||
|
||||
|
||||
clean:
|
||||
|
||||
@@ -54,8 +54,8 @@ type FallbackResult struct {
|
||||
Xver int
|
||||
}
|
||||
|
||||
func (ef *FallbackResult) GetFallback(ftype byte, _ ...string) *FallbackResult {
|
||||
return ef
|
||||
func (r *FallbackResult) GetFallback(ftype byte, _ ...string) *FallbackResult {
|
||||
return r
|
||||
}
|
||||
|
||||
func (FallbackResult) SupportType() byte {
|
||||
|
||||
@@ -72,49 +72,49 @@ type HeaderPreset struct {
|
||||
}
|
||||
|
||||
// 将Header改为首字母大写
|
||||
func (hh *HeaderPreset) Prepare() {
|
||||
if hh.Request != nil && len(hh.Request.Headers) > 0 {
|
||||
func (h *HeaderPreset) Prepare() {
|
||||
if h.Request != nil && len(h.Request.Headers) > 0 {
|
||||
|
||||
var realHeaders http.Header = make(http.Header)
|
||||
for k, vs := range hh.Request.Headers {
|
||||
for k, vs := range h.Request.Headers {
|
||||
for _, v := range vs {
|
||||
realHeaders.Add(k, v)
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
hh.Request.Headers = realHeaders
|
||||
h.Request.Headers = realHeaders
|
||||
}
|
||||
if hh.Response != nil && len(hh.Response.Headers) > 0 {
|
||||
if h.Response != nil && len(h.Response.Headers) > 0 {
|
||||
|
||||
var realHeaders http.Header = make(http.Header)
|
||||
for k, vs := range hh.Response.Headers {
|
||||
for k, vs := range h.Response.Headers {
|
||||
for _, v := range vs {
|
||||
realHeaders.Add(k, v)
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
hh.Response.Headers = realHeaders
|
||||
h.Response.Headers = realHeaders
|
||||
}
|
||||
}
|
||||
|
||||
//默认值保持与v2ray的配置相同
|
||||
func (hh *HeaderPreset) AssignDefaultValue() {
|
||||
if hh.Request == nil {
|
||||
hh.Request = &RequestHeader{}
|
||||
func (h *HeaderPreset) AssignDefaultValue() {
|
||||
if h.Request == nil {
|
||||
h.Request = &RequestHeader{}
|
||||
}
|
||||
if hh.Request.Version == "" {
|
||||
hh.Request.Version = "1.1"
|
||||
if h.Request.Version == "" {
|
||||
h.Request.Version = "1.1"
|
||||
}
|
||||
if hh.Request.Method == "" {
|
||||
hh.Request.Method = "GET"
|
||||
if h.Request.Method == "" {
|
||||
h.Request.Method = "GET"
|
||||
}
|
||||
if len(hh.Request.Path) == 0 {
|
||||
hh.Request.Path = []string{"/"}
|
||||
if len(h.Request.Path) == 0 {
|
||||
h.Request.Path = []string{"/"}
|
||||
}
|
||||
if len(hh.Request.Headers) == 0 {
|
||||
hh.Request.Headers = map[string][]string{
|
||||
if len(h.Request.Headers) == 0 {
|
||||
h.Request.Headers = map[string][]string{
|
||||
"Host": {"www.baidu.com", "www.bing.com"},
|
||||
"User-Agent": {"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36", "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 Safari/601.1.46"},
|
||||
"Accept-Encoding": {"gzip, deflate"},
|
||||
@@ -124,23 +124,23 @@ func (hh *HeaderPreset) AssignDefaultValue() {
|
||||
|
||||
}
|
||||
|
||||
if hh.Response == nil {
|
||||
hh.Response = &ResponseHeader{}
|
||||
if h.Response == nil {
|
||||
h.Response = &ResponseHeader{}
|
||||
}
|
||||
|
||||
if hh.Response.Version == "" {
|
||||
hh.Response.Version = "1.1"
|
||||
if h.Response.Version == "" {
|
||||
h.Response.Version = "1.1"
|
||||
}
|
||||
|
||||
if hh.Response.StatusCode == "" {
|
||||
hh.Response.StatusCode = "200"
|
||||
if h.Response.StatusCode == "" {
|
||||
h.Response.StatusCode = "200"
|
||||
}
|
||||
if hh.Response.Reason == "" {
|
||||
hh.Response.Reason = "OK"
|
||||
if h.Response.Reason == "" {
|
||||
h.Response.Reason = "OK"
|
||||
}
|
||||
|
||||
if len(hh.Response.Headers) == 0 {
|
||||
hh.Response.Headers = map[string][]string{
|
||||
if len(h.Response.Headers) == 0 {
|
||||
h.Response.Headers = map[string][]string{
|
||||
"Content-Type": {"application/octet-stream", "video/mpeg"},
|
||||
"Transfer-Encoding": {"chunked"},
|
||||
"Connection": {"keep-alive"},
|
||||
@@ -148,7 +148,7 @@ func (hh *HeaderPreset) AssignDefaultValue() {
|
||||
}
|
||||
}
|
||||
|
||||
hh.Prepare()
|
||||
h.Prepare()
|
||||
}
|
||||
|
||||
func (h *HeaderPreset) ReadRequest(underlay net.Conn) (err error, leftBuf *bytes.Buffer) {
|
||||
@@ -237,15 +237,15 @@ func (h *HeaderPreset) ReadRequest(underlay net.Conn) (err error, leftBuf *bytes
|
||||
return nil, rp.WholeRequestBuf
|
||||
}
|
||||
|
||||
func (p *HeaderPreset) WriteRequest(underlay net.Conn, payload []byte) error {
|
||||
func (h *HeaderPreset) WriteRequest(underlay net.Conn, payload []byte) error {
|
||||
|
||||
buf := bytes.NewBuffer(payload)
|
||||
r, err := http.NewRequest(p.Request.Method, p.Request.Path[0], buf)
|
||||
r, err := http.NewRequest(h.Request.Method, h.Request.Path[0], buf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
nh := TrimHeaders(p.Request.Headers)
|
||||
nh := TrimHeaders(h.Request.Headers)
|
||||
|
||||
r.Header = nh
|
||||
|
||||
@@ -255,7 +255,7 @@ func (p *HeaderPreset) WriteRequest(underlay net.Conn, payload []byte) error {
|
||||
return r.Write(underlay)
|
||||
}
|
||||
|
||||
func (p *HeaderPreset) ReadResponse(underlay net.Conn) (err error, leftBuf *bytes.Buffer) {
|
||||
func (h *HeaderPreset) ReadResponse(underlay net.Conn) (err error, leftBuf *bytes.Buffer) {
|
||||
|
||||
bs := utils.GetPacket()
|
||||
var n int
|
||||
@@ -281,18 +281,18 @@ func (p *HeaderPreset) ReadResponse(underlay net.Conn) (err error, leftBuf *byte
|
||||
return nil, buf
|
||||
}
|
||||
|
||||
func (p *HeaderPreset) WriteResponse(underlay net.Conn, payload []byte) error {
|
||||
func (h *HeaderPreset) WriteResponse(underlay net.Conn, payload []byte) error {
|
||||
buf := utils.GetBuf()
|
||||
|
||||
buf.WriteString("HTTP/")
|
||||
buf.WriteString(p.Response.Version)
|
||||
buf.WriteString(h.Response.Version)
|
||||
buf.WriteString(" ")
|
||||
buf.WriteString(p.Response.StatusCode)
|
||||
buf.WriteString(h.Response.StatusCode)
|
||||
buf.WriteString(" ")
|
||||
buf.WriteString(p.Response.Reason)
|
||||
buf.WriteString(h.Response.Reason)
|
||||
buf.WriteString(CRLF)
|
||||
|
||||
for key, v := range p.Response.Headers {
|
||||
for key, v := range h.Response.Headers {
|
||||
thisStr := v[rand.Intn(len(v))]
|
||||
buf.WriteString(key)
|
||||
buf.WriteString(":")
|
||||
@@ -325,51 +325,51 @@ type HeaderConn struct {
|
||||
notFirstWrite bool
|
||||
}
|
||||
|
||||
func (pc *HeaderConn) Read(p []byte) (n int, err error) {
|
||||
func (c *HeaderConn) Read(p []byte) (n int, err error) {
|
||||
var buf *bytes.Buffer
|
||||
|
||||
if pc.IsServerEnd {
|
||||
if pc.optionalReader == nil {
|
||||
err, buf = pc.H.ReadRequest(pc.Conn)
|
||||
if c.IsServerEnd {
|
||||
if c.optionalReader == nil {
|
||||
err, buf = c.H.ReadRequest(c.Conn)
|
||||
if err != nil {
|
||||
err = utils.ErrInErr{ErrDesc: "http HeaderConn Read failed, at serverEnd", ErrDetail: err}
|
||||
return
|
||||
}
|
||||
|
||||
pc.optionalReader = io.MultiReader(buf, pc.Conn)
|
||||
c.optionalReader = io.MultiReader(buf, c.Conn)
|
||||
}
|
||||
|
||||
} else {
|
||||
if pc.optionalReader == nil {
|
||||
err, buf = pc.H.ReadResponse(pc.Conn)
|
||||
if c.optionalReader == nil {
|
||||
err, buf = c.H.ReadResponse(c.Conn)
|
||||
if err != nil {
|
||||
err = utils.ErrInErr{ErrDesc: "http HeaderConn Read failed", ErrDetail: err}
|
||||
return
|
||||
}
|
||||
|
||||
pc.optionalReader = io.MultiReader(buf, pc.Conn)
|
||||
c.optionalReader = io.MultiReader(buf, c.Conn)
|
||||
}
|
||||
}
|
||||
return pc.optionalReader.Read(p)
|
||||
return c.optionalReader.Read(p)
|
||||
|
||||
}
|
||||
|
||||
func (pc *HeaderConn) Write(p []byte) (n int, err error) {
|
||||
func (c *HeaderConn) Write(p []byte) (n int, err error) {
|
||||
|
||||
if pc.IsServerEnd {
|
||||
if pc.notFirstWrite {
|
||||
return pc.Conn.Write(p)
|
||||
if c.IsServerEnd {
|
||||
if c.notFirstWrite {
|
||||
return c.Conn.Write(p)
|
||||
}
|
||||
pc.notFirstWrite = true
|
||||
err = pc.H.WriteResponse(pc.Conn, p)
|
||||
c.notFirstWrite = true
|
||||
err = c.H.WriteResponse(c.Conn, p)
|
||||
|
||||
} else {
|
||||
|
||||
if pc.notFirstWrite {
|
||||
return pc.Conn.Write(p)
|
||||
if c.notFirstWrite {
|
||||
return c.Conn.Write(p)
|
||||
}
|
||||
pc.notFirstWrite = true
|
||||
err = pc.H.WriteRequest(pc.Conn, p)
|
||||
c.notFirstWrite = true
|
||||
err = c.H.WriteRequest(c.Conn, p)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
|
||||
@@ -99,12 +99,12 @@ func (e *RequestErr) Is(err error) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (pe *RequestErr) Error() string {
|
||||
func (e *RequestErr) Error() string {
|
||||
var sb strings.Builder
|
||||
sb.WriteString("InvaidRequest ")
|
||||
sb.WriteString(pe.Method)
|
||||
sb.WriteString(e.Method)
|
||||
sb.WriteString(",")
|
||||
sb.WriteString(pe.Path)
|
||||
sb.WriteString(e.Path)
|
||||
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ func loopAccept(listener net.Listener, xver int, acceptFunc func(net.Conn)) {
|
||||
if xver > 0 {
|
||||
|
||||
if ce := utils.CanLogDebug("Listening PROXY protocol"); ce != nil {
|
||||
ce.Write(zap.Int("prefered version", xver))
|
||||
ce.Write(zap.Int("preferred version", xver))
|
||||
}
|
||||
|
||||
listener = &proxyproto.Listener{Listener: listener, Policy: proxyProtocolListenPolicyFunc}
|
||||
|
||||
158
proxy/base.go
158
proxy/base.go
@@ -107,56 +107,56 @@ type Base struct {
|
||||
|
||||
}
|
||||
|
||||
func (pcs *Base) GetBase() *Base {
|
||||
return pcs
|
||||
func (b *Base) GetBase() *Base {
|
||||
return b
|
||||
}
|
||||
|
||||
func (pcs *Base) Network() string {
|
||||
return pcs.TransportLayer
|
||||
func (b *Base) Network() string {
|
||||
return b.TransportLayer
|
||||
}
|
||||
|
||||
func (pcs *Base) GetXver() int {
|
||||
return pcs.Xver
|
||||
func (b *Base) GetXver() int {
|
||||
return b.Xver
|
||||
}
|
||||
|
||||
func (pcs *Base) HasHeader() *httpLayer.HeaderPreset {
|
||||
return pcs.Header
|
||||
func (b *Base) HasHeader() *httpLayer.HeaderPreset {
|
||||
return b.Header
|
||||
}
|
||||
|
||||
func (pcs *Base) GetFallback() *netLayer.Addr {
|
||||
return pcs.FallbackAddr
|
||||
func (b *Base) GetFallback() *netLayer.Addr {
|
||||
return b.FallbackAddr
|
||||
}
|
||||
|
||||
func (pcs *Base) MiddleName() string {
|
||||
func (b *Base) MiddleName() string {
|
||||
var sb strings.Builder
|
||||
sb.WriteString("")
|
||||
|
||||
if pcs.TLS {
|
||||
if b.TLS {
|
||||
sb.WriteString("+tls")
|
||||
}
|
||||
if pcs.Header != nil {
|
||||
if pcs.AdvancedL != "ws" {
|
||||
if b.Header != nil {
|
||||
if b.AdvancedL != "ws" {
|
||||
sb.WriteString("+http")
|
||||
}
|
||||
}
|
||||
if pcs.AdvancedL != "" {
|
||||
if b.AdvancedL != "" {
|
||||
sb.WriteString("+")
|
||||
sb.WriteString(pcs.AdvancedL)
|
||||
sb.WriteString(b.AdvancedL)
|
||||
}
|
||||
sb.WriteString("+")
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
func (pcs *Base) CantRoute() bool {
|
||||
return pcs.IsCantRoute
|
||||
func (b *Base) CantRoute() bool {
|
||||
return b.IsCantRoute
|
||||
}
|
||||
|
||||
func (pcs *Base) InnerMuxEstablished() bool {
|
||||
return pcs.Innermux != nil && !pcs.Innermux.IsClosed()
|
||||
func (b *Base) InnerMuxEstablished() bool {
|
||||
return b.Innermux != nil && !b.Innermux.IsClosed()
|
||||
}
|
||||
|
||||
//placeholder
|
||||
func (pcs *Base) HasInnerMux() (int, string) {
|
||||
func (b *Base) HasInnerMux() (int, string) {
|
||||
return 0, ""
|
||||
}
|
||||
|
||||
@@ -174,16 +174,16 @@ func (*Base) GetServerInnerMuxSession(wlc io.ReadWriteCloser) *smux.Session {
|
||||
return smuxSession
|
||||
}
|
||||
|
||||
func (pcs *Base) CloseInnerMuxSession() {
|
||||
if pcs.Innermux != nil && !pcs.Innermux.IsClosed() {
|
||||
pcs.Innermux.Close()
|
||||
pcs.Innermux = nil
|
||||
func (b *Base) CloseInnerMuxSession() {
|
||||
if b.Innermux != nil && !b.Innermux.IsClosed() {
|
||||
b.Innermux.Close()
|
||||
b.Innermux = nil
|
||||
}
|
||||
}
|
||||
|
||||
func (pcs *Base) GetClientInnerMuxSession(wrc io.ReadWriteCloser) *smux.Session {
|
||||
if pcs.Innermux != nil && !pcs.Innermux.IsClosed() {
|
||||
return pcs.Innermux
|
||||
func (b *Base) GetClientInnerMuxSession(wrc io.ReadWriteCloser) *smux.Session {
|
||||
if b.Innermux != nil && !b.Innermux.IsClosed() {
|
||||
return b.Innermux
|
||||
} else {
|
||||
smuxConfig := smux.DefaultConfig()
|
||||
smuxSession, err := smux.Client(wrc, smuxConfig)
|
||||
@@ -195,112 +195,112 @@ func (pcs *Base) GetClientInnerMuxSession(wrc io.ReadWriteCloser) *smux.Session
|
||||
}
|
||||
return nil
|
||||
}
|
||||
pcs.Innermux = smuxSession
|
||||
b.Innermux = smuxSession
|
||||
return smuxSession
|
||||
}
|
||||
}
|
||||
|
||||
//return false. As a placeholder.
|
||||
func (pcs *Base) IsUDP_MultiChannel() bool {
|
||||
func (b *Base) IsUDP_MultiChannel() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (pcs *Base) GetTag() string {
|
||||
return pcs.Tag
|
||||
func (b *Base) GetTag() string {
|
||||
return b.Tag
|
||||
}
|
||||
func (pcs *Base) GetSockopt() *netLayer.Sockopt {
|
||||
return pcs.Sockopt
|
||||
func (b *Base) GetSockopt() *netLayer.Sockopt {
|
||||
return b.Sockopt
|
||||
}
|
||||
|
||||
func (pcs *Base) setNetwork(network string) {
|
||||
func (b *Base) setNetwork(network string) {
|
||||
if network == "" {
|
||||
pcs.TransportLayer = "tcp"
|
||||
b.TransportLayer = "tcp"
|
||||
|
||||
} else {
|
||||
pcs.TransportLayer = network
|
||||
b.TransportLayer = network
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
func (pcs *Base) AdvancedLayer() string {
|
||||
return pcs.AdvancedL
|
||||
func (b *Base) AdvancedLayer() string {
|
||||
return b.AdvancedL
|
||||
}
|
||||
|
||||
//try close inner mux and AdvS
|
||||
func (s *Base) Stop() {
|
||||
if s.Innermux != nil {
|
||||
s.Innermux.Close()
|
||||
func (b *Base) Stop() {
|
||||
if b.Innermux != nil {
|
||||
b.Innermux.Close()
|
||||
}
|
||||
|
||||
if s.AdvS != nil {
|
||||
s.AdvS.Stop()
|
||||
if b.AdvS != nil {
|
||||
b.AdvS.Stop()
|
||||
}
|
||||
}
|
||||
|
||||
//return false. As a placeholder.
|
||||
func (s *Base) CanFallback() bool {
|
||||
func (b *Base) CanFallback() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (s *Base) GetTLS_Server() *tlsLayer.Server {
|
||||
return s.Tls_s
|
||||
func (b *Base) GetTLS_Server() *tlsLayer.Server {
|
||||
return b.Tls_s
|
||||
}
|
||||
func (s *Base) GetTLS_Client() *tlsLayer.Client {
|
||||
return s.Tls_c
|
||||
func (b *Base) GetTLS_Client() *tlsLayer.Client {
|
||||
return b.Tls_c
|
||||
}
|
||||
|
||||
func (s *Base) AddrStr() string {
|
||||
return s.Addr
|
||||
func (b *Base) AddrStr() string {
|
||||
return b.Addr
|
||||
}
|
||||
func (s *Base) SetAddrStr(a string) {
|
||||
s.Addr = a
|
||||
func (b *Base) SetAddrStr(a string) {
|
||||
b.Addr = a
|
||||
}
|
||||
|
||||
func (s *Base) IsUseTLS() bool {
|
||||
return s.TLS
|
||||
func (b *Base) IsUseTLS() bool {
|
||||
return b.TLS
|
||||
}
|
||||
|
||||
func (s *Base) GetAdvClient() advLayer.Client {
|
||||
return s.AdvC
|
||||
func (b *Base) GetAdvClient() advLayer.Client {
|
||||
return b.AdvC
|
||||
}
|
||||
func (s *Base) GetAdvServer() advLayer.Server {
|
||||
return s.AdvS
|
||||
func (b *Base) GetAdvServer() advLayer.Server {
|
||||
return b.AdvS
|
||||
}
|
||||
|
||||
//setNetwork, xver, Tag,Sockopt,header,AdvancedL, InitAdvLayer
|
||||
func (c *Base) ConfigCommon(cc *CommonConf) {
|
||||
func (b *Base) ConfigCommon(cc *CommonConf) {
|
||||
|
||||
c.setNetwork(cc.Network)
|
||||
c.Xver = cc.Xver
|
||||
c.Tag = cc.Tag
|
||||
c.Sockopt = cc.Sockopt
|
||||
b.setNetwork(cc.Network)
|
||||
b.Xver = cc.Xver
|
||||
b.Tag = cc.Tag
|
||||
b.Sockopt = cc.Sockopt
|
||||
|
||||
if cc.HttpHeader != nil {
|
||||
cc.HttpHeader.AssignDefaultValue()
|
||||
c.Header = (cc.HttpHeader)
|
||||
b.Header = (cc.HttpHeader)
|
||||
}
|
||||
|
||||
c.AdvancedL = cc.AdvancedLayer
|
||||
b.AdvancedL = cc.AdvancedLayer
|
||||
|
||||
c.InitAdvLayer()
|
||||
b.InitAdvLayer()
|
||||
}
|
||||
|
||||
func (s *Base) InitAdvLayer() {
|
||||
switch s.AdvancedL {
|
||||
func (b *Base) InitAdvLayer() {
|
||||
switch b.AdvancedL {
|
||||
case "":
|
||||
return
|
||||
case "quic":
|
||||
s.setNetwork("udp")
|
||||
b.setNetwork("udp")
|
||||
}
|
||||
|
||||
creator := advLayer.ProtocolsMap[s.AdvancedL]
|
||||
creator := advLayer.ProtocolsMap[b.AdvancedL]
|
||||
if creator == nil {
|
||||
utils.Error("InitAdvLayer failed, not supported, " + s.AdvancedL)
|
||||
utils.Error("InitAdvLayer failed, not supported, " + b.AdvancedL)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
ad, err := netLayer.NewAddr(s.Addr)
|
||||
ad, err := netLayer.NewAddr(b.Addr)
|
||||
if err != nil {
|
||||
if ce := utils.CanLogErr("InitAdvLayer addr failed "); ce != nil {
|
||||
ce.Write(
|
||||
@@ -311,7 +311,7 @@ func (s *Base) InitAdvLayer() {
|
||||
return
|
||||
}
|
||||
|
||||
if dc := s.DialConf; dc != nil {
|
||||
if dc := b.DialConf; dc != nil {
|
||||
|
||||
var Headers *httpLayer.HeaderPreset
|
||||
if creator.CanHandleHeaders() {
|
||||
@@ -336,18 +336,18 @@ func (s *Base) InitAdvLayer() {
|
||||
|
||||
if ce := utils.CanLogErr("InitAdvLayer client failed "); ce != nil {
|
||||
ce.Write(
|
||||
zap.String("protocol", s.AdvancedL),
|
||||
zap.String("protocol", b.AdvancedL),
|
||||
zap.Error(err),
|
||||
)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
s.AdvC = advClient
|
||||
b.AdvC = advClient
|
||||
|
||||
}
|
||||
|
||||
if lc := s.ListenConf; lc != nil {
|
||||
if lc := b.ListenConf; lc != nil {
|
||||
|
||||
var Headers *httpLayer.HeaderPreset
|
||||
|
||||
@@ -390,7 +390,7 @@ func (s *Base) InitAdvLayer() {
|
||||
|
||||
if ce := utils.CanLogErr("InitAdvLayer server failed "); ce != nil {
|
||||
ce.Write(
|
||||
zap.String("protocol", s.AdvancedL),
|
||||
zap.String("protocol", b.AdvancedL),
|
||||
zap.Error(err),
|
||||
)
|
||||
}
|
||||
@@ -398,6 +398,6 @@ func (s *Base) InitAdvLayer() {
|
||||
return
|
||||
}
|
||||
|
||||
s.AdvS = advSer
|
||||
b.AdvS = advSer
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,8 +52,8 @@ type RejectClient struct {
|
||||
|
||||
func (*RejectClient) Name() string { return RejectName }
|
||||
|
||||
func (b *RejectClient) tryResponseAndClose(underlay net.Conn) {
|
||||
switch b.theType {
|
||||
func (c *RejectClient) tryResponseAndClose(underlay net.Conn) {
|
||||
switch c.theType {
|
||||
case "http":
|
||||
underlay.Write([]byte(httpLayer.Err403response))
|
||||
}
|
||||
@@ -62,13 +62,13 @@ func (b *RejectClient) tryResponseAndClose(underlay net.Conn) {
|
||||
}
|
||||
|
||||
//optionally response a 403 and close the underlay.
|
||||
func (b *RejectClient) Handshake(underlay net.Conn, _ []byte, _ netLayer.Addr) (result io.ReadWriteCloser, err error) {
|
||||
b.tryResponseAndClose(underlay)
|
||||
func (c *RejectClient) Handshake(underlay net.Conn, _ []byte, _ netLayer.Addr) (result io.ReadWriteCloser, err error) {
|
||||
c.tryResponseAndClose(underlay)
|
||||
return nil, io.EOF
|
||||
}
|
||||
|
||||
//function the same as Handshake
|
||||
func (b *RejectClient) EstablishUDPChannel(underlay net.Conn, _ netLayer.Addr) (netLayer.MsgConn, error) {
|
||||
b.tryResponseAndClose(underlay)
|
||||
func (c *RejectClient) EstablishUDPChannel(underlay net.Conn, _ netLayer.Addr) (netLayer.MsgConn, error) {
|
||||
c.tryResponseAndClose(underlay)
|
||||
return nil, io.EOF
|
||||
}
|
||||
|
||||
@@ -19,19 +19,19 @@ type TCPConn struct {
|
||||
isServerEnd bool
|
||||
}
|
||||
|
||||
func (uc *TCPConn) Read(p []byte) (int, error) {
|
||||
if uc.remainFirstBufLen > 0 {
|
||||
n, err := uc.optionalReader.Read(p)
|
||||
func (c *TCPConn) Read(p []byte) (int, error) {
|
||||
if c.remainFirstBufLen > 0 {
|
||||
n, err := c.optionalReader.Read(p)
|
||||
if n > 0 {
|
||||
uc.remainFirstBufLen -= n
|
||||
c.remainFirstBufLen -= n
|
||||
}
|
||||
return n, err
|
||||
} else {
|
||||
return uc.Conn.Read(p)
|
||||
return c.Conn.Read(p)
|
||||
}
|
||||
}
|
||||
func (uc *TCPConn) Write(p []byte) (int, error) {
|
||||
return uc.Conn.Write(p)
|
||||
func (c *TCPConn) Write(p []byte) (int, error) {
|
||||
return c.Conn.Write(p)
|
||||
}
|
||||
|
||||
func (c *TCPConn) EverPossibleToSplice() bool {
|
||||
|
||||
@@ -22,19 +22,19 @@ type UserTCPConn struct {
|
||||
isServerEnd bool
|
||||
}
|
||||
|
||||
func (uc *UserTCPConn) Read(p []byte) (int, error) {
|
||||
if uc.remainFirstBufLen > 0 {
|
||||
n, err := uc.optionalReader.Read(p)
|
||||
func (c *UserTCPConn) Read(p []byte) (int, error) {
|
||||
if c.remainFirstBufLen > 0 {
|
||||
n, err := c.optionalReader.Read(p)
|
||||
if n > 0 {
|
||||
uc.remainFirstBufLen -= n
|
||||
c.remainFirstBufLen -= n
|
||||
}
|
||||
return n, err
|
||||
} else {
|
||||
return uc.Conn.Read(p)
|
||||
return c.Conn.Read(p)
|
||||
}
|
||||
}
|
||||
func (uc *UserTCPConn) Write(p []byte) (int, error) {
|
||||
return uc.Conn.Write(p)
|
||||
func (c *UserTCPConn) Write(p []byte) (int, error) {
|
||||
return c.Conn.Write(p)
|
||||
}
|
||||
|
||||
func (c *UserTCPConn) EverPossibleToSplice() bool {
|
||||
|
||||
@@ -31,15 +31,15 @@ type UserTCPConn struct {
|
||||
mr utils.MultiReader //用于 Readbuffers
|
||||
}
|
||||
|
||||
func (uc *UserTCPConn) GetProtocolVersion() int {
|
||||
return uc.version
|
||||
func (c *UserTCPConn) GetProtocolVersion() int {
|
||||
return c.version
|
||||
}
|
||||
func (uc *UserTCPConn) GetIdentityStr() string {
|
||||
if uc.convertedUUIDStr == "" {
|
||||
uc.convertedUUIDStr = utils.UUIDToStr(uc.uuid)
|
||||
func (c *UserTCPConn) GetIdentityStr() string {
|
||||
if c.convertedUUIDStr == "" {
|
||||
c.convertedUUIDStr = utils.UUIDToStr(c.uuid)
|
||||
}
|
||||
|
||||
return uc.convertedUUIDStr
|
||||
return c.convertedUUIDStr
|
||||
}
|
||||
|
||||
//当前连接状态是否可以直接写入底层Conn而不经任何改动/包装
|
||||
@@ -112,16 +112,16 @@ func (c *UserTCPConn) WriteBuffers(buffers [][]byte) (int64, error) {
|
||||
|
||||
//如果是udp,则是多线程不安全的,如果是tcp,则安不安全看底层的链接。
|
||||
// 这里规定,如果是UDP,则 每Write一遍,都要Write一个 完整的UDP 数据包
|
||||
func (uc *UserTCPConn) Write(p []byte) (int, error) {
|
||||
func (c *UserTCPConn) Write(p []byte) (int, error) {
|
||||
|
||||
if uc.version == 0 {
|
||||
if c.version == 0 {
|
||||
|
||||
originalSupposedWrittenLenth := len(p)
|
||||
|
||||
var writeBuf *bytes.Buffer
|
||||
|
||||
if uc.isServerEnd && !uc.isntFirstPacket {
|
||||
uc.isntFirstPacket = true
|
||||
if c.isServerEnd && !c.isntFirstPacket {
|
||||
c.isntFirstPacket = true
|
||||
|
||||
writeBuf = utils.GetBuf()
|
||||
|
||||
@@ -135,7 +135,7 @@ func (uc *UserTCPConn) Write(p []byte) (int, error) {
|
||||
if writeBuf != nil {
|
||||
writeBuf.Write(p)
|
||||
|
||||
_, err := uc.Conn.Write(writeBuf.Bytes())
|
||||
_, err := c.Conn.Write(writeBuf.Bytes())
|
||||
|
||||
utils.PutBuf(writeBuf)
|
||||
|
||||
@@ -144,7 +144,7 @@ func (uc *UserTCPConn) Write(p []byte) (int, error) {
|
||||
}
|
||||
|
||||
} else {
|
||||
_, err := uc.Conn.Write(p)
|
||||
_, err := c.Conn.Write(p)
|
||||
|
||||
if err != nil {
|
||||
return 0, err
|
||||
@@ -153,52 +153,52 @@ func (uc *UserTCPConn) Write(p []byte) (int, error) {
|
||||
return originalSupposedWrittenLenth, nil
|
||||
|
||||
} else {
|
||||
return uc.Conn.Write(p)
|
||||
return c.Conn.Write(p)
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//专门适用于 裸奔splice的情况
|
||||
func (uc *UserTCPConn) ReadFrom(r io.Reader) (written int64, err error) {
|
||||
func (c *UserTCPConn) ReadFrom(r io.Reader) (written int64, err error) {
|
||||
|
||||
return netLayer.TryReadFrom_withSplice(uc, uc.Conn, r, uc.canDirectWrite)
|
||||
return netLayer.TryReadFrom_withSplice(c, c.Conn, r, c.canDirectWrite)
|
||||
}
|
||||
|
||||
//如果是udp,则是多线程不安全的,如果是tcp,则安不安全看底层的链接。
|
||||
// 这里规定,如果是UDP,则 每次 Read 得到的都是一个 完整的UDP 数据包,除非p给的太小……
|
||||
func (uc *UserTCPConn) Read(p []byte) (int, error) {
|
||||
func (c *UserTCPConn) Read(p []byte) (int, error) {
|
||||
|
||||
if uc.isServerEnd {
|
||||
var from io.Reader = uc.Conn
|
||||
if uc.optionalReader != nil {
|
||||
from = uc.optionalReader
|
||||
if c.isServerEnd {
|
||||
var from io.Reader = c.Conn
|
||||
if c.optionalReader != nil {
|
||||
from = c.optionalReader
|
||||
}
|
||||
|
||||
if uc.remainFirstBufLen > 0 {
|
||||
if c.remainFirstBufLen > 0 {
|
||||
|
||||
n, err := from.Read(p)
|
||||
|
||||
if n > 0 {
|
||||
uc.remainFirstBufLen -= n
|
||||
if uc.remainFirstBufLen <= 0 {
|
||||
uc.optionalReader = nil
|
||||
c.remainFirstBufLen -= n
|
||||
if c.remainFirstBufLen <= 0 {
|
||||
c.optionalReader = nil
|
||||
}
|
||||
}
|
||||
return n, err
|
||||
|
||||
} else {
|
||||
return uc.Conn.Read(p)
|
||||
return c.Conn.Read(p)
|
||||
}
|
||||
|
||||
} else if uc.version == 0 {
|
||||
} else if c.version == 0 {
|
||||
|
||||
if !uc.isntFirstPacket {
|
||||
if !c.isntFirstPacket {
|
||||
//先读取响应头
|
||||
|
||||
uc.isntFirstPacket = true
|
||||
c.isntFirstPacket = true
|
||||
|
||||
bs := utils.GetPacket()
|
||||
n, e := uc.Conn.Read(bs)
|
||||
n, e := c.Conn.Read(bs)
|
||||
|
||||
if e != nil {
|
||||
utils.PutPacket(bs)
|
||||
@@ -214,12 +214,12 @@ func (uc *UserTCPConn) Read(p []byte) (int, error) {
|
||||
return n, nil
|
||||
|
||||
} else {
|
||||
return uc.Conn.Read(p)
|
||||
return c.Conn.Read(p)
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
return uc.Conn.Read(p)
|
||||
return c.Conn.Read(p)
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user