Last active
December 14, 2016 11:53
-
-
Save shiyanhui/f29b99fb7a0986dd743e23cd7e0b87b9 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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