selfFastHttp

package module
v0.0.0-...-2268fce Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 3, 2018 License: Apache-2.0 Imports: 24 Imported by: 0

README

selfFastHttp

Documentation

Overview

selfFastHttp document

selfFastHttp project selfFastHttp.go

Index

Constants

View Source
const (
	CompressNoCompression      = flate.NoCompression
	CompressBestSpeed          = flate.BestSpeed
	CompressBestCompression    = flate.BestCompression
	CompressDefaultCompression = 6  // flate.DefaultCompression
	CompressHuffmanOnly        = -2 // flate.HuffmanOnly
)
View Source
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 (错误请求)服务器不理解请求的参数。
	StatusUnauthorized                 = 401 // RFC 7235, 3.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来指明该问题。
	StatusUnavailableForLegalReasons   = 451 // RFC 7725, 3    因法律原因而被官方审查,由于法律原因产生的后果而被官方拒绝访问

	//5xx (服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。
	StatusInternalServerError           = 500 // RFC 7231, 6.6.1 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。
	StatusNotImplemented                = 501 // RFC 7231, 6.6.2 服务器不支持当前请求所需要的某个功能。
	StatusBadGateway                    = 502 // RFC 7231, 6.6.3 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
	StatusServiceUnavailable            = 503 // RFC 7231, 6.6.4 由于临时的服务器维护或者过载,服务器当前无法处理请求。
	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流量实现的。当用户试图访问网络返回一个重定向和登录,这很讨厌,但是实际情况就是这样的。
)
View Source
const DefaultConcurrency = 256 * 1024 //略少

一个server并发数

View Source
const DefaultMaxRequestBodySize = 4 * 1024 * 1024 // 4M

DefaultMaxRequestBodySize is the maximum request body size the server reads by default.

See Server.MaxRequestBodySize for details.

Variables

View Source
var (
	// 设置一个过去的时间,让其过期被移除
	CookieExpireDelete = time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC)

	// 不限时,默认
	CookieExpireUnlimited = zeroTime
)
View Source
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")
)
View Source
var ErrBodyTooLarge = errors.New("body size exceeds the given limit")
View Source
var ErrMissingFile = errors.New("there is no uploaded file associated with the given key")
View Source
var (
	ErrNoArgValue = errors.New("no Arg value for the given key")
)
View Source
var ErrNoMultipartForm = errors.New("request has no multipart/form-data Content-Type")

--- MultipartForm

Functions

func AcquireByteBuffer

func AcquireByteBuffer() *bytebufferpool.ByteBuffer

func AppendDeflateBytes

func AppendDeflateBytes(dst, src []byte) []byte

func AppendDeflateBytesLevel

func AppendDeflateBytesLevel(dst, src []byte, level int) []byte

将p deflate到w中 level: * CompressNoCompression * CompressBestSpeed * CompressBestCompression * CompressDefaultCompression * CompressHuffmanOnly

func AppendGunzipBytes

func AppendGunzipBytes(dst, src []byte) ([]byte, error)

func AppendGzipBytes

func AppendGzipBytes(dst, src []byte) []byte

func AppendGzipBytesLevel

func AppendGzipBytesLevel(dst, src []byte, level int) []byte

将p gzip到w中 level: * CompressNoCompression * CompressBestSpeed * CompressBestCompression * CompressDefaultCompression * CompressHuffmanOnly

func AppendHTTPDate

func AppendHTTPDate(dst []byte, date time.Time) []byte

HTTP-compliant (RFC1123) representation of date windows amd64 BenchmarkAppendHTTPDate-8 20000000 101 ns/op

func AppendInflateBytes

func AppendInflateBytes(dst, src []byte) ([]byte, error)

将src inflate到 dst中

func AppendNormalizedHeaderKey

func AppendNormalizedHeaderKey(dst []byte, key string) []byte

将key格式化(首字母大写)附加到dst上

func AppendNormalizedHeaderKeyBytes

func AppendNormalizedHeaderKeyBytes(dst, key []byte) []byte

func AppendQuotedArg

func AppendQuotedArg(dst, src []byte) []byte

将src经url-encoded转换,传给dst

func AppendUint

func AppendUint(dst []byte, n int) []byte

将int转成[]byte-int:最大20位 循环判断传入值:

