fix port mux bug

This commit is contained in:
刘河 2019-12-07 20:44:32 +08:00
parent 614d81f374
commit 9268e67529
2 changed files with 19 additions and 9 deletions

View File

@ -6,15 +6,17 @@ import (
) )
type PortConn struct { type PortConn struct {
Conn net.Conn Conn net.Conn
rs []byte rs []byte
start int readMore bool
start int
} }
func newPortConn(conn net.Conn, rs []byte) *PortConn { func newPortConn(conn net.Conn, rs []byte, readMore bool) *PortConn {
return &PortConn{ return &PortConn{
Conn: conn, Conn: conn,
rs: rs, rs: rs,
readMore: readMore,
} }
} }
@ -29,9 +31,15 @@ func (pConn *PortConn) Read(b []byte) (n int, err error) {
defer func() { defer func() {
pConn.start = len(pConn.rs) pConn.start = len(pConn.rs)
}() }()
return copy(b, pConn.rs[pConn.start:]), nil n = copy(b, pConn.rs[pConn.start:])
if !pConn.readMore {
return
}
} }
return pConn.Conn.Read(b) var n2 = 0
n2, err = pConn.Conn.Read(b[n:])
n = n + n2
return
} }
func (pConn *PortConn) Write(b []byte) (n int, err error) { func (pConn *PortConn) Write(b []byte) (n int, err error) {

View File

@ -89,6 +89,7 @@ func (pMux *PortMux) process(conn net.Conn) {
var ch chan *PortConn var ch chan *PortConn
var rs []byte var rs []byte
var buffer bytes.Buffer var buffer bytes.Buffer
var readMore = false
switch common.BytesToNum(buf) { switch common.BytesToNum(buf) {
case HTTP_CONNECT, HTTP_DELETE, HTTP_GET, HTTP_HEAD, HTTP_OPTIONS, HTTP_POST, HTTP_PUT, HTTP_TRACE: //http and manager case HTTP_CONNECT, HTTP_DELETE, HTTP_GET, HTTP_HEAD, HTTP_OPTIONS, HTTP_POST, HTTP_PUT, HTTP_TRACE: //http and manager
buffer.Reset() buffer.Reset()
@ -123,6 +124,7 @@ func (pMux *PortMux) process(conn net.Conn) {
case CLIENT: // client connection case CLIENT: // client connection
ch = pMux.clientConn ch = pMux.clientConn
default: // https default: // https
readMore = true
ch = pMux.httpsConn ch = pMux.httpsConn
} }
if len(rs) == 0 { if len(rs) == 0 {
@ -131,7 +133,7 @@ func (pMux *PortMux) process(conn net.Conn) {
timer := time.NewTimer(ACCEPT_TIME_OUT) timer := time.NewTimer(ACCEPT_TIME_OUT)
select { select {
case <-timer.C: case <-timer.C:
case ch <- newPortConn(conn, rs): case ch <- newPortConn(conn, rs, readMore):
} }
} }