@@ -6,15 +6,17 @@ import (
)
type PortConn struct {
- Conn net.Conn
- rs []byte
- start int
+ Conn net.Conn
+ rs []byte
+ readMore bool
+ start int
}
-func newPortConn(conn net.Conn, rs []byte) *PortConn {
+func newPortConn(conn net.Conn, rs []byte, readMore bool) *PortConn {
return &PortConn{
- Conn: conn,
- rs: rs,
+ Conn: conn,
+ rs: rs,
+ readMore: readMore,
@@ -29,9 +31,15 @@ func (pConn *PortConn) Read(b []byte) (n int, err error) {
defer func() {
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
func (pConn *PortConn) Write(b []byte) (n int, err error) {
@@ -89,6 +89,7 @@ func (pMux *PortMux) process(conn net.Conn) {
var ch chan *PortConn
var rs []byte
var buffer bytes.Buffer
+ var readMore = false
switch common.BytesToNum(buf) {
case HTTP_CONNECT, HTTP_DELETE, HTTP_GET, HTTP_HEAD, HTTP_OPTIONS, HTTP_POST, HTTP_PUT, HTTP_TRACE: //http and manager
buffer.Reset()
@@ -123,6 +124,7 @@ func (pMux *PortMux) process(conn net.Conn) {
case CLIENT: // client connection
ch = pMux.clientConn
default: // https
+ readMore = true
ch = pMux.httpsConn
if len(rs) == 0 {
@@ -131,7 +133,7 @@ func (pMux *PortMux) process(conn net.Conn) {
timer := time.NewTimer(ACCEPT_TIME_OUT)
select {
case <-timer.C:
- case ch <- newPortConn(conn, rs):
+ case ch <- newPortConn(conn, rs, readMore):