Documentation
¶
Overview ¶
selfFastHttp document
selfFastHttp project selfFastHttp.go
Index ¶
- Constants
- Variables
- func AcquireByteBuffer() *bytebufferpool.ByteBuffer
- func AppendDeflateBytes(dst, src []byte) []byte
- func AppendDeflateBytesLevel(dst, src []byte, level int) []byte
- func AppendGunzipBytes(dst, src []byte) ([]byte, error)
- func AppendGzipBytes(dst, src []byte) []byte
- func AppendGzipBytesLevel(dst, src []byte, level int) []byte
- func AppendHTTPDate(dst []byte, date time.Time) []byte
- func AppendInflateBytes(dst, src []byte) ([]byte, error)
- func AppendNormalizedHeaderKey(dst []byte, key string) []byte
- func AppendNormalizedHeaderKeyBytes(dst, key []byte) []byte
- func AppendQuotedArg(dst, src []byte) []byte
- func AppendUint(dst []byte, n int) []byte
- func CoarseTimeNow() time.Time
- func GetAddr(o interface{}) uintptr
- func ListenAndServe(addr string, handler RequestHandler) error
- func ListenAndServeTLS(addr, certFile, keyFile string, handler RequestHandler) error
- func ListenAndServeTLSEmbed(addr string, certData, keyData []byte, handler RequestHandler) error
- func ListenAndServeUNIX(addr string, mode os.FileMode, handler RequestHandler) error
- func NewLogger(out io.Writer) *selfLogger
- func NewStreamReader(sw StreamWriter) io.ReadCloser
- func ParseHTTPDate(date []byte) (time.Time, error)
- func ParseUfloat(buf []byte) (float64, error)
- func ParseUint(buf []byte) (int, error)
- func ReleaseArgs(a *Args)
- func ReleaseByteBuffer(b *bytebufferpool.ByteBuffer)
- func ReleaseCookie(c *Cookie)
- func ReleaseURI(u *URI)
- func SaveMultipartFile(fh *multipart.FileHeader, path string) error
- func Serve(ln net.Listener, handler RequestHandler) error
- func ServeConn(c net.Conn, handler RequestHandler) error
- func ServeFile(ctx *RequestCtx, path string)
- func ServeFileBytes(ctx *RequestCtx, path []byte)
- func ServeTLS(ln net.Listener, certFile, keyFile string, handler RequestHandler) error
- func ServeTLSEmbed(ln net.Listener, certData, keyData []byte, handler RequestHandler) error
- func StatusMessage(statusCode int) string
- func TestHello() []byte
- func WriteDeflate(w io.Writer, p []byte) (int, error)
- func WriteDeflateLevel(w io.Writer, p []byte, level int) (int, error)
- func WriteGunzip(w io.Writer, p []byte) (int, error)
- func WriteGzip(w io.Writer, p []byte) (int, error)
- func WriteGzipLevel(w io.Writer, p []byte, level int) (int, error)
- func WriteInflate(w io.Writer, p []byte) (int, error)
- func WriteMultipartForm(w io.Writer, f *multipart.Form, boundary string) error
- type Args
- func (a *Args) AaddBytesKV(key, value []byte)
- func (a *Args) Add(key, value string)
- func (a *Args) AddBytesK(key []byte, value string)
- func (a *Args) AddBytesV(key string, value []byte)
- func (a *Args) AppendBytes(dst []byte) []byte
- func (a *Args) CopyTo(dst *Args)
- func (a *Args) Del(key string)
- func (a *Args) DelBytes(key []byte)
- func (a *Args) GetBool(key string) bool
- func (a *Args) GetUfloat(key string) (float64, error)
- func (a *Args) GetUfloatOrZero(key string) float64
- func (a *Args) GetUint(key string) (int, error)
- func (a *Args) GetUintOrZero(key string) int
- func (a *Args) Has(key string) bool
- func (a *Args) HasBytes(key []byte) bool
- func (a *Args) Len() int
- func (a *Args) Parse(s string)
- func (a *Args) ParseBytes(b []byte)
- func (a *Args) Peek(key string) []byte
- func (a *Args) PeekBytes(key []byte) []byte
- func (a *Args) PeekMulti(key string) [][]byte
- func (a *Args) PeekMultiBytes(key []byte) [][]byte
- func (a *Args) QueryString() []byte
- func (a *Args) Reset()
- func (a *Args) Set(key, value string)
- func (a *Args) SetBytesK(key []byte, value string)
- func (a *Args) SetBytesKV(key, value []byte)
- func (a *Args) SetBytesV(key string, value []byte)
- func (a *Args) SetUint(key string, value int)
- func (a *Args) SetUintBytes(key []byte, value int)
- func (a *Args) String() string
- func (a *Args) VisitAll(f func(key, value []byte))
- func (a *Args) WriteTo(w io.Writer) (int64, error)
- type Cookie
- func (c *Cookie) AppendBytes(dst []byte) []byte
- func (c *Cookie) Cookie() []byte
- func (c *Cookie) CopyTo(dst *Cookie)
- func (c *Cookie) Domain() []byte
- func (c *Cookie) Expire() time.Time
- func (c *Cookie) HTTPOnly() bool
- func (c *Cookie) Key() []byte
- func (c *Cookie) Parse(src string) error
- func (c *Cookie) ParseBytes(src []byte) error
- func (c *Cookie) Path() []byte
- func (c *Cookie) Reset()
- func (c *Cookie) Secure() bool
- func (c *Cookie) SetDomain(domain string)
- func (c *Cookie) SetDomainBytes(domain []byte)
- func (c *Cookie) SetExpire(expire time.Time)
- func (c *Cookie) SetHTTPOnly(httpOnly bool)
- func (c *Cookie) SetKey(key string)
- func (c *Cookie) SetKeyBytes(key []byte)
- func (c *Cookie) SetPath(path string)
- func (c *Cookie) SetPathBytes(path []byte)
- func (c *Cookie) SetSecure(secure bool)
- func (c *Cookie) SetValue(value string)
- func (c *Cookie) SetValueBytes(value []byte)
- func (c *Cookie) String() string
- func (c *Cookie) Value() []byte
- func (c *Cookie) WriteTo(w io.Writer) (int64, error)
- type ErrSmallBuffer
- type HijackHandler
- type Logger
- type Request
- func (req *Request) AppendBody(p []byte)
- func (req *Request) AppendBodyString(s string)
- func (req *Request) Body() []byte
- func (req *Request) BodyGunzip() ([]byte, error)
- func (req *Request) BodyInflate() ([]byte, error)
- func (req *Request) BodyWriteTo(w io.Writer) error
- func (req *Request) BodyWriter() io.Writer
- func (req *Request) ConnectionClose() bool
- func (req *Request) ContinueReadBody(r *bufio.Reader, maxBodySize int) error
- func (req *Request) CopyTo(dst *Request)
- func (req *Request) Host() []byte
- func (req *Request) IsBodyStream() bool
- func (req *Request) MayContinue() bool
- func (req *Request) MultipartForm() (*multipart.Form, error)
- func (req *Request) PostArgs() *Args
- func (req *Request) Read(r *bufio.Reader) error
- func (req *Request) ReadLimitBody(r *bufio.Reader, maxBodySize int) error
- func (req *Request) ReleaseBody(size int)
- func (req *Request) RemoveMultipartFormFiles()
- func (req *Request) RequestURI() []byte
- func (req *Request) Reset()
- func (req *Request) ResetBody()
- func (req *Request) SetBody(body []byte)
- func (req *Request) SetBodyStream(bodyStream io.Reader, bodySize int)
- func (req *Request) SetBodyStreamWriter(sw StreamWriter)
- func (req *Request) SetBodyString(body string)
- func (req *Request) SetConnectionClose()
- func (req *Request) SetHost(host string)
- func (req *Request) SetHostBytes(host []byte)
- func (req *Request) SetRequestURI(requestURI string)
- func (req *Request) SetRequestURIBytes(requestURI []byte)
- func (req *Request) String() string
- func (req *Request) SwapBody(body []byte) []byte
- func (req *Request) URI() *URI
- func (req *Request) Write(w *bufio.Writer) error
- func (req *Request) WriteTo(w io.Writer) (int64, error)
- type RequestCtx
- func (ctx *RequestCtx) ConnID() uint64
- func (ctx *RequestCtx) ConnRequestNum() uint64
- func (ctx *RequestCtx) ConnTime() time.Time
- func (ctx *RequestCtx) Error(msg string, statusCode int)
- func (ctx *RequestCtx) FormFile(key string) (*multipart.FileHeader, error)
- func (ctx *RequestCtx) FormValue(key string) []byte
- func (ctx *RequestCtx) Hijack(handler HijackHandler)
- func (ctx *RequestCtx) Hijacked() bool
- func (ctx *RequestCtx) Host() []byte
- func (ctx *RequestCtx) ID() uint64
- func (ctx *RequestCtx) IfModifiedSince(lastModified time.Time) bool
- func (ctx *RequestCtx) Init(req *Request, remoteAddr net.Addr, logger Logger)
- func (ctx *RequestCtx) Init2(conn net.Conn, logger Logger, reduceMemoryUsage bool)
- func (ctx *RequestCtx) IsBodyStream() bool
- func (ctx *RequestCtx) IsDelete() bool
- func (ctx *RequestCtx) IsGet() bool
- func (ctx *RequestCtx) IsHead() bool
- func (ctx *RequestCtx) IsPost() bool
- func (ctx *RequestCtx) IsPut() bool
- func (ctx *RequestCtx) IsTLS() bool
- func (ctx *RequestCtx) LastTimeoutErrorResponse() *Response
- func (ctx *RequestCtx) LocalAddr() net.Addr
- func (ctx *RequestCtx) LocalIP() net.IP
- func (ctx *RequestCtx) Logger() Logger
- func (ctx *RequestCtx) Method() []byte
- func (ctx *RequestCtx) MultipartForm() (*multipart.Form, error)
- func (ctx *RequestCtx) NotFound()
- func (ctx *RequestCtx) NotModified()
- func (ctx *RequestCtx) Path() []byte
- func (ctx *RequestCtx) PostArgs() *Args
- func (ctx *RequestCtx) PostBody() []byte
- func (ctx *RequestCtx) QueryArgs() *Args
- func (ctx *RequestCtx) Redirect(uri string, statusCode int)
- func (ctx *RequestCtx) RedirectBytes(uri []byte, statusCode int)
- func (ctx *RequestCtx) Referer() []byte
- func (ctx *RequestCtx) RemoteAddr() net.Addr
- func (ctx *RequestCtx) RemoteIP() net.IP
- func (ctx *RequestCtx) RequestURI() []byte
- func (ctx *RequestCtx) Reset()
- func (ctx *RequestCtx) ResetBody()
- func (ctx *RequestCtx) SendFile(path string)
- func (ctx *RequestCtx) SendFileBytes(path []byte)
- func (ctx *RequestCtx) SetBody(body []byte)
- func (ctx *RequestCtx) SetBodyStream(bodyStream io.Reader, bodySize int)
- func (ctx *RequestCtx) SetBodyStreamWriter(sw StreamWriter)
- func (ctx *RequestCtx) SetBodyString(body string)
- func (ctx *RequestCtx) SetConnectionClose()
- func (ctx *RequestCtx) SetContentType(contentType string)
- func (ctx *RequestCtx) SetContentTypeBytes(contentType []byte)
- func (ctx *RequestCtx) SetStatusCode(statusCode int)
- func (ctx *RequestCtx) SetUserValue(key string, value interface{})
- func (ctx *RequestCtx) SetUserValueBytes(key []byte, value interface{})
- func (ctx *RequestCtx) String() string
- func (ctx *RequestCtx) Success(contentType string, body []byte)
- func (ctx *RequestCtx) SuccessString(contentType, body string)
- func (ctx *RequestCtx) TLSConnectionState() *tls.ConnectionState
- func (ctx *RequestCtx) Time() time.Time
- func (ctx *RequestCtx) TimeoutError(msg string)
- func (ctx *RequestCtx) TimeoutErrorWithCode(msg string, statusCode int)
- func (ctx *RequestCtx) TimeoutErrorWithResponse(resp *Response)
- func (ctx *RequestCtx) URI() *URI
- func (ctx *RequestCtx) UserAgent() []byte
- func (ctx *RequestCtx) UserValue(key string) interface{}
- func (ctx *RequestCtx) UserValueBytes(key []byte) interface{}
- func (ctx *RequestCtx) VisitUserValues(visitor func([]byte, interface{}))
- func (ctx *RequestCtx) Write(p []byte) (int, error)
- func (ctx *RequestCtx) WriteString(s string) (int, error)
- type RequestHandler
- type RequestHeader
- func (h *RequestHeader) Add(key, value string)
- func (h *RequestHeader) AddBytesK(key []byte, value string)
- func (h *RequestHeader) AddBytesKV(key, value []byte)
- func (h *RequestHeader) AddBytesV(key string, value []byte)
- func (h *RequestHeader) AppendBytes(dst []byte) []byte
- func (h *RequestHeader) ConnectionClose() bool
- func (h *RequestHeader) ConnectionUpgrade() bool
- func (h *RequestHeader) ContentLength() int
- func (h *RequestHeader) ContentType() []byte
- func (h *RequestHeader) Cookie(key string) []byte
- func (h *RequestHeader) CookieBytes(key []byte) []byte
- func (h *RequestHeader) CopyTo(dst *RequestHeader)
- func (h *RequestHeader) Del(key string)
- func (h *RequestHeader) DelAllCookies()
- func (h *RequestHeader) DelBytes(key []byte)
- func (h *RequestHeader) DelCookie(key string)
- func (h *RequestHeader) DelCookieBytes(key []byte)
- func (h *RequestHeader) DisableNormalizing()
- func (h *RequestHeader) HasAcceptEncoding(acceptEncoding string) bool
- func (h *RequestHeader) HasAcceptEncodingBytes(acceptEncoding []byte) bool
- func (h *RequestHeader) Header() []byte
- func (h *RequestHeader) Host() []byte
- func (h *RequestHeader) IsDelete() bool
- func (h *RequestHeader) IsGet() bool
- func (h *RequestHeader) IsHTTP11() bool
- func (h *RequestHeader) IsHead() bool
- func (h *RequestHeader) IsPost() bool
- func (h *RequestHeader) IsPut() bool
- func (h *RequestHeader) Len() int
- func (h *RequestHeader) Method() []byte
- func (h *RequestHeader) MultipartFormBoundary() []byte
- func (h *RequestHeader) Peek(key string) []byte
- func (h *RequestHeader) PeekBytes(key []byte) []byte
- func (h *RequestHeader) Read(r *bufio.Reader) error
- func (h *RequestHeader) Referer() []byte
- func (h *RequestHeader) RequestURI() []byte
- func (h *RequestHeader) Reset()
- func (h *RequestHeader) ResetConnectionClose()
- func (h *RequestHeader) Set(key, value string)
- func (h *RequestHeader) SetByteRange(startPos, endPos int)
- func (h *RequestHeader) SetBytesK(key []byte, value string)
- func (h *RequestHeader) SetBytesKV(key, value []byte)
- func (h *RequestHeader) SetBytesV(key string, value []byte)
- func (h *RequestHeader) SetCanonical(key, value []byte)
- func (h *RequestHeader) SetConnectionClose()
- func (h *RequestHeader) SetContentLength(contentLength int)
- func (h *RequestHeader) SetContentType(contentType string)
- func (h *RequestHeader) SetContentTypeBytes(contentType []byte)
- func (h *RequestHeader) SetCookie(key, value string)
- func (h *RequestHeader) SetCookieBytesK(key []byte, value string)
- func (h *RequestHeader) SetCookieBytesKV(key, value []byte)
- func (h *RequestHeader) SetHost(host string)
- func (h *RequestHeader) SetHostBytes(host []byte)
- func (h *RequestHeader) SetMethod(method string)
- func (h *RequestHeader) SetMethodBytes(method []byte)
- func (h *RequestHeader) SetMultipartFormBoundary(boundary string)
- func (h *RequestHeader) SetMultipartFormBoundaryBytes(boundary []byte)
- func (h *RequestHeader) SetReferer(referer string)
- func (h *RequestHeader) SetRefererBytes(referer []byte)
- func (h *RequestHeader) SetRequestURI(requestURI string)
- func (h *RequestHeader) SetRequestURIBytes(requestURI []byte)
- func (h *RequestHeader) SetUserAgent(userAgent string)
- func (h *RequestHeader) SetUserAgentBytes(userAgent []byte)
- func (h *RequestHeader) String() string
- func (h *RequestHeader) UserAgent() []byte
- func (h *RequestHeader) VisitAll(f func(key, value []byte))
- func (h *RequestHeader) VisitAllCookie(f func(key, value []byte))
- func (h *RequestHeader) Write(w *bufio.Writer) error
- func (h *RequestHeader) WriteTo(w io.Writer) (int64, error)
- type Response
- func (resp *Response) AppendBody(p []byte)
- func (resp *Response) AppendBodyString(s string)
- func (resp *Response) Body() []byte
- func (resp *Response) BodyGunzip() ([]byte, error)
- func (resp *Response) BodyInflate() ([]byte, error)
- func (resp *Response) BodyWriteTo(w io.Writer) error
- func (resp *Response) BodyWriter() io.Writer
- func (resp *Response) ConnectionClose() bool
- func (resp *Response) CopyTo(dst *Response)
- func (resp *Response) IsBodyStream() bool
- func (resp *Response) Read(r *bufio.Reader) error
- func (resp *Response) ReadLimitBody(r *bufio.Reader, maxBodySize int) error
- func (resp *Response) ReleaseBody(size int)
- func (resp *Response) Reset()
- func (resp *Response) ResetBody()
- func (resp *Response) SendFile(path string) error
- func (resp *Response) SetBody(body []byte)
- func (resp *Response) SetBodyStream(bodyStream io.Reader, bodySize int)
- func (resp *Response) SetBodyStreamWriter(sw StreamWriter)
- func (resp *Response) SetBodyString(body string)
- func (resp *Response) SetConnectionClose()
- func (resp *Response) SetStatusCode(statusCode int)
- func (resp *Response) StatusCode() int
- func (resp *Response) String() string
- func (resp *Response) SwapBody(body []byte) []byte
- func (resp *Response) Write(w *bufio.Writer) error
- func (resp *Response) WriteDeflate(w *bufio.Writer) error
- func (resp *Response) WriteDeflateLevel(w *bufio.Writer, level int) error
- func (resp *Response) WriteGzip(w *bufio.Writer) error
- func (resp *Response) WriteGzipLevel(w *bufio.Writer, level int) error
- func (resp *Response) WriteTo(w io.Writer) (int64, error)
- type ResponseHeader
- func (h *ResponseHeader) Add(key, value string)
- func (h *ResponseHeader) AddBytesK(key []byte, value string)
- func (h *ResponseHeader) AddBytesKV(key, value []byte)
- func (h *ResponseHeader) AddBytesV(key string, value []byte)
- func (h *ResponseHeader) AppendBytes(dst []byte) []byte
- func (h *ResponseHeader) ConnectionClose() bool
- func (h *ResponseHeader) ConnectionUpgrade() bool
- func (h *ResponseHeader) ContentLength() int
- func (h *ResponseHeader) ContentType() []byte
- func (h *ResponseHeader) Cookie(cookie *Cookie) bool
- func (h *ResponseHeader) CopyTo(dst *ResponseHeader)
- func (h *ResponseHeader) Del(key string)
- func (h *ResponseHeader) DelAllCookies()
- func (h *ResponseHeader) DelBytes(key []byte)
- func (h *ResponseHeader) DelClientCookie(key string)
- func (h *ResponseHeader) DelClientCookieBytes(key []byte)
- func (h *ResponseHeader) DelCookie(key string)
- func (h *ResponseHeader) DelCookieBytes(key []byte)
- func (h *ResponseHeader) DisableNormalizing()
- func (h *ResponseHeader) Header() []byte
- func (h *ResponseHeader) IsHTTP11() bool
- func (h *ResponseHeader) Len() int
- func (h *ResponseHeader) Peek(key string) []byte
- func (h *ResponseHeader) PeekBytes(key []byte) []byte
- func (h *ResponseHeader) Read(r *bufio.Reader) error
- func (h *ResponseHeader) Reset()
- func (h *ResponseHeader) ResetConnectionClose()
- func (h *ResponseHeader) Server() []byte
- func (h *ResponseHeader) Set(key, value string)
- func (h *ResponseHeader) SetBytesK(key []byte, value string)
- func (h *ResponseHeader) SetBytesKV(key, value []byte)
- func (h *ResponseHeader) SetBytesV(key string, value []byte)
- func (h *ResponseHeader) SetCanonical(key, value []byte)
- func (h *ResponseHeader) SetConnectionClose()
- func (h *ResponseHeader) SetContentLength(contentLength int)
- func (h *ResponseHeader) SetContentRange(startPos, endPos, contentLength int)
- func (h *ResponseHeader) SetContentType(contentType string)
- func (h *ResponseHeader) SetContentTypeBytes(contentType []byte)
- func (h *ResponseHeader) SetCookie(cookie *Cookie)
- func (h *ResponseHeader) SetLastModified(t time.Time)
- func (h *ResponseHeader) SetServer(server string)
- func (h *ResponseHeader) SetServerBytes(server []byte)
- func (h *ResponseHeader) SetStatusCode(statusCode int)
- func (h *ResponseHeader) StatusCode() int
- func (h *ResponseHeader) String() string
- func (h *ResponseHeader) VisitAll(f func(key, value []byte))
- func (h *ResponseHeader) VisitAllCookie(f func(key, value []byte))
- func (h *ResponseHeader) Write(w *bufio.Writer) error
- func (h *ResponseHeader) WriteTo(w io.Writer) (int64, error)
- type Server
- func (s *Server) ListenAndServe(addr string) error
- func (s *Server) ListenAndServeTLS(addr, certFile, keyFile string) error
- func (s *Server) ListenAndServeTLSEmbed(addr string, certData, keyData []byte) error
- func (s *Server) ListenAndServeUNIX(addr string, mode os.FileMode) error
- func (s *Server) Serve(ln net.Listener) error
- func (s *Server) ServeConn(c net.Conn) error
- func (s *Server) ServeTLS(ln net.Listener, certFile, keyFile string) error
- func (s *Server) ServeTLSEmbed(ln net.Listener, certData, keyData []byte) error
- type StreamWriter
- type URI
- func (u *URI) AppendBytes(dst []byte) []byte
- func (u *URI) CopyTo(dst *URI)
- func (u *URI) Fragment() []byte
- func (u *URI) FullURI() []byte
- func (u *URI) Host() []byte
- func (u *URI) LastPathSegment() []byte
- func (u *URI) Parse(host, uri []byte)
- func (u *URI) Path() []byte
- func (u *URI) PathOriginal() []byte
- func (u *URI) QueryArgs() *Args
- func (u *URI) QueryString() []byte
- func (u *URI) RequestURI() []byte
- func (u *URI) Reset()
- func (u *URI) Scheme() []byte
- func (u *URI) SetFragment(fragment string)
- func (u *URI) SetFragmentBytes(fragment []byte)
- func (u *URI) SetHost(host string)
- func (u *URI) SetHostBytes(host []byte)
- func (u *URI) SetPath(path string)
- func (u *URI) SetPathBytes(path []byte)
- func (u *URI) SetQueryString(queryString string)
- func (u *URI) SetQueryStringBytes(queryString []byte)
- func (u *URI) SetScheme(scheme string)
- func (u *URI) SetSchemeBytes(scheme []byte)
- func (u *URI) String() string
- func (u *URI) Update(newURI string)
- func (u *URI) UpdateBytes(newURI []byte)
- func (u *URI) WriteTo(w io.Writer) (int64, error)
Constants ¶
const ( CompressNoCompression = flate.NoCompression CompressBestSpeed = flate.BestSpeed CompressBestCompression = flate.BestCompression CompressDefaultCompression = 6 // flate.DefaultCompression CompressHuffmanOnly = -2 // flate.HuffmanOnly )
const ( StatusContinue = 100 // RFC 7231, 6.2.1 客户端应当继续发送请求,这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。服务器必须在请求完成后向客户端发送一个最终响应。 StatusSwitchingProtocols = 101 // RFC 7231, 6.2.2 服务器已经理解了客户端的请求,并将通过Upgrade 消息头通知客户端采用不同的协议来完成这个请求。在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。 只有在切换新的协议更有好处的时候才应该采取类似措施。例如,切换到新的HTTP 版本比旧版本更有优势,或者切换到一个实时且同步的协议以传送利用此类特性的资源。 StatusProcessing = 102 // RFC 2518, 10.1 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。 //2xx 请求成功处理 StatusOK = 200 // RFC 7231, 6.3.1 请求已成功,请求所希望的响应头或数据体将随此响应返回。 StatusCreated = 201 // RFC 7231, 6.3.2 请求成功,并相应创建新资源,且其 URI 已经随Location 头信息返回 StatusAccepted = 202 // RFC 7231, 6.3.3 请求已接受,尚未处理(允许服务器接受其他过程的请求,而不必让客户端一直保持与服务器的连接直到批处理操作全部完成) StatusNonAuthoritativeInfo = 203 // RFC 7231, 6.3.4 非授权的信息,返回内容为第三方源 StatusNoContent = 204 // RFC 7231, 6.3.5 未返回内容 StatusResetContent = 205 // RFC 7231, 6.3.6 未返回内容,要求请求方重置文档视图 StatusPartialContent = 206 // RFC 7233, 4.1 断点续传等使用,返回指定片断的资源 StatusMultiStatus = 207 // RFC 4918, 11.1 WebDAV(RFC 2518)扩展的状态码,代表之后的消息体是一个XML消息,并可能依照之前子请求数量的不同,包含一系列独立的响应代码 StatusAlreadyReported = 208 // RFC 5842, 7.1 StatusIMUsed = 209 // RFC 3229, 10.4.1 //3xx (请求被重定向)表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。 StatusMultipleChoices = 300 // RFC 7231, 6.4.1 被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息。用户或浏览器能够自行选择一个首选的地址进行重定向。 StatusMovedPermanently = 301 // RFC 7231, 6.4.2 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一 StatusFound = 302 // RFC 7231, 6.4.3 请求的资源现在临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。 StatusSeeOther = 303 // RFC 7231, 6.4.4 对应当前请求的响应可以在另一个 URI 上被找到,而且客户端应当采用 GET 的方式访问那个资源。 StatusNotModified = 304 // RFC 7232, 4.1 如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304响应禁止包含消息体,因此始终以消息头后的第一个空行结尾。 StatusUseProxy = 305 // RFC 7231, 6.4.5 被请求的资源必须通过指定的代理才能被访问。Location 域中将给出指定的代理所在的 URI 信息,接收者需要重复发送一个单独的请求,通过这个代理才能访问相应资源。只有原始服务器才能建立305响应。 StatusTemporaryRedirect = 307 // RFC 7231, 6.4.7 请求的资源现在临时从不同的URI 响应请求。请求的资源现在临时从不同的URI 响应请求。 StatusPermanentRedirect = 308 // RFC 7538, 3 请求的资源已永久移动到新位置。 //4xx (请求错误)这些状态代码表示请求可能出错,妨碍了服务器的处理。 StatusBadRequest = 400 // RFC 7231, 6.5.1 (错误请求)服务器不理解请求的参数。 StatusPaymentRequired = 402 // RFC 7231, 6.5.2 该状态码是为了将来可能的需求而预留的。 StatusForbidden = 403 // RFC 7231, 6.5.3 (禁止) 服务器已经理解请求,但是拒绝执行它。 StatusNotFound = 404 // RFC 7231, 6.5.4 请求失败,请求所希望得到的资源未被在服务器上发现。 StatusMethodNotAllowed = 405 // RFC 7231, 6.5.5 请求行中指定的请求方法不能被用于请求相应的资源。该响应必须返回一个Allow 头信息用以表示出当前资源能够接受的请求方法的列表。鉴于 PUT,DELETE 方法会对服务器上的资源进行写操作,因而绝大部分的网页服务器都不支持或者在默认配置下不允许上述请求方法,对于此类请求均会返回405错误。 StatusNotAcceptable = 406 // RFC 7231, 6.5.6 请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体。 StatusProxyAuthRequired = 407 // RFC 7235, 3.2 与401响应类似,只不过客户端必须在代理服务器上进行身份验证。 StatusRequestTimeout = 408 // RFC 7231, 6.5.7 请求超时。客户端没有在服务器预备等待的时间内完成一个请求的发送。客户端可以随时再次提交这一请求而无需进行任何更改。 StatusConflict = 409 // RFC 7231, 6.5.8 由于和被请求的资源的当前状态之间存在冲突,请求无法完成。这个代码只允许用在这样的情况下才能被使用:用户被认为能够解决冲突,并且会重新提交新的请求。该响应应当包含足够的信息以便用户发现冲突的源头。 冲突通常发生于对 PUT 请求的处理中。例如,在采用版本检查的环境下,某次 PUT 提交的对特定资源的修改请求所附带的版本信息与之前的某个(第三方)请求向冲突,那么此时服务器就应该返回一个409错误,告知用户请求无法完成。此时,响应实体中很可能会包含两个冲突版本之间的差异比较,以便用户重新提交归并以后的新版本。 StatusGone = 410 // RFC 7231, 6.5.9 被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址。这样的状况应当被认为是永久性的。 StatusLengthRequired = 411 // RFC 7231, 6.5.10 服务器拒绝在没有定义 Content-Length 头的情况下接受请求。 StatusPreconditionFailed = 412 // RFC 7232, 4.2 服务器在验证在请求的头字段中给出先决条件时,没能满足其中的一个或多个。 StatusRequestEntityTooLarge = 413 // RFC 7231, 6.5.11 服务器拒绝处理当前请求,因为该请求提交的实体数据大小超过了服务器愿意或者能够处理的范围。 StatusRequestURITooLong = 414 // RFC 7231, 6.5.12 请求的URI长度超过了服务器能够解释的长度,因此服务器拒绝对该请求提供服务。 StatusUnsupportedMediaType = 415 // RFC 7231, 6.5.13 对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝。 StatusRequestedRangeNotSatisfiable = 416 // RFC 7232, 4.4 如果请求中包含了Range请求头,并且Range中指定的任何数据范围都与当前资源的可用范围不重合,同时请求中又没有定义If-Range请求头,那么服务器就应当返回416状态码。 StatusExpectationFailed = 417 // RFC 7231, 6.5.14 在请求头Expect中指定的预期内容无法被服务器满足,或者这个服务器是一个代理服务器,它有明显的证据证明在当前路由的下一个节点上,Expect的内容无法被满足。 StatusTeapot = 418 // RFC 7168, 2.3.3 愚人节玩笑 StatusIPTooManyConnection = 421 // 从当前客户端所在的IP地址到服务器的连接数超过了服务器许可的最大范围。 StatusUnprocessableEntity = 422 // RFC 4918, 11.2 请求格式正确,但是由于含有语义错误,无法响应。 StatusLocked = 423 // RFC 4918, 11.3 当前资源被锁定。(RFC 4918 WebDAV) StatusFailedDependency = 424 // RFC 4918, 11.4 由于之前的某个请求发生的错误,导致当前请求失败,例如 PROPPATCH。 StatusUpgradeRequired = 426 // RFC 7231, 6.5.15 客户端应当切换到TLS/1.0。(RFC 2817) StatusPreconditionRequired = 428 // RFC 6585, 3 要求先决条件 StatusTooManyRequests = 429 // RFC 6585, 4 太多请求 StatusRequestHeaderFieldsTooLarge = 431 // RFC 6585, 5 某些情况下,客户端发送HTTP请求头会变得很大,那么服务器可发送431来指明该问题。 //5xx (服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。 StatusInternalServerError = 500 // RFC 7231, 6.6.1 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。 StatusNotImplemented = 501 // RFC 7231, 6.6.2 服务器不支持当前请求所需要的某个功能。 StatusBadGateway = 502 // RFC 7231, 6.6.3 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。 StatusGatewayTimeout = 504 // RFC 7231, 6.6.5 作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应。 StatusHTTPVersionNotSupported = 505 // RFC 7231, 6.6.6 服务器不支持,或者拒绝支持在请求中使用的 HTTP 版本。 StatusVariantAlsoNegotiates = 506 // RFC 2295, 8.1 由《透明内容协商协议》(RFC 2295)扩展,是因为服务器没有正确配置:被请求的协商变元资源被配置为在透明内容协商中使用自己,因此在一个协商处理中不是一个合适的重点。 StatusInsufficientStorage = 507 // RFC 4918, 11.5 服务器无法存储完成请求所必须的内容。这个状况被认为是临时的。WebDAV (RFC 4918) StatusLoopDetected = 508 // RFC 5842, 7.2 请求处理死循环 StatusNotExtended = 510 // RFC 2774, 7 获取资源所需要的策略并没有没满足。(RFC 2774) StatusNetworkAuthenticationRequired = 511 // RFC 6585, 6 要求网络认证.大量的公用 Wifi 服务要求你必须接受一些协议或者必须登录后才能使用,这是通过拦截HTTP流量实现的。当用户试图访问网络返回一个重定向和登录,这很讨厌,但是实际情况就是这样的。 )
const DefaultConcurrency = 256 * 1024 //略少
一个server并发数
const DefaultMaxRequestBodySize = 4 * 1024 * 1024 // 4M
DefaultMaxRequestBodySize is the maximum request body size the server reads by default.
See Server.MaxRequestBodySize for details.
Variables ¶
var ( // 设置一个过去的时间,让其过期被移除 CookieExpireDelete = time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC) // 不限时,默认 CookieExpireUnlimited = zeroTime )
var ( ErrPerIPConnLimit = errors.New("too many connections per ip") ErrConcurrencyLimit = errors.New("cannot serve the connection because Server.Concurrency concurrent connections are served") ErrKeepaliveTimeout = errors.New("exceeded MaxKeepaliveDuration") )
var ErrBodyTooLarge = errors.New("body size exceeds the given limit")
var ErrMissingFile = errors.New("there is no uploaded file associated with the given key")
var (
ErrNoArgValue = errors.New("no Arg value for the given key")
)
var ErrNoMultipartForm = errors.New("request has no multipart/form-data Content-Type")
--- MultipartForm
Functions ¶
func AcquireByteBuffer ¶
func AcquireByteBuffer() *bytebufferpool.ByteBuffer
func AppendDeflateBytes ¶
func AppendDeflateBytesLevel ¶
将p deflate到w中 level: * CompressNoCompression * CompressBestSpeed * CompressBestCompression * CompressDefaultCompression * CompressHuffmanOnly
func AppendGunzipBytes ¶
func AppendGzipBytes ¶
func AppendGzipBytesLevel ¶
将p gzip到w中 level: * CompressNoCompression * CompressBestSpeed * CompressBestCompression * CompressDefaultCompression * CompressHuffmanOnly
func AppendHTTPDate ¶
HTTP-compliant (RFC1123) representation of date windows amd64 BenchmarkAppendHTTPDate-8 20000000 101 ns/op
func AppendInflateBytes ¶
将src inflate到 dst中
func AppendNormalizedHeaderKey ¶
将key格式化(首字母大写)附加到dst上
func AppendUint ¶
将int转成[]byte-int:最大20位 循环判断传入值:
1.>=10 将个位数转成ascii码,存入临时缓存buf中 2.最后一位,也保存进缓存buf中
将缓存附加到dst后
func CoarseTimeNow ¶
CoarseTimeNow returns the current time truncated to the nearest second.
This is a faster alternative to time.Now().
func ListenAndServe ¶
func ListenAndServe(addr string, handler RequestHandler) error
监听addr,提供http服务
func ListenAndServeTLS ¶
func ListenAndServeTLS(addr, certFile, keyFile string, handler RequestHandler) error
func ListenAndServeTLSEmbed ¶
func ListenAndServeTLSEmbed(addr string, certData, keyData []byte, handler RequestHandler) error
func ListenAndServeUNIX ¶
func ListenAndServeUNIX(addr string, mode os.FileMode, handler RequestHandler) error
监听addr,提供http服务
func NewStreamReader ¶
func NewStreamReader(sw StreamWriter) io.ReadCloser
流读取器-协程异步方式 返回一个reader,用于重放sw产生的数据 这个reader有可能传到Response.SetBodyStream 返回reader中,当所有请求的数据被读完,须调用Close;否则goroutine有可能泄漏
func ParseUfloat ¶
将[]byte转为float64,粗略版 1.空值判断 2.遍历:
2.1.0-9, 按10进制转成float64 2.2.非0-9: 2.2.1. 若为'.',若重复出现,返回错误;否则加标志-后续小数值控制 2.2.2. 若为'e','E',判断若无后续字符,报错;否则,后续字串转10进制,用于前面值指数运算
粗略定为最长19,超过即为不支持的数据
func ReleaseByteBuffer ¶
func ReleaseByteBuffer(b *bytebufferpool.ByteBuffer)
ByteBuffer.B在此之后,不可被引用,否则数据竞争
func ReleaseCookie ¶
func ReleaseCookie(c *Cookie)
func ReleaseURI ¶
func ReleaseURI(u *URI)
func SaveMultipartFile ¶
func SaveMultipartFile(fh *multipart.FileHeader, path string) error
永久保存上传文件 成 新指定文件
func Serve ¶
func Serve(ln net.Listener, handler RequestHandler) error
为ln的连接,提供http服务 Serve阻塞,直到ln返回错误
func ServeConn ¶
func ServeConn(c net.Conn, handler RequestHandler) error
为传入的c,提供http服务 服务操作 请求成功,返回nil,否则返回error c须立即将响应数据传到Write中,否则请求处理,会卡住 c会在返回前Close
func ServeFile ¶
func ServeFile(ctx *RequestCtx, path string)
func ServeFileBytes ¶
func ServeFileBytes(ctx *RequestCtx, path []byte)
func ServeTLS ¶
func ServeTLS(ln net.Listener, certFile, keyFile string, handler RequestHandler) error
为ln的连接,提供https服务 Serve阻塞,直到ln返回错误
func ServeTLSEmbed ¶
func ServeTLSEmbed(ln net.Listener, certData, keyData []byte, handler RequestHandler) error
为ln的连接,提供https服务 Serve阻塞,直到ln返回错误
func StatusMessage ¶
return HTTP status message for the given status code
func WriteDeflateLevel ¶
将p deflate到w中 level: * CompressNoCompression * CompressBestSpeed * CompressBestCompression * CompressDefaultCompression * CompressHuffmanOnly
func WriteGzipLevel ¶
将p gzip到w中 level: * CompressNoCompression * CompressBestSpeed * CompressBestCompression * CompressDefaultCompression * CompressHuffmanOnly
Types ¶
type Args ¶
type Args struct {
// contains filtered or unexported fields
}
表示query参数 不支持并发使用 不可直接复制
func (*Args) AaddBytesKV ¶
func (*Args) GetUfloatOrZero ¶
func (*Args) GetUintOrZero ¶
func (*Args) PeekMultiBytes ¶
func (*Args) SetBytesKV ¶
func (*Args) SetUintBytes ¶
type Cookie ¶
type Cookie struct {
// contains filtered or unexported fields
}
用于响应cookie相关处理 不要直接保存,创建并CopyTo 不可用于并发处理
func AcquireCookie ¶
func AcquireCookie() *Cookie
func (*Cookie) AppendBytes ¶
用于Response Set-Cookie: user_info=currentNewsGuid22248=9d565bae-2f9b-449d-9456-dc71c1582b9b; expires=Sun, 24-Jun-2018 09:53:08 GMT; path=/ key : user_info value : currentNewsGuid22248=9d565bae-2f9b-449d-9456-dc71c1582b9b expires : Sun, 24-Jun-2018 09:53:08 GMT path : /
func (*Cookie) SetDomainBytes ¶
func (*Cookie) SetHTTPOnly ¶
func (*Cookie) SetKeyBytes ¶
func (*Cookie) SetPathBytes ¶
func (*Cookie) SetValueBytes ¶
type ErrSmallBuffer ¶
type ErrSmallBuffer struct {
// contains filtered or unexported fields
}
提供的buffer太小 从Server或Client得到的ReadBufferSize,要减掉这些错误值
type HijackHandler ¶
=================================== 劫持处理接口,在正常Server请求接口处理完成后,执行该接口
type Request ¶
type Request struct {
// 禁止直接复制值,正确做法:新建并CopyTo
Header RequestHeader
// contains filtered or unexported fields
}
禁止直接复制值,正确做法:新建并CopyTo 不可用于并发
func (*Request) AppendBodyString ¶
func (*Request) BodyGunzip ¶
--- BodyGunzip 用于读取那些,有设置'Content-Encoding: gzip'头的body 用Body读取gzipped的数据
func (*Request) BodyInflate ¶
--- BodyInflate 用于读取那些,有设置'Content-Encoding: defalte'压缩的body
func (*Request) BodyWriteTo ¶
--- BodyWriteTo 1.bodyStream流 2.仅MultipartForm
func (*Request) BodyWriter ¶
func (*Request) ConnectionClose ¶
func (*Request) ContinueReadBody ¶
当MayContinue条件成立,调用者须处理以下任意一条: - 1.发送StatusExpectationFailed响应 - 2.在ContinueReadBody之前,发送StatusContinue响应 - 3.关闭连接 ps: 在读取之前,连接关闭时,返回io.EOF
func (*Request) IsBodyStream ¶
--- IsBodyStream 确认body是通过bodyStream获取的源数据
func (*Request) MayContinue ¶
func (*Request) MultipartForm ¶
解析multipartForm并返回 非multipartForm,返回相应错误 * RemoveMultipartFormFiles须在返回multipartFrom之后
func (*Request) Read ¶
--- Req.Read 获取请求数据(包括body) * RemoveMultipartFormFiles 或 Reset 须在之后调用,以便删除上传的临时文件 当MayContinue条件成立,调用者须处理以下任意一条: - 1.发送StatusExpectationFailed响应 - 2.在ContinueReadBody之前,发送StatusContinue响应 - 3.关闭连接 ps: 在读取之前,连接关闭时,返回io.EOF
func (*Request) ReadLimitBody ¶
按限定量,读取body数据 当设置了maxBodySize >0,而实际body数据超过该值,返回ErrBodyTooLarge * RemoveMultipartFormFiles 或 Reset 须在之后调用,以便删除上传的临时文件 当MayContinue条件成立,调用者须处理以下任意一条: - 1.发送StatusExpectationFailed响应 - 2.在ContinueReadBody之前,发送StatusContinue响应 - 3.关闭连接 ps: 在读取之前,连接关闭时,返回io.EOF
func (*Request) ReleaseBody ¶
func (*Request) RemoveMultipartFormFiles ¶
func (req *Request) RemoveMultipartFormFiles()
--- Req.RemoveMultipartFormFiles 移除请求中的临时文件
func (*Request) RequestURI ¶
func (*Request) SetBodyStream ¶
--- SetBodyStream 触发关闭:Body,BodyWriteTo,AppendBodyString,SetBodyStream,ResetBody,ReleaseBody,SwapBody,writeBodyStream * bodySize>=0,则bodyStream需提供相应字节 * bodySize<0,则读取直到io.EOF ps: GET,HEAD没有body
func (*Request) SetBodyStreamWriter ¶
func (req *Request) SetBodyStreamWriter(sw StreamWriter)
--- SetBodyStreamWriter 情景: * body太大,超过10M * body是从外部慢源取流数据 * body需要分片的 - `http client push` `chunked transfer-encoding`
func (*Request) SetBodyString ¶
func (*Request) SetConnectionClose ¶
func (req *Request) SetConnectionClose()
func (*Request) SetHostBytes ¶
func (*Request) SetRequestURI ¶
--- Req.RequestURI
func (*Request) SetRequestURIBytes ¶
type RequestCtx ¶
type RequestCtx struct {
// 到来的请求
// 禁止值拷贝,使用指针
Request Request
// 下发的响应内容
// 禁止值拷贝,使用指针
Response Response
// contains filtered or unexported fields
}
=================================== RequestCtx 包含请求,并管理响应 禁止拷贝 RequestHandler应避免在返回后,继续使用RequestCtx内成员 如果在返回后,确实要用引用RequestCtx内成员,则RequestHandler在返回前,必须调用ctx.TimeoutError()
多协程并发读或改RequestCtx是不安全的,TimeoutError*是惟一可并发时使用
func (*RequestCtx) ConnID ¶
func (ctx *RequestCtx) ConnID() uint64
func (*RequestCtx) ConnTime ¶
func (ctx *RequestCtx) ConnTime() time.Time
func (*RequestCtx) FormFile ¶
func (ctx *RequestCtx) FormFile(key string) (*multipart.FileHeader, error)
按key返回上传的文件 所有上传的临时文件,在RequestHandler返回后,删除;直接移动或复制文件到新地方,来保存之 SaveMultipartFile用于永久保存上传的文件
func (*RequestCtx) FormValue ¶
func (ctx *RequestCtx) FormValue(key string) []byte
按key,在Query、post、put中查找值 包含该值的细化方法: * QueryArgs - query string * PostArgs - POST/PUT body * MultipartForm - multipart form * FormFile - uploaded file
func (*RequestCtx) Hijack ¶
func (ctx *RequestCtx) Hijack(handler HijackHandler)
----------------------------------- 注册劫持接口 触发时机: RequestHandler执行完,response发送前 劫持处理完,连接将自动关闭 不触发:
当'Connection: close'头在request 或response已存在 发送响应内容时出错
Server停止处理hijack连接 Server限制(最大并发数、读超时时间、写超时时间)将不生效
该接口须不引用ctx成员 任意的'Connection: Upgrade' 协议可能应用该接口,.e.g:
- WebSocket 'GET /ws HTTP/1.1\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-Websocket-Key: A3xNe7sEB9HixkmBhVrYaA==\r\nSec-Websocket-Version: 13' 'HTTP/1.1 101 Switching Protocols\r\nConnection: UpgradeSec-Websocket-Accept: ksu0wXWG+YmkVx+KQR2agP0cQn4=\r\nUpgrade: websocket'
- HTTP/2.0
func (*RequestCtx) Host ¶
func (ctx *RequestCtx) Host() []byte
func (*RequestCtx) IfModifiedSince ¶
func (ctx *RequestCtx) IfModifiedSince(lastModified time.Time) bool
检测客户端缓存文件,与服务端该文件的最后修改时间,相应处理
If-Modified-Since是标准的HTTP请求头标签,在发送HTTP请求时,把浏览器端缓存页面的最后修改时间一起发到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行比较。 如果时间一致,那么返回HTTP状态码304(不返回文件内容),客户端接到之后,就直接把本地缓存文件显示到浏览器中。 如果时间不一致,就返回HTTP状态码200和新的文件内容,客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示到浏览器中。
func (*RequestCtx) Init ¶
func (ctx *RequestCtx) Init(req *Request, remoteAddr net.Addr, logger Logger)
初始化ctx,用于传到RequestHandler remoteAddr和logger可选,用于RequestCtx.logger 该函数用于自定Server接口
func (*RequestCtx) Init2 ¶
func (ctx *RequestCtx) Init2(conn net.Conn, logger Logger, reduceMemoryUsage bool)
初始化ctx,用于传到RequestHandler remoteAddr和logger可选,用于RequestCtx.logger 该函数用于自定Server接口 See https://github.com/valyala/httpteleport for details. todo??
func (*RequestCtx) IsBodyStream ¶
func (ctx *RequestCtx) IsBodyStream() bool
func (*RequestCtx) IsDelete ¶
func (ctx *RequestCtx) IsDelete() bool
func (*RequestCtx) IsGet ¶
func (ctx *RequestCtx) IsGet() bool
func (*RequestCtx) IsHead ¶
func (ctx *RequestCtx) IsHead() bool
func (*RequestCtx) IsPost ¶
func (ctx *RequestCtx) IsPost() bool
func (*RequestCtx) IsPut ¶
func (ctx *RequestCtx) IsPut() bool
func (*RequestCtx) IsTLS ¶
func (ctx *RequestCtx) IsTLS() bool
tls.Conn is an encrypted connection (aka SSL, HTTPS).
func (*RequestCtx) LastTimeoutErrorResponse ¶
func (ctx *RequestCtx) LastTimeoutErrorResponse() *Response
返回TimeoutError*设置的超时响应 用于用户自定义接口
func (*RequestCtx) LocalIP ¶
func (ctx *RequestCtx) LocalIP() net.IP
func (*RequestCtx) Logger ¶
func (ctx *RequestCtx) Logger() Logger
logger用于在RequestHandler记录 请求的任意信息 所有记录的信息包含:request id, request duration, local address, remote address, request method and request url 可重复利用返回的logger来记录当次请求信息 在RequestHandler返回前有效
func (*RequestCtx) Method ¶
func (ctx *RequestCtx) Method() []byte
func (*RequestCtx) MultipartForm ¶
func (ctx *RequestCtx) MultipartForm() (*multipart.Form, error)
requests's multipart form. 若不包启'multipart/form-data'头,返回ErrNoMultipartForm 所有上传的临时文件,在RequestHandler返回后,删除;直接移动或复制文件到新地方,来保存之 SaveMultipartFile用于永久保存上传的文件
func (*RequestCtx) Path ¶
func (ctx *RequestCtx) Path() []byte
func (*RequestCtx) PostArgs ¶
func (ctx *RequestCtx) PostArgs() *Args
func (*RequestCtx) QueryArgs ¶
func (ctx *RequestCtx) QueryArgs() *Args
func (*RequestCtx) Redirect ¶
func (ctx *RequestCtx) Redirect(uri string, statusCode int)
Redirect 返回'Location: uri'头和状态码 状态码:
301 被请求的资源已永久移动到新位置 302 请求的资源现在临时从不同的 URI 响应请求 303 对应当前请求的响应可以在另一个 URI 上被找到,而且客户端应当采用 GET 的方式访问那个资源。 307 请求的资源现在临时从不同的URI 响应请求。 其它状态码,将转为302
跳转uri有可能与现uri是相对或绝对关系
func (*RequestCtx) RedirectBytes ¶
func (ctx *RequestCtx) RedirectBytes(uri []byte, statusCode int)
RedirectBytes 返回'Location: uri'头和状态码 状态码:
301 被请求的资源已永久移动到新位置 302 请求的资源现在临时从不同的 URI 响应请求 303 对应当前请求的响应可以在另一个 URI 上被找到,而且客户端应当采用 GET 的方式访问那个资源。 307 请求的资源现在临时从不同的URI 响应请求。 其它状态码,将转为302
跳转uri有可能与现uri是相对或绝对关系
func (*RequestCtx) RemoteAddr ¶
func (ctx *RequestCtx) RemoteAddr() net.Addr
func (*RequestCtx) RequestURI ¶
func (ctx *RequestCtx) RequestURI() []byte
i.e. 仅URI部份,不含scheme,host
func (*RequestCtx) SendFile ¶
func (ctx *RequestCtx) SendFile(path string)
将路径所指的本地文件,当作响应内容
是ServeFile(ctx, path)的快捷方式
参考: ServeFile, FSHandler, FS
func (*RequestCtx) SendFileBytes ¶
func (ctx *RequestCtx) SendFileBytes(path []byte)
将路径所指本地文件,当作响应内容
是ServeFileBytes(ctx, path)的快捷方式
参考: ServeFileBytes, FSHandler, FS
func (*RequestCtx) SetBodyStream ¶
func (ctx *RequestCtx) SetBodyStream(bodyStream io.Reader, bodySize int)
触发关闭:Body,BodyWriteTo,AppendBodyString,SetBodyStream,ResetBody,ReleaseBody,SwapBody,writeBodyStream * bodySize>=0,则bodyStream需提供相应字节 * bodySize<0,则读取直到io.EOF ps: GET,HEAD没有body
func (*RequestCtx) SetBodyStreamWriter ¶
func (ctx *RequestCtx) SetBodyStreamWriter(sw StreamWriter)
情景: * body太大,超过10M * body是从外部慢源取流数据 * body需要分片的 - `http client push` `chunked transfer-encoding`
func (*RequestCtx) SetBodyString ¶
func (ctx *RequestCtx) SetBodyString(body string)
func (*RequestCtx) SetConnectionClose ¶
func (ctx *RequestCtx) SetConnectionClose()
响应头:'Connection: close' 当RequestHandler处理完闭,关闭连接
func (*RequestCtx) SetContentType ¶
func (ctx *RequestCtx) SetContentType(contentType string)
设置:响应类型
func (*RequestCtx) SetContentTypeBytes ¶
func (ctx *RequestCtx) SetContentTypeBytes(contentType []byte)
复制contentType,函数返回后,可直接处理之
func (*RequestCtx) SetStatusCode ¶
func (ctx *RequestCtx) SetStatusCode(statusCode int)
func (*RequestCtx) SetUserValue ¶
func (ctx *RequestCtx) SetUserValue(key string, value interface{})
控key存储任意value value可能包含UserValue*-嵌套 请求流程中,函数间传任意值 当从RequestHandler返回,所有值被移除;另外,所有value会尝试io.Closer关闭操作
func (*RequestCtx) SetUserValueBytes ¶
func (ctx *RequestCtx) SetUserValueBytes(key []byte, value interface{})
控key存储任意value value可能包含UserValue*-嵌套 请求流程中,函数间传任意值 当从RequestHandler返回,所有值被移除;另外,所有value会尝试io.Closer关闭操作
func (*RequestCtx) String ¶
func (ctx *RequestCtx) String() string
---------------------------------
func (*RequestCtx) Success ¶
func (ctx *RequestCtx) Success(contentType string, body []byte)
func (*RequestCtx) SuccessString ¶
func (ctx *RequestCtx) SuccessString(contentType, body string)
func (*RequestCtx) TLSConnectionState ¶
func (ctx *RequestCtx) TLSConnectionState() *tls.ConnectionState
TLS connection state. 非tls,返回nil 返回值,可用于确定tls版本,客户端证书
func (*RequestCtx) Time ¶
func (ctx *RequestCtx) Time() time.Time
func (*RequestCtx) TimeoutError ¶
func (ctx *RequestCtx) TimeoutError(msg string)
设置超时响应码和响应内容 所有在该方法之后的响应变更,都被忽略 若在其它协程中,有涉及到ctx的成员,TimeoutError须在RequestHandler返回前调用 不鼓励使用该方法,最好直接在挂起的协程中,消除对ctx的引用
func (*RequestCtx) TimeoutErrorWithCode ¶
func (ctx *RequestCtx) TimeoutErrorWithCode(msg string, statusCode int)
设置超时响应码和响应内容 所有在该方法之后的响应变更,都被忽略 若在其它协程中,有涉及到ctx的成员,TimeoutErrorWithCode须在RequestHandler返回前调用 不鼓励使用该方法,最好直接在挂起的协程中,消除对ctx的引用
func (*RequestCtx) TimeoutErrorWithResponse ¶
func (ctx *RequestCtx) TimeoutErrorWithResponse(resp *Response)
将ctx标记为超时,发送给定的响应 所有在该方法之后的响应变更,都被忽略 若在其它协程中,有涉及到ctx的成员,TimeoutErrorWithResponse须在RequestHandler返回前调用 不鼓励使用该方法,最好直接在挂起的协程中,消除对ctx的引用
func (*RequestCtx) UserValue ¶
func (ctx *RequestCtx) UserValue(key string) interface{}
func (*RequestCtx) UserValueBytes ¶
func (ctx *RequestCtx) UserValueBytes(key []byte) interface{}
func (*RequestCtx) VisitUserValues ¶
func (ctx *RequestCtx) VisitUserValues(visitor func([]byte, interface{}))
func (*RequestCtx) WriteString ¶
func (ctx *RequestCtx) WriteString(s string) (int, error)
type RequestHandler ¶
type RequestHandler func(ctx *RequestCtx)
请求处理接口 RequestHandler必须能处理请求 当返回后,有引用ctx内成员,须在返回前,调用ctx.TimeoutError() 当有响应时间限制,可将其封装在TimeoutHandler
func CompressHandler ¶
func CompressHandler(h RequestHandler) RequestHandler
有'gzip' or 'deflate' 'Accept-Encoding'头时,将压缩h生成的响应内容
func CompressHandlerLevel ¶
func CompressHandlerLevel(h RequestHandler, level int) RequestHandler
'gzip' or 'deflate' 'Accept-Encoding'头
level: * CompressNoCompression * CompressBestSpeed * CompressBestCompression * CompressDefaultCompression * CompressHuffmanOnly
func TimeoutHandler ¶
func TimeoutHandler(h RequestHandler, timeout time.Duration, msg string) RequestHandler
生成定时请求处理器-当h处理超时时,将StatusRequestTimeout发给客户端 生成的处理器,在并发满载时,会响应StatusTooManyRequests
type RequestHeader ¶
type RequestHeader struct {
// contains filtered or unexported fields
}
禁止直接复制值,正确做法:新建并CopyTo 不可用于并发 -- 接口:Add(Byte[K][V]),Set(Byte[K][V]),Del(Bytes),VisitAll,Write(To),CopyTo,Peek(Bytes),Read(接入数据),Reset,String,Header
func (*RequestHeader) Add ¶
func (h *RequestHeader) Add(key, value string)
--- Req.Add Add操作,有可能会有重复值
func (*RequestHeader) AddBytesK ¶
func (h *RequestHeader) AddBytesK(key []byte, value string)
func (*RequestHeader) AddBytesKV ¶
func (h *RequestHeader) AddBytesKV(key, value []byte)
func (*RequestHeader) AddBytesV ¶
func (h *RequestHeader) AddBytesV(key string, value []byte)
func (*RequestHeader) AppendBytes ¶
func (h *RequestHeader) AppendBytes(dst []byte) []byte
整理头部信息到buf中 1.首行-'GET /foo/bar/baz.php?q=xx#ffdd HTTP/1.1\r\n' 2.判定头部-非空&&未解析,直接返回之-无需paresRawHeader 3.UserAgent 4.Host 5.ContentType:
5.1.有body时,未指定,默认为post; 设置ContentLength 5.2.未指定, 不处理
6.其它h.h中设置的头信息 7.Cookie 8.ConnectionClose 9.\r\n
func (*RequestHeader) ConnectionClose ¶
func (h *RequestHeader) ConnectionClose() bool
是否设置:'Connection: close'
func (*RequestHeader) ConnectionUpgrade ¶
func (h *RequestHeader) ConnectionUpgrade() bool
func (*RequestHeader) ContentLength ¶
func (h *RequestHeader) ContentLength() int
func (*RequestHeader) ContentType ¶
func (h *RequestHeader) ContentType() []byte
--- Req.ContentType
func (*RequestHeader) CookieBytes ¶
func (h *RequestHeader) CookieBytes(key []byte) []byte
func (*RequestHeader) CopyTo ¶
func (h *RequestHeader) CopyTo(dst *RequestHeader)
func (*RequestHeader) Del ¶
func (h *RequestHeader) Del(key string)
func (*RequestHeader) DelAllCookies ¶
func (h *RequestHeader) DelAllCookies()
func (*RequestHeader) DelBytes ¶
func (h *RequestHeader) DelBytes(key []byte)
func (*RequestHeader) DelCookieBytes ¶
func (h *RequestHeader) DelCookieBytes(key []byte)
func (*RequestHeader) DisableNormalizing ¶
func (h *RequestHeader) DisableNormalizing()
func (*RequestHeader) HasAcceptEncoding ¶
func (h *RequestHeader) HasAcceptEncoding(acceptEncoding string) bool
--- Req.AcceptEncoding: 是否显式设置了支持该编码 Examples:
Accept-Encoding: compress, gzip //支持compress 和gzip类型 Accept-Encoding: //默认是identity Accept-Encoding: * //支持所有类型 Accept-Encoding: compress;q=0.5, gzip;q=1.0 //按顺序支持 gzip , compress Accept-Encoding: gzip;q=1.0, identity;q=0.5, *;q=0 // 按顺序支持 gzip , identity
Server对应响应: 'Content-Encoding: gzip' ps: q值的范围从0.0~1.0(1.0优先级最高)
func (*RequestHeader) HasAcceptEncodingBytes ¶
func (h *RequestHeader) HasAcceptEncodingBytes(acceptEncoding []byte) bool
+优化 q的简单处理
func (*RequestHeader) IsDelete ¶
func (h *RequestHeader) IsDelete() bool
func (*RequestHeader) IsHead ¶
func (h *RequestHeader) IsHead() bool
func (*RequestHeader) IsPost ¶
func (h *RequestHeader) IsPost() bool
func (*RequestHeader) IsPut ¶
func (h *RequestHeader) IsPut() bool
func (*RequestHeader) Len ¶
func (h *RequestHeader) Len() int
func (*RequestHeader) MultipartFormBoundary ¶
func (h *RequestHeader) MultipartFormBoundary() []byte
从'Content-Type: multiform/form-data; boundary=...'返回
func (*RequestHeader) Peek ¶
func (h *RequestHeader) Peek(key string) []byte
func (*RequestHeader) PeekBytes ¶
func (h *RequestHeader) PeekBytes(key []byte) []byte
func (*RequestHeader) Read ¶
func (h *RequestHeader) Read(r *bufio.Reader) error
- Req 在首次读取前,r已关闭,返回io.EOF
func (*RequestHeader) RequestURI ¶
func (h *RequestHeader) RequestURI() []byte
--- Req.RequestURI 默认'/',仅URI
func (*RequestHeader) Reset ¶
func (h *RequestHeader) Reset()
func (*RequestHeader) ResetConnectionClose ¶
func (h *RequestHeader) ResetConnectionClose()
如果已设'Connection: close',清理之
func (*RequestHeader) SetByteRange ¶
func (h *RequestHeader) SetByteRange(startPos, endPos int)
分段请求数据-断点续传 值根据响应的: Content-Length和Accept-Ranges确定 'Range: bytes=startPos-endPos' * 当startPos为负,'bytes=-startPos' * 当endPos为负,将忽略endPos, 形如'bytes=startPos-'
func (*RequestHeader) SetBytesK ¶
func (h *RequestHeader) SetBytesK(key []byte, value string)
func (*RequestHeader) SetBytesKV ¶
func (h *RequestHeader) SetBytesKV(key, value []byte)
func (*RequestHeader) SetBytesV ¶
func (h *RequestHeader) SetBytesV(key string, value []byte)
func (*RequestHeader) SetCanonical ¶
func (h *RequestHeader) SetCanonical(key, value []byte)
func (*RequestHeader) SetConnectionClose ¶
func (h *RequestHeader) SetConnectionClose()
func (*RequestHeader) SetContentLength ¶
func (h *RequestHeader) SetContentLength(contentLength int)
为负: 设置'Transfer-Encoding: chunked'
func (*RequestHeader) SetContentType ¶
func (h *RequestHeader) SetContentType(contentType string)
func (*RequestHeader) SetContentTypeBytes ¶
func (h *RequestHeader) SetContentTypeBytes(contentType []byte)
func (*RequestHeader) SetCookieBytesK ¶
func (h *RequestHeader) SetCookieBytesK(key []byte, value string)
func (*RequestHeader) SetCookieBytesKV ¶
func (h *RequestHeader) SetCookieBytesKV(key, value []byte)
func (h *RequestHeader) SetCookieBytesV(key string, value []byte) {
h.SetCookie(key, b2s(value))
}
func (*RequestHeader) SetHost ¶
func (h *RequestHeader) SetHost(host string)
func (*RequestHeader) SetHostBytes ¶
func (h *RequestHeader) SetHostBytes(host []byte)
func (*RequestHeader) SetMethod ¶
func (h *RequestHeader) SetMethod(method string)
func (*RequestHeader) SetMethodBytes ¶
func (h *RequestHeader) SetMethodBytes(method []byte)
func (*RequestHeader) SetMultipartFormBoundary ¶
func (h *RequestHeader) SetMultipartFormBoundary(boundary string)
--- Req.boundary 'Content-Type: multiform/form-data; boundary=...'
func (*RequestHeader) SetMultipartFormBoundaryBytes ¶
func (h *RequestHeader) SetMultipartFormBoundaryBytes(boundary []byte)
func (*RequestHeader) SetReferer ¶
func (h *RequestHeader) SetReferer(referer string)
func (*RequestHeader) SetRefererBytes ¶
func (h *RequestHeader) SetRefererBytes(referer []byte)
func (*RequestHeader) SetRequestURI ¶
func (h *RequestHeader) SetRequestURI(requestURI string)
将在HTTP请求第1行设置RequestURI RequestURI须是经过转码的 在并发中使用,结果将不可知
func (*RequestHeader) SetRequestURIBytes ¶
func (h *RequestHeader) SetRequestURIBytes(requestURI []byte)
func (*RequestHeader) SetUserAgent ¶
func (h *RequestHeader) SetUserAgent(userAgent string)
func (*RequestHeader) SetUserAgentBytes ¶
func (h *RequestHeader) SetUserAgentBytes(userAgent []byte)
func (*RequestHeader) VisitAll ¶
func (h *RequestHeader) VisitAll(f func(key, value []byte))
func (*RequestHeader) VisitAllCookie ¶
func (h *RequestHeader) VisitAllCookie(f func(key, value []byte))
type Response ¶
type Response struct {
// 禁止直接复制值,正确做法:新建并CopyTo
Header ResponseHeader
// 跳过 读取/写入 Body内容
// 在响head方法中使用
SkipBody bool
// contains filtered or unexported fields
}
禁止直接复制值,正确做法:新建并CopyTo 不可用于并发
func (*Response) AppendBody ¶
--- Resp.AppendBody 函数是复制内容,返回后,p不与body关连
func (*Response) AppendBodyString ¶
func (*Response) BodyGunzip ¶
func (*Response) BodyInflate ¶
func (*Response) BodyWriter ¶
--- BodyWriter 用于RequestHandler内部,在其结束后,不可使用 RequestCtx.Write or SetBodyStreamWriter
func (*Response) IsBodyStream ¶
func (*Response) Read ¶
--- Resp.Read 获取请求数据(包括body) * RemoveMultipartFormFiles 或 Reset 须在之后调用,以便删除上传的临时文件 当MayContinue条件成立,调用者须处理以下任意一条: - 1.发送StatusExpectationFailed响应 - 2.在ContinueReadBody之前,发送StatusContinue响应 - 3.关闭连接 ps: 在读取之前,连接关闭时,返回io.EOF
func (*Response) ReadLimitBody ¶
func (*Response) ReleaseBody ¶
--- ReleaseBody 当body容量超过指定大小时,直接释放该body(需不是放回sync.Pool) * 旨在让GC回收大内存,需不让该超大块内存,被后续重复使用 * 必须在ReleaseResponse函数之前使用 ps: 该函数大部分情况无需使用;使用时,必须明白该函数是如何生效
func (*Response) SendFile ¶
--- Resp.SendFile 将本地文件内容,作为响应内容 ps:该接口未设置Content-Type,需另外主动设置 1.打开文件 - 关闭文件 2.查看文件大小:是否超过int最大值 3.文件修改时间:作为头部-修改时间
func (*Response) SetBodyStream ¶
func (*Response) SetBodyStreamWriter ¶
func (resp *Response) SetBodyStreamWriter(sw StreamWriter)
func (*Response) SetBodyString ¶
func (*Response) SetConnectionClose ¶
func (resp *Response) SetConnectionClose()
func (*Response) SetStatusCode ¶
func (*Response) WriteDeflate ¶
--- Resp.WriteDeflate * 写入到w,并设置'Content-Encoding: deflate'头 考虑性能原因,不直接写入到w
func (*Response) WriteDeflateLevel ¶
Level: 1.CompressNoCompression 2.CompressBestSpeed 3.CompressBestCompression 4.CompressDefaultCompression 5.CompresshuffmanOnly * 写入到w,并设置'Content-Encoding: deflate'头 考虑性能原因,不直接写入到w
func (*Response) WriteGzip ¶
--- Resp.WriteGzip gzip打包body,并写入到w * 写入到w,并设置'Content-Encoding: gzip'头 考虑性能原因,不直接写入到w
func (*Response) WriteGzipLevel ¶
Level: 1.CompressNoCompression 2.CompressBestSpeed 3.CompressBestCompression 4.CompressDefaultCompression 5.CompresshuffmanOnly * 写入到w,并设置'Content-Encoding: gzip'头 考虑性能原因,不直接写入到w
type ResponseHeader ¶
type ResponseHeader struct {
// contains filtered or unexported fields
}
禁止直接复制值,正确做法:新建并CopyTo 不可用于并发
func (*ResponseHeader) Add ¶
func (h *ResponseHeader) Add(key, value string)
--- Resp.Add: 'key: value' => h.h Add操作,有可能会有重复值
func (*ResponseHeader) AddBytesK ¶
func (h *ResponseHeader) AddBytesK(key []byte, value string)
func (*ResponseHeader) AddBytesKV ¶
func (h *ResponseHeader) AddBytesKV(key, value []byte)
func (*ResponseHeader) AddBytesV ¶
func (h *ResponseHeader) AddBytesV(key string, value []byte)
func (*ResponseHeader) AppendBytes ¶
func (h *ResponseHeader) AppendBytes(dst []byte) []byte
整理头部信息到buf中 1.首行-状态码(默认200) 'HTTP/1.1 200 OK' 'HTTP/1.1 502 Fiddler - Connection Failed' 2.Server信息 - 未设使用默认 3.serverDate信息 4.Content-Type信息-仅非空body响应或明确指定 5.ContentLength 6.其它h.h中设置的头信息-非strDate 7.Set-Cookie 8.ConnectionClose 9.\r\n
func (*ResponseHeader) ConnectionClose ¶
func (h *ResponseHeader) ConnectionClose() bool
是否设置'Connection: close'
func (*ResponseHeader) ConnectionUpgrade ¶
func (h *ResponseHeader) ConnectionUpgrade() bool
--------------------------------------- --- 'Connection: Upgrade'
func (*ResponseHeader) ContentLength ¶
func (h *ResponseHeader) ContentLength() int
---------------- --- 'Content-Length: xx' -1 : 'Transfer-Encoding: chunked' 十六进制的长度值和数据,长度值在其后独占一行,长度不包括它结尾的 CRLF(\r\n),也不包括分块数据结尾的 CRLF -2 : 'Transfer-Encoding: identity' HTTP/1.1已弃 从第一个字按顺序传输到最后一个字结束
func (*ResponseHeader) ContentType ¶
func (h *ResponseHeader) ContentType() []byte
返回ContentType,未设置,使用默认值
func (*ResponseHeader) Cookie ¶
func (h *ResponseHeader) Cookie(cookie *Cookie) bool
--- Cookie - Resp.获取值到Cookie
func (*ResponseHeader) DelBytes ¶
func (h *ResponseHeader) DelBytes(key []byte)
func (*ResponseHeader) DelClientCookie ¶
func (h *ResponseHeader) DelClientCookie(key string)
--- DelCookie - Resp 通知客户端,移除指定cookie
func (*ResponseHeader) DelClientCookieBytes ¶
func (h *ResponseHeader) DelClientCookieBytes(key []byte)
func (*ResponseHeader) DelCookie ¶
func (h *ResponseHeader) DelCookie(key string)
在响应头中,移除指定cookie,不通知移除客户端(DelClientCookie)
func (*ResponseHeader) DelCookieBytes ¶
func (h *ResponseHeader) DelCookieBytes(key []byte)
func (*ResponseHeader) DisableNormalizing ¶
func (h *ResponseHeader) DisableNormalizing()
--- disableNormalizing 禁止标准化 头选项名 默认开启(首字母大写)
func (*ResponseHeader) IsHTTP11 ¶
func (h *ResponseHeader) IsHTTP11() bool
func (*ResponseHeader) Peek ¶
func (h *ResponseHeader) Peek(key string) []byte
--- Peek 不要直接保存返回值,复制之
func (*ResponseHeader) PeekBytes ¶
func (h *ResponseHeader) PeekBytes(key []byte) []byte
func (*ResponseHeader) Read ¶
func (h *ResponseHeader) Read(r *bufio.Reader) error
--- Read - Resp 在首次读取前,r已关闭,返回io.EOF
func (*ResponseHeader) ResetConnectionClose ¶
func (h *ResponseHeader) ResetConnectionClose()
当设置了'Connection: close',清除之
func (*ResponseHeader) Set ¶
func (h *ResponseHeader) Set(key, value string)
--- Resp.Set: 'key: value' => h.h
func (*ResponseHeader) SetBytesK ¶
func (h *ResponseHeader) SetBytesK(key []byte, value string)
取标准 头选项 名
func (*ResponseHeader) SetBytesKV ¶
func (h *ResponseHeader) SetBytesKV(key, value []byte)
取标准 头选项 名
func (*ResponseHeader) SetBytesV ¶
func (h *ResponseHeader) SetBytesV(key string, value []byte)
取标准 头选项 名
func (*ResponseHeader) SetCanonical ¶
func (h *ResponseHeader) SetCanonical(key, value []byte)
'key: value'
func (*ResponseHeader) SetConnectionClose ¶
func (h *ResponseHeader) SetConnectionClose()
func (*ResponseHeader) SetContentLength ¶
func (h *ResponseHeader) SetContentLength(contentLength int)
func (*ResponseHeader) SetContentRange ¶
func (h *ResponseHeader) SetContentRange(startPos, endPos, contentLength int)
========================================= 'Content-Range: bytes startPos-endPos/contentLength' 用于响应分段请求数据
func (*ResponseHeader) SetContentType ¶
func (h *ResponseHeader) SetContentType(contentType string)
func (*ResponseHeader) SetContentTypeBytes ¶
func (h *ResponseHeader) SetContentTypeBytes(contentType []byte)
func (*ResponseHeader) SetCookie ¶
func (h *ResponseHeader) SetCookie(cookie *Cookie)
--- SetCookie - Resp 返回后,保存重利用cookie - 复制方式
func (*ResponseHeader) SetLastModified ¶
func (h *ResponseHeader) SetLastModified(t time.Time)
'Last-Modified'
func (*ResponseHeader) SetServer ¶
func (h *ResponseHeader) SetServer(server string)
func (*ResponseHeader) SetServerBytes ¶
func (h *ResponseHeader) SetServerBytes(server []byte)
func (*ResponseHeader) SetStatusCode ¶
func (h *ResponseHeader) SetStatusCode(statusCode int)
func (*ResponseHeader) StatusCode ¶
func (h *ResponseHeader) StatusCode() int
--------------------------------------- 响应状态码,默认200
func (*ResponseHeader) VisitAll ¶
func (h *ResponseHeader) VisitAll(f func(key, value []byte))
--- VisitAll f不要直接保存传入的值,需要使用复制
func (*ResponseHeader) VisitAllCookie ¶
func (h *ResponseHeader) VisitAllCookie(f func(key, value []byte))
--- VisitAllCookie f不要直接保存传入的值,需要使用复制
type Server ¶
type Server struct {
//外部处理接口
Handler RequestHandler
// 服务器名,如果未设置,使用defaultServerName
Name string
//一个server的并发数
Concurrency int
// 是否不使用长连接
//
// The server will close all the incoming connections after sending
// the first response to client if this option is set to true.
//
// 默认允许长连接
DisableKeepalive bool
// 每个连接的读缓存区大小
// 这个同样限制了header的大小
// 如果用到大uris 或大headers(i.e. 大cookies).
//
// Default buffer size is used if not set.
ReadBufferSize int
// 每个连接的写缓存区大小
// Default buffer size is used if not set.
WriteBufferSize int
// 读取1个请求数据(包括body)的等待时间
//
// 对闲置长连接生效 //todo
// By default 无限制
ReadTimeout time.Duration
// 写操作超时时间(包括body)
// 默认无限制
WriteTimeout time.Duration
// 针对ip限制并发最大连接数
//
// 默认无限制
MaxConnsPerIP int
// 每个连接的最大请求数(使用次数)
//
// 当最后一个请求结束,将关闭连接
// 设置'Connection: close'头到最后一个响应里
//
// 默认无限制
MaxRequestsPerConn int
// 长连接的最大存活时间
// 读或写触发 todo
// 默认无限制
MaxKeepaliveDuration time.Duration
// 请求的最大body大小
// server将拒绝超过大小的请求
// 1.比对头部的contentLength,2.读取过程中检测
// 未设置,使用默认值
MaxRequestBodySize int
// 通过高cpu占用方式,强制降低内存使用
// 仅当server消耗太多内存在闲置长连接上,降低约50%以上内存
// resetbody时,使用bufferpool方式,而非在连接上直接保留bodybuffer
// 默认关闭
ReduceMemoryUsage bool
// 仅Get方式
// 用于防ddos攻击,请求大小受ReadBufferSize限制
// 默认允许所有方式 put delete get post head等
// GetOnly bool
GetPostOnly bool
// 在生产环境中,会记录频繁的错误"connection reset by peer", "broken pipe", "connection timeout"
// 默认不输出以上错误
LogAllErrors bool
// 启用后,header项将按原值传输
// 仅当作为代理服务器,后续服务器对header中的各值敏感时,启用
// 默认,不启用
// cONTENT-lenGTH -> Content-Length
DisableHeaderNamesNormalizing bool
// Logger which is used by RequestCtx.Logger().
// 默认使用log包
Logger Logger
// contains filtered or unexported fields
}
func (*Server) ListenAndServe ¶
func (*Server) ListenAndServeTLS ¶
HTTPS requests
func (*Server) ListenAndServeTLSEmbed ¶
HTTPS requests
func (*Server) ListenAndServeUNIX ¶
先移除 该地址上的文件 todo??
func (*Server) ServeConn ¶
处理c请求:前置检测-maxConnPerIP,concurrency 请求成功,返回nil,否则返回error c须立即将响应数据传到Write中,否则请求处理,会卡住 c会在返回前Close
type StreamWriter ¶
必定将数据写入w 通常,是循环遍历将数据写入w 当有错误时,需立即返回 因为是buffer数据,须调用Flush将数据传给reader
type URI ¶
type URI struct {
// contains filtered or unexported fields
}
统一资源标志符URI就是在某一规则下能把一个资源独一无二地标识出来 URL在于Locater,一般来说(URL)统一资源定位符,可以提供找到该资源的路径 uri组成:
访问资源的命名机制。 存放资源的主机名。 资源自身的名称,由路径表示。
func (*URI) AppendBytes ¶
func (*URI) Fragment ¶
---------------------------------- i.e. qwe of http://xxx.com/foo/bar?baz=123&bap=456#qwe
func (*URI) Host ¶
i.e xxx.com of http://xxx.com/foo/bar?baz=123&bap=456#qwe 返回值:最小化 从RequestHeader中,取得host数据
func (*URI) LastPathSegment ¶
LastPathSegment: 返回最后一个'/'之后的内容
- /foo/bar/baz.html => baz.html
- /foo/bar/ =>
- /foobar.js => foobar.js
- foobar.js => foobar.js
func (*URI) Parse ¶
初化化 host可nil,当此时,uri中包含完整信息 当host不为空,uri可仅包含RequestURI .i.e. host: http://xxx.com .i.e. uri: /foo/bar?baz=123&bap=456#qwe
func (*URI) Path ¶
i.e. /foo/bar of http://xxx.com/foo/bar?baz=123&bap=456#qwe 返回值:解码+标准化 i.e. '//f%20obar/baz/../zzz' becomes '/f obar/zzz'
func (*URI) QueryString ¶
i.e. baz=123&bap=456 of http://xxx.com/foo/bar?baz=123&bap=456#qwe
func (*URI) RequestURI ¶
重组RequestURI,并传出 i.e. 仅URI部份,不含scheme,host path + queryArgs/queryString + fragment
func (*URI) Scheme ¶
i.e. http of http://xxx.com/foo/bar?baz=123&bap=456#qwe 返回值:小写化
func (*URI) SetFragment ¶
func (*URI) SetFragmentBytes ¶
func (*URI) SetHostBytes ¶
func (*URI) SetPathBytes ¶
func (*URI) SetQueryString ¶
func (*URI) SetQueryStringBytes ¶
func (*URI) SetSchemeBytes ¶
func (*URI) Update ¶
根据传入的newURI,更新相应值:scheme, host, uri, path/pathOriginal, fragment 接受以下格式:
- 完整格式 http://xxx.com/aa/bb?cc => 替换original uri
- 不含scheme, //xxx.com/aa/bb?cc => scheme使用默认值
- 不含http, /aa/bb?cc => 仅替换RequestURI
- 相对路径, bb?cc => 根据相对路径,更新RequestURI
然后parse