Package request implements an HTTP request reader.
go get github.com/hslam/request
import "github.com/hslam/request"
package main
import (
"bufio""github.com/hslam/mux""github.com/hslam/request""github.com/hslam/response""net""net/http"
)
funcmain() {
m:=mux.New()
m.HandleFunc("/", func(w http.ResponseWriter, r*http.Request) {
w.Write([]byte("Hello World"))
})
ListenAndServe(":8080", m)
}
funcListenAndServe(addrstring, handler http.Handler) error {
ln, err:=net.Listen("tcp", addr)
iferr!=nil {
returnerr
}
for {
conn, err:=ln.Accept()
iferr!=nil {
returnerr
}
gofunc(conn net.Conn) {
reader:=bufio.NewReader(conn)
rw:=bufio.NewReadWriter(reader, bufio.NewWriter(conn))
varerrerrorvarreq*http.Requestfor {
req, err=request.ReadFastRequest(reader)
iferr!=nil {
break
}
res:=response.NewResponse(req, conn, rw)
handler.ServeHTTP(res, req)
res.FinishRequest()
request.FreeRequest(req)
response.FreeResponse(res)
}
}(conn)
}
}package main
import (
"bufio""github.com/hslam/mux""github.com/hslam/netpoll""github.com/hslam/request""github.com/hslam/response""net""net/http""sync"
)
funcmain() {
m:=mux.New()
m.HandleFunc("/", func(w http.ResponseWriter, r*http.Request) {
w.Write([]byte("Hello World"))
})
ListenAndServe(":8080", m)
}
funcListenAndServe(addrstring, handler http.Handler) error {
varh=&netpoll.ConnHandler{}
typeContextstruct {
reader*bufio.Readerrw*bufio.ReadWriterconn net.Connserving sync.Mutex
}
h.SetUpgrade(func(conn net.Conn) (netpoll.Context, error) {
reader:=bufio.NewReader(conn)
rw:=bufio.NewReadWriter(reader, bufio.NewWriter(conn))
return&Context{reader: reader, conn: conn, rw: rw}, nil
})
h.SetServe(func(context netpoll.Context) error {
ctx:=context.(*Context)
ctx.serving.Lock()
req, err:=request.ReadFastRequest(ctx.reader)
iferr!=nil {
ctx.serving.Unlock()
returnerr
}
res:=response.NewResponse(req, ctx.conn, ctx.rw)
handler.ServeHTTP(res, req)
res.FinishRequest()
ctx.serving.Unlock()
request.FreeRequest(req)
response.FreeResponse(res)
returnnil
})
returnnetpoll.ListenAndServe("tcp", addr, h)
}curl -XGET http://localhost:8080
Hello World
This package is licensed under a MIT license (Copyright (c) 2020 Meng Huang)
request was written by Meng Huang.