func (s *Server) Run() error { // bind a port to handle TLS connections l, err := net.Listen("tcp", s.Configuration.BindAddr) if err != nil { return err } s.Printf("Serving connections on %v", l.Addr()) // start muxing on it s.mux, err = vhost.NewTLSMuxer(l, muxTimeout) if err != nil { return err } // wait for all frontends to finish s.wait.Add(len(s.Frontends)) // setup muxing for each frontend for name, front := range s.Frontends { fl, err := s.mux.Listen(name) if err != nil { return err } go s.runFrontend(name, front, fl) } // custom error handler so we can log errors go func() { for { conn, err := s.mux.NextError() if conn == nil { s.Printf("Failed to mux next connection, error: %v", err) if _, ok := err.(vhost.Closed); ok { return } else { continue } } else { if _, ok := err.(vhost.NotFound); ok && s.defaultFrontend != nil { go s.proxyConnection(conn, s.defaultFrontend) } else { s.Printf("Failed to mux connection from %v, error: %v", conn.RemoteAddr(), err) // XXX: respond with valid TLS close messages conn.Close() } } } }() // we're ready, signal it for testing if s.ready != nil { close(s.ready) } s.wait.Wait() return nil }
func NewTLSBinder(addr, publicBaseAddr string, muxTimeout time.Duration) (*TLSBinder, error) { listener, err := net.Listen("tcp", addr) if err != nil { return nil, err } mux, err := vhost.NewTLSMuxer(listener, muxTimeout) if err != nil { return nil, err } binder := &TLSBinder{ mux: mux, publicBaseAddr: publicBaseAddr, } go mux.HandleErrors() return binder, nil }