diff --git a/echo.go b/echo.go
index ed68c824..6a16b514 100644
--- a/echo.go
+++ b/echo.go
@@ -293,7 +293,7 @@ func (e *Echo) add(method, path string, h Handler) {
// Static serves static files.
func (e *Echo) Static(path, root string) {
fs := http.StripPrefix(path, http.FileServer(http.Dir(root)))
- e.Get(path+"/*", func(c *Context) *HTTPError {
+ e.Get(path+"*", func(c *Context) *HTTPError {
fs.ServeHTTP(c.Response, c.Request)
return nil
})
@@ -312,6 +312,11 @@ func (e *Echo) Index(file string) {
e.ServeFile("/", file)
}
+// Favicon serves the default favicon - GET /favicon.ico.
+func (e *Echo) Favicon(file string) {
+ e.ServeFile("/favicon.ico", file)
+}
+
func (e *Echo) ServeHTTP(w http.ResponseWriter, r *http.Request) {
c := e.pool.Get().(*Context)
h, echo := e.Router.Find(r.Method, r.URL.Path, c)
diff --git a/echo_test.go b/echo_test.go
index 839f0248..0ee49837 100644
--- a/echo_test.go
+++ b/echo_test.go
@@ -39,6 +39,17 @@ func TestEchoIndex(t *testing.T) {
}
}
+func TestEchoFavicon(t *testing.T) {
+ e := New()
+ e.Favicon("examples/web/public/favicon.ico")
+ w := httptest.NewRecorder()
+ r, _ := http.NewRequest(GET, "/favicon.ico", nil)
+ e.ServeHTTP(w, r)
+ if w.Code != 200 {
+ t.Errorf("status code should be 200, found %d", w.Code)
+ }
+}
+
func TestEchoStatic(t *testing.T) {
e := New()
e.Static("/scripts", "examples/web/public/scripts")
diff --git a/examples/web/public/favicon.ico b/examples/web/public/favicon.ico
new file mode 100755
index 00000000..d939ddca
Binary files /dev/null and b/examples/web/public/favicon.ico differ
diff --git a/examples/web/public/index.html b/examples/web/public/index.html
index 950f86fb..aed4f466 100644
--- a/examples/web/public/index.html
+++ b/examples/web/public/index.html
@@ -1,11 +1,15 @@
-
+
-
+
+
Echo
+
+
+
- Echo!
-
+ Echo!
+
diff --git a/examples/web/server.go b/examples/web/server.go
index 7affe32a..ba321230 100644
--- a/examples/web/server.go
+++ b/examples/web/server.go
@@ -36,8 +36,12 @@ func (t *Template) Render(w io.Writer, name string, data interface{}) *echo.HTTP
return nil
}
-func welcome(c *echo.Context) {
- c.Render(http.StatusOK, "welcome", "Joe")
+//----------
+// Handlers
+//----------
+
+func welcome(c *echo.Context) *echo.HTTPError {
+ return c.Render(http.StatusOK, "welcome", "Joe")
}
func createUser(c *echo.Context) *echo.HTTPError {
@@ -74,15 +78,18 @@ func main() {
s := stats.New()
e.Use(s.Handler)
// Route
- e.Get("/stats", func(c *echo.Context) {
- c.JSON(http.StatusOK, s.Data())
+ e.Get("/stats", func(c *echo.Context) *echo.HTTPError {
+ return c.JSON(http.StatusOK, s.Data())
})
// Serve index file
e.Index("public/index.html")
+ // Serve favicon
+ e.Favicon("public/favicon.ico")
+
// Serve static files
- e.Static("/scripts", "public/scripts")
+ e.Static("/scripts/", "public/scripts")
//--------
// Routes
@@ -109,19 +116,21 @@ func main() {
// Group with parent middleware
a := e.Group("/admin")
- a.Use(func(c *echo.Context) {
+ a.Use(func(c *echo.Context) *echo.HTTPError {
// Security middleware
+ return nil
})
- a.Get("", func(c *echo.Context) {
- c.String(http.StatusOK, "Welcome admin!")
+ a.Get("", func(c *echo.Context) *echo.HTTPError {
+ return c.String(http.StatusOK, "Welcome admin!")
})
// Group with no parent middleware
- g := e.Group("/files", func(c *echo.Context) {
+ g := e.Group("/files", func(c *echo.Context) *echo.HTTPError {
// Security middleware
+ return nil
})
- g.Get("", func(c *echo.Context) {
- c.String(http.StatusOK, "Your files!")
+ g.Get("", func(c *echo.Context) *echo.HTTPError {
+ return c.String(http.StatusOK, "Your files!")
})
// Start server
diff --git a/router.go b/router.go
index 7e68c8f9..75f10e47 100644
--- a/router.go
+++ b/router.go
@@ -137,11 +137,11 @@ func (r *router) insert(method, path string, h HandlerFunc, t ntype, pnames []st
}
}
-func newNode(t ntype, pfx string, p *node, c children, h HandlerFunc, pnames []string, echo *Echo) *node {
+func newNode(t ntype, pre string, p *node, c children, h HandlerFunc, pnames []string, echo *Echo) *node {
return &node{
typ: t,
- label: pfx[0],
- prefix: pfx,
+ label: pre[0],
+ prefix: pre,
parent: p,
children: c,
handler: h,
diff --git a/website/docs/guide.md b/website/docs/guide.md
index 930c2dfa..9f49fcc7 100644
--- a/website/docs/guide.md
+++ b/website/docs/guide.md
@@ -193,18 +193,17 @@ Sends an HTML HTTP response with status code.
### Static files
-`echo.Static(path, root string)` serves static files. For example, code below
-serves all files from `public/scripts` directory for any path starting
-with `/scripts/`
+`echo.Static(path, root string)` serves static files. For example, code below serves
+files from directory `public/scripts` for any URL path starting with `/scripts/`.
```go
-e.Static("/scripts", "public/scripts")
+e.Static("/scripts/", "public/scripts")
```
### Serving a file
`echo.ServeFile(path, file string)` serves a file. For example, code below serves
-welcome.html for path `/welcome`
+file `welcome.html` for URL path `/welcome`.
```go
e.ServeFile("/welcome", "welcome.html")
@@ -212,13 +211,22 @@ e.ServeFile("/welcome", "welcome.html")
### Serving an index file
-`echo.Index(file string)` serves an index file. For example, code below serves
-index.html for path `/`
+`echo.Index(file string)` serves an index file. For example, code below serves file
+`index.html`.
```go
e.Index("index.html")
```
+### Serving favicon
+
+`echo.Favicon(file string)` serves default favicon - `GET /favicon.ico`. For example,
+code below serves file `favicon.ico`.
+
+```go
+e.Index("public/favicon.ico")
+```
+
## Error Handling
Echo advocates centralized HTTP error handling by returning `*echo.HTTPError` from