func main() { rootConfig, err := config.NewConfig(os.Args) logger := rootConfig.Logger err = rootConfig.Validate() if err != nil { logger.Fatal("Error validating config:", err, lager.Data{"config": rootConfig}) } go func() { logger.Info(fmt.Sprintf("Starting profiling server on port %d", rootConfig.ProfilerPort)) err := http.ListenAndServe(fmt.Sprintf("0.0.0.0:%d", rootConfig.ProfilerPort), nil) if err != nil { logger.Error("profiler failed with error", err) } }() if _, err := os.Stat(rootConfig.StaticDir); os.IsNotExist(err) { logger.Fatal(fmt.Sprintf("staticDir: %s does not exist", rootConfig.StaticDir), nil) } backends := domain.NewBackends(rootConfig.Proxy.Backends, logger) arpManager := domain.NewArmManager(logger) cluster := domain.NewCluster( backends, rootConfig.Proxy.HealthcheckTimeout(), logger, arpManager, ) handler := api.NewHandler(backends, logger, rootConfig.API, rootConfig.StaticDir) members := grouper.Members{ { Name: "proxy", Runner: proxy.NewRunner(cluster, rootConfig.Proxy.Port, logger), }, { Name: "api", Runner: api.NewRunner(rootConfig.API.Port, handler, logger), }, } if rootConfig.HealthPort != rootConfig.API.Port { members = append(members, grouper.Member{ Name: "health", Runner: health.NewRunner(rootConfig.HealthPort, logger), }) } group := grouper.NewDynamic(os.Kill, len(members), len(members)) process := ifrit.Invoke(group) inserter := group.Client().Inserter() for _, member := range members { inserter <- member } group.Client().Close() err = waitUntilReady(process, logger) if err != nil { logger.Fatal("Error starting switchboard", err, lager.Data{"proxyConfig": rootConfig.Proxy}) } logger.Info("Proxy started", lager.Data{"proxyConfig": rootConfig.Proxy}) err = ioutil.WriteFile(rootConfig.PidFile, []byte(strconv.Itoa(os.Getpid())), 0644) if err == nil { logger.Info(fmt.Sprintf("Wrote pidFile to %s", rootConfig.PidFile)) } else { logger.Fatal("Cannot write pid to file", err, lager.Data{"pidFile": rootConfig.PidFile}) } err = <-process.Wait() if err != nil { logger.Fatal("Switchboard exited unexpectedly", err, lager.Data{"proxyConfig": rootConfig.Proxy}) } }
) var _ = Describe("Handler", func() { var ( handler http.Handler responseRecorder *httptest.ResponseRecorder ) JustBeforeEach(func() { backends := &domainfakes.FakeBackends{} logger := lagertest.NewTestLogger("Handler Test") config := config.API{ ForceHttps: true, } staticDir := "" handler = api.NewHandler(backends, logger, config, staticDir) }) Context("when a request panics", func() { var ( realBackendsIndex func(backends domain.Backends) http.Handler responseWriter *apifakes.FakeResponseWriter request *http.Request ) BeforeEach(func() { realBackendsIndex = api.BackendsIndex api.BackendsIndex = func(domain.Backends) http.Handler { return http.HandlerFunc(func(http.ResponseWriter, *http.Request) { panic("fake request panic") })