func (s *srv) start() error { log.Infof("%s start", s) switch s.state { case srvStateInit: listener, err := net.Listen(s.listener.Address.Network, s.listener.Address.Address) if err != nil { return err } if s.isTLS() { config, err := s.newTLSConfig() if err != nil { return err } listener = manners.NewTLSListener( manners.TCPKeepAliveListener{listener.(*net.TCPListener)}, config) } s.srv = manners.NewWithOptions( manners.Options{ Server: s.newHTTPServer(), Listener: listener, StateHandler: s.mux.connTracker.onStateChange, }) s.state = srvStateActive go s.serve(s.srv) return nil case srvStateHijacked: s.state = srvStateActive go s.serve(s.srv) return nil } return fmt.Errorf("%v Calling start in unsupported state", s) }
func (s *srv) takeFile(f *FileDescriptor) error { log.Infof("%s takeFile %v", s, f) listener, err := f.ToListener() if err != nil { return err } if s.isTLS() { tcpListener, ok := listener.(*net.TCPListener) if !ok { return fmt.Errorf(`%s failed to take file descriptor - it is running in TLS mode so I need a TCP listener, but the file descriptor that was given corresponded to a listener of type %T. More about file descriptor: %s`, listener, s, f) } config, err := s.newTLSConfig() if err != nil { return err } listener = manners.NewTLSListener( manners.TCPKeepAliveListener{tcpListener}, config) } s.srv = manners.NewWithOptions( manners.Options{ Server: s.newHTTPServer(), Listener: listener, StateHandler: s.mux.connTracker.onStateChange, }) s.state = srvStateHijacked return nil }