瀏覽代碼

Favicon dummy handler & hello message at the root

DarthSim 5 年之前
父節點
當前提交
337bb38a16
共有 3 個文件被更改,包括 50 次插入10 次删除
  1. 20 0
      landing.go
  2. 20 7
      router.go
  3. 10 3
      server.go

+ 20 - 0
landing.go

@@ -0,0 +1,20 @@
+package main
+
+import "net/http"
+
+var landingTmpl = []byte(`
+<!doctype html>
+<html>
+	<head><title>Hey, I'm imgproxy!</title></head>
+	<body>
+		<h1>Hey, I'm imgproxy!</h1>
+		<p style="font-size:1.2em">You can get me here: <a href="https://github.com/imgproxy/imgproxy" target="_blank">https://github.com/imgproxy/imgproxy</a></p>
+	</body>
+</html>
+`)
+
+func handleLanding(reqID string, rw http.ResponseWriter, r *http.Request) {
+	rw.Header().Set("Content-Tyle", "text/html")
+	rw.WriteHeader(200)
+	rw.Write(landingTmpl)
+}

+ 20 - 7
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
 		}

+ 10 - 3
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)
+}