httpd

package
v1.0.3 Latest Latest
Warning

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

Go to latest
Published: Apr 19, 2022 License: MIT Imports: 24 Imported by: 0

README

基于 nbio 的webserver

系统构建于kernel之上

  • 基于 nbio 支持百万长链接

  • 你可以通过配置,控制固定的处理线程

  • 高性能的路由器

  • 支持websocket

  • 支持拦截器

    • 如果使用了websocket,不建议在拦截器中执行阻塞代码,这样会使响应效率降低
    • 可以单独启动一个httpd作为websocket使用
  • 由于基于kernel,你可以使用所有相关技术

  • 仅仅支持http,如果有https需求,建议通过nginx做反向代理

websocket可以作为一个单独库使用

使用方法参考 example

parser,websocket 均修改自 nbio 的http部分

Documentation

Index

Constants

View Source
const (

	// MaxUint .
	MaxUint = ^uint(0)
	// MaxInt .
	MaxInt = int64(int(MaxUint >> 1))
)

Variables

View Source
var (
	// ErrClosed .
	ErrClosed = errors.New("closed")

	// ErrInvalidCRLF .
	ErrInvalidCRLF = errors.New("invalid cr/lf at the end of line")

	// ErrInvalidHTTPVersion .
	ErrInvalidHTTPVersion = errors.New("invalid HTTP version")

	// ErrInvalidHTTPStatusCode .
	ErrInvalidHTTPStatusCode = errors.New("invalid HTTP status code")
	// ErrInvalidHTTPStatus .
	ErrInvalidHTTPStatus = errors.New("invalid HTTP status")

	// ErrInvalidMethod .
	ErrInvalidMethod = errors.New("invalid HTTP method")

	// ErrInvalidRequestURI .
	ErrInvalidRequestURI = errors.New("invalid URL")

	// ErrInvalidHost .
	ErrInvalidHost = errors.New("invalid host")

	// ErrInvalidPort .
	ErrInvalidPort = errors.New("invalid port")

	// ErrInvalidPath .
	ErrInvalidPath = errors.New("invalid path")

	// ErrInvalidQueryString .
	ErrInvalidQueryString = errors.New("invalid query string")

	// ErrInvalidFragment .
	ErrInvalidFragment = errors.New("invalid fragment")

	// ErrCRExpected .
	ErrCRExpected = errors.New("CR character expected")

	// ErrLFExpected .
	ErrLFExpected = errors.New("LF character expected")

	// ErrInvalidCharInHeader .
	ErrInvalidCharInHeader = errors.New("invalid character in header")

	// ErrUnexpectedContentLength .
	ErrUnexpectedContentLength = errors.New("unexpected content-length header")

	// ErrInvalidContentLength .
	ErrInvalidContentLength = errors.New("invalid ContentLength")

	// ErrInvalidChunkSize .
	ErrInvalidChunkSize = errors.New("invalid chunk size")

	// ErrTrailerExpected .
	ErrTrailerExpected = errors.New("trailer expected")

	// ErrTooLong .
	ErrTooLong = errors.New("invalid http message: too long")
)
View Source
var (
	// ErrInvalidH2SM .
	ErrInvalidH2SM = errors.New("invalid http2 SM characters")

	// ErrInvalidH2HeaderR .
	ErrInvalidH2HeaderR = errors.New("invalid http2 SM characters")
)
View Source
var (
	// ErrClientUnsupportedSchema .
	ErrClientUnsupportedSchema = errors.New("unsupported schema")

	// ErrClientTimeout .
	ErrClientTimeout = errors.New("timeout")

	// ErrClientClosed .
	ErrClientClosed = errors.New("http client closed")
)
View Source
var (
	DefaultHTTPReadLimit = 20 * 1024 * 1024
)
View Source
var (
	// ErrNilConn .
	ErrNilConn = errors.New("nil Conn")
)

Functions

func WithAddr

func WithAddr(addr string) config

如果你仅仅想监听内网ip,或者多个端口,使用这个 WithAddr("127.0.0.1:8080") WithAddr(":8081")

func WithBalancingRand

func WithBalancingRand() config

修改负载均衡为随机,默认根据fd取模负载

func WithManagerNum

func WithManagerNum(num int) config

func WithMaxWorkerNum

func WithMaxWorkerNum(num int) config

func WithReadLimit

func WithReadLimit(num int) config

func WithTcpBuff

func WithTcpBuff(num int) config

func WithWsConfig

func WithWsConfig(cfg websocket.Config) config

Types

type BodyReader

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

BodyReader .

func NewBodyReader

