()
| 394 | } |
| 395 | |
| 396 | func (s *Proxy) serveProxy() { |
| 397 | if s.IsClosed() { |
| 398 | return |
| 399 | } |
| 400 | defer s.Close() |
| 401 | |
| 402 | log.Warnf("[%p] proxy start service on %s", s, s.lproxy.Addr()) |
| 403 | |
| 404 | eh := make(chan error, 1) |
| 405 | go func(l net.Listener) (err error) { |
| 406 | defer func() { |
| 407 | eh <- err |
| 408 | }() |
| 409 | for { |
| 410 | c, err := s.acceptConn(l) |
| 411 | if err != nil { |
| 412 | return err |
| 413 | } |
| 414 | NewSession(c, s.config).Start(s.router) |
| 415 | } |
| 416 | }(s.lproxy) |
| 417 | |
| 418 | if d := s.config.BackendPingPeriod.Duration(); d != 0 { |
| 419 | go s.keepAlive(d) |
| 420 | } |
| 421 | |
| 422 | select { |
| 423 | case <-s.exit.C: |
| 424 | log.Warnf("[%p] proxy shutdown", s) |
| 425 | case err := <-eh: |
| 426 | log.ErrorErrorf(err, "[%p] proxy exit on error", s) |
| 427 | } |
| 428 | } |
| 429 | |
| 430 | func (s *Proxy) keepAlive(d time.Duration) { |
| 431 | var ticker = time.NewTicker(math2.MaxDuration(d, time.Second)) |
no test coverage detected