Serve accepts incoming connections on the Listener l, creating a new connection goroutine for each. The connection goroutines read requests and then calls srv.Handler to handle sessions. Serve always returns a non-nil error.
(l net.Listener)
| 234 | // |
| 235 | // Serve always returns a non-nil error. |
| 236 | func (srv *Server) Serve(l net.Listener) error { |
| 237 | srv.ensureHandlers() |
| 238 | defer l.Close() |
| 239 | if err := srv.ensureHostSigner(); err != nil { |
| 240 | return err |
| 241 | } |
| 242 | if srv.Handler == nil { |
| 243 | srv.Handler = DefaultHandler |
| 244 | } |
| 245 | var tempDelay time.Duration |
| 246 | |
| 247 | srv.trackListener(l, true) |
| 248 | defer srv.trackListener(l, false) |
| 249 | for { |
| 250 | conn, e := l.Accept() |
| 251 | if e != nil { |
| 252 | select { |
| 253 | case <-srv.getDoneChan(): |
| 254 | return ErrServerClosed |
| 255 | default: |
| 256 | } |
| 257 | if ne, ok := e.(net.Error); ok && ne.Temporary() { |
| 258 | if tempDelay == 0 { |
| 259 | tempDelay = 5 * time.Millisecond |
| 260 | } else { |
| 261 | tempDelay *= 2 |
| 262 | } |
| 263 | if max := 1 * time.Second; tempDelay > max { |
| 264 | tempDelay = max |
| 265 | } |
| 266 | time.Sleep(tempDelay) |
| 267 | continue |
| 268 | } |
| 269 | return e |
| 270 | } |
| 271 | go srv.HandleConn(conn) |
| 272 | } |
| 273 | } |
| 274 | |
| 275 | func (srv *Server) HandleConn(newConn net.Conn) { |
| 276 | ctx, cancel := newContext(srv) |