diff --git a/src/server/router/router.go b/src/server/router/router.go index c29d8ec..c225b11 100644 --- a/src/server/router/router.go +++ b/src/server/router/router.go @@ -50,9 +50,15 @@ func (r *Router) resolve(path string) *Route { func (r *Router) ServeHTTP(rw http.ResponseWriter, req *http.Request) { // autoclose open base url - if r.base != "" && r.base == req.URL.Path { - http.Redirect(rw, req, r.base+"/", http.StatusFound) - return + if r.base != "" { + if r.base == req.URL.Path { + http.Redirect(rw, req, r.base+"/", http.StatusFound) + return + } + if !strings.HasPrefix(req.URL.Path, r.base) { + rw.WriteHeader(http.StatusNotFound) + return + } } path := strings.TrimPrefix(req.URL.Path, r.base) diff --git a/src/server/router/router_test.go b/src/server/router/router_test.go index dba5873..4230fcb 100644 --- a/src/server/router/router_test.go +++ b/src/server/router/router_test.go @@ -118,7 +118,6 @@ func TestRouterBase(t *testing.T) { recorder := httptest.NewRecorder() request := httptest.NewRequest("GET", "/foo/bar", nil) - router.ServeHTTP(recorder, request) if recorder.Result().StatusCode != 200 { @@ -130,6 +129,20 @@ func TestRouterBase(t *testing.T) { } } +func TestRouterBase404(t *testing.T) { + router := NewRouter("/foo") + router.For("/bar", func(c *Context) { + c.Out.Write([]byte("!!!")) + }) + + recorder := httptest.NewRecorder() + request := httptest.NewRequest("GET", "/bar", nil) + router.ServeHTTP(recorder, request) + if recorder.Result().StatusCode != 404 { + t.Fatal("expected 404") + } +} + func TestRouterBaseRedirect(t *testing.T) { router := NewRouter("/foo") router.For("/", func(c *Context) {