1.>=10 将个位数转成ascii码,存入临时缓存buf中
2.最后一位,也保存进缓存buf中

将缓存附加到dst后

func CoarseTimeNow

func CoarseTimeNow() time.Time

CoarseTimeNow returns the current time truncated to the nearest second.

This is a faster alternative to time.Now().

func GetAddr

func GetAddr(o interface{}) uintptr

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 NewLogger

func NewLogger(out io.Writer) *selfLogger

func NewStreamReader

func NewStreamReader(sw StreamWriter) io.ReadCloser

流读取器-协程异步方式 返回一个reader,用于重放sw产生的数据 这个reader有可能传到Response.SetBodyStream 返回reader中,当所有请求的数据被读完,须调用Close;否则goroutine有可能泄漏

func ParseHTTPDate

func ParseHTTPDate(date []byte) (time.Time, error)

func ParseUfloat

func ParseUfloat(buf []byte) (float64, error)

将[]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 ParseUint

func ParseUint(buf []byte) (int, error)

func ReleaseArgs

func ReleaseArgs(a *Args)

释放Args

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

func StatusMessage(statusCode int) string

return HTTP status message for the given status code

func TestHello

func TestHello() []byte

func WriteDeflate

func WriteDeflate(w io.Writer, p []byte) (int, error)

func WriteDeflateLevel

func WriteDeflateLevel(w io.Writer, p []byte, level int) (int, error)

将p deflate到w中 level: * CompressNoCompression * CompressBestSpeed * CompressBestCompression * CompressDefaultCompression * CompressHuffmanOnly

func WriteGunzip

func WriteGunzip(w io.Writer, p []byte) (int, error)

解p解压到w,并返回解压后写的w的数据大小

func WriteGzip

func WriteGzip(w io.Writer, p []byte) (int, error)

func WriteGzipLevel

func WriteGzipLevel(w io.Writer, p []byte, level int) (int, error)

将p gzip到w中 level: * CompressNoCompression * CompressBestSpeed * CompressBestCompression * CompressDefaultCompression * CompressHuffmanOnly

func WriteInflate

func WriteInflate(w io.Writer, p []byte) (int, error)

将p inflate到w中

func WriteMultipartForm

func WriteMultipartForm(w io.Writer, f *multipart.Form, boundary string) error

Types

type Args

type Args struct {
	// contains filtered or unexported fields
}

表示query参数 不支持并发使用 不可直接复制

func AcquireArgs

func AcquireArgs() *Args

Args工厂

func (*Args) AaddBytesKV

func (a *Args) AaddBytesKV(key, value []byte)

func (*Args) Add

func (a *Args) Add(key, value string)

--- add key, value:复制值方式

func (*Args) AddBytesK

func (a *Args) AddBytesK(key []byte, value string)

func (*Args) AddBytesV

func (a *Args) AddBytesV(key string, value []byte)

func (*Args) AppendBytes

func (a *Args) AppendBytes(dst []byte) []byte

将args键值,遍历传给dst

func (*Args) CopyTo

func (a *Args) CopyTo(dst *Args)

复制到

func (*Args) Del

func (a *Args) Del(key string)

--- del key

func (*Args) DelBytes

func (a *Args) DelBytes(key []byte)

func (*Args) GetBool

func (a *Args) GetBool(key string) bool

func (*Args) GetUfloat

func (a *Args) GetUfloat(key string) (float64, error)

func (*Args) GetUfloatOrZero

func (a *Args) GetUfloatOrZero(key string) float64

func (*Args) GetUint

func (a *Args) GetUint(key string) (int, error)

--- proc value Uint

func (*Args) GetUintOrZero

func (a *Args) GetUintOrZero(key string) int

func (*Args) Has

func (a *Args) Has(key string) bool

--- has key

func (*Args) HasBytes

func (a *Args) HasBytes(key []byte) bool

func (*Args) Len

func (a *Args) Len() int

func (*Args) Parse

func (a *Args) Parse(s string)

解析传入字串

func (*Args) ParseBytes

func (a *Args) ParseBytes(b []byte)

1.清空数据 2.使用解析器处理

func (*Args) Peek

func (a *Args) Peek(key string) []byte

--- peek key

func (*Args) PeekBytes

func (a *Args) PeekBytes(key []byte) []byte

