Bo-Yi Wu
6655232d45
Merge branch 'master' into fix-binding-empty-value
2020-03-18 21:21:53 +08:00
Andy Pan
982daeb1ec
Use zero-copy approach to convert types between string and byte… ( #2206 )
...
* Use zero-copy approach to convert types between string and byte slice
* Rename argument to a eligible one
Benchmark:
BenchmarkBytesConvBytesToStrRaw-4 21003800 70.9 ns/op 96 B/op 1 allocs/op
BenchmarkBytesConvBytesToStr-4 1000000000 0.333 ns/op 0 B/op 0 allocs/op
BenchmarkBytesConvStrToBytesRaw-4 18478059 59.3 ns/op 96 B/op 1 allocs/op
BenchmarkBytesConvStrToBytes-4 1000000000 0.373 ns/op 0 B/op 0 allocs/op
Co-authored-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2020-01-18 00:32:50 +08:00
guonaihong
362376322e
add comment
2020-01-16 22:52:42 +08:00
guonaihong
1e858d5bd7
modify code
2019-12-11 19:05:54 +08:00
guonaihong
7e9f808e02
fix empty value error
...
Here is the code that can report an error
```go
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"io"
"net/http"
"os"
"time"
)
type header struct {
Duration time.Duration `header:"duration"`
CreateTime time.Time `header:"createTime" time_format:"unix"`
}
func needFix1() {
g := gin.Default()
g.GET("/", func(c *gin.Context) {
h := header{}
err := c.ShouldBindHeader(&h)
if err != nil {
c.JSON(500, fmt.Sprintf("fail:%s\n", err))
return
}
c.JSON(200, h)
})
g.Run(":8081")
}
func needFix2() {
g := gin.Default()
g.GET("/", func(c *gin.Context) {
h := header{}
err := c.ShouldBindHeader(&h)
if err != nil {
c.JSON(500, fmt.Sprintf("fail:%s\n", err))
return
}
c.JSON(200, h)
})
g.Run(":8082")
}
func sendNeedFix1() {
// send to needFix1
sendBadData("http://127.0.0.1:8081 ", "duration")
}
func sendNeedFix2() {
// send to needFix2
sendBadData("http://127.0.0.1:8082 ", "createTime")
}
func sendBadData(url, key string) {
req, err := http.NewRequest("GET", "http://127.0.0.1:8081 ", nil)
if err != nil {
fmt.Printf("err:%s\n", err)
return
}
// Only the key and no value can cause an error
req.Header.Add(key, "")
rsp, err := http.DefaultClient.Do(req)
if err != nil {
return
}
io.Copy(os.Stdout, rsp.Body)
rsp.Body.Close()
}
func main() {
go needFix1()
go needFix2()
time.Sleep(time.Second / 1000 * 200) // 200ms
sendNeedFix1()
sendNeedFix2()
}
```
2019-12-06 15:49:43 +08:00
Dmitry Kutakov
db9174ae0c
fix ignore walking on form mapping ( #1942 ) ( #1943 )
2019-11-01 10:47:40 +08:00
ZhangYunHao
8a1bfcfd3b
format errUnknownType ( #2103 )
2019-10-26 14:20:35 +08:00
guonaihong
502c898d75
binding: support unix time ( #1980 )
...
* binding: support unix time
ref:#1979
* binding: support unix time
add test file
modify readme
```golang
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"time"
)
type shareTime struct {
CreateTime time.Time `form:"createTime" time_format:"unixNano"`
UnixTime time.Time `form:"unixTime" time_format:"unix"`
}
func main() {
r := gin.Default()
unix := r.Group("/unix")
testCT := time.Date(2019, 7, 6, 16, 0, 33, 123, time.Local)
fmt.Printf("%d\n", testCT.UnixNano())
testUT := time.Date(2019, 7, 6, 16, 0, 33, 0, time.Local)
fmt.Printf("%d\n", testUT.Unix())
unix.GET("/nano", func(c *gin.Context) {
s := shareTime{}
c.ShouldBindQuery(&s)
if !testCT.Equal(s.CreateTime) {
c.String(500, "want %d got %d", testCT.UnixNano(), s.CreateTime)
return
}
c.JSON(200, s)
})
unix.GET("/sec", func(c *gin.Context) {
s := shareTime{}
c.ShouldBindQuery(&s)
if !testUT.Equal(s.UnixTime) {
c.String(500, "want %d got %d", testCT.Unix(), s.UnixTime)
return
}
c.JSON(200, s)
})
r.Run()
}
```
* Contraction variable scope
2019-07-10 13:02:40 +08:00
Kirill Motkov
b1d607a899
Some code improvements ( #1909 )
...
* strings.ToLower comparison changed to strings.EqualFold.
* Rewrite switch statement with only one case as if.
2019-05-21 23:08:52 +08:00
guonaihong
8ee9d959a0
Now you can parse the inline lowercase start structure ( #1893 )
...
* Now you can parse the inline lowercase start structure
package main
import (
"encoding/json"
"fmt"
"github.com/gin-gonic/gin"
)
type appkey struct {
Appkey string `json:"appkey" form:"appkey"`
}
type Query struct {
Page int `json:"page" form:"page"`
Size int `json:"size" form:"size"`
appkey
}
func main() {
router := gin.Default()
router.POST("/login", func(c *gin.Context) {
var q2 Query
if c.ShouldBindQuery(&q2) == nil {
c.JSON(200, &q2)
}
})
router.Run(":8088")
}
http client:
old:
curl -X POST "127.0.0.1:8088/login?appkey=china&page=1&size=10"
{"page":1,"size":10,"appkey":""}
now:
curl -X POST "127.0.0.1:8088/login?appkey=china&page=1&size=10"
{"page":1,"size":10,"appkey":"china"}
* Modify judgment conditions
2019-05-13 10:17:31 +08:00
Dmitry Kutakov
2e915f4e50
refactor(form_mapping.go): mapping multipart request ( #1829 )
...
* refactor(form_mapping.go): mapping multipart request
* add checkers for a types to match with the setter interface
* form_mapping.go: rename method name on setter interface, add comments
* fix style of comments
2019-04-02 09:01:34 +08:00
Boyi Wu
c16bfa7949
update for supporting file binding ( #1264 )
...
update for supporting multipart form and file binding
example:
```
type PhoptUploadForm struct {
imgData *multipart.FileHeader `form:"img_data" binding:"required"`
ProjectID string `form:"project_id" binding:"required"`
Description string `form:"description binding:"required"`
}
```
ref: https://github.com/gin-gonic/gin/issues/1263
2019-03-18 10:16:34 +08:00
Dmitry Kutakov
483f828bce
add support arrays on mapping ( #1797 )
...
* add support arrays on mapping
* not allow default value on array mapping
2019-03-14 13:34:56 +08:00
田欧
a5dda62cdc
chore: use internal/json ( #1791 )
2019-03-05 06:46:18 +08:00
Dmitry Kutakov
805b2d4904
add support time.Duration on mapping ( #1794 )
2019-03-04 11:37:46 +08:00
Dmitry Kutakov
0d50ce8597
refactor(form_mapping.go): mapping ptr, struct and map ( #1749 )
...
* refactor(form_mapping.go): mapping ptr, struct and map
* fix #1672 correct work with ptr - not create value if field is not set
* avoid allocations on strings.Split() - change to strings.Index()
* fix #610 tag value "-" is mean ignoring field
* struct fields mapped like json.Unmarshal
* map fields mapped like json.Unmarshal
* fix after @thinkerou review
2019-03-03 14:39:43 +08:00
André Bazaglia
48f6c6137c
allow ignoring field on form mapping ( #1733 )
2019-02-22 12:23:52 +08:00
Dmitry Kutakov
49e4b0c60c
fix mapping inner structs with correct tag ( #1718 )
2018-12-28 09:57:09 +08:00
thinkerou
521d06c81d
support bind uri param ( #1612 )
...
* support bind uri (1)
* uri binding successful run
* fix vet warning: github.com/gin-gonic/gin/internal.Param composite literal uses unkeyed fields
* fix code style
* update function name
* fix test function signature
* add test for CanSet
* update readme and add test case
* remove internal.Params
* add coverage
* fix warning
2018-11-22 09:29:48 +08:00
田欧
85f3e78abc
chore: remove else instead of return/continue ( #1502 )
...
As[ Effective Go](https://golang.org/doc/effective_go.html?#if ) about `if` said, remove else statement instead of return/continue statement.
2018-08-20 21:49:24 +08:00
Alexander Lokhman
7eb0f74b89
Set default time format in form binding ( #1487 )
2018-08-17 09:41:56 +08:00
chainhelen
5636afe02d
fix bug, return err when failed binding bool ( #1350 )
...
* fix bug, return err when failed binding bool
* add test, return err when failed binding bool
2018-05-11 22:40:33 +08:00
田欧
bd4f73af67
support struct pointer ( #1342 )
...
* support struct pointer
* add readme
2018-05-01 14:24:18 +08:00
Alexander Lokhman
2282be059b
Add support of pointers in form binding ( #1336 )
...
* Add support of pointers in form binding
* Add tests for pointer form binding
2018-04-26 22:09:34 +08:00
田欧
41f951e0cd
support default value for form ( #1138 )
...
* support default value for form
* fix bug for nil interface
* use SplitN and optimization code
* add test case
* add test cases for form(own default value)
* fix invalid code
* fix code indent
* assert order
2018-04-25 16:24:03 +08:00
Boris Borshevsky
6f94fd05c9
Linting and optimizing struct memory signature. ( #1184 )
...
* fix cleanPath spell (#969 )
* linter and optimize structs
2017-11-29 10:50:14 +08:00
delphinus
a8c53949e5
Support time location on form binding ( #1117 )
2017-09-28 22:23:18 +08:00
Bo-Yi Wu
1e1e4fc867
Add Makefile to check the following thing ( #947 )
...
* Add Makefile to check the following thing.
* vet check
* fmt check
* embedmd check
* misspell check
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
* remove unused variable.
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2017-06-12 21:50:42 -05:00
Andrey Nering
6a3a8ae61b
Fix time.Time binding ( #904 )
...
If a empty string is given(`""`), them time should be zero.
2017-05-04 09:22:00 +08:00
Andrey Nering
863248034b
Support time.Time on form binding ( #801 )
2017-02-17 21:32:36 +08:00
Manu Mtz-Almeida
0873992f38
More unit tests for form binding
2015-07-08 04:26:37 +02:00
Manu Mtz-Almeida
967e62337a
form mapping optimisation
2015-05-24 03:56:11 +02:00
Manu Mtz-Almeida
208e1f5569
Merge branch 'master' of https://github.com/remerge/gin
...
Conflicts:
binding/binding.go
2015-05-24 03:33:21 +02:00
Manu Mtz-Almeida
8b26264574
Merge branch 'develop' into performance
...
Conflicts:
context.go
context_test.go
gin_test.go
recovery_test.go
utils.go
2015-04-08 13:37:25 +02:00
Manu Mtz-Almeida
ac0ad2fed8
Improves unit tests
2015-04-08 02:58:35 +02:00
Manu Mtz-Almeida
9828435f70
Fixes failing unit test
2015-04-07 18:14:33 +02:00
Manu Mtz-Almeida
1f6304ca25
Cleaning up performance branch
2015-04-07 12:22:38 +02:00
Manu Mtz-Almeida
d4413b6e91
Refactors binding module
2015-03-31 17:51:10 +02:00