修订文档;令http层支持回落

This commit is contained in:
e1732a364fed
2000-01-01 00:00:00 +00:00
parent a44a83c5f3
commit 0f527cfba4
8 changed files with 69 additions and 26 deletions

View File

@@ -172,9 +172,8 @@ func (h *HeaderPreset) AssignDefaultValue() {
h.Prepare()
}
func (h *HeaderPreset) ReadRequest(underlay net.Conn) (leftBuf *bytes.Buffer, err error) {
func (h *HeaderPreset) ReadRequest(underlay io.Reader) (rp H1RequestParser, leftBuf *bytes.Buffer, err error) {
var rp H1RequestParser
err = rp.ReadAndParse(underlay)
if err != nil {
return
@@ -193,14 +192,18 @@ func (h *HeaderPreset) ReadRequest(underlay net.Conn) (leftBuf *bytes.Buffer, er
err = utils.ErrInErr{ErrDesc: "ReadRequest failed, wrong path", ErrDetail: utils.ErrInvalidData, Data: rp.Path}
return
}
allbytes := rp.WholeRequestBuf.Bytes()
leftBuf = bytes.NewBuffer(allbytes)
indexOfEnding := bytes.Index(allbytes, HeaderENDING_bytes)
if indexOfEnding < 0 {
err = utils.ErrInvalidData
return
}
headerBytes := rp.WholeRequestBuf.Next(indexOfEnding)
headerBytes := leftBuf.Next(indexOfEnding)
if h.Strict {
indexOfFirstCRLF := bytes.Index(allbytes, []byte(CRLF))
@@ -258,12 +261,12 @@ func (h *HeaderPreset) ReadRequest(underlay net.Conn) (leftBuf *bytes.Buffer, er
}
rp.WholeRequestBuf.Next(4)
leftBuf.Next(len(HeaderENDING))
return rp.WholeRequestBuf, nil
return
}
func (h *HeaderPreset) WriteRequest(underlay net.Conn, payload []byte) error {
func (h *HeaderPreset) WriteRequest(underlay io.Writer, payload []byte) error {
buf := bytes.NewBuffer(payload)
r, err := http.NewRequest(h.Request.Method, h.Request.Path[0], buf)
@@ -281,7 +284,7 @@ func (h *HeaderPreset) WriteRequest(underlay net.Conn, payload []byte) error {
return r.Write(underlay)
}
func (h *HeaderPreset) ReadResponse(underlay net.Conn) (leftBuf *bytes.Buffer, err error) {
func (h *HeaderPreset) ReadResponse(underlay io.Reader) (leftBuf *bytes.Buffer, err error) {
bs := utils.GetPacket()
var n int
@@ -307,7 +310,7 @@ func (h *HeaderPreset) ReadResponse(underlay net.Conn) (leftBuf *bytes.Buffer, e
return buf, nil
}
func (h *HeaderPreset) WriteResponse(underlay net.Conn, payload []byte) error {
func (h *HeaderPreset) WriteResponse(underlay io.Writer, payload []byte) error {
buf := utils.GetBuf()
buf.WriteString("HTTP/")
@@ -347,6 +350,7 @@ type HeaderConn struct {
IsServerEnd bool
optionalReader io.Reader
ReadOkCallback func(*bytes.Buffer)
notFirstWrite bool
}
@@ -356,11 +360,21 @@ func (c *HeaderConn) Read(p []byte) (n int, err error) {
if c.IsServerEnd {
if c.optionalReader == nil {
buf, err = c.H.ReadRequest(c.Conn)
var rp H1RequestParser
rp, buf, err = c.H.ReadRequest(c.Conn)
if err != nil {
err = utils.ErrInErr{ErrDesc: "http HeaderConn Read failed, at serverEnd", ErrDetail: err}
err = &utils.ErrBuffer{
Err: utils.ErrInErr{ErrDesc: "http HeaderConn Read failed, at serverEnd", ErrDetail: err},
Buf: rp.WholeRequestBuf,
}
return
}
if c.ReadOkCallback != nil {
c.ReadOkCallback(rp.WholeRequestBuf)
}
c.optionalReader = io.MultiReader(buf, c.Conn)
}

View File

@@ -118,7 +118,7 @@ type H1RequestParser struct {
Headers []RawHeader
}
// 尝试读取数据并解析HTTP请求, 解析道道 数据会存入 RequestParser 结构中.
// 尝试读取数据并解析HTTP请求, 解析 数据会存入 RequestParser 结构中.
//如果读取错误,会返回该错误; 如果读到的不是HTTP请求返回 的err 的 errors.Is(err,ErrNotHTTP_Request) == true;
//
// 该函数有个小问题,就是如果一次Read是短Read可能是网络原因没读完整个http头部则仍然会认为是错误