diff --git a/main.go b/main.go index 28ed9aa..51d334e 100644 --- a/main.go +++ b/main.go @@ -44,8 +44,6 @@ func main() { server.BasePath = strings.TrimSuffix(server.BasePath, "/") } - server.BasePathReady <- true - logger := log.New(os.Stdout, "", log.Ldate|log.Ltime|log.Lshortfile) configPath, err := os.UserConfigDir() diff --git a/server/handlers.go b/server/handlers.go index 211418b..af19929 100644 --- a/server/handlers.go +++ b/server/handlers.go @@ -6,6 +6,7 @@ import ( "encoding/base64" "encoding/json" "fmt" + "github.com/nkanaev/yarr/storage" "html" "html/template" "io" @@ -18,41 +19,27 @@ import ( "reflect" "strconv" "strings" - - "github.com/nkanaev/yarr/storage" ) -var routes []Route +var routes []Route = []Route{ + p("/", IndexHandler).ManualAuth(), + p("/static/*path", StaticHandler).ManualAuth(), -var BasePathReady = make(chan bool) - -func init() { - go func() { - <-BasePathReady - routes = []Route{ - p(BasePath+"/", IndexHandler).ManualAuth(), - p(BasePath+"/static/*path", StaticHandler).ManualAuth(), - - p(BasePath+"/api/status", StatusHandler), - p(BasePath+"/api/folders", FolderListHandler), - p(BasePath+"/api/folders/:id", FolderHandler), - p(BasePath+"/api/feeds", FeedListHandler), - p(BasePath+"/api/feeds/find", FeedHandler), - p(BasePath+"/api/feeds/refresh", FeedRefreshHandler), - p(BasePath+"/api/feeds/errors", FeedErrorsHandler), - p(BasePath+"/api/feeds/:id/icon", FeedIconHandler), - p(BasePath+"/api/feeds/:id", FeedHandler), - p(BasePath+"/api/items", ItemListHandler), - p(BasePath+"/api/items/:id", ItemHandler), - p(BasePath+"/api/settings", SettingsHandler), - p(BasePath+"/opml/import", OPMLImportHandler), - p(BasePath+"/opml/export", OPMLExportHandler), - p(BasePath+"/page", PageCrawlHandler), - } - if BasePath != "" { - routes = append(routes, p(BasePath, RedirectBasePathHandler).ManualAuth()) - } - }() + p("/api/status", StatusHandler), + p("/api/folders", FolderListHandler), + p("/api/folders/:id", FolderHandler), + p("/api/feeds", FeedListHandler), + p("/api/feeds/find", FeedHandler), + p("/api/feeds/refresh", FeedRefreshHandler), + p("/api/feeds/errors", FeedErrorsHandler), + p("/api/feeds/:id/icon", FeedIconHandler), + p("/api/feeds/:id", FeedHandler), + p("/api/items", ItemListHandler), + p("/api/items/:id", ItemHandler), + p("/api/settings", SettingsHandler), + p("/opml/import", OPMLImportHandler), + p("/opml/export", OPMLExportHandler), + p("/page", PageCrawlHandler), } type asset struct { @@ -153,11 +140,6 @@ func IndexHandler(rw http.ResponseWriter, req *http.Request) { func StaticHandler(rw http.ResponseWriter, req *http.Request) { path := Vars(req)["path"] - - if BasePath != "" { - path = strings.TrimPrefix(path, BasePath) - } - ctype := mime.TypeByExtension(filepath.Ext(path)) if assets != nil { @@ -546,7 +528,3 @@ func PageCrawlHandler(rw http.ResponseWriter, req *http.Request) { } } } - -func RedirectBasePathHandler(rw http.ResponseWriter, req *http.Request) { - http.Redirect(rw, req, req.URL.Path+"/", http.StatusFound) -} diff --git a/server/router.go b/server/router.go index a6b9dd8..ea3d6aa 100644 --- a/server/router.go +++ b/server/router.go @@ -35,13 +35,13 @@ func p(path string, handler func(http.ResponseWriter, *http.Request)) Route { } } -func getRoute(req *http.Request) (*Route, map[string]string) { +func getRoute(reqPath string) (*Route, map[string]string) { vars := make(map[string]string) for _, route := range routes { - if route.urlRegex.MatchString(req.URL.Path) { - matches := route.urlRegex.FindStringSubmatchIndex(req.URL.Path) + if route.urlRegex.MatchString(reqPath) { + matches := route.urlRegex.FindStringSubmatchIndex(reqPath) for i, key := range route.urlRegex.SubexpNames()[1:] { - vars[key] = req.URL.Path[matches[i*2+2]:matches[i*2+3]] + vars[key] = reqPath[matches[i*2+2]:matches[i*2+3]] } return &route, vars } diff --git a/server/server.go b/server/server.go index f15d358..dc855cb 100644 --- a/server/server.go +++ b/server/server.go @@ -2,12 +2,14 @@ package server import ( "context" - "github.com/nkanaev/yarr/storage" "log" "net/http" "runtime" + "strings" "sync/atomic" "time" + + "github.com/nkanaev/yarr/storage" ) type Handler struct { @@ -18,11 +20,11 @@ type Handler struct { queueSize *int32 refreshRate chan int64 // auth - Username string - Password string + Username string + Password string // https - CertFile string - KeyFile string + CertFile string + KeyFile string } func New(db *storage.Storage, logger *log.Logger, addr string) *Handler { @@ -39,7 +41,7 @@ func New(db *storage.Storage, logger *log.Logger, addr string) *Handler { func (h *Handler) GetAddr() string { proto := "http" - if (h.CertFile != "" && h.KeyFile != "") { + if h.CertFile != "" && h.KeyFile != "" { proto = "https" } return proto + "://" + h.Addr @@ -65,7 +67,15 @@ func unsafeMethod(method string) bool { } func (h Handler) ServeHTTP(rw http.ResponseWriter, req *http.Request) { - route, vars := getRoute(req) + reqPath := req.URL.Path + if BasePath != "" { + reqPath = strings.TrimPrefix(req.URL.Path, BasePath) + if reqPath == "" { + http.Redirect(rw, req, BasePath+"/", http.StatusFound) + return + } + } + route, vars := getRoute(reqPath) if route == nil { rw.WriteHeader(http.StatusNotFound) return