mirror of
https://github.com/labstack/echo.git
synced 2025-06-02 23:27:34 +02:00
New renderer interface #21
Signed-off-by: Vishal Rana <vr@labstack.com>
This commit is contained in:
parent
da18bc1ce6
commit
6633a1fca7
@ -48,7 +48,7 @@ func (c *Context) Bind(v interface{}) error {
|
|||||||
func (c *Context) Render(code int, name string, data interface{}) error {
|
func (c *Context) Render(code int, name string, data interface{}) error {
|
||||||
c.Response.Header().Set(HeaderContentType, MIMEHTML+"; charset=utf-8")
|
c.Response.Header().Set(HeaderContentType, MIMEHTML+"; charset=utf-8")
|
||||||
c.Response.WriteHeader(code)
|
c.Response.WriteHeader(code)
|
||||||
return c.echo.renderFunc(c.Response, name, data)
|
return c.echo.renderer.Render(c.Response, name, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
// JSON sends an application/json response with status code.
|
// JSON sends an application/json response with status code.
|
||||||
|
@ -12,7 +12,7 @@ func TestContext(t *testing.T) {
|
|||||||
b, _ := json.Marshal(u1)
|
b, _ := json.Marshal(u1)
|
||||||
r, _ := http.NewRequest(POST, "/users/1", bytes.NewReader(b))
|
r, _ := http.NewRequest(POST, "/users/1", bytes.NewReader(b))
|
||||||
c := &Context{
|
c := &Context{
|
||||||
Response: &response{writer: httptest.NewRecorder()},
|
Response: &response{Writer: httptest.NewRecorder()},
|
||||||
Request: r,
|
Request: r,
|
||||||
params: make(Params, 5),
|
params: make(Params, 5),
|
||||||
store: make(store),
|
store: make(store),
|
||||||
|
18
echo.go
18
echo.go
@ -15,14 +15,16 @@ type (
|
|||||||
middleware []MiddlewareFunc
|
middleware []MiddlewareFunc
|
||||||
maxParam byte
|
maxParam byte
|
||||||
notFoundHandler HandlerFunc
|
notFoundHandler HandlerFunc
|
||||||
renderFunc RenderFunc
|
renderer Renderer
|
||||||
pool sync.Pool
|
pool sync.Pool
|
||||||
}
|
}
|
||||||
Middleware interface{}
|
Middleware interface{}
|
||||||
MiddlewareFunc func(HandlerFunc) HandlerFunc
|
MiddlewareFunc func(HandlerFunc) HandlerFunc
|
||||||
Handler interface{}
|
Handler interface{}
|
||||||
HandlerFunc func(*Context)
|
HandlerFunc func(*Context)
|
||||||
RenderFunc func(io.Writer, string, interface{}) error
|
Renderer interface {
|
||||||
|
Render(io.Writer, string, interface{}) error
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -72,9 +74,6 @@ func New() (e *Echo) {
|
|||||||
notFoundHandler: func(c *Context) {
|
notFoundHandler: func(c *Context) {
|
||||||
http.Error(c.Response, http.StatusText(http.StatusNotFound), http.StatusNotFound)
|
http.Error(c.Response, http.StatusText(http.StatusNotFound), http.StatusNotFound)
|
||||||
},
|
},
|
||||||
renderFunc: func(w io.Writer, name string, data interface{}) (err error) {
|
|
||||||
return
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
e.Router = NewRouter(e)
|
e.Router = NewRouter(e)
|
||||||
e.pool.New = func() interface{} {
|
e.pool.New = func() interface{} {
|
||||||
@ -115,9 +114,9 @@ func (e *Echo) NotFoundHandler(h Handler) {
|
|||||||
e.notFoundHandler = wrapH(h)
|
e.notFoundHandler = wrapH(h)
|
||||||
}
|
}
|
||||||
|
|
||||||
// RenderFunc sets a custom RenderFunc.
|
// Renderer sets an HTML Renderer.
|
||||||
func (e *Echo) RenderFunc(r RenderFunc) {
|
func (e *Echo) Renderer(r Renderer) {
|
||||||
e.renderFunc = r
|
e.renderer = r
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use adds handler to the middleware chain.
|
// Use adds handler to the middleware chain.
|
||||||
@ -197,7 +196,8 @@ func (e *Echo) Index(file string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (e *Echo) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
func (e *Echo) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
h, c, echo := e.Router.Find(r.Method, r.URL.Path)
|
c := e.pool.Get().(*Context)
|
||||||
|
h, echo := e.Router.Find(r.Method, r.URL.Path, c.params)
|
||||||
if echo != nil {
|
if echo != nil {
|
||||||
e = echo
|
e = echo
|
||||||
}
|
}
|
||||||
|
10
response.go
10
response.go
@ -7,7 +7,7 @@ import (
|
|||||||
|
|
||||||
type (
|
type (
|
||||||
response struct {
|
response struct {
|
||||||
writer http.ResponseWriter
|
Writer http.ResponseWriter
|
||||||
status int
|
status int
|
||||||
size int
|
size int
|
||||||
committed bool
|
committed bool
|
||||||
@ -15,7 +15,7 @@ type (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (r *response) Header() http.Header {
|
func (r *response) Header() http.Header {
|
||||||
return r.writer.Header()
|
return r.Writer.Header()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *response) WriteHeader(n int) {
|
func (r *response) WriteHeader(n int) {
|
||||||
@ -25,12 +25,12 @@ func (r *response) WriteHeader(n int) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
r.status = n
|
r.status = n
|
||||||
r.writer.WriteHeader(n)
|
r.Writer.WriteHeader(n)
|
||||||
r.committed = true
|
r.committed = true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *response) Write(b []byte) (n int, err error) {
|
func (r *response) Write(b []byte) (n int, err error) {
|
||||||
n, err = r.writer.Write(b)
|
n, err = r.Writer.Write(b)
|
||||||
r.size += n
|
r.size += n
|
||||||
return n, err
|
return n, err
|
||||||
}
|
}
|
||||||
@ -44,6 +44,6 @@ func (r *response) Size() int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *response) reset(w http.ResponseWriter) {
|
func (r *response) reset(w http.ResponseWriter) {
|
||||||
r.writer = w
|
r.Writer = w
|
||||||
r.committed = false
|
r.committed = false
|
||||||
}
|
}
|
||||||
|
12
router.go
12
router.go
@ -157,8 +157,7 @@ func lcp(a, b string) (i int) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *router) Find(method, path string) (h HandlerFunc, c *Context, echo *Echo) {
|
func (r *router) Find(method, path string, params Params) (h HandlerFunc, echo *Echo) {
|
||||||
c = r.echo.pool.Get().(*Context)
|
|
||||||
cn := r.trees[method] // Current node as root
|
cn := r.trees[method] // Current node as root
|
||||||
search := path
|
search := path
|
||||||
n := 0 // Param count
|
n := 0 // Param count
|
||||||
@ -182,7 +181,7 @@ func (r *router) Find(method, path string) (h HandlerFunc, c *Context, echo *Ech
|
|||||||
i, l := 0, len(search)
|
i, l := 0, len(search)
|
||||||
for ; i < l && search[i] != '/'; i++ {
|
for ; i < l && search[i] != '/'; i++ {
|
||||||
}
|
}
|
||||||
p := c.params[:n+1]
|
p := params[:n+1]
|
||||||
p[n].Name = cn.prefix[1:]
|
p[n].Name = cn.prefix[1:]
|
||||||
p[n].Value = search[:i]
|
p[n].Value = search[:i]
|
||||||
n++
|
n++
|
||||||
@ -190,7 +189,7 @@ func (r *router) Find(method, path string) (h HandlerFunc, c *Context, echo *Ech
|
|||||||
} else if cn.has == cnode {
|
} else if cn.has == cnode {
|
||||||
// Catch-all node
|
// Catch-all node
|
||||||
cn = cn.edges[0]
|
cn = cn.edges[0]
|
||||||
p := c.params[:n+1]
|
p := params[:n+1]
|
||||||
p[n].Name = "_name"
|
p[n].Name = "_name"
|
||||||
p[n].Value = search
|
p[n].Value = search
|
||||||
search = "" // End search
|
search = "" // End search
|
||||||
@ -215,8 +214,9 @@ func (r *router) Find(method, path string) (h HandlerFunc, c *Context, echo *Ech
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *router) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
func (r *router) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
||||||
h, c, _ := r.Find(req.Method, req.URL.Path)
|
c := r.echo.pool.Get().(*Context)
|
||||||
c.Response.writer = w
|
h, _ := r.Find(req.Method, req.URL.Path, c.params)
|
||||||
|
c.Response.Writer = w
|
||||||
if h != nil {
|
if h != nil {
|
||||||
h(c)
|
h(c)
|
||||||
} else {
|
} else {
|
||||||
|
581
router_test.go
581
router_test.go
@ -12,273 +12,276 @@ type route struct {
|
|||||||
path string
|
path string
|
||||||
}
|
}
|
||||||
|
|
||||||
var api = []route{
|
var (
|
||||||
// OAuth Authorizations
|
params = make(Params, 5)
|
||||||
{"GET", "/authorizations"},
|
api = []route{
|
||||||
{"GET", "/authorizations/:id"},
|
// OAuth Authorizations
|
||||||
{"POST", "/authorizations"},
|
{"GET", "/authorizations"},
|
||||||
//{"PUT", "/authorizations/clients/:client_id"},
|
{"GET", "/authorizations/:id"},
|
||||||
//{"PATCH", "/authorizations/:id"},
|
{"POST", "/authorizations"},
|
||||||
{"DELETE", "/authorizations/:id"},
|
//{"PUT", "/authorizations/clients/:client_id"},
|
||||||
{"GET", "/applications/:client_id/tokens/:access_token"},
|
//{"PATCH", "/authorizations/:id"},
|
||||||
{"DELETE", "/applications/:client_id/tokens"},
|
{"DELETE", "/authorizations/:id"},
|
||||||
{"DELETE", "/applications/:client_id/tokens/:access_token"},
|
{"GET", "/applications/:client_id/tokens/:access_token"},
|
||||||
|
{"DELETE", "/applications/:client_id/tokens"},
|
||||||
|
{"DELETE", "/applications/:client_id/tokens/:access_token"},
|
||||||
|
|
||||||
// Activity
|
// Activity
|
||||||
{"GET", "/events"},
|
{"GET", "/events"},
|
||||||
{"GET", "/repos/:owner/:repo/events"},
|
{"GET", "/repos/:owner/:repo/events"},
|
||||||
{"GET", "/networks/:owner/:repo/events"},
|
{"GET", "/networks/:owner/:repo/events"},
|
||||||
{"GET", "/orgs/:org/events"},
|
{"GET", "/orgs/:org/events"},
|
||||||
{"GET", "/users/:user/received_events"},
|
{"GET", "/users/:user/received_events"},
|
||||||
{"GET", "/users/:user/received_events/public"},
|
{"GET", "/users/:user/received_events/public"},
|
||||||
{"GET", "/users/:user/events"},
|
{"GET", "/users/:user/events"},
|
||||||
{"GET", "/users/:user/events/public"},
|
{"GET", "/users/:user/events/public"},
|
||||||
{"GET", "/users/:user/events/orgs/:org"},
|
{"GET", "/users/:user/events/orgs/:org"},
|
||||||
{"GET", "/feeds"},
|
{"GET", "/feeds"},
|
||||||
{"GET", "/notifications"},
|
{"GET", "/notifications"},
|
||||||
{"GET", "/repos/:owner/:repo/notifications"},
|
{"GET", "/repos/:owner/:repo/notifications"},
|
||||||
{"PUT", "/notifications"},
|
{"PUT", "/notifications"},
|
||||||
{"PUT", "/repos/:owner/:repo/notifications"},
|
{"PUT", "/repos/:owner/:repo/notifications"},
|
||||||
{"GET", "/notifications/threads/:id"},
|
{"GET", "/notifications/threads/:id"},
|
||||||
//{"PATCH", "/notifications/threads/:id"},
|
//{"PATCH", "/notifications/threads/:id"},
|
||||||
{"GET", "/notifications/threads/:id/subscription"},
|
{"GET", "/notifications/threads/:id/subscription"},
|
||||||
{"PUT", "/notifications/threads/:id/subscription"},
|
{"PUT", "/notifications/threads/:id/subscription"},
|
||||||
{"DELETE", "/notifications/threads/:id/subscription"},
|
{"DELETE", "/notifications/threads/:id/subscription"},
|
||||||
{"GET", "/repos/:owner/:repo/stargazers"},
|
{"GET", "/repos/:owner/:repo/stargazers"},
|
||||||
{"GET", "/users/:user/starred"},
|
{"GET", "/users/:user/starred"},
|
||||||
{"GET", "/user/starred"},
|
{"GET", "/user/starred"},
|
||||||
{"GET", "/user/starred/:owner/:repo"},
|
{"GET", "/user/starred/:owner/:repo"},
|
||||||
{"PUT", "/user/starred/:owner/:repo"},
|
{"PUT", "/user/starred/:owner/:repo"},
|
||||||
{"DELETE", "/user/starred/:owner/:repo"},
|
{"DELETE", "/user/starred/:owner/:repo"},
|
||||||
{"GET", "/repos/:owner/:repo/subscribers"},
|
{"GET", "/repos/:owner/:repo/subscribers"},
|
||||||
{"GET", "/users/:user/subscriptions"},
|
{"GET", "/users/:user/subscriptions"},
|
||||||
{"GET", "/user/subscriptions"},
|
{"GET", "/user/subscriptions"},
|
||||||
{"GET", "/repos/:owner/:repo/subscription"},
|
{"GET", "/repos/:owner/:repo/subscription"},
|
||||||
{"PUT", "/repos/:owner/:repo/subscription"},
|
{"PUT", "/repos/:owner/:repo/subscription"},
|
||||||
{"DELETE", "/repos/:owner/:repo/subscription"},
|
{"DELETE", "/repos/:owner/:repo/subscription"},
|
||||||
{"GET", "/user/subscriptions/:owner/:repo"},
|
{"GET", "/user/subscriptions/:owner/:repo"},
|
||||||
{"PUT", "/user/subscriptions/:owner/:repo"},
|
{"PUT", "/user/subscriptions/:owner/:repo"},
|
||||||
{"DELETE", "/user/subscriptions/:owner/:repo"},
|
{"DELETE", "/user/subscriptions/:owner/:repo"},
|
||||||
|
|
||||||
// Gists
|
// Gists
|
||||||
{"GET", "/users/:user/gists"},
|
{"GET", "/users/:user/gists"},
|
||||||
{"GET", "/gists"},
|
{"GET", "/gists"},
|
||||||
//{"GET", "/gists/public"},
|
//{"GET", "/gists/public"},
|
||||||
//{"GET", "/gists/starred"},
|
//{"GET", "/gists/starred"},
|
||||||
{"GET", "/gists/:id"},
|
{"GET", "/gists/:id"},
|
||||||
{"POST", "/gists"},
|
{"POST", "/gists"},
|
||||||
//{"PATCH", "/gists/:id"},
|
//{"PATCH", "/gists/:id"},
|
||||||
{"PUT", "/gists/:id/star"},
|
{"PUT", "/gists/:id/star"},
|
||||||
{"DELETE", "/gists/:id/star"},
|
{"DELETE", "/gists/:id/star"},
|
||||||
{"GET", "/gists/:id/star"},
|
{"GET", "/gists/:id/star"},
|
||||||
{"POST", "/gists/:id/forks"},
|
{"POST", "/gists/:id/forks"},
|
||||||
{"DELETE", "/gists/:id"},
|
{"DELETE", "/gists/:id"},
|
||||||
|
|
||||||
// Git Data
|
// Git Data
|
||||||
{"GET", "/repos/:owner/:repo/git/blobs/:sha"},
|
{"GET", "/repos/:owner/:repo/git/blobs/:sha"},
|
||||||
{"POST", "/repos/:owner/:repo/git/blobs"},
|
{"POST", "/repos/:owner/:repo/git/blobs"},
|
||||||
{"GET", "/repos/:owner/:repo/git/commits/:sha"},
|
{"GET", "/repos/:owner/:repo/git/commits/:sha"},
|
||||||
{"POST", "/repos/:owner/:repo/git/commits"},
|
{"POST", "/repos/:owner/:repo/git/commits"},
|
||||||
//{"GET", "/repos/:owner/:repo/git/refs/*ref"},
|
//{"GET", "/repos/:owner/:repo/git/refs/*ref"},
|
||||||
{"GET", "/repos/:owner/:repo/git/refs"},
|
{"GET", "/repos/:owner/:repo/git/refs"},
|
||||||
{"POST", "/repos/:owner/:repo/git/refs"},
|
{"POST", "/repos/:owner/:repo/git/refs"},
|
||||||
//{"PATCH", "/repos/:owner/:repo/git/refs/*ref"},
|
//{"PATCH", "/repos/:owner/:repo/git/refs/*ref"},
|
||||||
//{"DELETE", "/repos/:owner/:repo/git/refs/*ref"},
|
//{"DELETE", "/repos/:owner/:repo/git/refs/*ref"},
|
||||||
{"GET", "/repos/:owner/:repo/git/tags/:sha"},
|
{"GET", "/repos/:owner/:repo/git/tags/:sha"},
|
||||||
{"POST", "/repos/:owner/:repo/git/tags"},
|
{"POST", "/repos/:owner/:repo/git/tags"},
|
||||||
{"GET", "/repos/:owner/:repo/git/trees/:sha"},
|
{"GET", "/repos/:owner/:repo/git/trees/:sha"},
|
||||||
{"POST", "/repos/:owner/:repo/git/trees"},
|
{"POST", "/repos/:owner/:repo/git/trees"},
|
||||||
|
|
||||||
// Issues
|
// Issues
|
||||||
{"GET", "/issues"},
|
{"GET", "/issues"},
|
||||||
{"GET", "/user/issues"},
|
{"GET", "/user/issues"},
|
||||||
{"GET", "/orgs/:org/issues"},
|
{"GET", "/orgs/:org/issues"},
|
||||||
{"GET", "/repos/:owner/:repo/issues"},
|
{"GET", "/repos/:owner/:repo/issues"},
|
||||||
{"GET", "/repos/:owner/:repo/issues/:number"},
|
{"GET", "/repos/:owner/:repo/issues/:number"},
|
||||||
{"POST", "/repos/:owner/:repo/issues"},
|
{"POST", "/repos/:owner/:repo/issues"},
|
||||||
//{"PATCH", "/repos/:owner/:repo/issues/:number"},
|
//{"PATCH", "/repos/:owner/:repo/issues/:number"},
|
||||||
{"GET", "/repos/:owner/:repo/assignees"},
|
{"GET", "/repos/:owner/:repo/assignees"},
|
||||||
{"GET", "/repos/:owner/:repo/assignees/:assignee"},
|
{"GET", "/repos/:owner/:repo/assignees/:assignee"},
|
||||||
{"GET", "/repos/:owner/:repo/issues/:number/comments"},
|
{"GET", "/repos/:owner/:repo/issues/:number/comments"},
|
||||||
//{"GET", "/repos/:owner/:repo/issues/comments"},
|
//{"GET", "/repos/:owner/:repo/issues/comments"},
|
||||||
//{"GET", "/repos/:owner/:repo/issues/comments/:id"},
|
//{"GET", "/repos/:owner/:repo/issues/comments/:id"},
|
||||||
{"POST", "/repos/:owner/:repo/issues/:number/comments"},
|
{"POST", "/repos/:owner/:repo/issues/:number/comments"},
|
||||||
//{"PATCH", "/repos/:owner/:repo/issues/comments/:id"},
|
//{"PATCH", "/repos/:owner/:repo/issues/comments/:id"},
|
||||||
//{"DELETE", "/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/:number/events"},
|
||||||
//{"GET", "/repos/:owner/:repo/issues/events"},
|
//{"GET", "/repos/:owner/:repo/issues/events"},
|
||||||
//{"GET", "/repos/:owner/:repo/issues/events/:id"},
|
//{"GET", "/repos/:owner/:repo/issues/events/:id"},
|
||||||
{"GET", "/repos/:owner/:repo/labels"},
|
{"GET", "/repos/:owner/:repo/labels"},
|
||||||
{"GET", "/repos/:owner/:repo/labels/:name"},
|
{"GET", "/repos/:owner/:repo/labels/:name"},
|
||||||
{"POST", "/repos/:owner/:repo/labels"},
|
{"POST", "/repos/:owner/:repo/labels"},
|
||||||
//{"PATCH", "/repos/:owner/:repo/labels/:name"},
|
//{"PATCH", "/repos/:owner/:repo/labels/:name"},
|
||||||
{"DELETE", "/repos/:owner/:repo/labels/:name"},
|
{"DELETE", "/repos/:owner/:repo/labels/:name"},
|
||||||
{"GET", "/repos/:owner/:repo/issues/:number/labels"},
|
{"GET", "/repos/:owner/:repo/issues/:number/labels"},
|
||||||
{"POST", "/repos/:owner/:repo/issues/:number/labels"},
|
{"POST", "/repos/:owner/:repo/issues/:number/labels"},
|
||||||
{"DELETE", "/repos/:owner/:repo/issues/:number/labels/:name"},
|
{"DELETE", "/repos/:owner/:repo/issues/:number/labels/:name"},
|
||||||
{"PUT", "/repos/:owner/:repo/issues/:number/labels"},
|
{"PUT", "/repos/:owner/:repo/issues/:number/labels"},
|
||||||
{"DELETE", "/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/:number/labels"},
|
||||||
{"GET", "/repos/:owner/:repo/milestones"},
|
{"GET", "/repos/:owner/:repo/milestones"},
|
||||||
{"GET", "/repos/:owner/:repo/milestones/:number"},
|
{"GET", "/repos/:owner/:repo/milestones/:number"},
|
||||||
{"POST", "/repos/:owner/:repo/milestones"},
|
{"POST", "/repos/:owner/:repo/milestones"},
|
||||||
//{"PATCH", "/repos/:owner/:repo/milestones/:number"},
|
//{"PATCH", "/repos/:owner/:repo/milestones/:number"},
|
||||||
{"DELETE", "/repos/:owner/:repo/milestones/:number"},
|
{"DELETE", "/repos/:owner/:repo/milestones/:number"},
|
||||||
|
|
||||||
// Miscellaneous
|
// Miscellaneous
|
||||||
{"GET", "/emojis"},
|
{"GET", "/emojis"},
|
||||||
{"GET", "/gitignore/templates"},
|
{"GET", "/gitignore/templates"},
|
||||||
{"GET", "/gitignore/templates/:name"},
|
{"GET", "/gitignore/templates/:name"},
|
||||||
{"POST", "/markdown"},
|
{"POST", "/markdown"},
|
||||||
{"POST", "/markdown/raw"},
|
{"POST", "/markdown/raw"},
|
||||||
{"GET", "/meta"},
|
{"GET", "/meta"},
|
||||||
{"GET", "/rate_limit"},
|
{"GET", "/rate_limit"},
|
||||||
|
|
||||||
// Organizations
|
// Organizations
|
||||||
{"GET", "/users/:user/orgs"},
|
{"GET", "/users/:user/orgs"},
|
||||||
{"GET", "/user/orgs"},
|
{"GET", "/user/orgs"},
|
||||||
{"GET", "/orgs/:org"},
|
{"GET", "/orgs/:org"},
|
||||||
//{"PATCH", "/orgs/:org"},
|
//{"PATCH", "/orgs/:org"},
|
||||||
{"GET", "/orgs/:org/members"},
|
{"GET", "/orgs/:org/members"},
|
||||||
{"GET", "/orgs/:org/members/:user"},
|
{"GET", "/orgs/:org/members/:user"},
|
||||||
{"DELETE", "/orgs/:org/members/:user"},
|
{"DELETE", "/orgs/:org/members/:user"},
|
||||||
{"GET", "/orgs/:org/public_members"},
|
{"GET", "/orgs/:org/public_members"},
|
||||||
{"GET", "/orgs/:org/public_members/:user"},
|
{"GET", "/orgs/:org/public_members/:user"},
|
||||||
{"PUT", "/orgs/:org/public_members/:user"},
|
{"PUT", "/orgs/:org/public_members/:user"},
|
||||||
{"DELETE", "/orgs/:org/public_members/:user"},
|
{"DELETE", "/orgs/:org/public_members/:user"},
|
||||||
{"GET", "/orgs/:org/teams"},
|
{"GET", "/orgs/:org/teams"},
|
||||||
{"GET", "/teams/:id"},
|
{"GET", "/teams/:id"},
|
||||||
{"POST", "/orgs/:org/teams"},
|
{"POST", "/orgs/:org/teams"},
|
||||||
//{"PATCH", "/teams/:id"},
|
//{"PATCH", "/teams/:id"},
|
||||||
{"DELETE", "/teams/:id"},
|
{"DELETE", "/teams/:id"},
|
||||||
{"GET", "/teams/:id/members"},
|
{"GET", "/teams/:id/members"},
|
||||||
{"GET", "/teams/:id/members/:user"},
|
{"GET", "/teams/:id/members/:user"},
|
||||||
{"PUT", "/teams/:id/members/:user"},
|
{"PUT", "/teams/:id/members/:user"},
|
||||||
{"DELETE", "/teams/:id/members/:user"},
|
{"DELETE", "/teams/:id/members/:user"},
|
||||||
{"GET", "/teams/:id/repos"},
|
{"GET", "/teams/:id/repos"},
|
||||||
{"GET", "/teams/:id/repos/:owner/:repo"},
|
{"GET", "/teams/:id/repos/:owner/:repo"},
|
||||||
{"PUT", "/teams/:id/repos/:owner/:repo"},
|
{"PUT", "/teams/:id/repos/:owner/:repo"},
|
||||||
{"DELETE", "/teams/:id/repos/:owner/:repo"},
|
{"DELETE", "/teams/:id/repos/:owner/:repo"},
|
||||||
{"GET", "/user/teams"},
|
{"GET", "/user/teams"},
|
||||||
|
|
||||||
// Pull Requests
|
// Pull Requests
|
||||||
{"GET", "/repos/:owner/:repo/pulls"},
|
{"GET", "/repos/:owner/:repo/pulls"},
|
||||||
{"GET", "/repos/:owner/:repo/pulls/:number"},
|
{"GET", "/repos/:owner/:repo/pulls/:number"},
|
||||||
{"POST", "/repos/:owner/:repo/pulls"},
|
{"POST", "/repos/:owner/:repo/pulls"},
|
||||||
//{"PATCH", "/repos/:owner/:repo/pulls/:number"},
|
//{"PATCH", "/repos/:owner/:repo/pulls/:number"},
|
||||||
{"GET", "/repos/:owner/:repo/pulls/:number/commits"},
|
{"GET", "/repos/:owner/:repo/pulls/:number/commits"},
|
||||||
{"GET", "/repos/:owner/:repo/pulls/:number/files"},
|
{"GET", "/repos/:owner/:repo/pulls/:number/files"},
|
||||||
{"GET", "/repos/:owner/:repo/pulls/:number/merge"},
|
{"GET", "/repos/:owner/:repo/pulls/:number/merge"},
|
||||||
{"PUT", "/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/:number/comments"},
|
||||||
//{"GET", "/repos/:owner/:repo/pulls/comments"},
|
//{"GET", "/repos/:owner/:repo/pulls/comments"},
|
||||||
//{"GET", "/repos/:owner/:repo/pulls/comments/:number"},
|
//{"GET", "/repos/:owner/:repo/pulls/comments/:number"},
|
||||||
{"PUT", "/repos/:owner/:repo/pulls/:number/comments"},
|
{"PUT", "/repos/:owner/:repo/pulls/:number/comments"},
|
||||||
//{"PATCH", "/repos/:owner/:repo/pulls/comments/:number"},
|
//{"PATCH", "/repos/:owner/:repo/pulls/comments/:number"},
|
||||||
//{"DELETE", "/repos/:owner/:repo/pulls/comments/:number"},
|
//{"DELETE", "/repos/:owner/:repo/pulls/comments/:number"},
|
||||||
|
|
||||||
// Repositories
|
// Repositories
|
||||||
{"GET", "/user/repos"},
|
{"GET", "/user/repos"},
|
||||||
{"GET", "/users/:user/repos"},
|
{"GET", "/users/:user/repos"},
|
||||||
{"GET", "/orgs/:org/repos"},
|
{"GET", "/orgs/:org/repos"},
|
||||||
{"GET", "/repositories"},
|
{"GET", "/repositories"},
|
||||||
{"POST", "/user/repos"},
|
{"POST", "/user/repos"},
|
||||||
{"POST", "/orgs/:org/repos"},
|
{"POST", "/orgs/:org/repos"},
|
||||||
{"GET", "/repos/:owner/:repo"},
|
{"GET", "/repos/:owner/:repo"},
|
||||||
//{"PATCH", "/repos/:owner/:repo"},
|
//{"PATCH", "/repos/:owner/:repo"},
|
||||||
{"GET", "/repos/:owner/:repo/contributors"},
|
{"GET", "/repos/:owner/:repo/contributors"},
|
||||||
{"GET", "/repos/:owner/:repo/languages"},
|
{"GET", "/repos/:owner/:repo/languages"},
|
||||||
{"GET", "/repos/:owner/:repo/teams"},
|
{"GET", "/repos/:owner/:repo/teams"},
|
||||||
{"GET", "/repos/:owner/:repo/tags"},
|
{"GET", "/repos/:owner/:repo/tags"},
|
||||||
{"GET", "/repos/:owner/:repo/branches"},
|
{"GET", "/repos/:owner/:repo/branches"},
|
||||||
{"GET", "/repos/:owner/:repo/branches/:branch"},
|
{"GET", "/repos/:owner/:repo/branches/:branch"},
|
||||||
{"DELETE", "/repos/:owner/:repo"},
|
{"DELETE", "/repos/:owner/:repo"},
|
||||||
{"GET", "/repos/:owner/:repo/collaborators"},
|
{"GET", "/repos/:owner/:repo/collaborators"},
|
||||||
{"GET", "/repos/:owner/:repo/collaborators/:user"},
|
{"GET", "/repos/:owner/:repo/collaborators/:user"},
|
||||||
{"PUT", "/repos/:owner/:repo/collaborators/:user"},
|
{"PUT", "/repos/:owner/:repo/collaborators/:user"},
|
||||||
{"DELETE", "/repos/:owner/:repo/collaborators/:user"},
|
{"DELETE", "/repos/:owner/:repo/collaborators/:user"},
|
||||||
{"GET", "/repos/:owner/:repo/comments"},
|
{"GET", "/repos/:owner/:repo/comments"},
|
||||||
{"GET", "/repos/:owner/:repo/commits/:sha/comments"},
|
{"GET", "/repos/:owner/:repo/commits/:sha/comments"},
|
||||||
{"POST", "/repos/:owner/:repo/commits/:sha/comments"},
|
{"POST", "/repos/:owner/:repo/commits/:sha/comments"},
|
||||||
{"GET", "/repos/:owner/:repo/comments/:id"},
|
{"GET", "/repos/:owner/:repo/comments/:id"},
|
||||||
//{"PATCH", "/repos/:owner/:repo/comments/:id"},
|
//{"PATCH", "/repos/:owner/:repo/comments/:id"},
|
||||||
{"DELETE", "/repos/:owner/:repo/comments/:id"},
|
{"DELETE", "/repos/:owner/:repo/comments/:id"},
|
||||||
{"GET", "/repos/:owner/:repo/commits"},
|
{"GET", "/repos/:owner/:repo/commits"},
|
||||||
{"GET", "/repos/:owner/:repo/commits/:sha"},
|
{"GET", "/repos/:owner/:repo/commits/:sha"},
|
||||||
{"GET", "/repos/:owner/:repo/readme"},
|
{"GET", "/repos/:owner/:repo/readme"},
|
||||||
//{"GET", "/repos/:owner/:repo/contents/*path"},
|
//{"GET", "/repos/:owner/:repo/contents/*path"},
|
||||||
//{"PUT", "/repos/:owner/:repo/contents/*path"},
|
//{"PUT", "/repos/:owner/:repo/contents/*path"},
|
||||||
//{"DELETE", "/repos/:owner/:repo/contents/*path"},
|
//{"DELETE", "/repos/:owner/:repo/contents/*path"},
|
||||||
//{"GET", "/repos/:owner/:repo/:archive_format/:ref"},
|
//{"GET", "/repos/:owner/:repo/:archive_format/:ref"},
|
||||||
{"GET", "/repos/:owner/:repo/keys"},
|
{"GET", "/repos/:owner/:repo/keys"},
|
||||||
{"GET", "/repos/:owner/:repo/keys/:id"},
|
{"GET", "/repos/:owner/:repo/keys/:id"},
|
||||||
{"POST", "/repos/:owner/:repo/keys"},
|
{"POST", "/repos/:owner/:repo/keys"},
|
||||||
//{"PATCH", "/repos/:owner/:repo/keys/:id"},
|
//{"PATCH", "/repos/:owner/:repo/keys/:id"},
|
||||||
{"DELETE", "/repos/:owner/:repo/keys/:id"},
|
{"DELETE", "/repos/:owner/:repo/keys/:id"},
|
||||||
{"GET", "/repos/:owner/:repo/downloads"},
|
{"GET", "/repos/:owner/:repo/downloads"},
|
||||||
{"GET", "/repos/:owner/:repo/downloads/:id"},
|
{"GET", "/repos/:owner/:repo/downloads/:id"},
|
||||||
{"DELETE", "/repos/:owner/:repo/downloads/:id"},
|
{"DELETE", "/repos/:owner/:repo/downloads/:id"},
|
||||||
{"GET", "/repos/:owner/:repo/forks"},
|
{"GET", "/repos/:owner/:repo/forks"},
|
||||||
{"POST", "/repos/:owner/:repo/forks"},
|
{"POST", "/repos/:owner/:repo/forks"},
|
||||||
{"GET", "/repos/:owner/:repo/hooks"},
|
{"GET", "/repos/:owner/:repo/hooks"},
|
||||||
{"GET", "/repos/:owner/:repo/hooks/:id"},
|
{"GET", "/repos/:owner/:repo/hooks/:id"},
|
||||||
{"POST", "/repos/:owner/:repo/hooks"},
|
{"POST", "/repos/:owner/:repo/hooks"},
|
||||||
//{"PATCH", "/repos/:owner/:repo/hooks/:id"},
|
//{"PATCH", "/repos/:owner/:repo/hooks/:id"},
|
||||||
{"POST", "/repos/:owner/:repo/hooks/:id/tests"},
|
{"POST", "/repos/:owner/:repo/hooks/:id/tests"},
|
||||||
{"DELETE", "/repos/:owner/:repo/hooks/:id"},
|
{"DELETE", "/repos/:owner/:repo/hooks/:id"},
|
||||||
{"POST", "/repos/:owner/:repo/merges"},
|
{"POST", "/repos/:owner/:repo/merges"},
|
||||||
{"GET", "/repos/:owner/:repo/releases"},
|
{"GET", "/repos/:owner/:repo/releases"},
|
||||||
{"GET", "/repos/:owner/:repo/releases/:id"},
|
{"GET", "/repos/:owner/:repo/releases/:id"},
|
||||||
{"POST", "/repos/:owner/:repo/releases"},
|
{"POST", "/repos/:owner/:repo/releases"},
|
||||||
//{"PATCH", "/repos/:owner/:repo/releases/:id"},
|
//{"PATCH", "/repos/:owner/:repo/releases/:id"},
|
||||||
{"DELETE", "/repos/:owner/:repo/releases/:id"},
|
{"DELETE", "/repos/:owner/:repo/releases/:id"},
|
||||||
{"GET", "/repos/:owner/:repo/releases/:id/assets"},
|
{"GET", "/repos/:owner/:repo/releases/:id/assets"},
|
||||||
{"GET", "/repos/:owner/:repo/stats/contributors"},
|
{"GET", "/repos/:owner/:repo/stats/contributors"},
|
||||||
{"GET", "/repos/:owner/:repo/stats/commit_activity"},
|
{"GET", "/repos/:owner/:repo/stats/commit_activity"},
|
||||||
{"GET", "/repos/:owner/:repo/stats/code_frequency"},
|
{"GET", "/repos/:owner/:repo/stats/code_frequency"},
|
||||||
{"GET", "/repos/:owner/:repo/stats/participation"},
|
{"GET", "/repos/:owner/:repo/stats/participation"},
|
||||||
{"GET", "/repos/:owner/:repo/stats/punch_card"},
|
{"GET", "/repos/:owner/:repo/stats/punch_card"},
|
||||||
{"GET", "/repos/:owner/:repo/statuses/:ref"},
|
{"GET", "/repos/:owner/:repo/statuses/:ref"},
|
||||||
{"POST", "/repos/:owner/:repo/statuses/:ref"},
|
{"POST", "/repos/:owner/:repo/statuses/:ref"},
|
||||||
|
|
||||||
// Search
|
// Search
|
||||||
{"GET", "/search/repositories"},
|
{"GET", "/search/repositories"},
|
||||||
{"GET", "/search/code"},
|
{"GET", "/search/code"},
|
||||||
{"GET", "/search/issues"},
|
{"GET", "/search/issues"},
|
||||||
{"GET", "/search/users"},
|
{"GET", "/search/users"},
|
||||||
{"GET", "/legacy/issues/search/:owner/:repository/:state/:keyword"},
|
{"GET", "/legacy/issues/search/:owner/:repository/:state/:keyword"},
|
||||||
{"GET", "/legacy/repos/search/:keyword"},
|
{"GET", "/legacy/repos/search/:keyword"},
|
||||||
{"GET", "/legacy/user/search/:keyword"},
|
{"GET", "/legacy/user/search/:keyword"},
|
||||||
{"GET", "/legacy/user/email/:email"},
|
{"GET", "/legacy/user/email/:email"},
|
||||||
|
|
||||||
// Users
|
// Users
|
||||||
{"GET", "/users/:user"},
|
{"GET", "/users/:user"},
|
||||||
{"GET", "/user"},
|
{"GET", "/user"},
|
||||||
//{"PATCH", "/user"},
|
//{"PATCH", "/user"},
|
||||||
{"GET", "/users"},
|
{"GET", "/users"},
|
||||||
{"GET", "/user/emails"},
|
{"GET", "/user/emails"},
|
||||||
{"POST", "/user/emails"},
|
{"POST", "/user/emails"},
|
||||||
{"DELETE", "/user/emails"},
|
{"DELETE", "/user/emails"},
|
||||||
{"GET", "/users/:user/followers"},
|
{"GET", "/users/:user/followers"},
|
||||||
{"GET", "/user/followers"},
|
{"GET", "/user/followers"},
|
||||||
{"GET", "/users/:user/following"},
|
{"GET", "/users/:user/following"},
|
||||||
{"GET", "/user/following"},
|
{"GET", "/user/following"},
|
||||||
{"GET", "/user/following/:user"},
|
{"GET", "/user/following/:user"},
|
||||||
{"GET", "/users/:user/following/:target_user"},
|
{"GET", "/users/:user/following/:target_user"},
|
||||||
{"PUT", "/user/following/:user"},
|
{"PUT", "/user/following/:user"},
|
||||||
{"DELETE", "/user/following/:user"},
|
{"DELETE", "/user/following/:user"},
|
||||||
{"GET", "/users/:user/keys"},
|
{"GET", "/users/:user/keys"},
|
||||||
{"GET", "/user/keys"},
|
{"GET", "/user/keys"},
|
||||||
{"GET", "/user/keys/:id"},
|
{"GET", "/user/keys/:id"},
|
||||||
{"POST", "/user/keys"},
|
{"POST", "/user/keys"},
|
||||||
//{"PATCH", "/user/keys/:id"},
|
//{"PATCH", "/user/keys/:id"},
|
||||||
{"DELETE", "/user/keys/:id"},
|
{"DELETE", "/user/keys/:id"},
|
||||||
}
|
}
|
||||||
|
)
|
||||||
|
|
||||||
func TestRouterStatic(t *testing.T) {
|
func TestRouterStatic(t *testing.T) {
|
||||||
r := New().Router
|
r := New().Router
|
||||||
r.Add(GET, "/folders/files/echo.gif", func(*Context) {}, nil)
|
r.Add(GET, "/folders/files/echo.gif", func(*Context) {}, nil)
|
||||||
h, _, _ := r.Find(GET, "/folders/files/echo.gif")
|
h, _ := r.Find(GET, "/folders/files/echo.gif", params)
|
||||||
if h == nil {
|
if h == nil {
|
||||||
t.Fatal("handle not found")
|
t.Fatal("handle not found")
|
||||||
}
|
}
|
||||||
@ -286,35 +289,37 @@ func TestRouterStatic(t *testing.T) {
|
|||||||
|
|
||||||
func TestRouterParam(t *testing.T) {
|
func TestRouterParam(t *testing.T) {
|
||||||
r := New().Router
|
r := New().Router
|
||||||
r.Add(GET, "/users/:id", func(*Context) {}, nil)
|
r.Add(GET, "/users/:id", func(c *Context) {
|
||||||
h, c, _ := r.Find(GET, "/users/1")
|
if c.P(0) != "1" {
|
||||||
|
t.Error("param id should be 1")
|
||||||
|
}
|
||||||
|
}, nil)
|
||||||
|
h, _ := r.Find(GET, "/users/1", make(Params, 5))
|
||||||
if h == nil {
|
if h == nil {
|
||||||
t.Fatal("handle not found")
|
t.Fatal("handle not found")
|
||||||
}
|
}
|
||||||
if c.P(0) != "1" {
|
|
||||||
t.Error("param id should be 1")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRouterTwoParam(t *testing.T) {
|
func TestRouterTwoParam(t *testing.T) {
|
||||||
r := New().Router
|
r := New().Router
|
||||||
r.Add(GET, "/users/:uid/files/:fid", func(*Context) {}, nil)
|
r.Add(GET, "/users/:uid/files/:fid", func(c *Context) {
|
||||||
h, c, _ := r.Find(GET, "/users/1/files/1")
|
if c.P(0) != "1" {
|
||||||
|
t.Error("param uid should be 1")
|
||||||
|
}
|
||||||
|
if c.P(1) != "1" {
|
||||||
|
t.Error("param fid should be 1")
|
||||||
|
}
|
||||||
|
}, nil)
|
||||||
|
h, _ := r.Find(GET, "/users/1/files/1", params)
|
||||||
if h == nil {
|
if h == nil {
|
||||||
t.Fatal("handle not found")
|
t.Fatal("handle not found")
|
||||||
}
|
}
|
||||||
if c.P(0) != "1" {
|
|
||||||
t.Error("param uid should be 1")
|
|
||||||
}
|
|
||||||
if c.P(1) != "1" {
|
|
||||||
t.Error("param fid should be 1")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRouterCatchAll(t *testing.T) {
|
func TestRouterCatchAll(t *testing.T) {
|
||||||
r := New().Router
|
r := New().Router
|
||||||
r.Add(GET, "/static/*", func(*Context) {}, nil)
|
r.Add(GET, "/static/*", func(*Context) {}, nil)
|
||||||
h, _, _ := r.Find(GET, "/static/*")
|
h, _ := r.Find(GET, "/static/*", params)
|
||||||
if h == nil {
|
if h == nil {
|
||||||
t.Fatal("handle not found")
|
t.Fatal("handle not found")
|
||||||
}
|
}
|
||||||
@ -322,36 +327,38 @@ func TestRouterCatchAll(t *testing.T) {
|
|||||||
|
|
||||||
func TestRouterMicroParam(t *testing.T) {
|
func TestRouterMicroParam(t *testing.T) {
|
||||||
r := New().Router
|
r := New().Router
|
||||||
r.Add(GET, "/:a/:b/:c", func(*Context) {}, nil)
|
r.Add(GET, "/:a/:b/:c", func(c *Context) {
|
||||||
h, c, _ := r.Find(GET, "/1/2/3")
|
if c.P(0) != "1" {
|
||||||
|
t.Error("param a should be 1")
|
||||||
|
}
|
||||||
|
if c.P(1) != "2" {
|
||||||
|
t.Error("param b should be 2")
|
||||||
|
}
|
||||||
|
if c.P(2) != "3" {
|
||||||
|
t.Error("param c should be 3")
|
||||||
|
}
|
||||||
|
}, nil)
|
||||||
|
h, _ := r.Find(GET, "/1/2/3", params)
|
||||||
if h == nil {
|
if h == nil {
|
||||||
t.Fatal("handle not found")
|
t.Fatal("handle not found")
|
||||||
}
|
}
|
||||||
if c.P(0) != "1" {
|
|
||||||
t.Error("param a should be 1")
|
|
||||||
}
|
|
||||||
if c.P(1) != "2" {
|
|
||||||
t.Error("param b should be 2")
|
|
||||||
}
|
|
||||||
if c.P(2) != "3" {
|
|
||||||
t.Error("param c should be 3")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRouterAPI(t *testing.T) {
|
func TestRouterAPI(t *testing.T) {
|
||||||
r := New().Router
|
r := New().Router
|
||||||
for _, route := range api {
|
for _, route := range api {
|
||||||
r.Add(route.method, route.path, func(*Context) {}, nil)
|
r.Add(route.method, route.path, func(c *Context) {
|
||||||
h, c, _ := r.Find(route.method, route.path)
|
for _, p := range c.params {
|
||||||
if h == nil {
|
if p.Name != "" {
|
||||||
t.Errorf("handler not found, method=%s, path=%s", route.method, route.path)
|
if ":"+p.Name != p.Value {
|
||||||
}
|
t.Errorf("param not found, method=%s, path=%s", route.method, route.path)
|
||||||
for _, p := range c.params {
|
}
|
||||||
if p.Name != "" {
|
|
||||||
if ":"+p.Name != p.Value {
|
|
||||||
t.Errorf("param not found, method=%s, path=%s", route.method, route.path)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}, nil)
|
||||||
|
h, _ := r.Find(route.method, route.path, params)
|
||||||
|
if h == nil {
|
||||||
|
t.Errorf("handler not found, method=%s, path=%s", route.method, route.path)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user