package web import ( "fmt" "log" "net/http" "status/config" "status/storage" "status/web/handler" "status/web/session" ) func httpToHTTPSHandler() *http.ServeMux { handleRedirect := func(w http.ResponseWriter, r *http.Request) { newURI := "https://" + r.Host + r.URL.String() http.Redirect(w, r, newURI, http.StatusFound) } mux := &http.ServeMux{} mux.HandleFunc("/", handleRedirect) return mux } func Serve(data *storage.Storage, cfg *config.Config) error { var err error sess := session.New(cfg.SessionKey, data) s, err := handler.New(cfg, sess, data) if err != nil { log.Fatal(err) } switch cfg.Env { case "PROD": go func() { fmt.Printf("Starting HTTP server on :443\n") err := http.ListenAndServeTLS(":443", cfg.CertFile, cfg.KeyFile, s) if err != nil { log.Fatalf("httpsSrv.ListendAndServeTLS() failed with %s", err) } }() fmt.Printf("Starting HTTP to HTTPS server on :80\n") err = http.ListenAndServe(":80", httpToHTTPSHandler()) break default: fmt.Printf("Starting HTTP server on port 8000\n") err = http.ListenAndServe(":8000", s) } return err }