package handler import ( "fmt" "github.com/gorilla/mux" "log" "net/http" "status/config" "status/storage" "status/web/session" ) func serverError(w http.ResponseWriter, err error) { log.Println("[server error]", err) http.Error(w, fmt.Sprintf("server error: %s", err), http.StatusInternalServerError) } func notFound(w http.ResponseWriter) { http.Error(w, "Page Not Found", http.StatusNotFound) } func unauthorized(w http.ResponseWriter) { http.Error(w, "Unauthorized", http.StatusUnauthorized) } type Handler struct { cfg *config.Config mux *mux.Router storage *storage.Storage sess *session.Session } //func (h *Handler) getUser(r *http.Request) (string, error) { // user, err := h.sess.Get(r) // if err != nil { // return "", err // } // if h.cfg.Env != "PROD" { // return user, err // } // // Removes "https://" from referer before checking. // // Thank you crussel for this fix! // if !strings.HasPrefix(r.Referer()[8:], h.cfg.Host) && !strings.HasPrefix(r.Referer()[8:], user+h.cfg.Host) { // err = errors.New("wrong referer") // } // return user, err //} func (h *Handler) getUser(r *http.Request) (string, error) { user, err := h.sess.Get(r) if err != nil { return "", err } return user, nil } func New(cfg *config.Config, sess *session.Session, data *storage.Storage) (http.Handler, error) { router := mux.NewRouter() h := &Handler{ cfg: cfg, mux: router, storage: data, sess: sess, } h.initTpl() router.HandleFunc("/", h.showIndexView).Methods(http.MethodGet) router.HandleFunc("/login", h.showLoginView).Methods(http.MethodGet) router.HandleFunc("/check-login", h.checkLogin).Methods(http.MethodPost) router.HandleFunc("/register", h.handleRegister) router.HandleFunc("/logout", h.logout).Methods(http.MethodGet) router.HandleFunc("/status-new", h.showNewStatusView).Methods(http.MethodGet) router.HandleFunc("/status-save", h.saveStatus).Methods(http.MethodPost) router.HandleFunc("/statuses/{id}/edit", h.showEditStatusView).Methods(http.MethodGet) router.HandleFunc("/statuses/{id}/update", h.updateStatus).Methods(http.MethodPost) router.HandleFunc("/users/{user}", h.showUserView).Methods(http.MethodGet) router.HandleFunc("/users/{user}/status.json", h.showUserStatusView).Methods(http.MethodGet) router.PathPrefix("/assets/").Handler( http.StripPrefix("/assets/", http.FileServer( http.Dir(cfg.AssetsDir), ), ), ) return router, nil }