diff --git a/context_test.go b/context_test.go index ce0ef9e9..108f051d 100644 --- a/context_test.go +++ b/context_test.go @@ -4,7 +4,6 @@ import ( "errors" "io" "net/http" - "net/http/httptest" "testing" "text/template" @@ -14,6 +13,7 @@ import ( "encoding/xml" + "github.com/labstack/echo/test" "github.com/stretchr/testify/assert" ) @@ -36,9 +36,9 @@ func TestContext(t *testing.T) { var nonMarshallableChannel chan bool e := New() - req, _ := http.NewRequest(POST, "/", strings.NewReader(userJSON)) - rec := httptest.NewRecorder() - c := NewContext(req, NewResponse(rec, e), e).X() + req := test.NewRequest(POST, "/", strings.NewReader(userJSON)) + rec := test.NewResponseRecorder() + c := NewContext(req, rec, e) // Request assert.NotNil(t, c.Request()) @@ -50,8 +50,8 @@ func TestContext(t *testing.T) { assert.Nil(t, c.Socket()) // Param by id - c.pnames = []string{"id"} - c.pvalues = []string{"1"} + c.X().pnames = []string{"id"} + c.X().pvalues = []string{"1"} assert.Equal(t, "1", c.P(0)) // Param by name @@ -69,7 +69,7 @@ func TestContext(t *testing.T) { testBind(t, c, "application/json") // XML - c.request, _ = http.NewRequest(POST, "/", strings.NewReader(userXML)) + c.X().request = test.NewRequest(POST, "/", strings.NewReader(userXML)) testBind(t, c, ApplicationXML) // Unsupported @@ -82,151 +82,151 @@ func TestContext(t *testing.T) { tpl := &Template{ templates: template.Must(template.New("hello").Parse("Hello, {{.}}!")), } - c.echo.SetRenderer(tpl) + c.X().echo.SetRenderer(tpl) err := c.Render(http.StatusOK, "hello", "Joe") if assert.NoError(t, err) { - assert.Equal(t, http.StatusOK, rec.Code) + assert.Equal(t, http.StatusOK, rec.Status()) assert.Equal(t, "Hello, Joe!", rec.Body.String()) } - c.echo.renderer = nil + c.X().echo.renderer = nil err = c.Render(http.StatusOK, "hello", "Joe") assert.Error(t, err) // JSON - rec = httptest.NewRecorder() - c = NewContext(req, NewResponse(rec, e), e).X() + rec = test.NewResponseRecorder() + c = NewContext(req, rec, e) err = c.JSON(http.StatusOK, user{"1", "Joe"}) if assert.NoError(t, err) { - assert.Equal(t, http.StatusOK, rec.Code) + assert.Equal(t, http.StatusOK, rec.Status()) assert.Equal(t, ApplicationJSONCharsetUTF8, rec.Header().Get(ContentType)) assert.Equal(t, userJSON, rec.Body.String()) } // JSON (error) - rec = httptest.NewRecorder() - c = NewContext(req, NewResponse(rec, e), e).X() + rec = test.NewResponseRecorder() + c = NewContext(req, rec, e) val := make(chan bool) err = c.JSON(http.StatusOK, val) assert.Error(t, err) // JSONIndent - rec = httptest.NewRecorder() - c = NewContext(req, NewResponse(rec, e), e).X() + rec = test.NewResponseRecorder() + c = NewContext(req, rec, e) err = c.JSONIndent(http.StatusOK, user{"1", "Joe"}, "_", "?") if assert.NoError(t, err) { - assert.Equal(t, http.StatusOK, rec.Code) + assert.Equal(t, http.StatusOK, rec.Status()) assert.Equal(t, ApplicationJSONCharsetUTF8, rec.Header().Get(ContentType)) assert.Equal(t, userJSONIndent, rec.Body.String()) } // JSONIndent (error) - rec = httptest.NewRecorder() - c = NewContext(req, NewResponse(rec, e), e).X() + rec = test.NewResponseRecorder() + c = NewContext(req, rec, e) err = c.JSONIndent(http.StatusOK, nonMarshallableChannel, "_", "?") assert.Error(t, err) // JSONP - rec = httptest.NewRecorder() - c = NewContext(req, NewResponse(rec, e), e).X() + rec = test.NewResponseRecorder() + c = NewContext(req, rec, e) callback := "callback" err = c.JSONP(http.StatusOK, callback, user{"1", "Joe"}) if assert.NoError(t, err) { - assert.Equal(t, http.StatusOK, rec.Code) + assert.Equal(t, http.StatusOK, rec.Status()) assert.Equal(t, ApplicationJavaScriptCharsetUTF8, rec.Header().Get(ContentType)) assert.Equal(t, callback+"("+userJSON+");", rec.Body.String()) } // XML - rec = httptest.NewRecorder() - c = NewContext(req, NewResponse(rec, e), e).X() + rec = test.NewResponseRecorder() + c = NewContext(req, rec, e) err = c.XML(http.StatusOK, user{"1", "Joe"}) if assert.NoError(t, err) { - assert.Equal(t, http.StatusOK, rec.Code) + assert.Equal(t, http.StatusOK, rec.Status()) assert.Equal(t, ApplicationXMLCharsetUTF8, rec.Header().Get(ContentType)) assert.Equal(t, xml.Header+userXML, rec.Body.String()) } // XML (error) - rec = httptest.NewRecorder() - c = NewContext(req, NewResponse(rec, e), e).X() + rec = test.NewResponseRecorder() + c = NewContext(req, rec, e) err = c.XML(http.StatusOK, nonMarshallableChannel) assert.Error(t, err) // XMLIndent - rec = httptest.NewRecorder() - c = NewContext(req, NewResponse(rec, e), e).X() + rec = test.NewResponseRecorder() + c = NewContext(req, rec, e) err = c.XMLIndent(http.StatusOK, user{"1", "Joe"}, "_", "?") if assert.NoError(t, err) { - assert.Equal(t, http.StatusOK, rec.Code) + assert.Equal(t, http.StatusOK, rec.Status()) assert.Equal(t, ApplicationXMLCharsetUTF8, rec.Header().Get(ContentType)) assert.Equal(t, xml.Header+userXMLIndent, rec.Body.String()) } // XMLIndent (error) - rec = httptest.NewRecorder() - c = NewContext(req, NewResponse(rec, e), e).X() + rec = test.NewResponseRecorder() + c = NewContext(req, rec, e) err = c.XMLIndent(http.StatusOK, nonMarshallableChannel, "_", "?") assert.Error(t, err) // String - rec = httptest.NewRecorder() - c = NewContext(req, NewResponse(rec, e), e).X() + rec = test.NewResponseRecorder() + c = NewContext(req, rec, e) err = c.String(http.StatusOK, "Hello, World!") if assert.NoError(t, err) { - assert.Equal(t, http.StatusOK, rec.Code) + assert.Equal(t, http.StatusOK, rec.Status()) assert.Equal(t, TextPlainCharsetUTF8, rec.Header().Get(ContentType)) assert.Equal(t, "Hello, World!", rec.Body.String()) } // HTML - rec = httptest.NewRecorder() - c = NewContext(req, NewResponse(rec, e), e).X() + rec = test.NewResponseRecorder() + c = NewContext(req, rec, e) err = c.HTML(http.StatusOK, "Hello, World!") if assert.NoError(t, err) { - assert.Equal(t, http.StatusOK, rec.Code) + assert.Equal(t, http.StatusOK, rec.Status()) assert.Equal(t, TextHTMLCharsetUTF8, rec.Header().Get(ContentType)) assert.Equal(t, "Hello, World!", rec.Body.String()) } // File - rec = httptest.NewRecorder() - c = NewContext(req, NewResponse(rec, e), e).X() - err = c.File("test/fixture/walle.png", "", false) + rec = test.NewResponseRecorder() + c = NewContext(req, rec, e) + err = c.File("testing/fixture/walle.png", "", false) if assert.NoError(t, err) { - assert.Equal(t, http.StatusOK, rec.Code) + assert.Equal(t, http.StatusOK, rec.Status()) assert.Equal(t, 219885, rec.Body.Len()) } // File as attachment - rec = httptest.NewRecorder() - c = NewContext(req, NewResponse(rec, e), e).X() - err = c.File("test/fixture/walle.png", "WALLE.PNG", true) + rec = test.NewResponseRecorder() + c = NewContext(req, rec, e) + err = c.File("testing/fixture/walle.png", "WALLE.PNG", true) if assert.NoError(t, err) { - assert.Equal(t, http.StatusOK, rec.Code) + assert.Equal(t, http.StatusOK, rec.Status()) assert.Equal(t, rec.Header().Get(ContentDisposition), "attachment; filename=WALLE.PNG") assert.Equal(t, 219885, rec.Body.Len()) } // NoContent - rec = httptest.NewRecorder() - c = NewContext(req, NewResponse(rec, e), e).X() + rec = test.NewResponseRecorder() + c = NewContext(req, rec, e) c.NoContent(http.StatusOK) - assert.Equal(t, http.StatusOK, c.response.status) + assert.Equal(t, http.StatusOK, c.Response().Status()) // Redirect - rec = httptest.NewRecorder() - c = NewContext(req, NewResponse(rec, e), e).X() + rec = test.NewResponseRecorder() + c = NewContext(req, rec, e) assert.Equal(t, nil, c.Redirect(http.StatusMovedPermanently, "http://labstack.github.io/echo")) // Error - rec = httptest.NewRecorder() - c = NewContext(req, NewResponse(rec, e), e).X() + rec = test.NewResponseRecorder() + c = NewContext(req, rec, e).X() c.Error(errors.New("error")) - assert.Equal(t, http.StatusInternalServerError, c.response.status) + assert.Equal(t, http.StatusInternalServerError, c.Response().Status()) // reset - c.reset(req, NewResponse(httptest.NewRecorder(), e), e) + c.X().reset(req, test.NewResponseRecorder(), e) } func TestContextPath(t *testing.T) { @@ -234,12 +234,12 @@ func TestContextPath(t *testing.T) { r := e.Router() r.Add(GET, "/users/:id", nil, e) - c := NewContext(nil, nil, e).X() + c := NewContext(nil, nil, e) r.Find(GET, "/users/1", c) assert.Equal(t, c.Path(), "/users/:id") r.Add(GET, "/users/:uid/files/:fid", nil, e) - c = NewContext(nil, nil, e).X() + c = NewContext(nil, nil, e) r.Find(GET, "/users/1/files/1", c) assert.Equal(t, c.Path(), "/users/:uid/files/:fid") } @@ -248,11 +248,7 @@ func TestContextQuery(t *testing.T) { q := make(url.Values) q.Set("name", "joe") q.Set("email", "joe@labstack.com") - - req, err := http.NewRequest(GET, "/", nil) - assert.NoError(t, err) - req.URL.RawQuery = q.Encode() - + req := test.NewRequest(GET, "/?"+q.Encode(), nil) c := NewContext(req, nil, New()) assert.Equal(t, "joe", c.Query("name")) assert.Equal(t, "joe@labstack.com", c.Query("email")) @@ -263,9 +259,8 @@ func TestContextForm(t *testing.T) { f.Set("name", "joe") f.Set("email", "joe@labstack.com") - req, err := http.NewRequest(POST, "/", strings.NewReader(f.Encode())) - assert.NoError(t, err) - req.Header.Add(ContentType, ApplicationForm) + req := test.NewRequest(POST, "/", strings.NewReader(f.Encode())) + req.Header().Add(ContentType, ApplicationForm) c := NewContext(req, nil, New()) assert.Equal(t, "joe", c.Form("name")) @@ -278,8 +273,8 @@ func TestContextNetContext(t *testing.T) { // assert.Equal(t, "val", c.Value("key")) } -func testBind(t *testing.T, c *context, ct string) { - c.request.Header.Set(ContentType, ct) +func testBind(t *testing.T, c Context, ct string) { + c.Request().Header().Set(ContentType, ct) u := new(user) err := c.Bind(u) if ct == "" { diff --git a/echo.go b/echo.go index 8683bfba..ce6d8015 100644 --- a/echo.go +++ b/echo.go @@ -203,21 +203,19 @@ func New() (e *Echo) { e.HTTP2(true) e.defaultHTTPErrorHandler = func(err error, c Context) { - // TODO: v2 - // x := c.X() - // code := http.StatusInternalServerError - // msg := http.StatusText(code) - // if he, ok := err.(*HTTPError); ok { - // code = he.code - // msg = he.message - // } - // if e.debug { - // msg = err.Error() - // } - // if !x.response.Committed() { - // http.Error(x.response, msg, code) - // } - // e.logger.Error(err) + code := http.StatusInternalServerError + msg := http.StatusText(code) + if he, ok := err.(*HTTPError); ok { + code = he.code + msg = he.message + } + if e.debug { + msg = err.Error() + } + if !c.Response().Committed() { + c.String(code, msg) + } + e.logger.Error(err) } e.SetHTTPErrorHandler(e.defaultHTTPErrorHandler) e.SetBinder(&binder{}) @@ -410,15 +408,13 @@ func (e *Echo) ServeFile(path, file string) { } func (e *Echo) serveFile(dir, file string, c Context) (err error) { - // TODO: v2 - // x := c.X() // fs := http.Dir(dir) // f, err := fs.Open(file) // if err != nil { // return NewHTTPError(http.StatusNotFound) // } // defer f.Close() - // + // fi, _ := f.Stat() // if fi.IsDir() { // /* NOTE: @@ -426,7 +422,7 @@ func (e *Echo) serveFile(dir, file string, c Context) (err error) { // changing differnt directories for the same path. // */ // d := f - // + // // Index file // file = filepath.Join(file, indexPage) // f, err = fs.Open(file) @@ -439,7 +435,7 @@ func (e *Echo) serveFile(dir, file string, c Context) (err error) { // } // fi, _ = f.Stat() // Index file stat // } - // http.ServeContent(x.response, x.request, fi.Name(), fi.ModTime(), f) + // http.ServeContent(c.Response(), c.Request(), fi.Name(), fi.ModTime(), f) return } diff --git a/echo_test.go b/echo_test.go index 6fb77dab..bd12b8ab 100644 --- a/echo_test.go +++ b/echo_test.go @@ -12,8 +12,9 @@ import ( "errors" + "github.com/labstack/echo/engine" + "github.com/labstack/echo/test" "github.com/stretchr/testify/assert" - "golang.org/x/net/websocket" ) type ( @@ -25,9 +26,9 @@ type ( func TestEcho(t *testing.T) { e := New() - req, _ := http.NewRequest(GET, "/", nil) - rec := httptest.NewRecorder() - c := NewContext(req, NewResponse(rec, e), e) + req := test.NewRequest(GET, "/", nil) + rec := test.NewResponseRecorder() + c := NewContext(req, rec, e) // Router assert.NotNil(t, e.Router()) @@ -38,7 +39,7 @@ func TestEcho(t *testing.T) { // DefaultHTTPErrorHandler e.DefaultHTTPErrorHandler(errors.New("error"), c) - assert.Equal(t, http.StatusInternalServerError, rec.Code) + assert.Equal(t, http.StatusInternalServerError, rec.Status()) } func TestEchoIndex(t *testing.T) { @@ -92,15 +93,13 @@ func TestEchoMiddleware(t *testing.T) { e := New() buf := new(bytes.Buffer) - // echo.MiddlewareFunc - e.Use(MiddlewareFunc(func(h HandlerFunc) HandlerFunc { + e.Use(func(h HandlerFunc) HandlerFunc { return func(c Context) error { buf.WriteString("a") return h(c) } - })) + }) - // func(echo.HandlerFunc) echo.HandlerFunc e.Use(func(h HandlerFunc) HandlerFunc { return func(c Context) error { buf.WriteString("b") @@ -108,59 +107,28 @@ func TestEchoMiddleware(t *testing.T) { } }) - // echo.HandlerFunc - e.Use(HandlerFunc(func(c Context) error { - buf.WriteString("c") - return nil - })) - - // func(*echo.Context) error - e.Use(func(c Context) error { - buf.WriteString("d") - return nil - }) - - // func(http.Handler) http.Handler - e.Use(func(h http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - buf.WriteString("e") - h.ServeHTTP(w, r) - }) - }) - - // http.Handler - e.Use(http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - buf.WriteString("f") - }))) - - // http.HandlerFunc - e.Use(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - buf.WriteString("g") - })) - - // func(http.ResponseWriter, *http.Request) - e.Use(func(w http.ResponseWriter, r *http.Request) { - buf.WriteString("h") - }) - - // Unknown - assert.Panics(t, func() { - e.Use(nil) + e.Use(func(h HandlerFunc) HandlerFunc { + return func(c Context) error { + buf.WriteString("c") + return h(c) + } }) // Route e.Get("/", func(c Context) error { - return c.String(http.StatusOK, "Hello!") + return c.String(http.StatusOK, "OK") }) c, b := request(GET, "/", e) - assert.Equal(t, "abcdefgh", buf.String()) + assert.Equal(t, "abc", buf.String()) assert.Equal(t, http.StatusOK, c) - assert.Equal(t, "Hello!", b) + assert.Equal(t, "OK", b) // Error - e.Use(func(Context) error { - return errors.New("error") + e.Use(func(h HandlerFunc) HandlerFunc { + return func(c Context) error { + return errors.New("error") + } }) c, b = request(GET, "/", e) assert.Equal(t, http.StatusInternalServerError, c) @@ -170,35 +138,13 @@ func TestEchoHandler(t *testing.T) { e := New() // HandlerFunc - e.Get("/1", HandlerFunc(func(c Context) error { - return c.String(http.StatusOK, "1") + e.Get("/ok", HandlerFunc(func(c Context) error { + return c.String(http.StatusOK, "OK") })) - // func(*echo.Context) error - e.Get("/2", func(c Context) error { - return c.String(http.StatusOK, "2") - }) - - // http.Handler/http.HandlerFunc - e.Get("/3", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Write([]byte("3")) - })) - - // func(http.ResponseWriter, *http.Request) - e.Get("/4", func(w http.ResponseWriter, r *http.Request) { - w.Write([]byte("4")) - }) - - for _, p := range []string{"1", "2", "3", "4"} { - c, b := request(GET, "/"+p, e) - assert.Equal(t, http.StatusOK, c) - assert.Equal(t, p, b) - } - - // Unknown - assert.Panics(t, func() { - e.Get("/5", nil) - }) + c, b := request(GET, "/ok", e) + assert.Equal(t, http.StatusOK, c) + assert.Equal(t, "OK", b) } func TestEchoConnect(t *testing.T) { @@ -260,28 +206,6 @@ func TestEchoMatch(t *testing.T) { // JFC }) } -func TestEchoWebSocket(t *testing.T) { - e := New() - e.WebSocket("/ws", func(c Context) error { - x := c.X() - x.socket.Write([]byte("test")) - return nil - }) - srv := httptest.NewServer(e) - defer srv.Close() - addr := srv.Listener.Addr().String() - origin := "http://localhost" - url := fmt.Sprintf("ws://%s/ws", addr) - ws, err := websocket.Dial(url, "", origin) - if assert.NoError(t, err) { - ws.Write([]byte("test")) - defer ws.Close() - buf := new(bytes.Buffer) - buf.ReadFrom(ws) - assert.Equal(t, "test", buf.String()) - } -} - func TestEchoURL(t *testing.T) { e := New() @@ -303,15 +227,16 @@ func TestEchoURL(t *testing.T) { func TestEchoRoutes(t *testing.T) { e := New() - h := func(Context) error { return nil } routes := []Route{ - {GET, "/users/:user/events", h}, - {GET, "/users/:user/events/public", h}, - {POST, "/repos/:owner/:repo/git/refs", h}, - {POST, "/repos/:owner/:repo/git/tags", h}, + {GET, "/users/:user/events", ""}, + {GET, "/users/:user/events/public", ""}, + {POST, "/repos/:owner/:repo/git/refs", ""}, + {POST, "/repos/:owner/:repo/git/tags", ""}, } for _, r := range routes { - e.add(r.Method, r.Path, h) + e.add(r.Method, r.Path, func(c Context) error { + return c.String(http.StatusOK, "OK") + }) } for i, r := range e.Routes() { @@ -323,9 +248,11 @@ func TestEchoRoutes(t *testing.T) { func TestEchoGroup(t *testing.T) { e := New() buf := new(bytes.Buffer) - e.Use(func(Context) error { - buf.WriteString("0") - return nil + e.Use(func(h HandlerFunc) HandlerFunc { + return func(c Context) error { + buf.WriteString("a") + return h(c) + } }) h := func(Context) error { return nil } @@ -337,28 +264,33 @@ func TestEchoGroup(t *testing.T) { // Group g1 := e.Group("/group1") - g1.Use(func(Context) error { - buf.WriteString("1") - return nil + g1.Use(func(h HandlerFunc) HandlerFunc { + return func(c Context) error { + buf.WriteString("1") + return h(c) + } }) g1.Get("/", h) // Group with no parent middleware - g2 := e.Group("/group2", func(Context) error { - buf.WriteString("2") - return nil + g2 := e.Group("/group2", func(h HandlerFunc) HandlerFunc { + return func(c Context) error { + buf.WriteString("2") + return h(c) + } }) g2.Get("/", h) // Nested groups g3 := e.Group("/group3") g4 := g3.Group("/group4") - g4.Get("/", func(c Context) error { - return c.NoContent(http.StatusOK) + g4.Use(func(h HandlerFunc) HandlerFunc { + return func(c Context) error { + return c.NoContent(http.StatusOK) + } }) request(GET, "/users", e) - // println(len(e.middleware)) assert.Equal(t, "0", buf.String()) buf.Reset() @@ -412,11 +344,11 @@ func TestEchoHook(t *testing.T) { e.Get("/test", func(c Context) error { return c.NoContent(http.StatusNoContent) }) - e.Hook(func(w http.ResponseWriter, r *http.Request) { - path := r.URL.Path + e.Hook(func(req engine.Request, res engine.Response) { + path := req.URL().Path() l := len(path) - 1 if path != "/" && path[l] == '/' { - r.URL.Path = path[:l] + // req.URL().Path() = path[:l] } }) r, _ := http.NewRequest(GET, "/test/", nil) diff --git a/group_test.go b/group_test.go index cbe19854..6fb9369f 100644 --- a/group_test.go +++ b/group_test.go @@ -14,7 +14,6 @@ func TestGroup(t *testing.T) { g.Post("/", h) g.Put("/", h) g.Trace("/", h) - g.WebSocket("/ws", h) g.Static("/scripts", "scripts") g.ServeDir("/scripts", "scripts") g.ServeFile("/scripts/main.js", "scripts/main.js") diff --git a/middleware/auth_test.go b/middleware/auth_test.go index d8b80c97..157d0703 100644 --- a/middleware/auth_test.go +++ b/middleware/auth_test.go @@ -25,7 +25,7 @@ func TestBasicAuth(t *testing.T) { // Valid credentials auth := Basic + " " + base64.StdEncoding.EncodeToString([]byte("joe:secret")) - req.Header.Set(echo.Authorization, auth) + req.Header().Set(echo.Authorization, auth) assert.NoError(t, ba(c)) //--------------------- @@ -34,7 +34,7 @@ func TestBasicAuth(t *testing.T) { // Incorrect password auth = Basic + " " + base64.StdEncoding.EncodeToString([]byte("joe:password")) - req.Header.Set(echo.Authorization, auth) + req.Header().Set(echo.Authorization, auth) he := ba(c).(*echo.HTTPError) assert.Equal(t, http.StatusUnauthorized, he.Code()) assert.Equal(t, Basic+" realm=Restricted", rec.Header().Get(echo.WWWAuthenticate)) diff --git a/middleware/logger.go b/middleware/logger.go index 912d6f35..e98a3e9d 100644 --- a/middleware/logger.go +++ b/middleware/logger.go @@ -15,7 +15,7 @@ func Logger() echo.MiddlewareFunc { res := c.Response() logger := c.Logger() - remoteAddr := req.RemoteAddr + remoteAddr := req.RemoteAddress() if ip := req.Header().Get(echo.XRealIP); ip != "" { remoteAddr = ip } else if ip = req.Header().Get(echo.XForwardedFor); ip != "" { @@ -30,7 +30,7 @@ func Logger() echo.MiddlewareFunc { } stop := time.Now() method := req.Method - path := req.URL.Path + path := req.URL().Path() if path == "" { path = "/" } diff --git a/recipes/embed-resources/.gitignore b/recipes/embed-resources/.gitignore deleted file mode 100644 index 9524d94f..00000000 --- a/recipes/embed-resources/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -rice -app.rice-box.go diff --git a/recipes/embed-resources/app/index.html b/recipes/embed-resources/app/index.html deleted file mode 100644 index 66aac446..00000000 --- a/recipes/embed-resources/app/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - go.rice Example - - - -

go.rice Example

- - diff --git a/recipes/embed-resources/app/main.js b/recipes/embed-resources/app/main.js deleted file mode 100644 index f888dc5c..00000000 --- a/recipes/embed-resources/app/main.js +++ /dev/null @@ -1 +0,0 @@ -alert("main.js"); diff --git a/recipes/file-upload/public/index.html b/recipes/file-upload/public/index.html deleted file mode 100644 index cdbdb3e5..00000000 --- a/recipes/file-upload/public/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - File Upload - - -

Upload Files

- -
- Name:
- Email:
- Files:

- -
- - diff --git a/recipes/google-app-engine/Dockerfile b/recipes/google-app-engine/Dockerfile deleted file mode 100644 index 5d1c13e5..00000000 --- a/recipes/google-app-engine/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -# Dockerfile extending the generic Go image with application files for a -# single application. -FROM gcr.io/google_appengine/golang - -COPY . /go/src/app -RUN go-wrapper download -RUN go-wrapper install -tags appenginevm \ No newline at end of file diff --git a/recipes/google-app-engine/app-engine.go b/recipes/google-app-engine/app-engine.go deleted file mode 100644 index ddbf3944..00000000 --- a/recipes/google-app-engine/app-engine.go +++ /dev/null @@ -1,18 +0,0 @@ -// +build appengine - -package main - -import ( - "github.com/labstack/echo" - "net/http" -) - -func createMux() *echo.Echo { - e := echo.New() - - // note: we don't need to provide the middleware or static handlers, that's taken care of by the platform - // app engine has it's own "main" wrapper - we just need to hook echo into the default handler - http.Handle("/", e) - - return e -} diff --git a/recipes/google-app-engine/app-engine.yaml b/recipes/google-app-engine/app-engine.yaml deleted file mode 100644 index e8f5bf05..00000000 --- a/recipes/google-app-engine/app-engine.yaml +++ /dev/null @@ -1,36 +0,0 @@ -application: my-application-id # defined when you create your app using google dev console -module: default # see https://cloud.google.com/appengine/docs/go/ -version: alpha # you can run multiple versions of an app and A/B test -runtime: go # see https://cloud.google.com/appengine/docs/go/ -api_version: go1 # used when appengine supports different go versions - -default_expiration: "1d" # for CDN serving of static files (use url versioning if long!) - -handlers: -# all the static files that we normally serve ourselves are defined here and Google will handle -# serving them for us from it's own CDN / edge locations. For all the configuration options see: -# https://cloud.google.com/appengine/docs/go/config/appconfig#Go_app_yaml_Static_file_handlers -- url: / - mime_type: text/html - static_files: public/index.html - upload: public/index.html - -- url: /favicon.ico - mime_type: image/x-icon - static_files: public/favicon.ico - upload: public/favicon.ico - -- url: /scripts - mime_type: text/javascript - static_dir: public/scripts - -# static files normally don't touch the server that the app runs on but server-side template files -# needs to be readable by the app. The application_readable option makes sure they are available as -# part of the app deployment onto the instance. -- url: /templates - static_dir: /templates - application_readable: true - -# finally, we route all other requests to our application. The script name just means "the go app" -- url: /.* - script: _go_app \ No newline at end of file diff --git a/recipes/google-app-engine/app-managed.go b/recipes/google-app-engine/app-managed.go deleted file mode 100644 index cc5adfbf..00000000 --- a/recipes/google-app-engine/app-managed.go +++ /dev/null @@ -1,29 +0,0 @@ -// +build appenginevm - -package main - -import ( - "github.com/labstack/echo" - "google.golang.org/appengine" - "net/http" - "runtime" -) - -func createMux() *echo.Echo { - // we're in a container on a Google Compute Engine instance so are not sandboxed anymore ... - runtime.GOMAXPROCS(runtime.NumCPU()) - - e := echo.New() - - // note: we don't need to provide the middleware or static handlers - // for the appengine vm version - that's taken care of by the platform - - return e -} - -func main() { - // the appengine package provides a convenient method to handle the health-check requests - // and also run the app on the correct port. We just need to add Echo to the default handler - http.Handle("/", e) - appengine.Main() -} diff --git a/recipes/google-app-engine/app-managed.yaml b/recipes/google-app-engine/app-managed.yaml deleted file mode 100644 index d5da4cd9..00000000 --- a/recipes/google-app-engine/app-managed.yaml +++ /dev/null @@ -1,37 +0,0 @@ -application: my-application-id # defined when you create your app using google dev console -module: default # see https://cloud.google.com/appengine/docs/go/ -version: alpha # you can run multiple versions of an app and A/B test -runtime: go # see https://cloud.google.com/appengine/docs/go/ -api_version: go1 # used when appengine supports different go versions -vm: true # for managed VMs only, remove for appengine classic - -default_expiration: "1d" # for CDN serving of static files (use url versioning if long!) - -handlers: -# all the static files that we normally serve ourselves are defined here and Google will handle -# serving them for us from it's own CDN / edge locations. For all the configuration options see: -# https://cloud.google.com/appengine/docs/go/config/appconfig#Go_app_yaml_Static_file_handlers -- url: / - mime_type: text/html - static_files: public/index.html - upload: public/index.html - -- url: /favicon.ico - mime_type: image/x-icon - static_files: public/favicon.ico - upload: public/favicon.ico - -- url: /scripts - mime_type: text/javascript - static_dir: public/scripts - -# static files normally don't touch the server that the app runs on but server-side template files -# needs to be readable by the app. The application_readable option makes sure they are available as -# part of the app deployment onto the instance. -- url: /templates - static_dir: /templates - application_readable: true - -# finally, we route all other requests to our application. The script name just means "the go app" -- url: /.* - script: _go_app \ No newline at end of file diff --git a/recipes/google-app-engine/app-standalone.go b/recipes/google-app-engine/app-standalone.go deleted file mode 100644 index 0a6881fa..00000000 --- a/recipes/google-app-engine/app-standalone.go +++ /dev/null @@ -1,25 +0,0 @@ -// +build !appengine,!appenginevm - -package main - -import ( - "github.com/labstack/echo" - "github.com/labstack/echo/middleware" -) - -func createMux() *echo.Echo { - e := echo.New() - - e.Use(middleware.Recover()) - e.Use(middleware.Logger()) - e.Use(middleware.Gzip()) - - e.Index("public/index.html") - e.Static("/public", "public") - - return e -} - -func main() { - e.Run(":8080") -} diff --git a/recipes/google-app-engine/app.go b/recipes/google-app-engine/app.go deleted file mode 100644 index 442ed886..00000000 --- a/recipes/google-app-engine/app.go +++ /dev/null @@ -1,4 +0,0 @@ -package main - -// referecnce our echo instance and create it early -var e = createMux() diff --git a/recipes/google-app-engine/public/favicon.ico b/recipes/google-app-engine/public/favicon.ico deleted file mode 100644 index d939ddca..00000000 Binary files a/recipes/google-app-engine/public/favicon.ico and /dev/null differ diff --git a/recipes/google-app-engine/public/index.html b/recipes/google-app-engine/public/index.html deleted file mode 100644 index aed4f466..00000000 --- a/recipes/google-app-engine/public/index.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - Echo - - - - - -

Echo!

- - - diff --git a/recipes/google-app-engine/public/scripts/main.js b/recipes/google-app-engine/public/scripts/main.js deleted file mode 100644 index 62a4c8f1..00000000 --- a/recipes/google-app-engine/public/scripts/main.js +++ /dev/null @@ -1 +0,0 @@ -console.log("Echo!"); diff --git a/recipes/google-app-engine/templates/welcome.html b/recipes/google-app-engine/templates/welcome.html deleted file mode 100644 index 5dc667c3..00000000 --- a/recipes/google-app-engine/templates/welcome.html +++ /dev/null @@ -1 +0,0 @@ -{{define "welcome"}}Hello, {{.}}!{{end}} diff --git a/recipes/jsonp/public/index.html b/recipes/jsonp/public/index.html deleted file mode 100644 index 033632e9..00000000 --- a/recipes/jsonp/public/index.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - JSONP - - - - - - -
- -

-


-        

-
- - - diff --git a/recipes/jwt-authentication/token/token.go b/recipes/jwt-authentication/token/token.go deleted file mode 100644 index 0e309ab1..00000000 --- a/recipes/jwt-authentication/token/token.go +++ /dev/null @@ -1,24 +0,0 @@ -package main - -import ( - "fmt" - "time" - - "github.com/dgrijalva/jwt-go" -) - -const SigningKey = "somethingsupersecret" - -func main() { - - // New web token. - token := jwt.New(jwt.SigningMethodHS256) - - // Set a header and a claim - token.Header["typ"] = "JWT" - token.Claims["exp"] = time.Now().Add(time.Hour * 96).Unix() - - // Generate encoded token - t, _ := token.SignedString([]byte(SigningKey)) - fmt.Println(t) -} diff --git a/recipes/streaming-file-upload/public/index.html b/recipes/streaming-file-upload/public/index.html deleted file mode 100644 index cdbdb3e5..00000000 --- a/recipes/streaming-file-upload/public/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - File Upload - - -

Upload Files

- -
- Name:
- Email:
- Files:

- -
- - diff --git a/recipes/website/public/favicon.ico b/recipes/website/public/favicon.ico deleted file mode 100644 index d939ddca..00000000 Binary files a/recipes/website/public/favicon.ico and /dev/null differ diff --git a/recipes/website/public/folder/index.html b/recipes/website/public/folder/index.html deleted file mode 100644 index 36b3a421..00000000 --- a/recipes/website/public/folder/index.html +++ /dev/null @@ -1 +0,0 @@ -sub directory \ No newline at end of file diff --git a/recipes/website/public/index.html b/recipes/website/public/index.html deleted file mode 100644 index 50888097..00000000 --- a/recipes/website/public/index.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - Echo - - - - - -

Echo!

- - - diff --git a/recipes/website/public/scripts/main.js b/recipes/website/public/scripts/main.js deleted file mode 100644 index c3b96d21..00000000 --- a/recipes/website/public/scripts/main.js +++ /dev/null @@ -1 +0,0 @@ -console.log("Echo!") diff --git a/recipes/website/public/views/welcome.html b/recipes/website/public/views/welcome.html deleted file mode 100644 index 5dc667c3..00000000 --- a/recipes/website/public/views/welcome.html +++ /dev/null @@ -1 +0,0 @@ -{{define "welcome"}}Hello, {{.}}!{{end}} diff --git a/recipes/websocket/public/index.html b/recipes/websocket/public/index.html deleted file mode 100644 index 859bd55d..00000000 --- a/recipes/websocket/public/index.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - WebSocket - - -

- - - - diff --git a/router.go b/router.go index 0a406281..226586c7 100644 --- a/router.go +++ b/router.go @@ -1,7 +1,5 @@ package echo -import "net/http" - type ( Router struct { tree *node @@ -400,14 +398,3 @@ End: } return } - -func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) { - // TODO: v2 - // c := r.echo.pool.Get().(*context) - // h, _ := r.Find(req.Method, req.URL.Path, c) - // c.reset(req, w, r.echo) - // if err := h(c); err != nil { - // r.echo.httpErrorHandler(err, c) - // } - // r.echo.pool.Put(c) -} diff --git a/router_test.go b/router_test.go index dc272667..ebbd27ff 100644 --- a/router_test.go +++ b/router_test.go @@ -3,7 +3,6 @@ package echo import ( "fmt" "net/http" - "net/http/httptest" "testing" "github.com/stretchr/testify/assert" @@ -12,265 +11,265 @@ import ( var ( api = []Route{ // OAuth Authorizations - {"GET", "/authorizations", nil}, - {"GET", "/authorizations/:id", nil}, - {"POST", "/authorizations", nil}, - //{"PUT", "/authorizations/clients/:client_id", nil}, - //{"PATCH", "/authorizations/:id", nil}, - {"DELETE", "/authorizations/:id", nil}, - {"GET", "/applications/:client_id/tokens/:access_token", nil}, - {"DELETE", "/applications/:client_id/tokens", nil}, - {"DELETE", "/applications/:client_id/tokens/:access_token", nil}, + {"GET", "/authorizations", ""}, + {"GET", "/authorizations/:id", ""}, + {"POST", "/authorizations", ""}, + //{"PUT", "/authorizations/clients/:client_id", ""}, + //{"PATCH", "/authorizations/:id", ""}, + {"DELETE", "/authorizations/:id", ""}, + {"GET", "/applications/:client_id/tokens/:access_token", ""}, + {"DELETE", "/applications/:client_id/tokens", ""}, + {"DELETE", "/applications/:client_id/tokens/:access_token", ""}, // Activity - {"GET", "/events", nil}, - {"GET", "/repos/:owner/:repo/events", nil}, - {"GET", "/networks/:owner/:repo/events", nil}, - {"GET", "/orgs/:org/events", nil}, - {"GET", "/users/:user/received_events", nil}, - {"GET", "/users/:user/received_events/public", nil}, - {"GET", "/users/:user/events", nil}, - {"GET", "/users/:user/events/public", nil}, - {"GET", "/users/:user/events/orgs/:org", nil}, - {"GET", "/feeds", nil}, - {"GET", "/notifications", nil}, - {"GET", "/repos/:owner/:repo/notifications", nil}, - {"PUT", "/notifications", nil}, - {"PUT", "/repos/:owner/:repo/notifications", nil}, - {"GET", "/notifications/threads/:id", nil}, - //{"PATCH", "/notifications/threads/:id", nil}, - {"GET", "/notifications/threads/:id/subscription", nil}, - {"PUT", "/notifications/threads/:id/subscription", nil}, - {"DELETE", "/notifications/threads/:id/subscription", nil}, - {"GET", "/repos/:owner/:repo/stargazers", nil}, - {"GET", "/users/:user/starred", nil}, - {"GET", "/user/starred", nil}, - {"GET", "/user/starred/:owner/:repo", nil}, - {"PUT", "/user/starred/:owner/:repo", nil}, - {"DELETE", "/user/starred/:owner/:repo", nil}, - {"GET", "/repos/:owner/:repo/subscribers", nil}, - {"GET", "/users/:user/subscriptions", nil}, - {"GET", "/user/subscriptions", nil}, - {"GET", "/repos/:owner/:repo/subscription", nil}, - {"PUT", "/repos/:owner/:repo/subscription", nil}, - {"DELETE", "/repos/:owner/:repo/subscription", nil}, - {"GET", "/user/subscriptions/:owner/:repo", nil}, - {"PUT", "/user/subscriptions/:owner/:repo", nil}, - {"DELETE", "/user/subscriptions/:owner/:repo", nil}, + {"GET", "/events", ""}, + {"GET", "/repos/:owner/:repo/events", ""}, + {"GET", "/networks/:owner/:repo/events", ""}, + {"GET", "/orgs/:org/events", ""}, + {"GET", "/users/:user/received_events", ""}, + {"GET", "/users/:user/received_events/public", ""}, + {"GET", "/users/:user/events", ""}, + {"GET", "/users/:user/events/public", ""}, + {"GET", "/users/:user/events/orgs/:org", ""}, + {"GET", "/feeds", ""}, + {"GET", "/notifications", ""}, + {"GET", "/repos/:owner/:repo/notifications", ""}, + {"PUT", "/notifications", ""}, + {"PUT", "/repos/:owner/:repo/notifications", ""}, + {"GET", "/notifications/threads/:id", ""}, + //{"PATCH", "/notifications/threads/:id", ""}, + {"GET", "/notifications/threads/:id/subscription", ""}, + {"PUT", "/notifications/threads/:id/subscription", ""}, + {"DELETE", "/notifications/threads/:id/subscription", ""}, + {"GET", "/repos/:owner/:repo/stargazers", ""}, + {"GET", "/users/:user/starred", ""}, + {"GET", "/user/starred", ""}, + {"GET", "/user/starred/:owner/:repo", ""}, + {"PUT", "/user/starred/:owner/:repo", ""}, + {"DELETE", "/user/starred/:owner/:repo", ""}, + {"GET", "/repos/:owner/:repo/subscribers", ""}, + {"GET", "/users/:user/subscriptions", ""}, + {"GET", "/user/subscriptions", ""}, + {"GET", "/repos/:owner/:repo/subscription", ""}, + {"PUT", "/repos/:owner/:repo/subscription", ""}, + {"DELETE", "/repos/:owner/:repo/subscription", ""}, + {"GET", "/user/subscriptions/:owner/:repo", ""}, + {"PUT", "/user/subscriptions/:owner/:repo", ""}, + {"DELETE", "/user/subscriptions/:owner/:repo", ""}, // Gists - {"GET", "/users/:user/gists", nil}, - {"GET", "/gists", nil}, - //{"GET", "/gists/public", nil}, - //{"GET", "/gists/starred", nil}, - {"GET", "/gists/:id", nil}, - {"POST", "/gists", nil}, - //{"PATCH", "/gists/:id", nil}, - {"PUT", "/gists/:id/star", nil}, - {"DELETE", "/gists/:id/star", nil}, - {"GET", "/gists/:id/star", nil}, - {"POST", "/gists/:id/forks", nil}, - {"DELETE", "/gists/:id", nil}, + {"GET", "/users/:user/gists", ""}, + {"GET", "/gists", ""}, + //{"GET", "/gists/public", ""}, + //{"GET", "/gists/starred", ""}, + {"GET", "/gists/:id", ""}, + {"POST", "/gists", ""}, + //{"PATCH", "/gists/:id", ""}, + {"PUT", "/gists/:id/star", ""}, + {"DELETE", "/gists/:id/star", ""}, + {"GET", "/gists/:id/star", ""}, + {"POST", "/gists/:id/forks", ""}, + {"DELETE", "/gists/:id", ""}, // Git Data - {"GET", "/repos/:owner/:repo/git/blobs/:sha", nil}, - {"POST", "/repos/:owner/:repo/git/blobs", nil}, - {"GET", "/repos/:owner/:repo/git/commits/:sha", nil}, - {"POST", "/repos/:owner/:repo/git/commits", nil}, - //{"GET", "/repos/:owner/:repo/git/refs/*ref", nil}, - {"GET", "/repos/:owner/:repo/git/refs", nil}, - {"POST", "/repos/:owner/:repo/git/refs", nil}, - //{"PATCH", "/repos/:owner/:repo/git/refs/*ref", nil}, - //{"DELETE", "/repos/:owner/:repo/git/refs/*ref", nil}, - {"GET", "/repos/:owner/:repo/git/tags/:sha", nil}, - {"POST", "/repos/:owner/:repo/git/tags", nil}, - {"GET", "/repos/:owner/:repo/git/trees/:sha", nil}, - {"POST", "/repos/:owner/:repo/git/trees", nil}, + {"GET", "/repos/:owner/:repo/git/blobs/:sha", ""}, + {"POST", "/repos/:owner/:repo/git/blobs", ""}, + {"GET", "/repos/:owner/:repo/git/commits/:sha", ""}, + {"POST", "/repos/:owner/:repo/git/commits", ""}, + //{"GET", "/repos/:owner/:repo/git/refs/*ref", ""}, + {"GET", "/repos/:owner/:repo/git/refs", ""}, + {"POST", "/repos/:owner/:repo/git/refs", ""}, + //{"PATCH", "/repos/:owner/:repo/git/refs/*ref", ""}, + //{"DELETE", "/repos/:owner/:repo/git/refs/*ref", ""}, + {"GET", "/repos/:owner/:repo/git/tags/:sha", ""}, + {"POST", "/repos/:owner/:repo/git/tags", ""}, + {"GET", "/repos/:owner/:repo/git/trees/:sha", ""}, + {"POST", "/repos/:owner/:repo/git/trees", ""}, // Issues - {"GET", "/issues", nil}, - {"GET", "/user/issues", nil}, - {"GET", "/orgs/:org/issues", nil}, - {"GET", "/repos/:owner/:repo/issues", nil}, - {"GET", "/repos/:owner/:repo/issues/:number", nil}, - {"POST", "/repos/:owner/:repo/issues", nil}, - //{"PATCH", "/repos/:owner/:repo/issues/:number", nil}, - {"GET", "/repos/:owner/:repo/assignees", nil}, - {"GET", "/repos/:owner/:repo/assignees/:assignee", nil}, - {"GET", "/repos/:owner/:repo/issues/:number/comments", nil}, - //{"GET", "/repos/:owner/:repo/issues/comments", nil}, - //{"GET", "/repos/:owner/:repo/issues/comments/:id", nil}, - {"POST", "/repos/:owner/:repo/issues/:number/comments", nil}, - //{"PATCH", "/repos/:owner/:repo/issues/comments/:id", nil}, - //{"DELETE", "/repos/:owner/:repo/issues/comments/:id", nil}, - {"GET", "/repos/:owner/:repo/issues/:number/events", nil}, - //{"GET", "/repos/:owner/:repo/issues/events", nil}, - //{"GET", "/repos/:owner/:repo/issues/events/:id", nil}, - {"GET", "/repos/:owner/:repo/labels", nil}, - {"GET", "/repos/:owner/:repo/labels/:name", nil}, - {"POST", "/repos/:owner/:repo/labels", nil}, - //{"PATCH", "/repos/:owner/:repo/labels/:name", nil}, - {"DELETE", "/repos/:owner/:repo/labels/:name", nil}, - {"GET", "/repos/:owner/:repo/issues/:number/labels", nil}, - {"POST", "/repos/:owner/:repo/issues/:number/labels", nil}, - {"DELETE", "/repos/:owner/:repo/issues/:number/labels/:name", nil}, - {"PUT", "/repos/:owner/:repo/issues/:number/labels", nil}, - {"DELETE", "/repos/:owner/:repo/issues/:number/labels", nil}, - {"GET", "/repos/:owner/:repo/milestones/:number/labels", nil}, - {"GET", "/repos/:owner/:repo/milestones", nil}, - {"GET", "/repos/:owner/:repo/milestones/:number", nil}, - {"POST", "/repos/:owner/:repo/milestones", nil}, - //{"PATCH", "/repos/:owner/:repo/milestones/:number", nil}, - {"DELETE", "/repos/:owner/:repo/milestones/:number", nil}, + {"GET", "/issues", ""}, + {"GET", "/user/issues", ""}, + {"GET", "/orgs/:org/issues", ""}, + {"GET", "/repos/:owner/:repo/issues", ""}, + {"GET", "/repos/:owner/:repo/issues/:number", ""}, + {"POST", "/repos/:owner/:repo/issues", ""}, + //{"PATCH", "/repos/:owner/:repo/issues/:number", ""}, + {"GET", "/repos/:owner/:repo/assignees", ""}, + {"GET", "/repos/:owner/:repo/assignees/:assignee", ""}, + {"GET", "/repos/:owner/:repo/issues/:number/comments", ""}, + //{"GET", "/repos/:owner/:repo/issues/comments", ""}, + //{"GET", "/repos/:owner/:repo/issues/comments/:id", ""}, + {"POST", "/repos/:owner/:repo/issues/:number/comments", ""}, + //{"PATCH", "/repos/:owner/:repo/issues/comments/:id", ""}, + //{"DELETE", "/repos/:owner/:repo/issues/comments/:id", ""}, + {"GET", "/repos/:owner/:repo/issues/:number/events", ""}, + //{"GET", "/repos/:owner/:repo/issues/events", ""}, + //{"GET", "/repos/:owner/:repo/issues/events/:id", ""}, + {"GET", "/repos/:owner/:repo/labels", ""}, + {"GET", "/repos/:owner/:repo/labels/:name", ""}, + {"POST", "/repos/:owner/:repo/labels", ""}, + //{"PATCH", "/repos/:owner/:repo/labels/:name", ""}, + {"DELETE", "/repos/:owner/:repo/labels/:name", ""}, + {"GET", "/repos/:owner/:repo/issues/:number/labels", ""}, + {"POST", "/repos/:owner/:repo/issues/:number/labels", ""}, + {"DELETE", "/repos/:owner/:repo/issues/:number/labels/:name", ""}, + {"PUT", "/repos/:owner/:repo/issues/:number/labels", ""}, + {"DELETE", "/repos/:owner/:repo/issues/:number/labels", ""}, + {"GET", "/repos/:owner/:repo/milestones/:number/labels", ""}, + {"GET", "/repos/:owner/:repo/milestones", ""}, + {"GET", "/repos/:owner/:repo/milestones/:number", ""}, + {"POST", "/repos/:owner/:repo/milestones", ""}, + //{"PATCH", "/repos/:owner/:repo/milestones/:number", ""}, + {"DELETE", "/repos/:owner/:repo/milestones/:number", ""}, // Miscellaneous - {"GET", "/emojis", nil}, - {"GET", "/gitignore/templates", nil}, - {"GET", "/gitignore/templates/:name", nil}, - {"POST", "/markdown", nil}, - {"POST", "/markdown/raw", nil}, - {"GET", "/meta", nil}, - {"GET", "/rate_limit", nil}, + {"GET", "/emojis", ""}, + {"GET", "/gitignore/templates", ""}, + {"GET", "/gitignore/templates/:name", ""}, + {"POST", "/markdown", ""}, + {"POST", "/markdown/raw", ""}, + {"GET", "/meta", ""}, + {"GET", "/rate_limit", ""}, // Organizations - {"GET", "/users/:user/orgs", nil}, - {"GET", "/user/orgs", nil}, - {"GET", "/orgs/:org", nil}, - //{"PATCH", "/orgs/:org", nil}, - {"GET", "/orgs/:org/members", nil}, - {"GET", "/orgs/:org/members/:user", nil}, - {"DELETE", "/orgs/:org/members/:user", nil}, - {"GET", "/orgs/:org/public_members", nil}, - {"GET", "/orgs/:org/public_members/:user", nil}, - {"PUT", "/orgs/:org/public_members/:user", nil}, - {"DELETE", "/orgs/:org/public_members/:user", nil}, - {"GET", "/orgs/:org/teams", nil}, - {"GET", "/teams/:id", nil}, - {"POST", "/orgs/:org/teams", nil}, - //{"PATCH", "/teams/:id", nil}, - {"DELETE", "/teams/:id", nil}, - {"GET", "/teams/:id/members", nil}, - {"GET", "/teams/:id/members/:user", nil}, - {"PUT", "/teams/:id/members/:user", nil}, - {"DELETE", "/teams/:id/members/:user", nil}, - {"GET", "/teams/:id/repos", nil}, - {"GET", "/teams/:id/repos/:owner/:repo", nil}, - {"PUT", "/teams/:id/repos/:owner/:repo", nil}, - {"DELETE", "/teams/:id/repos/:owner/:repo", nil}, - {"GET", "/user/teams", nil}, + {"GET", "/users/:user/orgs", ""}, + {"GET", "/user/orgs", ""}, + {"GET", "/orgs/:org", ""}, + //{"PATCH", "/orgs/:org", ""}, + {"GET", "/orgs/:org/members", ""}, + {"GET", "/orgs/:org/members/:user", ""}, + {"DELETE", "/orgs/:org/members/:user", ""}, + {"GET", "/orgs/:org/public_members", ""}, + {"GET", "/orgs/:org/public_members/:user", ""}, + {"PUT", "/orgs/:org/public_members/:user", ""}, + {"DELETE", "/orgs/:org/public_members/:user", ""}, + {"GET", "/orgs/:org/teams", ""}, + {"GET", "/teams/:id", ""}, + {"POST", "/orgs/:org/teams", ""}, + //{"PATCH", "/teams/:id", ""}, + {"DELETE", "/teams/:id", ""}, + {"GET", "/teams/:id/members", ""}, + {"GET", "/teams/:id/members/:user", ""}, + {"PUT", "/teams/:id/members/:user", ""}, + {"DELETE", "/teams/:id/members/:user", ""}, + {"GET", "/teams/:id/repos", ""}, + {"GET", "/teams/:id/repos/:owner/:repo", ""}, + {"PUT", "/teams/:id/repos/:owner/:repo", ""}, + {"DELETE", "/teams/:id/repos/:owner/:repo", ""}, + {"GET", "/user/teams", ""}, // Pull Requests - {"GET", "/repos/:owner/:repo/pulls", nil}, - {"GET", "/repos/:owner/:repo/pulls/:number", nil}, - {"POST", "/repos/:owner/:repo/pulls", nil}, - //{"PATCH", "/repos/:owner/:repo/pulls/:number", nil}, - {"GET", "/repos/:owner/:repo/pulls/:number/commits", nil}, - {"GET", "/repos/:owner/:repo/pulls/:number/files", nil}, - {"GET", "/repos/:owner/:repo/pulls/:number/merge", nil}, - {"PUT", "/repos/:owner/:repo/pulls/:number/merge", nil}, - {"GET", "/repos/:owner/:repo/pulls/:number/comments", nil}, - //{"GET", "/repos/:owner/:repo/pulls/comments", nil}, - //{"GET", "/repos/:owner/:repo/pulls/comments/:number", nil}, - {"PUT", "/repos/:owner/:repo/pulls/:number/comments", nil}, - //{"PATCH", "/repos/:owner/:repo/pulls/comments/:number", nil}, - //{"DELETE", "/repos/:owner/:repo/pulls/comments/:number", nil}, + {"GET", "/repos/:owner/:repo/pulls", ""}, + {"GET", "/repos/:owner/:repo/pulls/:number", ""}, + {"POST", "/repos/:owner/:repo/pulls", ""}, + //{"PATCH", "/repos/:owner/:repo/pulls/:number", ""}, + {"GET", "/repos/:owner/:repo/pulls/:number/commits", ""}, + {"GET", "/repos/:owner/:repo/pulls/:number/files", ""}, + {"GET", "/repos/:owner/:repo/pulls/:number/merge", ""}, + {"PUT", "/repos/:owner/:repo/pulls/:number/merge", ""}, + {"GET", "/repos/:owner/:repo/pulls/:number/comments", ""}, + //{"GET", "/repos/:owner/:repo/pulls/comments", ""}, + //{"GET", "/repos/:owner/:repo/pulls/comments/:number", ""}, + {"PUT", "/repos/:owner/:repo/pulls/:number/comments", ""}, + //{"PATCH", "/repos/:owner/:repo/pulls/comments/:number", ""}, + //{"DELETE", "/repos/:owner/:repo/pulls/comments/:number", ""}, // Repositories - {"GET", "/user/repos", nil}, - {"GET", "/users/:user/repos", nil}, - {"GET", "/orgs/:org/repos", nil}, - {"GET", "/repositories", nil}, - {"POST", "/user/repos", nil}, - {"POST", "/orgs/:org/repos", nil}, - {"GET", "/repos/:owner/:repo", nil}, - //{"PATCH", "/repos/:owner/:repo", nil}, - {"GET", "/repos/:owner/:repo/contributors", nil}, - {"GET", "/repos/:owner/:repo/languages", nil}, - {"GET", "/repos/:owner/:repo/teams", nil}, - {"GET", "/repos/:owner/:repo/tags", nil}, - {"GET", "/repos/:owner/:repo/branches", nil}, - {"GET", "/repos/:owner/:repo/branches/:branch", nil}, - {"DELETE", "/repos/:owner/:repo", nil}, - {"GET", "/repos/:owner/:repo/collaborators", nil}, - {"GET", "/repos/:owner/:repo/collaborators/:user", nil}, - {"PUT", "/repos/:owner/:repo/collaborators/:user", nil}, - {"DELETE", "/repos/:owner/:repo/collaborators/:user", nil}, - {"GET", "/repos/:owner/:repo/comments", nil}, - {"GET", "/repos/:owner/:repo/commits/:sha/comments", nil}, - {"POST", "/repos/:owner/:repo/commits/:sha/comments", nil}, - {"GET", "/repos/:owner/:repo/comments/:id", nil}, - //{"PATCH", "/repos/:owner/:repo/comments/:id", nil}, - {"DELETE", "/repos/:owner/:repo/comments/:id", nil}, - {"GET", "/repos/:owner/:repo/commits", nil}, - {"GET", "/repos/:owner/:repo/commits/:sha", nil}, - {"GET", "/repos/:owner/:repo/readme", nil}, - //{"GET", "/repos/:owner/:repo/contents/*path", nil}, - //{"PUT", "/repos/:owner/:repo/contents/*path", nil}, - //{"DELETE", "/repos/:owner/:repo/contents/*path", nil}, - //{"GET", "/repos/:owner/:repo/:archive_format/:ref", nil}, - {"GET", "/repos/:owner/:repo/keys", nil}, - {"GET", "/repos/:owner/:repo/keys/:id", nil}, - {"POST", "/repos/:owner/:repo/keys", nil}, - //{"PATCH", "/repos/:owner/:repo/keys/:id", nil}, - {"DELETE", "/repos/:owner/:repo/keys/:id", nil}, - {"GET", "/repos/:owner/:repo/downloads", nil}, - {"GET", "/repos/:owner/:repo/downloads/:id", nil}, - {"DELETE", "/repos/:owner/:repo/downloads/:id", nil}, - {"GET", "/repos/:owner/:repo/forks", nil}, - {"POST", "/repos/:owner/:repo/forks", nil}, - {"GET", "/repos/:owner/:repo/hooks", nil}, - {"GET", "/repos/:owner/:repo/hooks/:id", nil}, - {"POST", "/repos/:owner/:repo/hooks", nil}, - //{"PATCH", "/repos/:owner/:repo/hooks/:id", nil}, - {"POST", "/repos/:owner/:repo/hooks/:id/tests", nil}, - {"DELETE", "/repos/:owner/:repo/hooks/:id", nil}, - {"POST", "/repos/:owner/:repo/merges", nil}, - {"GET", "/repos/:owner/:repo/releases", nil}, - {"GET", "/repos/:owner/:repo/releases/:id", nil}, - {"POST", "/repos/:owner/:repo/releases", nil}, - //{"PATCH", "/repos/:owner/:repo/releases/:id", nil}, - {"DELETE", "/repos/:owner/:repo/releases/:id", nil}, - {"GET", "/repos/:owner/:repo/releases/:id/assets", nil}, - {"GET", "/repos/:owner/:repo/stats/contributors", nil}, - {"GET", "/repos/:owner/:repo/stats/commit_activity", nil}, - {"GET", "/repos/:owner/:repo/stats/code_frequency", nil}, - {"GET", "/repos/:owner/:repo/stats/participation", nil}, - {"GET", "/repos/:owner/:repo/stats/punch_card", nil}, - {"GET", "/repos/:owner/:repo/statuses/:ref", nil}, - {"POST", "/repos/:owner/:repo/statuses/:ref", nil}, + {"GET", "/user/repos", ""}, + {"GET", "/users/:user/repos", ""}, + {"GET", "/orgs/:org/repos", ""}, + {"GET", "/repositories", ""}, + {"POST", "/user/repos", ""}, + {"POST", "/orgs/:org/repos", ""}, + {"GET", "/repos/:owner/:repo", ""}, + //{"PATCH", "/repos/:owner/:repo", ""}, + {"GET", "/repos/:owner/:repo/contributors", ""}, + {"GET", "/repos/:owner/:repo/languages", ""}, + {"GET", "/repos/:owner/:repo/teams", ""}, + {"GET", "/repos/:owner/:repo/tags", ""}, + {"GET", "/repos/:owner/:repo/branches", ""}, + {"GET", "/repos/:owner/:repo/branches/:branch", ""}, + {"DELETE", "/repos/:owner/:repo", ""}, + {"GET", "/repos/:owner/:repo/collaborators", ""}, + {"GET", "/repos/:owner/:repo/collaborators/:user", ""}, + {"PUT", "/repos/:owner/:repo/collaborators/:user", ""}, + {"DELETE", "/repos/:owner/:repo/collaborators/:user", ""}, + {"GET", "/repos/:owner/:repo/comments", ""}, + {"GET", "/repos/:owner/:repo/commits/:sha/comments", ""}, + {"POST", "/repos/:owner/:repo/commits/:sha/comments", ""}, + {"GET", "/repos/:owner/:repo/comments/:id", ""}, + //{"PATCH", "/repos/:owner/:repo/comments/:id", ""}, + {"DELETE", "/repos/:owner/:repo/comments/:id", ""}, + {"GET", "/repos/:owner/:repo/commits", ""}, + {"GET", "/repos/:owner/:repo/commits/:sha", ""}, + {"GET", "/repos/:owner/:repo/readme", ""}, + //{"GET", "/repos/:owner/:repo/contents/*path", ""}, + //{"PUT", "/repos/:owner/:repo/contents/*path", ""}, + //{"DELETE", "/repos/:owner/:repo/contents/*path", ""}, + //{"GET", "/repos/:owner/:repo/:archive_format/:ref", ""}, + {"GET", "/repos/:owner/:repo/keys", ""}, + {"GET", "/repos/:owner/:repo/keys/:id", ""}, + {"POST", "/repos/:owner/:repo/keys", ""}, + //{"PATCH", "/repos/:owner/:repo/keys/:id", ""}, + {"DELETE", "/repos/:owner/:repo/keys/:id", ""}, + {"GET", "/repos/:owner/:repo/downloads", ""}, + {"GET", "/repos/:owner/:repo/downloads/:id", ""}, + {"DELETE", "/repos/:owner/:repo/downloads/:id", ""}, + {"GET", "/repos/:owner/:repo/forks", ""}, + {"POST", "/repos/:owner/:repo/forks", ""}, + {"GET", "/repos/:owner/:repo/hooks", ""}, + {"GET", "/repos/:owner/:repo/hooks/:id", ""}, + {"POST", "/repos/:owner/:repo/hooks", ""}, + //{"PATCH", "/repos/:owner/:repo/hooks/:id", ""}, + {"POST", "/repos/:owner/:repo/hooks/:id/tests", ""}, + {"DELETE", "/repos/:owner/:repo/hooks/:id", ""}, + {"POST", "/repos/:owner/:repo/merges", ""}, + {"GET", "/repos/:owner/:repo/releases", ""}, + {"GET", "/repos/:owner/:repo/releases/:id", ""}, + {"POST", "/repos/:owner/:repo/releases", ""}, + //{"PATCH", "/repos/:owner/:repo/releases/:id", ""}, + {"DELETE", "/repos/:owner/:repo/releases/:id", ""}, + {"GET", "/repos/:owner/:repo/releases/:id/assets", ""}, + {"GET", "/repos/:owner/:repo/stats/contributors", ""}, + {"GET", "/repos/:owner/:repo/stats/commit_activity", ""}, + {"GET", "/repos/:owner/:repo/stats/code_frequency", ""}, + {"GET", "/repos/:owner/:repo/stats/participation", ""}, + {"GET", "/repos/:owner/:repo/stats/punch_card", ""}, + {"GET", "/repos/:owner/:repo/statuses/:ref", ""}, + {"POST", "/repos/:owner/:repo/statuses/:ref", ""}, // Search - {"GET", "/search/repositories", nil}, - {"GET", "/search/code", nil}, - {"GET", "/search/issues", nil}, - {"GET", "/search/users", nil}, - {"GET", "/legacy/issues/search/:owner/:repository/:state/:keyword", nil}, - {"GET", "/legacy/repos/search/:keyword", nil}, - {"GET", "/legacy/user/search/:keyword", nil}, - {"GET", "/legacy/user/email/:email", nil}, + {"GET", "/search/repositories", ""}, + {"GET", "/search/code", ""}, + {"GET", "/search/issues", ""}, + {"GET", "/search/users", ""}, + {"GET", "/legacy/issues/search/:owner/:repository/:state/:keyword", ""}, + {"GET", "/legacy/repos/search/:keyword", ""}, + {"GET", "/legacy/user/search/:keyword", ""}, + {"GET", "/legacy/user/email/:email", ""}, // Users - {"GET", "/users/:user", nil}, - {"GET", "/user", nil}, - //{"PATCH", "/user", nil}, - {"GET", "/users", nil}, - {"GET", "/user/emails", nil}, - {"POST", "/user/emails", nil}, - {"DELETE", "/user/emails", nil}, - {"GET", "/users/:user/followers", nil}, - {"GET", "/user/followers", nil}, - {"GET", "/users/:user/following", nil}, - {"GET", "/user/following", nil}, - {"GET", "/user/following/:user", nil}, - {"GET", "/users/:user/following/:target_user", nil}, - {"PUT", "/user/following/:user", nil}, - {"DELETE", "/user/following/:user", nil}, - {"GET", "/users/:user/keys", nil}, - {"GET", "/user/keys", nil}, - {"GET", "/user/keys/:id", nil}, - {"POST", "/user/keys", nil}, - //{"PATCH", "/user/keys/:id", nil}, - {"DELETE", "/user/keys/:id", nil}, + {"GET", "/users/:user", ""}, + {"GET", "/user", ""}, + //{"PATCH", "/user", ""}, + {"GET", "/users", ""}, + {"GET", "/user/emails", ""}, + {"POST", "/user/emails", ""}, + {"DELETE", "/user/emails", ""}, + {"GET", "/users/:user/followers", ""}, + {"GET", "/user/followers", ""}, + {"GET", "/users/:user/following", ""}, + {"GET", "/user/following", ""}, + {"GET", "/user/following/:user", ""}, + {"GET", "/users/:user/following/:target_user", ""}, + {"PUT", "/user/following/:user", ""}, + {"DELETE", "/user/following/:user", ""}, + {"GET", "/users/:user/keys", ""}, + {"GET", "/user/keys", ""}, + {"GET", "/user/keys/:id", ""}, + {"POST", "/user/keys", ""}, + //{"PATCH", "/user/keys/:id", ""}, + {"DELETE", "/user/keys/:id", ""}, } ) @@ -283,7 +282,7 @@ func TestRouterStatic(t *testing.T) { return nil }, e) c := NewContext(nil, nil, e) - h, _ := r.Find(GET, path, c.X()) + h, _ := r.Find(GET, path, c) if assert.NotNil(t, h) { h(c) assert.Equal(t, path, c.Get("path")) @@ -296,7 +295,7 @@ func TestRouterParam(t *testing.T) { r.Add(GET, "/users/:id", func(c Context) error { return nil }, e) - c := NewContext(nil, nil, e).X() + c := NewContext(nil, nil, e) h, _ := r.Find(GET, "/users/1", c) if assert.NotNil(t, h) { assert.Equal(t, "1", c.P(0)) @@ -309,7 +308,7 @@ func TestRouterTwoParam(t *testing.T) { r.Add(GET, "/users/:uid/files/:fid", func(Context) error { return nil }, e) - c := NewContext(nil, nil, e).X() + c := NewContext(nil, nil, e) h, _ := r.Find(GET, "/users/1/files/1", c) if assert.NotNil(t, h) { @@ -332,7 +331,7 @@ func TestRouterMatchAny(t *testing.T) { r.Add(GET, "/users/*", func(Context) error { return nil }, e) - c := NewContext(nil, nil, e).X() + c := NewContext(nil, nil, e) h, _ := r.Find(GET, "/", c) if assert.NotNil(t, h) { @@ -356,7 +355,7 @@ func TestRouterMicroParam(t *testing.T) { r.Add(GET, "/:a/:b/:c", func(c Context) error { return nil }, e) - c := NewContext(nil, nil, e).X() + c := NewContext(nil, nil, e) h, _ := r.Find(GET, "/1/2/3", c) if assert.NotNil(t, h) { assert.Equal(t, "1", c.P(0)) @@ -373,7 +372,7 @@ func TestRouterMixParamMatchAny(t *testing.T) { r.Add(GET, "/users/:id/*", func(c Context) error { return nil }, e) - c := NewContext(nil, nil, e).X() + c := NewContext(nil, nil, e) h, _ := r.Find(GET, "/users/joe/comments", c) if assert.NotNil(t, h) { @@ -394,7 +393,7 @@ func TestRouterMultiRoute(t *testing.T) { r.Add(GET, "/users/:id", func(c Context) error { return nil }, e) - c := NewContext(nil, nil, e).X() + c := NewContext(nil, nil, e) // Route > /users h, _ := r.Find(GET, "/users", c) @@ -450,7 +449,7 @@ func TestRouterPriority(t *testing.T) { c.Set("g", 7) return nil }, e) - c := NewContext(nil, nil, e).X() + c := NewContext(nil, nil, e) // Route > /users h, _ := r.Find(GET, "/users", c) @@ -518,7 +517,7 @@ func TestRouterParamNames(t *testing.T) { r.Add(GET, "/users/:uid/files/:fid", func(c Context) error { return nil }, e) - c := NewContext(nil, nil, e).X() + c := NewContext(nil, nil, e) // Route > /users h, _ := r.Find(GET, "/users", c) @@ -530,16 +529,16 @@ func TestRouterParamNames(t *testing.T) { // Route > /users/:id h, _ = r.Find(GET, "/users/1", c) if assert.NotNil(t, h) { - assert.Equal(t, "id", c.pnames[0]) + assert.Equal(t, "id", c.X().pnames[0]) assert.Equal(t, "1", c.P(0)) } // Route > /users/:uid/files/:fid h, _ = r.Find(GET, "/users/1/files/1", c) if assert.NotNil(t, h) { - assert.Equal(t, "uid", c.pnames[0]) + assert.Equal(t, "uid", c.X().pnames[0]) assert.Equal(t, "1", c.P(0)) - assert.Equal(t, "fid", c.pnames[1]) + assert.Equal(t, "fid", c.X().pnames[1]) assert.Equal(t, "1", c.P(1)) } } @@ -553,11 +552,11 @@ func TestRouterAPI(t *testing.T) { return nil }, e) } - c := NewContext(nil, nil, e).X() + c := NewContext(nil, nil, e) for _, route := range api { h, _ := r.Find(route.Method, route.Path, c) if assert.NotNil(t, h) { - for i, n := range c.pnames { + for i, n := range c.X().pnames { if assert.NotEmpty(t, n) { assert.Equal(t, ":"+n, c.P(i)) } @@ -567,27 +566,6 @@ func TestRouterAPI(t *testing.T) { } } -func TestRouterServeHTTP(t *testing.T) { - e := New() - r := e.router - - r.Add(GET, "/users", func(Context) error { - return nil - }, e) - - // OK - req, _ := http.NewRequest(GET, "/users", nil) - w := httptest.NewRecorder() - r.ServeHTTP(w, req) - assert.Equal(t, http.StatusOK, w.Code) - - // Not found - req, _ = http.NewRequest(GET, "/files", nil) - w = httptest.NewRecorder() - r.ServeHTTP(w, req) - assert.Equal(t, http.StatusNotFound, w.Code) -} - func (n *node) printTree(pfx string, tail bool) { p := prefix(tail, pfx, "└── ", "├── ") fmt.Printf("%s%s, %p: type=%d, parent=%p, handler=%v\n", p, n.prefix, n, n.kind, n.parent, n.methodHandler) diff --git a/test/fixture/walle.png b/test/fixture/walle.png deleted file mode 100644 index 493985d4..00000000 Binary files a/test/fixture/walle.png and /dev/null differ diff --git a/website/Dockerfile b/website/Dockerfile index c3a6614a..e8306fd7 100644 --- a/website/Dockerfile +++ b/website/Dockerfile @@ -1,7 +1,7 @@ -FROM busybox +FROM reg.lab.st/argo MAINTAINER Vishal Rana -COPY server /server -COPY public /public +ADD argo.json /etc +ADD public /www -CMD ["/server"] +CMD ["-c", "/etc/argo.json"] diff --git a/website/argo.json b/website/argo.json new file mode 100644 index 00000000..8bc8ad38 --- /dev/null +++ b/website/argo.json @@ -0,0 +1,14 @@ +{ + "www": { + "listen": ":80", + "hosts": { + "*": { + "paths": { + "/*": { + "dir": "/www" + } + } + } + } + } +} diff --git a/website/content/recipes/crud.md b/website/content/recipes/crud.md index 5b1d81b2..65b1a099 100644 --- a/website/content/recipes/crud.md +++ b/website/content/recipes/crud.md @@ -16,4 +16,4 @@ menu: - [vishr](https://github.com/vishr) -### [Source Code](https://github.com/labstack/echo/blob/master/recipes/crud) +### [Source Code](https://github.com/vishr/recipes/blob/master/echo/recipes/crud) diff --git a/website/content/recipes/embed-resources.md b/website/content/recipes/embed-resources.md index 275aec1a..2b8ad44a 100644 --- a/website/content/recipes/embed-resources.md +++ b/website/content/recipes/embed-resources.md @@ -17,4 +17,4 @@ menu: - [caarlos0](https://github.com/caarlos0) -### [Source Code](https://github.com/labstack/echo/blob/master/recipes/rice) +### [Source Code](https://github.com/vishr/recipes/blob/master/echo/recipes/rice) diff --git a/website/content/recipes/file-upload.md b/website/content/recipes/file-upload.md index 9919b058..36582e63 100644 --- a/website/content/recipes/file-upload.md +++ b/website/content/recipes/file-upload.md @@ -50,4 +50,4 @@ if _, err = io.Copy(dst, file); err != nil { - [vishr](https://github.com/vishr) -### [Source Code](https://github.com/labstack/echo/blob/master/recipes/file-upload) +### [Source Code](https://github.com/vishr/recipes/blob/master/echo/recipes/file-upload) diff --git a/website/content/recipes/google-app-engine.md b/website/content/recipes/google-app-engine.md index ecc1c9b2..bbfe3572 100644 --- a/website/content/recipes/google-app-engine.md +++ b/website/content/recipes/google-app-engine.md @@ -132,4 +132,4 @@ but is outside the scope of this recipe. - [CaptainCodeman](https://github.com/CaptainCodeman) -### [Source Code](https://github.com/labstack/echo/blob/master/recipes/google-app-engine) +### [Source Code](https://github.com/vishr/recipes/blob/master/echo/recipes/google-app-engine) diff --git a/website/content/recipes/graceful-shutdown.md b/website/content/recipes/graceful-shutdown.md index 1d2cc3e0..f2516138 100644 --- a/website/content/recipes/graceful-shutdown.md +++ b/website/content/recipes/graceful-shutdown.md @@ -24,6 +24,6 @@ menu: ### Source Code -[graceful](https://github.com/labstack/echo/blob/master/recipes/graceful-shutdown/graceful) +[graceful](https://github.com/vishr/recipes/blob/master/echo/recipes/graceful-shutdown/graceful) -[grace](https://github.com/labstack/echo/blob/master/recipes/graceful-shutdown/grace) +[grace](https://github.com/vishr/recipes/blob/master/echo/recipes/graceful-shutdown/grace) diff --git a/website/content/recipes/hello-world.md b/website/content/recipes/hello-world.md index f774f9d5..94fa555f 100644 --- a/website/content/recipes/hello-world.md +++ b/website/content/recipes/hello-world.md @@ -16,4 +16,4 @@ menu: - [vishr](https://github.com/vishr) -### [Source Code](https://github.com/labstack/echo/blob/master/recipes/hello-world) +### [Source Code](https://github.com/vishr/recipes/blob/master/echo/recipes/hello-world) diff --git a/website/content/recipes/jsonp.md b/website/content/recipes/jsonp.md index c04c6c35..07ad7c7d 100644 --- a/website/content/recipes/jsonp.md +++ b/website/content/recipes/jsonp.md @@ -24,4 +24,4 @@ JSONP is a method that allows cross-domain server calls. You can read more about - [willf](https://github.com/willf) -### [Source Code](https://github.com/labstack/echo/blob/master/recipes/jsonp) +### [Source Code](https://github.com/vishr/recipes/blob/master/echo/recipes/jsonp) diff --git a/website/content/recipes/jwt-authentication.md b/website/content/recipes/jwt-authentication.md index df75f184..938c119e 100644 --- a/website/content/recipes/jwt-authentication.md +++ b/website/content/recipes/jwt-authentication.md @@ -55,4 +55,4 @@ $ curl localhost:1323/restricted -H "Authorization: Bearer " => Access g - [axdg](https://github.com/axdg) -### [Source Code](https://github.com/labstack/echo/blob/master/recipes/jwt-authentication) +### [Source Code](https://github.com/vishr/recipes/blob/master/echo/recipes/jwt-authentication) diff --git a/website/content/recipes/middleware.md b/website/content/recipes/middleware.md index bab02b00..6e000058 100644 --- a/website/content/recipes/middleware.md +++ b/website/content/recipes/middleware.md @@ -17,4 +17,4 @@ menu: - [vishr](https://github.com/vishr) -### [Source Code](https://github.com/labstack/echo/blob/master/recipes/middleware) +### [Source Code](https://github.com/vishr/recipes/blob/master/echo/recipes/middleware) diff --git a/website/content/recipes/streaming-file-upload.md b/website/content/recipes/streaming-file-upload.md index 3e1f9146..ea02aa48 100644 --- a/website/content/recipes/streaming-file-upload.md +++ b/website/content/recipes/streaming-file-upload.md @@ -25,4 +25,4 @@ menu: - [vishr](https://github.com/vishr) -### [Source Code](https://github.com/labstack/echo/blob/master/recipes/streaming-file-upload) +### [Source Code](https://github.com/vishr/recipes/blob/master/echo/recipes/streaming-file-upload) diff --git a/website/content/recipes/streaming-response.md b/website/content/recipes/streaming-response.md index 898c9b19..e9533526 100644 --- a/website/content/recipes/streaming-response.md +++ b/website/content/recipes/streaming-response.md @@ -35,4 +35,4 @@ $ curl localhost:1323 - [vishr](https://github.com/vishr) -### [Source Code](https://github.com/labstack/echo/blob/master/recipes/streaming-response) +### [Source Code](https://github.com/vishr/recipes/blob/master/echo/recipes/streaming-response) diff --git a/website/content/recipes/subdomains.md b/website/content/recipes/subdomains.md index f4647b0a..50b2a956 100644 --- a/website/content/recipes/subdomains.md +++ b/website/content/recipes/subdomains.md @@ -15,4 +15,4 @@ menu: - [axdg](https://github.com/axdg) - [vishr](https://github.com/axdg) -### [Source Code](https://github.com/labstack/echo/blob/master/recipes/subdomains) +### [Source Code](https://github.com/vishr/recipes/blob/master/echo/recipes/subdomains) diff --git a/website/content/recipes/website.md b/website/content/recipes/website.md index b9894e1d..2ea3e5b9 100644 --- a/website/content/recipes/website.md +++ b/website/content/recipes/website.md @@ -22,4 +22,4 @@ menu: - [vishr](https://github.com/vishr) -### [Source Code](https://github.com/labstack/echo/blob/master/recipes/website) +### [Source Code](https://github.com/vishr/recipes/blob/master/echo/recipes/website) diff --git a/website/content/recipes/websocket.md b/website/content/recipes/websocket.md index bdd084bb..03fa7a3d 100644 --- a/website/content/recipes/websocket.md +++ b/website/content/recipes/websocket.md @@ -44,4 +44,4 @@ Hello, Server! - [vishr](https://github.com/vishr) -### [Source Code](https://github.com/labstack/echo/blob/master/recipes/websocket) +### [Source Code](https://github.com/vishr/recipes/blob/master/echo/recipes/websocket) diff --git a/website/layouts/shortcodes/embed.html b/website/layouts/shortcodes/embed.html index 1c88e121..9de428b2 100644 --- a/website/layouts/shortcodes/embed.html +++ b/website/layouts/shortcodes/embed.html @@ -1,2 +1,2 @@ -
+
 
diff --git a/website/package.json b/website/package.json deleted file mode 100644 index 0967ef42..00000000 --- a/website/package.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/website/server.go b/website/server.go deleted file mode 100644 index 9327d3e6..00000000 --- a/website/server.go +++ /dev/null @@ -1,17 +0,0 @@ -package main - -import ( - "github.com/labstack/echo" - mw "github.com/labstack/echo/middleware" -) - -func main() { - e := echo.New() - e.Use(mw.Logger()) - e.Use(mw.Recover()) - e.Use(mw.Gzip()) - - e.Static("/", "public") - - e.Run(":80") -}