diff --git a/landing.go b/landing.go new file mode 100644 index 00000000..eb992b72 --- /dev/null +++ b/landing.go @@ -0,0 +1,20 @@ +package main + +import "net/http" + +var landingTmpl = []byte(` + + + Hey, I'm imgproxy! + +

Hey, I'm imgproxy!

+

You can get me here: https://github.com/imgproxy/imgproxy

+ + +`) + +func handleLanding(reqID string, rw http.ResponseWriter, r *http.Request) { + rw.Header().Set("Content-Tyle", "text/html") + rw.WriteHeader(200) + rw.Write(landingTmpl) +} diff --git a/router.go b/router.go index 6591ecd0..81b2275b 100644 --- a/router.go +++ b/router.go @@ -23,6 +23,7 @@ type route struct { Method string Prefix string Handler routeHandler + Exact bool } type router struct { @@ -30,25 +31,37 @@ type router struct { PanicHandler panicHandler } +func (r *route) IsMatch(req *http.Request) bool { + if r.Method != req.Method { + return false + } + + if r.Exact { + return req.URL.Path == r.Prefix + } + + return strings.HasPrefix(req.URL.Path, r.Prefix) +} + func newRouter() *router { return &router{ Routes: make([]*route, 0), } } -func (r *router) Add(method, prefix string, handler routeHandler) { +func (r *router) Add(method, prefix string, handler routeHandler, exact bool) { r.Routes = append( r.Routes, - &route{Method: method, Prefix: prefix, Handler: handler}, + &route{Method: method, Prefix: prefix, Handler: handler, Exact: exact}, ) } -func (r *router) GET(prefix string, handler routeHandler) { - r.Add(http.MethodGet, prefix, handler) +func (r *router) GET(prefix string, handler routeHandler, exact bool) { + r.Add(http.MethodGet, prefix, handler, exact) } -func (r *router) OPTIONS(prefix string, handler routeHandler) { - r.Add(http.MethodOptions, prefix, handler) +func (r *router) OPTIONS(prefix string, handler routeHandler, exact bool) { + r.Add(http.MethodOptions, prefix, handler, exact) } func (r *router) ServeHTTP(rw http.ResponseWriter, req *http.Request) { @@ -74,7 +87,7 @@ func (r *router) ServeHTTP(rw http.ResponseWriter, req *http.Request) { logRequest(reqID, req) for _, rr := range r.Routes { - if rr.Method == req.Method && strings.HasPrefix(req.URL.Path, rr.Prefix) { + if rr.IsMatch(req) { rr.Handler(reqID, rw, req) return } diff --git a/server.go b/server.go index db5196e0..d63d2e02 100644 --- a/server.go +++ b/server.go @@ -21,9 +21,11 @@ func buildRouter() *router { r.PanicHandler = handlePanic - r.GET("/health", handleHealth) - r.GET("/", withCORS(withSecret(handleProcessing))) - r.OPTIONS("/", withCORS(handleOptions)) + r.GET("/", handleLanding, true) + r.GET("/health", handleHealth, true) + r.GET("/favicon.ico", handleFavicon, true) + r.GET("/", withCORS(withSecret(handleProcessing)), false) + r.OPTIONS("/", withCORS(handleOptions), false) return r } @@ -130,3 +132,8 @@ func handleOptions(reqID string, rw http.ResponseWriter, r *http.Request) { logResponse(reqID, 200, "Respond with options") rw.WriteHeader(200) } + +func handleFavicon(reqID string, rw http.ResponseWriter, r *http.Request) { + // TODO: Add a real favicon maybe? + rw.WriteHeader(200) +}