fix obfs-http server
This commit is contained in:
parent
acc44b6822
commit
af98b99a8b
33
obfs.go
33
obfs.go
@ -6,7 +6,7 @@ import (
|
|||||||
"bufio"
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httputil"
|
"net/http/httputil"
|
||||||
@ -67,7 +67,8 @@ func (l *obfsHTTPListener) Accept() (net.Conn, error) {
|
|||||||
type obfsHTTPConn struct {
|
type obfsHTTPConn struct {
|
||||||
net.Conn
|
net.Conn
|
||||||
host string
|
host string
|
||||||
buf []byte
|
rbuf bytes.Buffer
|
||||||
|
wbuf bytes.Buffer
|
||||||
isServer bool
|
isServer bool
|
||||||
handshaked bool
|
handshaked bool
|
||||||
handshakeMutex sync.Mutex
|
handshakeMutex sync.Mutex
|
||||||
@ -106,11 +107,14 @@ func (c *obfsHTTPConn) serverHandshake() (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if r.ContentLength > 0 {
|
if r.ContentLength > 0 {
|
||||||
c.buf, err = ioutil.ReadAll(r.Body)
|
_, err = io.Copy(&c.rbuf, r.Body)
|
||||||
} else {
|
} else {
|
||||||
c.buf, err = br.Peek(br.Buffered())
|
var b []byte
|
||||||
|
b, err = br.Peek(br.Buffered())
|
||||||
|
if len(b) > 0 {
|
||||||
|
_, err = c.rbuf.Write(b)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Logf("[ohttp] %s -> %s : %v", c.Conn.RemoteAddr(), c.Conn.LocalAddr(), err)
|
log.Logf("[ohttp] %s -> %s : %v", c.Conn.RemoteAddr(), c.Conn.LocalAddr(), err)
|
||||||
return
|
return
|
||||||
@ -138,6 +142,12 @@ func (c *obfsHTTPConn) serverHandshake() (err error) {
|
|||||||
if Debug {
|
if Debug {
|
||||||
log.Logf("[ohttp] %s <- %s\n%s", c.Conn.RemoteAddr(), c.Conn.LocalAddr(), b.String())
|
log.Logf("[ohttp] %s <- %s\n%s", c.Conn.RemoteAddr(), c.Conn.LocalAddr(), b.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if c.rbuf.Len() > 0 {
|
||||||
|
c.wbuf = b // cache the response header if there are extra data in the request body.
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
_, err = b.WriteTo(c.Conn)
|
_, err = b.WriteTo(c.Conn)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -182,10 +192,8 @@ func (c *obfsHTTPConn) Read(b []byte) (n int, err error) {
|
|||||||
if err = c.Handshake(); err != nil {
|
if err = c.Handshake(); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if len(c.buf) > 0 {
|
if c.rbuf.Len() > 0 {
|
||||||
n = copy(b, c.buf)
|
return c.rbuf.Read(b)
|
||||||
c.buf = c.buf[n:]
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
return c.Conn.Read(b)
|
return c.Conn.Read(b)
|
||||||
}
|
}
|
||||||
@ -194,6 +202,13 @@ func (c *obfsHTTPConn) Write(b []byte) (n int, err error) {
|
|||||||
if err = c.Handshake(); err != nil {
|
if err = c.Handshake(); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if c.wbuf.Len() > 0 {
|
||||||
|
c.wbuf.Write(b) // append the data to the cached header
|
||||||
|
_, err = c.wbuf.WriteTo(c.Conn)
|
||||||
|
n = len(b) // exclude the header length
|
||||||
|
return
|
||||||
|
}
|
||||||
return c.Conn.Write(b)
|
return c.Conn.Write(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user