让你的异步 io 库插上 http1.1 解析的翅膀。 httparser 来也。
httparser
高性能 http 1.1 解析器,为你的异步 io 库插上解析的翅膀,目前每秒可以处理 300MB/s 流量[从零实现]
仓库位置
https://github.com/antlabs/httparser
出发点
本来想基于异步 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.1rn" + "Host: github.comrn" + "DNT: 1rn" + "Accept-Encoding: gzip, deflate, sdchrn" + "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4rn" + "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.36rn" + "Accept: text/html,application/xhtml+xml,application/xml;q=0.9," + "image/webp,*/*;q=0.8rn" + "Referer: https://github.com/joyent/http-parserrn" + "Connection: keep-alivern" + "Transfer-Encoding: chunkedrn" + "Cache-Control: max-age=0rnrnbrnhello worldrn0rn") var setting = httparser.Setting{ MessageBegin: func() { //解析器开始工作 fmt.Printf("beginn") }, URL: func(buf []byte) { //url 数据 fmt.Printf("url->%sn", buf) }, Status: func([]byte) { // 响应包才需要用到 }, HeaderField: func(buf []byte) { // http header field fmt.Printf("header field:%sn", buf) }, HeaderValue: func(buf []byte) { // http header value fmt.Printf("header value:%sn", buf) }, HeadersComplete: func() { // http header 解析结束 fmt.Printf("header completen") }, Body: func(buf []byte) { fmt.Printf("%s", buf) // Content-Length 或者 chunked 数据包 }, MessageComplete: func() { // 消息解析结束 fmt.Printf("n") }, } p := httparser.New( httparser.REQUEST) success, err := p.Execute(&setting, data) fmt.Printf("success:%d, err:%vn", 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) 只解析部分数据,未解析的数据需再送一次
吞吐量
- 测试仓库 https://github.com/junelabs/httparser-benchmark
- Benchmark result: 8192.00 mb | 315.08 mb/s | 637803.27 req/sec | 26.00 s