mirror of
https://github.com/gin-gonic/gin.git
synced 2025-10-20 00:02:16 +08:00
Merge branch 'master' into v1.5
This commit is contained in:
commit
66cb075dad
@ -441,7 +441,8 @@ func createFormFilesMultipartRequest(t *testing.T) *http.Request {
|
|||||||
defer f.Close()
|
defer f.Close()
|
||||||
fw, err1 := mw.CreateFormFile("file", "form.go")
|
fw, err1 := mw.CreateFormFile("file", "form.go")
|
||||||
assert.NoError(t, err1)
|
assert.NoError(t, err1)
|
||||||
io.Copy(fw, f)
|
_, err = io.Copy(fw, f)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
req, err2 := http.NewRequest("POST", "/?foo=getfoo&bar=getbar", body)
|
req, err2 := http.NewRequest("POST", "/?foo=getfoo&bar=getbar", body)
|
||||||
assert.NoError(t, err2)
|
assert.NoError(t, err2)
|
||||||
@ -465,7 +466,8 @@ func createFormFilesMultipartRequestFail(t *testing.T) *http.Request {
|
|||||||
defer f.Close()
|
defer f.Close()
|
||||||
fw, err1 := mw.CreateFormFile("file_foo", "form_foo.go")
|
fw, err1 := mw.CreateFormFile("file_foo", "form_foo.go")
|
||||||
assert.NoError(t, err1)
|
assert.NoError(t, err1)
|
||||||
io.Copy(fw, f)
|
_, err = io.Copy(fw, f)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
req, err2 := http.NewRequest("POST", "/?foo=getfoo&bar=getbar", body)
|
req, err2 := http.NewRequest("POST", "/?foo=getfoo&bar=getbar", body)
|
||||||
assert.NoError(t, err2)
|
assert.NoError(t, err2)
|
||||||
@ -554,7 +556,8 @@ func TestBindingFormPostForMapFail(t *testing.T) {
|
|||||||
func TestBindingFormFilesMultipart(t *testing.T) {
|
func TestBindingFormFilesMultipart(t *testing.T) {
|
||||||
req := createFormFilesMultipartRequest(t)
|
req := createFormFilesMultipartRequest(t)
|
||||||
var obj FooBarFileStruct
|
var obj FooBarFileStruct
|
||||||
FormMultipart.Bind(req, &obj)
|
err := FormMultipart.Bind(req, &obj)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
// file from os
|
// file from os
|
||||||
f, _ := os.Open("form.go")
|
f, _ := os.Open("form.go")
|
||||||
|
@ -51,6 +51,10 @@ func mappingByPtr(ptr interface{}, setter setter, tag string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func mapping(value reflect.Value, field reflect.StructField, setter setter, tag string) (bool, error) {
|
func mapping(value reflect.Value, field reflect.StructField, setter setter, tag string) (bool, error) {
|
||||||
|
if field.Tag.Get(tag) == "-" { // just ignoring this field
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
var vKind = value.Kind()
|
var vKind = value.Kind()
|
||||||
|
|
||||||
if vKind == reflect.Ptr {
|
if vKind == reflect.Ptr {
|
||||||
@ -112,9 +116,6 @@ func tryToSetValue(value reflect.Value, field reflect.StructField, setter setter
|
|||||||
tagValue = field.Tag.Get(tag)
|
tagValue = field.Tag.Get(tag)
|
||||||
tagValue, opts := head(tagValue, ",")
|
tagValue, opts := head(tagValue, ",")
|
||||||
|
|
||||||
if tagValue == "-" { // just ignoring this field
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
if tagValue == "" { // default value is FieldName
|
if tagValue == "" { // default value is FieldName
|
||||||
tagValue = field.Name
|
tagValue = field.Name
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,10 @@ type structFull struct {
|
|||||||
func BenchmarkMapFormFull(b *testing.B) {
|
func BenchmarkMapFormFull(b *testing.B) {
|
||||||
var s structFull
|
var s structFull
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
mapForm(&s, form)
|
err := mapForm(&s, form)
|
||||||
|
if err != nil {
|
||||||
|
b.Fatalf("Error on a form mapping")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
b.StopTimer()
|
b.StopTimer()
|
||||||
|
|
||||||
@ -52,7 +55,10 @@ type structName struct {
|
|||||||
func BenchmarkMapFormName(b *testing.B) {
|
func BenchmarkMapFormName(b *testing.B) {
|
||||||
var s structName
|
var s structName
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
mapForm(&s, form)
|
err := mapForm(&s, form)
|
||||||
|
if err != nil {
|
||||||
|
b.Fatalf("Error on a form mapping")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
b.StopTimer()
|
b.StopTimer()
|
||||||
|
|
||||||
|
@ -269,3 +269,13 @@ func TestMappingMapField(t *testing.T) {
|
|||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, map[string]int{"one": 1}, s.M)
|
assert.Equal(t, map[string]int{"one": 1}, s.M)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMappingIgnoredCircularRef(t *testing.T) {
|
||||||
|
type S struct {
|
||||||
|
S *S `form:"-"`
|
||||||
|
}
|
||||||
|
var s S
|
||||||
|
|
||||||
|
err := mappingByPtr(&s, formSource{}, "form")
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}
|
||||||
|
@ -516,7 +516,11 @@ func (c *Context) FormFile(name string) (*multipart.FileHeader, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_, fh, err := c.Request.FormFile(name)
|
f, fh, err := c.Request.FormFile(name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
f.Close()
|
||||||
return fh, err
|
return fh, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
7
gin.go
7
gin.go
@ -30,7 +30,7 @@ type HandlerFunc func(*Context)
|
|||||||
// HandlersChain defines a HandlerFunc array.
|
// HandlersChain defines a HandlerFunc array.
|
||||||
type HandlersChain []HandlerFunc
|
type HandlersChain []HandlerFunc
|
||||||
|
|
||||||
// Last returns the last handler in the chain. ie. the last handler is the main own.
|
// Last returns the last handler in the chain. ie. the last handler is the main one.
|
||||||
func (c HandlersChain) Last() HandlerFunc {
|
func (c HandlersChain) Last() HandlerFunc {
|
||||||
if length := len(c); length > 0 {
|
if length := len(c); length > 0 {
|
||||||
return c[length-1]
|
return c[length-1]
|
||||||
@ -320,7 +320,10 @@ func (engine *Engine) RunUnix(file string) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer listener.Close()
|
defer listener.Close()
|
||||||
os.Chmod(file, 0777)
|
err = os.Chmod(file, 0777)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
err = http.Serve(listener, engine)
|
err = http.Serve(listener, engine)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -90,7 +90,8 @@ func TestPusher(t *testing.T) {
|
|||||||
go func() {
|
go func() {
|
||||||
router.GET("/pusher", func(c *Context) {
|
router.GET("/pusher", func(c *Context) {
|
||||||
if pusher := c.Writer.Pusher(); pusher != nil {
|
if pusher := c.Writer.Pusher(); pusher != nil {
|
||||||
pusher.Push("/assets/app.js", nil)
|
err := pusher.Push("/assets/app.js", nil)
|
||||||
|
assert.NoError(t, err)
|
||||||
}
|
}
|
||||||
c.String(http.StatusOK, "it worked")
|
c.String(http.StatusOK, "it worked")
|
||||||
})
|
})
|
||||||
@ -239,6 +240,7 @@ func TestBadListener(t *testing.T) {
|
|||||||
addr, err := net.ResolveTCPAddr("tcp", "localhost:10086")
|
addr, err := net.ResolveTCPAddr("tcp", "localhost:10086")
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
listener, err := net.ListenTCP("tcp", addr)
|
listener, err := net.ListenTCP("tcp", addr)
|
||||||
|
assert.NoError(t, err)
|
||||||
listener.Close()
|
listener.Close()
|
||||||
assert.Error(t, router.RunListener(listener))
|
assert.Error(t, router.RunListener(listener))
|
||||||
}
|
}
|
||||||
|
@ -347,7 +347,10 @@ func TestRenderRedirect(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
w = httptest.NewRecorder()
|
w = httptest.NewRecorder()
|
||||||
assert.PanicsWithValue(t, "Cannot redirect with status code 200", func() { data2.Render(w) })
|
assert.PanicsWithValue(t, "Cannot redirect with status code 200", func() {
|
||||||
|
err := data2.Render(w)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
})
|
||||||
|
|
||||||
data3 := Redirect{
|
data3 := Redirect{
|
||||||
Code: http.StatusCreated,
|
Code: http.StatusCreated,
|
||||||
|
@ -193,13 +193,15 @@ func (group *RouterGroup) createStaticHandler(relativePath string, fs http.FileS
|
|||||||
|
|
||||||
file := c.Param("filepath")
|
file := c.Param("filepath")
|
||||||
// Check if file exists and/or if we have permission to access it
|
// Check if file exists and/or if we have permission to access it
|
||||||
if _, err := fs.Open(file); err != nil {
|
f, err := fs.Open(file)
|
||||||
|
if err != nil {
|
||||||
c.Writer.WriteHeader(http.StatusNotFound)
|
c.Writer.WriteHeader(http.StatusNotFound)
|
||||||
c.handlers = group.engine.noRoute
|
c.handlers = group.engine.noRoute
|
||||||
// Reset index
|
// Reset index
|
||||||
c.index = -1
|
c.index = -1
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
f.Close()
|
||||||
|
|
||||||
fileServer.ServeHTTP(c.Writer, c.Request)
|
fileServer.ServeHTTP(c.Writer, c.Request)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user