func (*Args) PeekMulti

func (a *Args) PeekMulti(key string) [][]byte

func (*Args) PeekMultiBytes

func (a *Args) PeekMultiBytes(key []byte) [][]byte

func (*Args) QueryString

func (a *Args) QueryString() []byte

buf从args重组化

func (*Args) Reset

func (a *Args) Reset()

重置

func (*Args) Set

func (a *Args) Set(key, value string)

--- set key, value:复制值方式

func (*Args) SetBytesK

func (a *Args) SetBytesK(key []byte, value string)

func (*Args) SetBytesKV

func (a *Args) SetBytesKV(key, value []byte)

func (*Args) SetBytesV

func (a *Args) SetBytesV(key string, value []byte)

func (*Args) SetUint

func (a *Args) SetUint(key string, value int)

func (*Args) SetUintBytes

func (a *Args) SetUintBytes(key []byte, value int)

func (*Args) String

func (a *Args) String() string

字串化

func (*Args) VisitAll

func (a *Args) VisitAll(f func(key, value []byte))

在f中,不可直接引用值 如有需要,复制一份

func (*Args) WriteTo

func (a *Args) WriteTo(w io.Writer) (int64, error)
type Cookie struct {
	// contains filtered or unexported fields
}

用于响应cookie相关处理 不要直接保存,创建并CopyTo 不可用于并发处理

func AcquireCookie

func AcquireCookie() *Cookie

func (*Cookie) AppendBytes

func (c *Cookie) AppendBytes(dst []byte) []byte

用于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) Cookie

func (c *Cookie) Cookie() []byte

func (*Cookie) CopyTo

func (c *Cookie) CopyTo(dst *Cookie)

================================

func (*Cookie) Domain

func (c *Cookie) Domain() []byte

- domain

func (*Cookie) Expire

func (c *Cookie) Expire() time.Time

- expire

func (*Cookie) HTTPOnly

func (c *Cookie) HTTPOnly() bool

- hostOnly

func (*Cookie) Key

func (c *Cookie) Key() []byte

- key

func (*Cookie) Parse

func (c *Cookie) Parse(src string) error

解析 'Set-Cookie: xxx'头

func (*Cookie) ParseBytes

func (c *Cookie) ParseBytes(src []byte) error

解析 'Set-Cookie: xxx'头

func (*Cookie) Path

func (c *Cookie) Path() []byte

- path

func (*Cookie) Reset

func (c *Cookie) Reset()

func (*Cookie) Secure

func (c *Cookie) Secure() bool

- secure

func (*Cookie) SetDomain

func (c *Cookie) SetDomain(domain string)

func (*Cookie) SetDomainBytes

func (c *Cookie) SetDomainBytes(domain []byte)

func (*Cookie) SetExpire

func (c *Cookie) SetExpire(expire time.Time)

func (*Cookie) SetHTTPOnly

func (c *Cookie) SetHTTPOnly(httpOnly bool)

func (*Cookie) SetKey

func (c *Cookie) SetKey(key string)

func (*Cookie) SetKeyBytes

func (c *Cookie) SetKeyBytes(key []byte)

func (*Cookie) SetPath

func (c *Cookie) SetPath(path string)

func (*Cookie) SetPathBytes

func (c *Cookie) SetPathBytes(path []byte)

func (*Cookie) SetSecure

func (c *Cookie) SetSecure(secure bool)

func (*Cookie) SetValue

func (c *Cookie) SetValue(value string)

func (*Cookie) SetValueBytes

func (c *Cookie) SetValueBytes(value []byte)

func (*Cookie) String

func (c *Cookie) String() string

func (*Cookie) Value

func (c *Cookie) Value() []byte

- value

func (*Cookie) WriteTo

func (c *Cookie) WriteTo(w io.Writer) (int64, error)

实现 io.WriteTo 接口

type ErrSmallBuffer

type ErrSmallBuffer struct {
	// contains filtered or unexported fields
}

提供的buffer太小 从Server或Client得到的ReadBufferSize,要减掉这些错误值

type HijackHandler

type HijackHandler func(c net.Conn)

=================================== 劫持处理接口,在正常Server请求接口处理完成后,执行该接口

type Logger

type Logger interface {
	Printf(format string, args ...interface{})
}

type Request