func NewBodyReader(buffer *bpool.Buff) *BodyReader

NewBodyReader creates a BodyReader.

func (*BodyReader) Append

func (br *BodyReader) Append(data []byte)

Append .

func (*BodyReader) Close

func (br *BodyReader) Close() error

Close implements io. Closer.

func (*BodyReader) RawBody

func (br *BodyReader) RawBody() []byte

func (*BodyReader) Read

func (br *BodyReader) Read(p []byte) (int, error)

Read implements io.Reader.

func (*BodyReader) TakeOver

func (br *BodyReader) TakeOver() *bpool.Buff

type Engine

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

func New

func New(name string, port int, c ...config) *Engine

快速的http server 仅仅支持http协议,如果需要https,可以通过nginx做反向代理

func (*Engine) Get

func (e *Engine) Get(uri string, handler func(ctx *kernel.Context, request *Request))

func (*Engine) GetGroup

func (e *Engine) GetGroup(uriGroup string) *GetGroup

GetGroup 返回一个url组 用法 e := New("web",8080) g := e.Group("/v1") // 组为根目录 host/v1

{
		g.Get("/login",handler)  // 响应url: host/v1/login
}

func (*Engine) GetWebsocket

func (e *Engine) GetWebsocket(uri string, handler *kernel.Actor, args ...interface{})

func (*Engine) Post

func (e *Engine) Post(uri string, handler func(ctx *kernel.Context, request *Request))

func (*Engine) PostGroup

func (e *Engine) PostGroup(uriGroup string) *PostGroup

func (*Engine) Run

func (e *Engine) Run() error

type GetGroup

type GetGroup Group

func (*GetGroup) Get

func (g *GetGroup) Get(uri string, handler handlerFunc)

GET

func (*GetGroup) GetWebsocket

func (g *GetGroup) GetWebsocket(uri string, handler *kernel.Actor)

func (*GetGroup) Group

func (g *GetGroup) Group(uriGroup string) *GetGroup

func (*GetGroup) SetInterceptor

func (g *GetGroup) SetInterceptor(f func(r *Request) bool)

设置拦截器

type Group

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

type Parser

type Parser struct {
	Conn *nbio.Conn
	// contains filtered or unexported fields
}

Parser .

func NewParser

func NewParser(onRequest func(conn *nbio.Conn, r *http.Request), conn *nbio.Conn, readLimit int) *Parser

NewParser .

func (*Parser) Close

func (p *Parser) Close(err error)

Close .

func (*Parser) Read

func (p *Parser) Read(data []byte) error

Read .

type PostGroup

type PostGroup Group

func (*PostGroup) Group

func (g *PostGroup) Group(uriGroup string) *PostGroup

func (*PostGroup) Post

func (g *PostGroup) Post(uri string, handler handlerFunc)

POST

func (*PostGroup) SetInterceptor

func (g *PostGroup) SetInterceptor(f func(r *Request) bool)

设置拦截器

type Request

type Request struct {
	*http.Request
	Conn net.Conn
	// contains filtered or unexported fields
}

func (*Request) AddBody

func (r *Request) AddBody(body []byte)

func (*Request) AddCookie

func (r *Request) AddCookie(name, value string)

func (*Request) AddCookieExpire

func (r *Request) AddCookieExpire(name, value string, Second int)

func (*Request) AddHead

func (r *Request) AddHead(name, value string)

func (*Request) AddJsonBody

func (r *Request) AddJsonBody(rs interface{})

func (*Request) CacheTime

func (r *Request) CacheTime(time int)

func (*Request) FormValue

func (r *Request) FormValue(key string) (value string)

返回表单单个value

func (*Request) FormValues

func (r *Request) FormValues(key string) (values []string)

返回表单多个values

func (*Request) Json

func (r *Request) Json() ejson.Json

把整个body解析为json

func (*Request) Lookup

func (r *Request) Lookup(key string) (value string)

返回查询字符串的值

func (*Request) RemoteIP

func (r *Request) RemoteIP() string

func (*Request) Reply

func (r *Request) Reply(statusCode int, body []byte) error

可以提前根据自己的需要,提前返回

func (*Request) Reply304

func (r *Request) Reply304(ETag string)

func (*Request) ResponseWriter

func (r *Request) ResponseWriter() http.ResponseWriter

func (*Request) SetCookie

func (r *Request) SetCookie(name, value string)

func (*Request) SetCookieExpire

func (r *Request) SetCookieExpire(name, value string, Second int)

func (*Request) SetHead

func (r *Request) SetHead(name, value string)

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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