// NewServerFromListener creates a server struct using a UnixListener specified // by ln. cb is the callback function which will get called for any authentication // request. func NewServerFromListener(ln *net.UnixListener, cb AuthCB) (s *Server, err error) { s = &Server{} s.sockPath = ln.Addr().String() s.cb = cb s.ln = net.Listener(ln) return }
// Start will start the SimpleServer at it's configured address. // If they are configured, this will start emitting metrics to Graphite, // register profiling, health checks and access logging. func (s *SimpleServer) Start() error { StartServerMetrics(s.cfg) healthHandler := RegisterHealthHandler(s.cfg, s.monitor, s.mux) s.cfg.HealthCheckPath = healthHandler.Path() srv := http.Server{ Handler: RegisterAccessLogger(s.cfg, s), MaxHeaderBytes: maxHeaderBytes, } l, err := net.Listen("tcp", fmt.Sprintf(":%d", s.cfg.HTTPPort)) if err != nil { return err } l = net.Listener(TCPKeepAliveListener{l.(*net.TCPListener)}) // add TLS if in the configs if s.cfg.TLSCertFile != nil && s.cfg.TLSKeyFile != nil { cert, err := tls.LoadX509KeyPair(*s.cfg.TLSCertFile, *s.cfg.TLSKeyFile) if err != nil { return err } srv.TLSConfig = &tls.Config{ Certificates: []tls.Certificate{cert}, NextProtos: []string{"http/1.1"}, } l = tls.NewListener(l, srv.TLSConfig) } go func() { if err := srv.Serve(l); err != nil { Log.Error("encountered an error while serving listener: ", err) } }() Log.Infof("Listening on %s", l.Addr().String()) // join the LB go func() { exit := <-s.exit // let the health check clean up if it needs to if err := healthHandler.Stop(); err != nil { Log.Warn("health check Stop returned with error: ", err) } // stop the listener exit <- l.Close() }() return nil }
func TestCopyFD(t *testing.T) { var l = net.Listener(newTL(t)) defer func() { if err := l.Close(); err != nil { t.Error(err) } }() if fd, err := CopyFD(l); err != nil { t.Fatal(err) } else { t.Logf("Got FD: %v\n", fd) if err := fd.Close(); err != nil { t.Error(err) } } }
// Start will start the SimpleServer at it's configured address. // If they are configured, this will start health checks and access logging. func (s *SimpleServer) Start() error { healthHandler := RegisterHealthHandler(s.cfg, s.monitor, s.mux) s.cfg.HealthCheckPath = healthHandler.Path() // if expvar, register on our router if s.cfg.Metrics.Type == metricscfg.Expvar { if s.cfg.Metrics.Path == "" { s.cfg.Metrics.Path = "/debug/vars" } s.mux.HandleFunc("GET", s.cfg.Metrics.Path, expvarHandler) } // if this is an App Engine setup, just run it here if s.cfg.appEngine { http.Handle("/", s) appengine.Main() return nil } wrappedHandler, err := NewAccessLogMiddleware(s.cfg.HTTPAccessLog, s) if err != nil { Log.Fatalf("unable to create http access log: %s", err) } srv := http.Server{ Handler: wrappedHandler, MaxHeaderBytes: maxHeaderBytes, ReadTimeout: readTimeout, WriteTimeout: writeTimeout, } l, err := net.Listen("tcp", fmt.Sprintf(":%d", s.cfg.HTTPPort)) if err != nil { return err } l = net.Listener(TCPKeepAliveListener{l.(*net.TCPListener)}) // add TLS if in the configs if s.cfg.TLSCertFile != nil && s.cfg.TLSKeyFile != nil { cert, err := tls.LoadX509KeyPair(*s.cfg.TLSCertFile, *s.cfg.TLSKeyFile) if err != nil { return err } srv.TLSConfig = &tls.Config{ Certificates: []tls.Certificate{cert}, NextProtos: []string{"http/1.1"}, } l = tls.NewListener(l, srv.TLSConfig) } go func() { if err := srv.Serve(l); err != nil { Log.Error("encountered an error while serving listener: ", err) } }() Log.Infof("Listening on %s", l.Addr().String()) // join the LB go func() { exit := <-s.exit // let the health check clean up if it needs to if err := healthHandler.Stop(); err != nil { Log.Warn("health check Stop returned with error: ", err) } // flush any remaining metrics and close connections s.mets.Stop() // stop the listener exit <- l.Close() }() return nil }