type Request struct {

	// 禁止直接复制值,正确做法:新建并CopyTo
	Header RequestHeader
	// contains filtered or unexported fields
}

禁止直接复制值,正确做法:新建并CopyTo 不可用于并发

func (*Request) AppendBody

func (req *Request) AppendBody(p []byte)

--- Req.AppendBody

func (*Request) AppendBodyString

func (req *Request) AppendBodyString(s string)

func (*Request) Body

func (req *Request) Body() []byte

--- Req.Body

func (*Request) BodyGunzip

func (req *Request) BodyGunzip() ([]byte, error)

--- BodyGunzip 用于读取那些,有设置'Content-Encoding: gzip'头的body 用Body读取gzipped的数据

func (*Request) BodyInflate

func (req *Request) BodyInflate() ([]byte, error)

--- BodyInflate 用于读取那些,有设置'Content-Encoding: defalte'压缩的body

func (*Request) BodyWriteTo

func (req *Request) BodyWriteTo(w io.Writer) error

--- BodyWriteTo 1.bodyStream流 2.仅MultipartForm

func (*Request) BodyWriter

func (req *Request) BodyWriter() io.Writer

func (*Request) ConnectionClose

func (req *Request) ConnectionClose() bool

func (*Request) ContinueReadBody

func (req *Request) ContinueReadBody(r *bufio.Reader, maxBodySize int) error

当MayContinue条件成立,调用者须处理以下任意一条: - 1.发送StatusExpectationFailed响应 - 2.在ContinueReadBody之前,发送StatusContinue响应 - 3.关闭连接 ps: 在读取之前,连接关闭时,返回io.EOF

func (*Request) CopyTo

func (req *Request) CopyTo(dst *Request)

--- CopyTo

func (*Request) Host

func (req *Request) Host() []byte

func (*Request) IsBodyStream

func (req *Request) IsBodyStream() bool

--- IsBodyStream 确认body是通过bodyStream获取的源数据

func (*Request) MayContinue

func (req *Request) MayContinue() bool

func (*Request) MultipartForm

func (req *Request) MultipartForm() (*multipart.Form, error)

解析multipartForm并返回 非multipartForm,返回相应错误 * RemoveMultipartFormFiles须在返回multipartFrom之后

func (*Request) PostArgs

func (req *Request) PostArgs() *Args

--- Req.PostArgs

func (*Request) Read

func (req *Request) Read(r *bufio.Reader) error

--- Req.Read 获取请求数据(包括body) * RemoveMultipartFormFiles 或 Reset 须在之后调用,以便删除上传的临时文件 当MayContinue条件成立,调用者须处理以下任意一条: - 1.发送StatusExpectationFailed响应 - 2.在ContinueReadBody之前,发送StatusContinue响应 - 3.关闭连接 ps: 在读取之前,连接关闭时,返回io.EOF

func (*Request) ReadLimitBody

func (req *Request) ReadLimitBody(r *bufio.Reader, maxBodySize int) error

按限定量,读取body数据 当设置了maxBodySize >0,而实际body数据超过该值,返回ErrBodyTooLarge * RemoveMultipartFormFiles 或 Reset 须在之后调用,以便删除上传的临时文件 当MayContinue条件成立,调用者须处理以下任意一条: - 1.发送StatusExpectationFailed响应 - 2.在ContinueReadBody之前,发送StatusContinue响应 - 3.关闭连接 ps: 在读取之前,连接关闭时,返回io.EOF

func (*Request) ReleaseBody

func (req *Request) ReleaseBody(size int)

func (*Request) RemoveMultipartFormFiles

func (req *Request) RemoveMultipartFormFiles()

--- Req.RemoveMultipartFormFiles 移除请求中的临时文件

func (*Request) RequestURI

func (req *Request) RequestURI() []byte

func (*Request) Reset

func (req *Request) Reset()

--- Req.Reset

func (*Request) ResetBody

func (req *Request) ResetBody()

--- Req.ResetBody

func (*Request) SetBody

func (req *Request) SetBody(body []byte)

--- Req.SetBody

func (*Request) SetBodyStream

func (req *Request) SetBodyStream(bodyStream io.Reader, bodySize int)

--- 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 (req *Request) SetBodyString(body string)

func (*Request) SetConnectionClose

func (req *Request) SetConnectionClose()

