Explorar o código

Eliminate the buggy HTTP parser (#7235)

Andy Pan %!s(int64=3) %!d(string=hai) anos
pai
achega
4cf23c521d
Modificáronse 3 ficheiros con 19 adicións e 19 borrados
  1. 6 2
      frameworks/Go/gnet/src/go.mod
  2. 0 4
      frameworks/Go/gnet/src/go.sum
  3. 13 13
      frameworks/Go/gnet/src/main.go

+ 6 - 2
frameworks/Go/gnet/src/go.mod

@@ -3,9 +3,13 @@ module gnet
 go 1.17
 
 require (
-	github.com/evanphx/wildcat v0.0.0-20141114174135-e7012f664567
 	github.com/panjf2000/gnet/v2 v2.0.2
-	github.com/vektra/errors v0.0.0-20140903201135-c64d83aba85a // indirect
 	go.uber.org/multierr v1.8.0 // indirect
 	golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5 // indirect
 )
+
+require (
+	go.uber.org/atomic v1.9.0 // indirect
+	go.uber.org/zap v1.21.0 // indirect
+	gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
+)

+ 0 - 4
frameworks/Go/gnet/src/go.sum

@@ -5,8 +5,6 @@ github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZx
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/evanphx/wildcat v0.0.0-20141114174135-e7012f664567 h1:7+oQw6YjB/kk9x27AEC7DMXudqERHD583hZpno18lRw=
-github.com/evanphx/wildcat v0.0.0-20141114174135-e7012f664567/go.mod h1:XNGflD53X+hfdCAt1NGeBUgiUpe9QmweW/zI1gV26Zw=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
@@ -25,8 +23,6 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
 github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
-github.com/vektra/errors v0.0.0-20140903201135-c64d83aba85a h1:lUVfiMMY/te9icPKBqOKkBIMZNxSpM90dxokDeCcfBg=
-github.com/vektra/errors v0.0.0-20140903201135-c64d83aba85a/go.mod h1:KUxJS71XlMs+ztT+RzsLRoWUQRUpECo/+Rb0EBk8/Wc=
 github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
 go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=

+ 13 - 13
frameworks/Go/gnet/src/main.go

@@ -1,6 +1,8 @@
 package main
 
 import (
+	"bytes"
+	"errors"
 	"flag"
 	"fmt"
 	"log"
@@ -8,7 +10,6 @@ import (
 	"sync/atomic"
 	"time"
 
-	"github.com/evanphx/wildcat"
 	"github.com/panjf2000/gnet/v2"
 )
 
@@ -21,8 +22,8 @@ type httpServer struct {
 }
 
 type httpCodec struct {
-	parser *wildcat.HTTPParser
-	buf    []byte
+	delimiter []byte
+	buf       []byte
 }
 
 func (hc *httpCodec) appendResponse() {
@@ -32,8 +33,13 @@ func (hc *httpCodec) appendResponse() {
 	hc.buf = append(hc.buf, "\r\nContent-Length: 13\r\n\r\nHello, World!"...)
 }
 
+var errCRLFNotFound = errors.New("CRLF not found")
+
 func (hc *httpCodec) parse(data []byte) (int, error) {
-	return hc.parser.Parse(data)
+	if idx := bytes.Index(data, hc.delimiter); idx != -1 {
+		return idx + 4, nil
+	}
+	return -1, errCRLFNotFound
 }
 
 func (hc *httpCodec) reset() {
@@ -47,7 +53,7 @@ func (hs *httpServer) OnBoot(eng gnet.Engine) gnet.Action {
 }
 
 func (hs *httpServer) OnOpen(c gnet.Conn) ([]byte, gnet.Action) {
-	c.SetContext(&httpCodec{parser: wildcat.NewHTTPParser()})
+	c.SetContext(&httpCodec{delimiter: []byte("\r\n\r\n")})
 	return nil, gnet.None
 }
 
@@ -55,18 +61,12 @@ func (hs *httpServer) OnTraffic(c gnet.Conn) gnet.Action {
 	buf, _ := c.Next(-1)
 	hc := c.Context().(*httpCodec)
 pipeline:
-	headerOffset, err := hc.parse(buf)
+	nextOffset, err := hc.parse(buf)
 	if err != nil {
-		log.Println("ERROR: failed to parse HTTP request,", err)
 		goto response
 	}
 	hc.appendResponse()
-	//bodyLen := int(hc.parser.ContentLength())
-	//if bodyLen == -1 {
-	//	bodyLen = 0
-	//}
-	//buf = buf[headerOffset+bodyLen:]
-	buf = buf[headerOffset:]
+	buf = buf[nextOffset:]
 	if len(buf) > 0 {
 		goto pipeline
 	}