mirror of https://github.com/gin-gonic/gin.git
Merge branch 'master' into develop
# Conflicts: # debug_test.go
This commit is contained in:
commit
8949247b92
|
@ -1,6 +1,6 @@
|
|||
|
||||
#Gin Web Framework
|
||||
<img align="right" src="https://s3.amazonaws.com/uploads.hipchat.com/36744/1498287/JVR32LgyEGCiy01/path4201%20copy%202.png">
|
||||
<img align="right" src="https://raw.githubusercontent.com/gin-gonic/gin/master/logo.jpg">
|
||||
[![Build Status](https://travis-ci.org/gin-gonic/gin.svg)](https://travis-ci.org/gin-gonic/gin)
|
||||
[![Coverage Status](https://coveralls.io/repos/gin-gonic/gin/badge.svg?branch=master)](https://coveralls.io/r/gin-gonic/gin?branch=master)
|
||||
[![GoDoc](https://godoc.org/github.com/gin-gonic/gin?status.svg)](https://godoc.org/github.com/gin-gonic/gin)
|
||||
|
@ -660,7 +660,7 @@ There be some ways.
|
|||
|
||||
We can using fvbock/endless to replace the default ListenAndServe
|
||||
|
||||
Refer the issue for more details:
|
||||
Refer the issue for more details:
|
||||
|
||||
https://github.com/gin-gonic/gin/issues/296
|
||||
|
||||
|
|
23
context.go
23
context.go
|
@ -185,7 +185,8 @@ func (c *Context) MustGet(key string) interface{} {
|
|||
|
||||
// Query is a shortcut for c.Request.URL.Query().Get(key)
|
||||
// It is used to return the url query values.
|
||||
// ?id=1234&name=Manu
|
||||
// It returns an empty string ("") when the value does not exist.
|
||||
// /path?id=1234&name=Manu
|
||||
// c.Query("id") == "1234"
|
||||
// c.Query("name") == "Manu"
|
||||
// c.Query("wtf") == ""
|
||||
|
@ -195,12 +196,18 @@ func (c *Context) Query(key string) string {
|
|||
}
|
||||
|
||||
// PostForm is a shortcut for c.Request.PostFormValue(key)
|
||||
// It returns an empty string ("") when the value does not exist.
|
||||
func (c *Context) PostForm(key string) string {
|
||||
value, _ := c.postForm(key)
|
||||
return value
|
||||
}
|
||||
|
||||
// Param is a shortcut for c.Params.ByName(key)
|
||||
// Param returns the value of the URL param.
|
||||
// It is a shortcut for c.Params.ByName(key)
|
||||
// router.GET("/user/:id", func(c *gin.Context) {
|
||||
// // a GET request to /user/john
|
||||
// id := c.Param("id") // id == "john"
|
||||
// })
|
||||
func (c *Context) Param(key string) string {
|
||||
return c.Params.ByName(key)
|
||||
}
|
||||
|
@ -214,11 +221,9 @@ func (c *Context) DefaultPostForm(key, defaultValue string) string {
|
|||
|
||||
// DefaultQuery returns the keyed url query value if it exists, othewise it returns the
|
||||
// specified defaultValue.
|
||||
// ```
|
||||
// /?name=Manu
|
||||
// c.DefaultQuery("name", "unknown") == "Manu"
|
||||
// c.DefaultQuery("id", "none") == "none"
|
||||
// ```
|
||||
// //?name=Manu
|
||||
// c.DefaultQuery("name", "unknown") == "Manu"
|
||||
// c.DefaultQuery("id", "none") == "none"
|
||||
func (c *Context) DefaultQuery(key, defaultValue string) string {
|
||||
if value, ok := c.query(key); ok {
|
||||
return value
|
||||
|
@ -250,8 +255,8 @@ func (c *Context) postForm(key string) (string, bool) {
|
|||
|
||||
// Bind checks the Content-Type to select a binding engine automatically,
|
||||
// Depending the "Content-Type" header different bindings are used:
|
||||
// "application/json" --> JSON binding
|
||||
// "application/xml" --> XML binding
|
||||
// "application/json" --> JSON binding
|
||||
// "application/xml" --> XML binding
|
||||
// otherwise --> returns an error
|
||||
// If Parses the request's body as JSON if Content-Type == "application/json" using JSON or XML as a JSON input.
|
||||
// It decodes the json payload into the struct specified as a pointer.
|
||||
|
|
|
@ -153,7 +153,7 @@ func TestContextHandlerName(t *testing.T) {
|
|||
c, _, _ := CreateTestContext()
|
||||
c.handlers = HandlersChain{func(c *Context) {}, handlerNameTest}
|
||||
|
||||
assert.Equal(t, c.HandlerName(), "github.com/gin-gonic/gin.handlerNameTest")
|
||||
assert.Regexp(t, "^(.*/vendor/)?github.com/gin-gonic/gin.handlerNameTest$", c.HandlerName())
|
||||
}
|
||||
|
||||
func handlerNameTest(c *Context) {
|
||||
|
|
|
@ -63,7 +63,7 @@ func TestDebugPrintRoutes(t *testing.T) {
|
|||
defer teardown()
|
||||
|
||||
debugPrintRoute("GET", "/path/to/route/:param", HandlersChain{func(c *Context) {}, handlerNameTest})
|
||||
assert.Equal(t, w.String(), "[GIN-debug] GET /path/to/route/:param --> github.com/gin-gonic/gin.handlerNameTest (2 handlers)\n")
|
||||
assert.Regexp(t, `^\[GIN-debug\] GET /path/to/route/:param --> (.*/vendor/)?github.com/gin-gonic/gin.handlerNameTest \(2 handlers\)\n$`, w.String())
|
||||
}
|
||||
|
||||
func setup(w io.Writer) {
|
||||
|
|
12
errors.go
12
errors.go
|
@ -109,13 +109,11 @@ func (a errorMsgs) Last() *Error {
|
|||
}
|
||||
|
||||
// Returns an array will all the error messages.
|
||||
// Example
|
||||
// ```
|
||||
// c.Error(errors.New("first"))
|
||||
// c.Error(errors.New("second"))
|
||||
// c.Error(errors.New("third"))
|
||||
// c.Errors.Errors() // == []string{"first", "second", "third"}
|
||||
// ``
|
||||
// Example:
|
||||
// c.Error(errors.New("first"))
|
||||
// c.Error(errors.New("second"))
|
||||
// c.Error(errors.New("third"))
|
||||
// c.Errors.Errors() // == []string{"first", "second", "third"}
|
||||
func (a errorMsgs) Errors() []string {
|
||||
if len(a) == 0 {
|
||||
return nil
|
||||
|
|
30
gin_test.go
30
gin_test.go
|
@ -214,32 +214,42 @@ func TestListOfRoutes(t *testing.T) {
|
|||
list := router.Routes()
|
||||
|
||||
assert.Len(t, list, 7)
|
||||
assert.Contains(t, list, RouteInfo{
|
||||
assertRoutePresent(t, list, RouteInfo{
|
||||
Method: "GET",
|
||||
Path: "/favicon.ico",
|
||||
Handler: "github.com/gin-gonic/gin.handler_test1",
|
||||
Handler: "^(.*/vendor/)?github.com/gin-gonic/gin.handler_test1$",
|
||||
})
|
||||
assert.Contains(t, list, RouteInfo{
|
||||
assertRoutePresent(t, list, RouteInfo{
|
||||
Method: "GET",
|
||||
Path: "/",
|
||||
Handler: "github.com/gin-gonic/gin.handler_test1",
|
||||
Handler: "^(.*/vendor/)?github.com/gin-gonic/gin.handler_test1$",
|
||||
})
|
||||
assert.Contains(t, list, RouteInfo{
|
||||
assertRoutePresent(t, list, RouteInfo{
|
||||
Method: "GET",
|
||||
Path: "/users/",
|
||||
Handler: "github.com/gin-gonic/gin.handler_test2",
|
||||
Handler: "^(.*/vendor/)?github.com/gin-gonic/gin.handler_test2$",
|
||||
})
|
||||
assert.Contains(t, list, RouteInfo{
|
||||
assertRoutePresent(t, list, RouteInfo{
|
||||
Method: "GET",
|
||||
Path: "/users/:id",
|
||||
Handler: "github.com/gin-gonic/gin.handler_test1",
|
||||
Handler: "^(.*/vendor/)?github.com/gin-gonic/gin.handler_test1$",
|
||||
})
|
||||
assert.Contains(t, list, RouteInfo{
|
||||
assertRoutePresent(t, list, RouteInfo{
|
||||
Method: "POST",
|
||||
Path: "/users/:id",
|
||||
Handler: "github.com/gin-gonic/gin.handler_test2",
|
||||
Handler: "^(.*/vendor/)?github.com/gin-gonic/gin.handler_test2$",
|
||||
})
|
||||
}
|
||||
|
||||
func assertRoutePresent(t *testing.T, gotRoutes RoutesInfo, wantRoute RouteInfo) {
|
||||
for _, gotRoute := range gotRoutes {
|
||||
if gotRoute.Path == wantRoute.Path && gotRoute.Method == wantRoute.Method {
|
||||
assert.Regexp(t, wantRoute.Path, gotRoute.Path)
|
||||
return
|
||||
}
|
||||
}
|
||||
t.Errorf("route not found: %v", wantRoute)
|
||||
}
|
||||
|
||||
func handler_test1(c *Context) {}
|
||||
func handler_test2(c *Context) {}
|
||||
|
|
6
mode.go
6
mode.go
|
@ -29,10 +29,8 @@ const (
|
|||
// Note that both Logger and Recovery provides custom ways to configure their
|
||||
// output io.Writer.
|
||||
// To support coloring in Windows use:
|
||||
// ```
|
||||
// import "github.com/mattn/go-colorable"
|
||||
// gin.DefaultWriter = colorable.NewColorableStdout()
|
||||
// ```
|
||||
// import "github.com/mattn/go-colorable"
|
||||
// gin.DefaultWriter = colorable.NewColorableStdout()
|
||||
var DefaultWriter io.Writer = os.Stdout
|
||||
var DefaultErrorWriter io.Writer = os.Stderr
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ var (
|
|||
|
||||
// Recovery returns a middleware that recovers from any panics and writes a 500 if there was one.
|
||||
func Recovery() HandlerFunc {
|
||||
return RecoveryWithWriter(DefaultWriter)
|
||||
return RecoveryWithWriter(DefaultErrorWriter)
|
||||
}
|
||||
|
||||
func RecoveryWithWriter(out io.Writer) HandlerFunc {
|
||||
|
|
|
@ -78,7 +78,7 @@ func TestFilterFlags(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestFunctionName(t *testing.T) {
|
||||
assert.Equal(t, nameOfFunction(somefunction), "github.com/gin-gonic/gin.somefunction")
|
||||
assert.Regexp(t, `^(.*/vendor/)?github.com/gin-gonic/gin.somefunction$`, nameOfFunction(somefunction))
|
||||
}
|
||||
|
||||
func somefunction() {
|
||||
|
|
Loading…
Reference in New Issue