func (*Request) SetHost

func (req *Request) SetHost(host string)

================================= --- Req.Host

func (*Request) SetHostBytes

func (req *Request) SetHostBytes(host []byte)

func (*Request) SetRequestURI

func (req *Request) SetRequestURI(requestURI string)

--- Req.RequestURI

func (*Request) SetRequestURIBytes

func (req *Request) SetRequestURIBytes(requestURI []byte)

func (*Request) String

func (req *Request) String() string

--- String 有错误时,返回错误信息 如有性能考虑,使用Write

func (*Request) SwapBody

func (req *Request) SwapBody(body []byte) []byte

func (*Request) URI

func (req *Request) URI() *URI

======================= --- Req.URI

func (*Request) Write

func (req *Request) Write(w *bufio.Writer) error

--- Req.Write * 考虑性能原因,不直接将request写到w ps: WriteTo-bufio缓存方式

func (*Request) WriteTo

func (req *Request) WriteTo(w io.Writer) (int64, error)

--- WriteTo

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) ConnRequestNum

func (ctx *RequestCtx) ConnRequestNum() uint64

返回当前连接的请求序号,从1开始

func (*RequestCtx) ConnTime

func (ctx *RequestCtx) ConnTime() time.Time

func (*RequestCtx) Error

func (ctx *RequestCtx) Error(msg string, statusCode int)

Error设置响应错误码、信息

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) Hijacked

func (ctx *RequestCtx) Hijacked() bool

检测劫持接口是否已设置

func (*RequestCtx) Host

func (ctx *RequestCtx) Host() []byte

func (*RequestCtx) ID

func (ctx *RequestCtx) ID() uint64

返回惟一的请求id

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) LocalAddr

func (ctx *RequestCtx) LocalAddr() net.Addr

保证返回non-nil值

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) NotFound

func (ctx *RequestCtx) NotFound()

404响应

func (*RequestCtx) NotModified

func (ctx *RequestCtx) NotModified()

配合IfModifiedSince(),发送未改变响应

func (*RequestCtx) Path

func (ctx *RequestCtx) Path() []byte

func (*RequestCtx) PostArgs

func (ctx *RequestCtx) PostArgs() *Args

func (*RequestCtx) PostBody

func (ctx *RequestCtx) PostBody() []byte

在RequestHandler返回前有效

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) Referer

func (ctx *RequestCtx) Referer() []byte

头响中referer内容

func (*RequestCtx) RemoteAddr

func (ctx *RequestCtx) RemoteAddr() net.Addr

func (*RequestCtx) RemoteIP

func (ctx *RequestCtx) RemoteIP() net.IP

返回远程网络地址

func (*RequestCtx) RequestURI

func (ctx *RequestCtx) RequestURI() []byte

i.e. 仅URI部份,不含scheme,host

func (*RequestCtx) Reset

func (ctx *RequestCtx) Reset()

+优化

func (*RequestCtx) ResetBody

func (ctx *RequestCtx) ResetBody()

重置响应Body

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) SetBody

func (ctx *RequestCtx) SetBody(body []byte)

设置响应body

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) URI

func (ctx *RequestCtx) URI() *URI

request uri模块

func (*RequestCtx) UserAgent

func (ctx *RequestCtx) UserAgent() []byte

请求中的用户代理

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) Write

func (ctx *RequestCtx) Write(p []byte) (int, error)

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) Cookie

func (h *RequestHeader) Cookie(key string) []byte

- Req.获取值

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) DelCookie

func (h *RequestHeader) DelCookie(key string)

- Req

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) Header

func (h *RequestHeader) Header() []byte

取头部信息

func (*RequestHeader) Host

func (h *RequestHeader) Host() []byte

--- Req.Host

func (*RequestHeader) IsDelete

func (h *RequestHeader) IsDelete() bool

func (*RequestHeader) IsGet

func (h *RequestHeader) IsGet() bool

--- Method: Isxx()

func (*RequestHeader) IsHTTP11

func (h *RequestHeader) IsHTTP11() bool

--- IsHTTP11

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) Method

func (h *RequestHeader) Method() []byte

--- Req.Method 默论Get方式

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) Referer

func (h *RequestHeader) Referer() []byte

--- Req.Referer

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) Set

func (h *RequestHeader) Set(key, value string)

