httparser

package module
v0.0.4 Latest Latest
Warning

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

Go to latest
Published: Feb 8, 2021 License: Apache-2.0 Imports: 5 Imported by: 1

README

httparser

Go codecov

高性能http 1.1解析器,为你的异步io库插上解析的翅膀[从零实现]

出发点

本来想基于异步io库写些好玩的代码,发现没有适用于这些库的http解析库,索性就自己写个,弥补golang生态一小片空白领域。

特性

  • url解析
  • request or response header field解析
  • request or response header value解析
  • Content-Length数据包解析
  • chunked数据包解析

parser request

	var data = []byte(
		"POST /joyent/http-parser HTTP/1.1\r\n" +
			"Host: github.com\r\n" +
			"DNT: 1\r\n" +
			"Accept-Encoding: gzip, deflate, sdch\r\n" +
			"Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4\r\n" +
			"User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) " +
			"AppleWebKit/537.36 (KHTML, like Gecko) " +
			"Chrome/39.0.2171.65 Safari/537.36\r\n" +
			"Accept: text/html,application/xhtml+xml,application/xml;q=0.9," +
			"image/webp,*/*;q=0.8\r\n" +
			"Referer: https://github.com/joyent/http-parser\r\n" +
			"Connection: keep-alive\r\n" +
			"Transfer-Encoding: chunked\r\n" +
			"Cache-Control: max-age=0\r\n\r\nb\r\nhello world\r\n0\r\n")

	var setting = httparser.Setting{
		MessageBegin: func(*httparser.Parser) {
			//解析器开始工作
			fmt.Printf("begin\n")
		},
		URL: func(_ *httparser.Parser, buf []byte) {
			//url数据
			fmt.Printf("url->%s\n", buf)
		},
		Status: func(*httparser.Parser, []byte) {
			// 响应包才需要用到
		},
		HeaderField: func(_ *httparser.Parser, buf []byte) {
			// http header field
			fmt.Printf("header field:%s\n", buf)
		},
		HeaderValue: func(_ *httparser.Parser, buf []byte) {
			// http header value
			fmt.Printf("header value:%s\n", buf)
		},
		HeadersComplete: func(_ *httparser.Parser) {
			// http header解析结束
			fmt.Printf("header complete\n")
		},
		Body: func(_ *httparser.Parser, buf []byte) {
			fmt.Printf("%s", buf)
			// Content-Length 或者chunked数据包
		},
		MessageComplete: func(_ *httparser.Parser) {
			// 消息解析结束
			fmt.Printf("\n")
		},
	}

	p := httparser.New(httparser.REQUEST)
	success, err := p.Execute(&setting, data)

	fmt.Printf("success:%d, err:%v\n", success, err)

response

response

request or response

如果你不确定数据包是请求还是响应,可看下面的例子
request or response

编译

生成 unhex表和tokens表

如果需要修改这两个表,可以到_cmd目录下面修改生成代码的代码

make gen
编译example
make example
运行示例
make example.run
return value
  • err != nil 错误
  • sucess == len(data) 所有数据成功解析
  • sucess < len(data) 只解析部分数据,未解析的数据需再送一次
吞吐量

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrHTTPVersion     = errors.New("http version")
	ErrHTTPVersionNum  = errors.New("http version number")
	ErrHTTPStatus      = errors.New("http status")
	ErrRspStatusLine   = errors.New("http rsp status line")
	ErrHeaderOverflow  = errors.New("http header overflow")
	ErrNoEndLF         = errors.New("http there is no end symbol")
	ErrChunkSize       = errors.New("http wrong chunk size")
	ErrTrailerPart     = errors.New("http trailer-part is not supported")
	ErrReqMethod       = errors.New("http request wrong method")
	ErrRequestLineCRLF = errors.New("http request line wrong CRLF")
)
View Source
var (
	MaxHeaderSize int32 = 4096 //默认http header单行最大限制为4k
)

Functions

func BytesToString

func BytesToString(b []byte) string

BytesToString 没有内存开销的转换

Types

type Parser

type Parser struct {
	MaxHeaderSize int32 //最大头长度

	StatusCode uint16 //状态码
	// contains filtered or unexported fields
}

http 1.1 or http 1.0解析器

func New

func New(t ReqOrRsp) *Parser

解析器构造函数

func (*Parser) Eof

func (p *Parser) Eof() bool

func (*Parser) Execute

func (p *Parser) Execute(setting *Setting, buf []byte) (success int, err error)

func (*Parser) Init

func (p *Parser) Init(t ReqOrRsp)

解析器Init函数

func (*Parser) Reset

func (p *Parser) Reset()

func (*Parser) SetUserData added in v0.0.3

func (p *Parser) SetUserData(d interface{})

一般情况,可以使用Setting里面函数闭包特性捕获变量 有时候了节约内存,使用普通函数,这时候用户数据可以放到p.userData里面

func (*Parser) Status added in v0.0.2

func (p *Parser) Status() string

debug专用

type ReqOrRsp

type ReqOrRsp uint8
const (
	REQUEST ReqOrRsp = iota + 1
	RESPONSE
	BOTH
)

type Setting

type Setting struct {
	// 解析开始
	MessageBegin func(*Parser)
	// url 回调函数, 只有在request包才会回调
	URL func(*Parser, []byte)
	// 状态短语
	Status func(*Parser, []byte)
	// http field 回调函数
	HeaderField func(*Parser, []byte)
	// http value 回调函数
	HeaderValue func(*Parser, []byte)
	// http 解析完成之后的回调函数
	HeadersComplete func(*Parser)
	// body的回调函数
	Body func(*Parser, []byte)
	// 所有消息成功解析
	MessageComplete func(*Parser)
}

查阅#6 看设计变更原因

type TwoBuf added in v0.0.4

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

func NewTwoBuf added in v0.0.4

func NewTwoBuf(size int) *TwoBuf

新建twobuf, size表明单个块的大小

func (*TwoBuf) All added in v0.0.4

func (t *TwoBuf) All(right int) []byte

获取全部buf, 如果没有溢出数据,就取右边 如果有溢出数据,就把溢出数据也包含进来

func (*TwoBuf) MoveLeft added in v0.0.4

func (t *TwoBuf) MoveLeft(leftBuf []byte)

移动到左边buf 如果写入数据超过left空间,会直接panic

func (*TwoBuf) Reset added in v0.0.4

func (t *TwoBuf) Reset()

func (*TwoBuf) Right added in v0.0.4

func (t *TwoBuf) Right() []byte

获取右边buf

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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