diff --git a/http/main.go b/http/main.go index 8c8f161..a4ce39e 100644 --- a/http/main.go +++ b/http/main.go @@ -1,70 +1,25 @@ package main import ( - "encoding/gob" "log" "net/http" - "strings" lishwist "lishwist/core" - "lishwist/http/api" "lishwist/http/env" - "lishwist/http/router" - "lishwist/http/routing" - "lishwist/http/session" + "lishwist/http/server" ) -func prefixMovedPermanently(before, after string) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - suffix := strings.TrimPrefix(r.RequestURI, before) - http.Redirect(w, r, after+suffix, http.StatusMovedPermanently) - } -} - func main() { - gob.Register(&api.RegisterProps{}) - gob.Register(&api.LoginProps{}) - err := lishwist.Init(env.DatabaseFile) if err != nil { log.Fatalf("Failed to init Lishwist: %s\n", err) } - store := session.NewInMemoryStore([]byte(env.SessionSecret)) - store.Options.MaxAge = 86_400 // 24 hours in seconds - store.Options.Secure = !env.InDev - store.Options.HttpOnly = true - - r := router.New(store) - - r.Public.HandleFunc("GET /", routing.Login) - r.Public.HandleFunc("GET /groups/{groupReference}", routing.PublicGroup) - r.Public.HandleFunc("GET /lists/{userReference}", routing.PublicWishlist) - r.Public.HandleFunc("GET /register", routing.Register) - r.Public.HandleFunc("POST /", routing.LoginPost) - r.Public.HandleFunc("POST /register", routing.RegisterPost) - - r.Private.HandleFunc("GET /", routing.NotFound) - r.Private.HandleFunc("GET /groups", routing.ExpectAppSession(routing.Groups)) - r.Private.HandleFunc("GET /groups/{groupReference}", routing.ExpectAppSession(routing.Group)) - r.Private.HandleFunc("GET /lists/{userReference}", routing.ExpectAppSession(routing.ForeignWishlist)) - r.Private.HandleFunc("GET /users", routing.ExpectAppSession(routing.Users)) - r.Private.HandleFunc("GET /users/{userReference}", routing.ExpectAppSession(routing.User)) - r.Private.HandleFunc("GET /{$}", routing.ExpectAppSession(routing.Home)) - r.Private.HandleFunc("POST /groups/{groupReference}", routing.ExpectAppSession(routing.GroupPost)) - r.Private.HandleFunc("POST /list/{userReference}", routing.ExpectAppSession(routing.ForeignWishlistPost)) - r.Private.HandleFunc("POST /logout", routing.LogoutPost) - r.Private.HandleFunc("POST /users/{userReference}", routing.ExpectAppSession(routing.UserPost)) - r.Private.HandleFunc("POST /{$}", routing.ExpectAppSession(routing.HomePost)) - - // Deprecated - http.Handle("GET /group/{groupReference}", prefixMovedPermanently("/group/", "/groups/")) - http.Handle("GET /list/{userReference}", prefixMovedPermanently("/list/", "/lists/")) - - http.Handle("/", r) + useSecureCookies := !env.InDev + r := server.Create(useSecureCookies) log.Printf("Running at http://127.0.0.1:%s\n", env.ServePort) - err = http.ListenAndServe(":"+env.ServePort, nil) + err = http.ListenAndServe(":"+env.ServePort, r) if err != nil { log.Fatalln("Failed to listen and server:", err) } diff --git a/http/router/router.go b/http/router/router.go index 5f4386e..4387305 100644 --- a/http/router/router.go +++ b/http/router/router.go @@ -17,7 +17,6 @@ func (s *VisibilityRouter) ServeHTTP(w http.ResponseWriter, r *http.Request) { session, _ := s.store.Get(r, "lishwist_user") _, authorized := session.Values["sessionKey"] - if authorized { s.Private.ServeHTTP(w, r) } else { @@ -32,3 +31,8 @@ func New(store *session.Store) *VisibilityRouter { Private: response.NewServeMux(store), } } + +func (r *VisibilityRouter) HandleFunc(pattern string, handler response.HandlerFunc) { + r.Public.HandleFunc(pattern, handler) + r.Private.HandleFunc(pattern, handler) +} diff --git a/http/server/server.go b/http/server/server.go new file mode 100644 index 0000000..8b18eea --- /dev/null +++ b/http/server/server.go @@ -0,0 +1,61 @@ +package server + +import ( + "encoding/gob" + "net/http" + "strings" + + "lishwist/http/api" + "lishwist/http/env" + "lishwist/http/response" + "lishwist/http/router" + "lishwist/http/routing" + "lishwist/http/session" + + "github.com/Teajey/rsvp" +) + +func prefixMovedPermanently(before, after string) response.HandlerFunc { + return func(s *response.Session, h http.Header, r *http.Request) rsvp.Response { + suffix := strings.TrimPrefix(r.RequestURI, before) + return rsvp.MovedPermanently(after + suffix) + } +} + +func Create(useSecureCookies bool) *router.VisibilityRouter { + gob.Register(&api.RegisterProps{}) + gob.Register(&api.LoginProps{}) + + store := session.NewInMemoryStore([]byte(env.SessionSecret)) + store.Options.MaxAge = 86_400 // 24 hours in seconds + store.Options.Secure = useSecureCookies + store.Options.HttpOnly = true + + r := router.New(store) + + r.Public.HandleFunc("GET /", routing.Login) + r.Public.HandleFunc("GET /groups/{groupReference}", routing.PublicGroup) + r.Public.HandleFunc("GET /lists/{userReference}", routing.PublicWishlist) + r.Public.HandleFunc("GET /register", routing.Register) + r.Public.HandleFunc("POST /", routing.LoginPost) + r.Public.HandleFunc("POST /register", routing.RegisterPost) + + r.Private.HandleFunc("GET /", routing.NotFound) + r.Private.HandleFunc("GET /groups", routing.ExpectAppSession(routing.Groups)) + r.Private.HandleFunc("GET /groups/{groupReference}", routing.ExpectAppSession(routing.Group)) + r.Private.HandleFunc("GET /lists/{userReference}", routing.ExpectAppSession(routing.ForeignWishlist)) + r.Private.HandleFunc("GET /users", routing.ExpectAppSession(routing.Users)) + r.Private.HandleFunc("GET /users/{userReference}", routing.ExpectAppSession(routing.User)) + r.Private.HandleFunc("GET /{$}", routing.ExpectAppSession(routing.Home)) + r.Private.HandleFunc("POST /groups/{groupReference}", routing.ExpectAppSession(routing.GroupPost)) + r.Private.HandleFunc("POST /list/{userReference}", routing.ExpectAppSession(routing.ForeignWishlistPost)) + r.Private.HandleFunc("POST /logout", routing.LogoutPost) + r.Private.HandleFunc("POST /users/{userReference}", routing.ExpectAppSession(routing.UserPost)) + r.Private.HandleFunc("POST /{$}", routing.ExpectAppSession(routing.HomePost)) + + // Deprecated + r.HandleFunc("GET /group/{groupReference}", prefixMovedPermanently("/group/", "/groups/")) + r.HandleFunc("GET /list/{userReference}", prefixMovedPermanently("/list/", "/lists/")) + + return r +}