Skip to content

Instantly share code, notes, and snippets.

@shiyanhui
Last active December 14, 2016 11:53
Show Gist options
  • Save shiyanhui/f29b99fb7a0986dd743e23cd7e0b87b9 to your computer and use it in GitHub Desktop.
Save shiyanhui/f29b99fb7a0986dd743e23cd7e0b87b9 to your computer and use it in GitHub Desktop.
func main() {
// how we start a http server
http.HandleFunc("/user", handler)
http.ListenAndServe(":8080", nil)
}
// src/net/http/server.go
func ListenAndServe(addr string, handler Handler) error {
server := &Server{Addr: addr, Handler: handler}
return server.ListenAndServe()
}
func (srv *Server) ListenAndServe() error {
addr := srv.Addr
if addr == "" {
addr = ":http"
}
ln, err := net.Listen("tcp", addr)
if err != nil {
return err
}
return srv.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)})
}
func (srv *Server) Serve(l net.Listener) error {
// ...
for {
rw, e := l.Accept()
if e != nil {
// 处理错误
return e
}
tempDelay = 0
c := srv.newConn(rw)
c.setState(c.rwc, StateNew) // before Serve can return
go c.serve(ctx)
}
}
func (c *conn) serve(ctx context.Context) {
// pre handle
for {
w, err := c.readRequest(ctx)
// handle w and err
serverHandler{c.server}.ServeHTTP(w, w.req)
// post handle
}
}
type serverHandler struct {
srv *Server
}
func (sh serverHandler) ServeHTTP(rw ResponseWriter, req *Request) {
handler := sh.srv.Handler
if handler == nil {
handler = DefaultServeMux
}
if req.RequestURI == "*" && req.Method == "OPTIONS" {
handler = globalOptionsHandler{}
}
handler.ServeHTTP(rw, req)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment