Documentation
¶
Index ¶
- func ContinueReadBody(req *protocol.Request, r network.Reader, maxBodySize int, ...) error
- func ProxyWrite(req *protocol.Request, w network.Writer) error
- func ReadHeader(h *protocol.RequestHeader, r network.Reader) error
- func ReadHeaderWithLimit(h *protocol.RequestHeader, r network.Reader, maxHeaderBytes int) error
- func ReadLimitBody(req *protocol.Request, r network.Reader, maxBodySize int, ...) error
- func Write(req *protocol.Request, w network.Writer) error
- func WriteHeader(h *protocol.RequestHeader, w network.Writer) error
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func ContinueReadBody ¶
func ContinueReadBody(req *protocol.Request, r network.Reader, maxBodySize int, preParseMultipartForm ...bool) error
// ContinueReadBodyStream reads request body in stream if request header contains // 'Expect: 100-continue'. // // The caller must send StatusContinue response before calling this method. // // If maxBodySize > 0 and the body size exceeds maxBodySize, // then errBodyTooLarge is returned.
func ContinueReadBodyStream(req *protocol.Request, zr network.Reader, maxBodySize int, preParseMultipartForm ...bool) error {
var err error
contentLength := req.Header.ContentLength()
if contentLength > 0 {
if len(preParseMultipartForm) == 0 || preParseMultipartForm[0] {
// Pre-read multipart form data of known length.
// This way we limit memory usage for large file uploads, since their contents
// is streamed into temporary files if file size exceeds defaultMaxInMemoryFileSize.
req.SetMultipartFormBoundary(string(req.Header.MultipartFormBoundary()))
if len(req.MultipartFormBoundary()) > 0 && len(req.Header.PeekContentEncoding()) == 0 {
err := protocol.ParseMultipartForm(zr.(io.Reader), req, contentLength, consts.DefaultMaxInMemoryFileSize)
if err != nil {
req.Reset()
}
return err
}
}
}
if contentLength == -2 {
// identity body has no sense for http requests, since
// the end of body is determined by connection close.
// So just ignore request body for requests without
// 'Content-Length' and 'Transfer-Encoding' headers.
// refer to https://tools.ietf.org/html/rfc7230#section-3.3.2
if !req.Header.IgnoreBody() {
req.Header.SetContentLength(0)
}
return nil
}
bodyBuf := req.BodyBuffer()
bodyBuf.Reset()
bodyBuf.B, err = ext.ReadBodyWithStreaming(zr, contentLength, maxBodySize, bodyBuf.B)
if err != nil {
if errors.Is(err, errs.ErrBodyTooLarge) {
req.Header.SetContentLength(contentLength)
req.ConstructBodyStream(bodyBuf, ext.AcquireBodyStream(bodyBuf, zr, req.Header.Trailer(), contentLength))
return nil
}
if errors.Is(err, errs.ErrChunkedStream) {
req.ConstructBodyStream(bodyBuf, ext.AcquireBodyStream(bodyBuf, zr, req.Header.Trailer(), contentLength))
return nil
}
req.Reset()
return err
}
req.ConstructBodyStream(bodyBuf, ext.AcquireBodyStream(bodyBuf, zr, req.Header.Trailer(), contentLength))
return nil
}
func ReadHeader ¶
func ReadHeader(h *protocol.RequestHeader, r network.Reader) error
func ReadHeaderWithLimit ¶
func ReadLimitBody ¶
func ReadLimitBody(req *protocol.Request, r network.Reader, maxBodySize int, getOnly, preParseMultipartForm bool) error
func ReadBodyStream(req *protocol.Request, zr network.Reader, maxBodySize int, getOnly, preParseMultipartForm bool) error {
if getOnly && !req.Header.IsGet() {
return errGetOnly
}
if req.MayContinue() {
// 'Expect: 100-continue' header found. Let the caller deciding
// whether to read request body or
// to return StatusExpectationFailed.
return nil
}
return ContinueReadBodyStream(req, zr, maxBodySize, preParseMultipartForm)
}
func WriteHeader ¶
func WriteHeader(h *protocol.RequestHeader, w network.Writer) error
Write writes request header to w.
Types ¶
This section is empty.
Click to show internal directories.
Click to hide internal directories.