--- Req.Set

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) SetCookie

func (h *RequestHeader) SetCookie(key, value string)

- Req

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) String

func (h *RequestHeader) String() string

取头部信息-返回string

func (*RequestHeader) UserAgent

func (h *RequestHeader) UserAgent() []byte

--- Req.UserAgent

func (*RequestHeader) VisitAll

func (h *RequestHeader) VisitAll(f func(key, value []byte))

func (*RequestHeader) VisitAllCookie

func (h *RequestHeader) VisitAllCookie(f func(key, value []byte))

func (*RequestHeader) Write

func (h *RequestHeader) Write(w *bufio.Writer) error
  • Req 将头部信息写入w

func (*RequestHeader) WriteTo

func (h *RequestHeader) WriteTo(w io.Writer) (int64, error)

WriteTo 实现 io.WriterTo 接口.

type Response

type Response struct {

	// 禁止直接复制值,正确做法:新建并CopyTo
	Header ResponseHeader

	// 跳过 读取/写入 Body内容
	// 在响head方法中使用
	SkipBody bool
	// contains filtered or unexported fields
}

禁止直接复制值,正确做法:新建并CopyTo 不可用于并发

func (*Response) AppendBody

func (resp *Response) AppendBody(p []byte)

--- Resp.AppendBody 函数是复制内容,返回后,p不与body关连

func (*Response) AppendBodyString

func (resp *Response) AppendBodyString(s string)

func (*Response) Body

func (resp *Response) Body() []byte

================================ --- Resp.Body

func (*Response) BodyGunzip

func (resp *Response) BodyGunzip() ([]byte, error)

func (*Response) BodyInflate

func (resp *Response) BodyInflate() ([]byte, error)

func (*Response) BodyWriteTo

func (resp *Response) BodyWriteTo(w io.Writer) error

func (*Response) BodyWriter

func (resp *Response) BodyWriter() io.Writer

--- BodyWriter 用于RequestHandler内部,在其结束后,不可使用 RequestCtx.Write or SetBodyStreamWriter

func (*Response) ConnectionClose

func (resp *Response) ConnectionClose() bool

--- ConnectionClose

func (*Response) CopyTo

func (resp *Response) CopyTo(dst *Response)

func (*Response) IsBodyStream

func (resp *Response) IsBodyStream() bool

func (*Response) Read

func (resp *Response) Read(r *bufio.Reader) error

--- Resp.Read 获取请求数据(包括body) * RemoveMultipartFormFiles 或 Reset 须在之后调用,以便删除上传的临时文件 当MayContinue条件成立,调用者须处理以下任意一条: - 1.发送StatusExpectationFailed响应 - 2.在ContinueReadBody之前,发送StatusContinue响应 - 3.关闭连接 ps: 在读取之前,连接关闭时,返回io.EOF

func (*Response) ReadLimitBody

func (resp *Response) ReadLimitBody(r *bufio.Reader, maxBodySize int) error

func (*Response) ReleaseBody

func (resp *Response) ReleaseBody(size int)

--- ReleaseBody 当body容量超过指定大小时,直接释放该body(需不是放回sync.Pool) * 旨在让GC回收大内存,需不让该超大块内存,被后续重复使用 * 必须在ReleaseResponse函数之前使用 ps: 该函数大部分情况无需使用;使用时,必须明白该函数是如何生效

func (*Response) Reset

func (resp *Response) Reset()

--- Resp.Reset

func (*Response) ResetBody

func (resp *Response) ResetBody()

--- Resp.ResetBody

func (*Response) SendFile

func (resp *Response) SendFile(path string) error

--- Resp.SendFile 将本地文件内容,作为响应内容 ps:该接口未设置Content-Type,需另外主动设置 1.打开文件 - 关闭文件 2.查看文件大小:是否超过int最大值 3.文件修改时间:作为头部-修改时间

func (*Response) SetBody

func (resp *Response) SetBody(body []byte)

--- Resp.SetBody 清空原内容,设置新内容

func (*Response) SetBodyStream

func (resp *Response) SetBodyStream(bodyStream io.Reader, bodySize int)

func (*Response) SetBodyStreamWriter

func (resp *Response) SetBodyStreamWriter(sw StreamWriter)

func (*Response) SetBodyString

