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 }
func (s *Service) startApi(file *proxy.FileDescriptor) error { addr := fmt.Sprintf("%s:%d", s.options.ApiInterface, s.options.ApiPort) server := &http.Server{ Addr: addr, Handler: s.apiApp.GetHandler(), ReadTimeout: s.options.ServerReadTimeout, WriteTimeout: s.options.ServerWriteTimeout, MaxHeaderBytes: 1 << 20, } var listener net.Listener if file != nil { var err error listener, err = file.ToListener() if err != nil { return err } } s.apiServer = manners.NewWithOptions(manners.Options{Server: server, Listener: listener}) return s.apiServer.ListenAndServe() }