func (resp *Response) SetBodyString(body string)

func (*Response) SetConnectionClose

func (resp *Response) SetConnectionClose()

func (*Response) SetStatusCode

func (resp *Response) SetStatusCode(statusCode int)

func (*Response) StatusCode

func (resp *Response) StatusCode() int

--- Resp.StatusCode

func (*Response) String

func (resp *Response) String() string

func (*Response) SwapBody

func (resp *Response) SwapBody(body []byte) []byte

--- SwapBody 用指定body替换,并返回原body * 传入的body在函数返回后,禁止使用

func (*Response) Write

func (resp *Response) Write(w *bufio.Writer) error

--- Resp.Write 考虑性能原因,不直接写入w

func (*Response) WriteDeflate

func (resp *Response) WriteDeflate(w *bufio.Writer) error

--- Resp.WriteDeflate * 写入到w,并设置'Content-Encoding: deflate'头 考虑性能原因,不直接写入到w

func (*Response) WriteDeflateLevel

func (resp *Response) WriteDeflateLevel(w *bufio.Writer, level int) error

Level: 1.CompressNoCompression 2.CompressBestSpeed 3.CompressBestCompression 4.CompressDefaultCompression 5.CompresshuffmanOnly * 写入到w,并设置'Content-Encoding: deflate'头 考虑性能原因,不直接写入到w

func (*Response) WriteGzip

func (resp *Response) WriteGzip(w *bufio.Writer) error

--- Resp.WriteGzip gzip打包body,并写入到w * 写入到w,并设置'Content-Encoding: gzip'头 考虑性能原因,不直接写入到w

func (*Response) WriteGzipLevel

func (resp *Response) WriteGzipLevel(w *bufio.Writer, level int) error

Level: 1.CompressNoCompression 2.CompressBestSpeed 3.CompressBestCompression 4.CompressDefaultCompression 5.CompresshuffmanOnly * 写入到w,并设置'Content-Encoding: gzip'头 考虑性能原因,不直接写入到w

func (*Response) WriteTo

func (resp *Response) WriteTo(w io.Writer) (int64, error)

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) CopyTo

func (h *ResponseHeader) CopyTo(dst *ResponseHeader)

--- CopyTo

func (*ResponseHeader) Del

func (h *ResponseHeader) Del(key string)

--- Del:移除指定header项

func (*ResponseHeader) DelAllCookies

func (h *ResponseHeader) DelAllCookies()

--- DelAllCookies

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) Header

func (h *ResponseHeader) Header() []byte

取头部信息

func (*ResponseHeader) IsHTTP11

func (h *ResponseHeader) IsHTTP11() bool

func (*ResponseHeader) Len

func (h *ResponseHeader) Len() int

--- Resp.Length of 响应头选项

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) Reset

func (h *ResponseHeader) Reset()

--- Reset 清理:响应头

func (*ResponseHeader) ResetConnectionClose

func (h *ResponseHeader) ResetConnectionClose()

当设置了'Connection: close',清除之

func (*ResponseHeader) Server

func (h *ResponseHeader) Server() []byte

--- Resp.Server

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) String

func (h *ResponseHeader) String() string

取头部信息-返回string

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不要直接保存传入的值,需要使用复制

func (*ResponseHeader) Write

func (h *ResponseHeader) Write(w *bufio.Writer) error

--- Write,WriteTo,Header,String,AppendBytes

  • Resp 将头部信息写入w

func (*ResponseHeader) WriteTo

func (h *ResponseHeader) WriteTo(w io.Writer) (int64, error)

WriteTo 实现 io.WriterTo 接口.

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 (s *Server) ListenAndServe(addr string) error

func (*Server) ListenAndServeTLS

func (s *Server) ListenAndServeTLS(addr, certFile, keyFile string) error

HTTPS requests

func (*Server) ListenAndServeTLSEmbed

func (s *Server) ListenAndServeTLSEmbed(addr string, certData, keyData []byte) error

HTTPS requests

func (*Server) ListenAndServeUNIX

func (s *Server) ListenAndServeUNIX(addr string, mode os.FileMode) error

先移除 该地址上的文件 todo??

func (*Server) Serve

func (s *Server) Serve(ln net.Listener) error

func (*Server) ServeConn

func (s *Server) ServeConn(c net.Conn) error

处理c请求:前置检测-maxConnPerIP,concurrency 请求成功,返回nil,否则返回error c须立即将响应数据传到Write中,否则请求处理,会卡住 c会在返回前Close

func (*Server) ServeTLS

func (s *Server) ServeTLS(ln net.Listener, certFile, keyFile string) error

func (*Server) ServeTLSEmbed

func (s *Server) ServeTLSEmbed(ln net.Listener, certData, keyData []byte) error

type StreamWriter

type StreamWriter func(w *bufio.Writer)

必定将数据写入w 通常,是循环遍历将数据写入w 当有错误时,需立即返回 因为是buffer数据,须调用Flush将数据传给reader

type URI

type URI struct {
	// contains filtered or unexported fields
}

统一资源标志符URI就是在某一规则下能把一个资源独一无二地标识出来 URL在于Locater,一般来说(URL)统一资源定位符,可以提供找到该资源的路径 uri组成:

访问资源的命名机制。
存放资源的主机名。
资源自身的名称,由路径表示。

func AcquireURI

func AcquireURI() *URI

URI工厂 使用完,用ReleaseURI回收

func (*URI) AppendBytes

func (u *URI) AppendBytes(dst []byte) []byte

func (*URI) CopyTo

func (u *URI) CopyTo(dst *URI)

func (*URI) Fragment

func (u *URI) Fragment() []byte

---------------------------------- i.e. qwe of http://xxx.com/foo/bar?baz=123&bap=456#qwe

func (*URI) FullURI

func (u *URI) FullURI() []byte

返回: {Scheme}://{Host}{RequestURI}#{Fragment}

func (*URI) Host

func (u *URI) Host() []byte

i.e xxx.com of http://xxx.com/foo/bar?baz=123&bap=456#qwe 返回值:最小化 从RequestHeader中,取得host数据

func (*URI) LastPathSegment

func (u *URI) LastPathSegment() []byte

LastPathSegment: 返回最后一个'/'之后的内容

  • /foo/bar/baz.html => baz.html
  • /foo/bar/ =>
  • /foobar.js => foobar.js
  • foobar.js => foobar.js

func (*URI) Parse

func (u *URI) Parse(host, uri []byte)

初化化 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

func (u *URI) Path() []byte

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) PathOriginal

func (u *URI) PathOriginal() []byte

返回path原始值

func (*URI) QueryArgs

func (u *URI) QueryArgs() *Args

func (*URI) QueryString

func (u *URI) QueryString() []byte

i.e. baz=123&bap=456 of http://xxx.com/foo/bar?baz=123&bap=456#qwe

func (*URI) RequestURI

func (u *URI) RequestURI() []byte

重组RequestURI,并传出 i.e. 仅URI部份,不含scheme,host path + queryArgs/queryString + fragment

func (*URI) Reset

func (u *URI) Reset()

func (*URI) Scheme

func (u *URI) Scheme() []byte

i.e. http of http://xxx.com/foo/bar?baz=123&bap=456#qwe 返回值:小写化

func (*URI) SetFragment

func (u *URI) SetFragment(fragment string)

func (*URI) SetFragmentBytes

func (u *URI) SetFragmentBytes(fragment []byte)

func (*URI) SetHost

func (u *URI) SetHost(host string)

func (*URI) SetHostBytes

func (u *URI) SetHostBytes(host []byte)

func (*URI) SetPath

func (u *URI) SetPath(path string)

func (*URI) SetPathBytes

func (u *URI) SetPathBytes(path []byte)

func (*URI) SetQueryString

func (u *URI) SetQueryString(queryString string)

func (*URI) SetQueryStringBytes

func (u *URI) SetQueryStringBytes(queryString []byte)

func (*URI) SetScheme

func (u *URI) SetScheme(scheme string)

func (*URI) SetSchemeBytes

func (u *URI) SetSchemeBytes(scheme []byte)

func (*URI) String

func (u *URI) String() string

字串化

func (*URI) Update

func (u *URI) Update(newURI string)

根据传入的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

func (*URI) UpdateBytes

func (u *URI) UpdateBytes(newURI []byte)

func (*URI) WriteTo

func (u *URI) WriteTo(w io.Writer) (int64, error)

将full uri写入io.Writer w是io写入型接口

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL