Added support for MessagePack binding and rendering (#808)
Added deps to vendor.json and fixed rendering bug
This commit is contained in:
		| @ -15,6 +15,8 @@ const ( | ||||
| 	MIMEPOSTForm          = "application/x-www-form-urlencoded" | ||||
| 	MIMEMultipartPOSTForm = "multipart/form-data" | ||||
| 	MIMEPROTOBUF          = "application/x-protobuf" | ||||
| 	MIMEMSGPACK           = "application/x-msgpack" | ||||
| 	MIMEMSGPACK2          = "application/msgpack" | ||||
| ) | ||||
|  | ||||
| type Binding interface { | ||||
| @ -40,6 +42,7 @@ var ( | ||||
| 	FormPost      = formPostBinding{} | ||||
| 	FormMultipart = formMultipartBinding{} | ||||
| 	ProtoBuf      = protobufBinding{} | ||||
| 	MsgPack       = msgpackBinding{} | ||||
| ) | ||||
|  | ||||
| func Default(method, contentType string) Binding { | ||||
| @ -53,6 +56,8 @@ func Default(method, contentType string) Binding { | ||||
| 			return XML | ||||
| 		case MIMEPROTOBUF: | ||||
| 			return ProtoBuf | ||||
| 		case MIMEMSGPACK, MIMEMSGPACK2: | ||||
| 			return MsgPack | ||||
| 		default: //case MIMEPOSTForm, MIMEMultipartPOSTForm: | ||||
| 			return Form | ||||
| 		} | ||||
|  | ||||
| @ -12,17 +12,18 @@ import ( | ||||
|  | ||||
| 	"github.com/gin-gonic/gin/binding/example" | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| 	"github.com/ugorji/go/codec" | ||||
|  | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| ) | ||||
|  | ||||
| type FooStruct struct { | ||||
| 	Foo string `json:"foo" form:"foo" xml:"foo" binding:"required"` | ||||
| 	Foo string `msgpack:"foo" json:"foo" form:"foo" xml:"foo" binding:"required"` | ||||
| } | ||||
|  | ||||
| type FooBarStruct struct { | ||||
| 	FooStruct | ||||
| 	Bar string `json:"bar" form:"bar" xml:"bar" binding:"required"` | ||||
| 	Bar string `msgpack:"bar" json:"bar" form:"bar" xml:"bar" binding:"required"` | ||||
| } | ||||
|  | ||||
| func TestBindingDefault(t *testing.T) { | ||||
| @ -43,6 +44,9 @@ func TestBindingDefault(t *testing.T) { | ||||
|  | ||||
| 	assert.Equal(t, Default("POST", MIMEPROTOBUF), ProtoBuf) | ||||
| 	assert.Equal(t, Default("PUT", MIMEPROTOBUF), ProtoBuf) | ||||
|  | ||||
| 	assert.Equal(t, Default("POST", MIMEMSGPACK), MsgPack) | ||||
| 	assert.Equal(t, Default("PUT", MIMEMSGPACK2), MsgPack) | ||||
| } | ||||
|  | ||||
| func TestBindingJSON(t *testing.T) { | ||||
| @ -121,6 +125,26 @@ func TestBindingProtoBuf(t *testing.T) { | ||||
| 		string(data), string(data[1:])) | ||||
| } | ||||
|  | ||||
| func TestBindingMsgPack(t *testing.T) { | ||||
| 	test := FooStruct{ | ||||
| 		Foo: "bar", | ||||
| 	} | ||||
|  | ||||
| 	h := new(codec.MsgpackHandle) | ||||
| 	assert.NotNil(t, h) | ||||
| 	buf := bytes.NewBuffer([]byte{}) | ||||
| 	assert.NotNil(t, buf) | ||||
| 	err := codec.NewEncoder(buf, h).Encode(test) | ||||
| 	assert.NoError(t, err) | ||||
|  | ||||
| 	data := buf.Bytes() | ||||
|  | ||||
| 	testMsgPackBodyBinding(t, | ||||
| 		MsgPack, "msgpack", | ||||
| 		"/", "/", | ||||
| 		string(data), string(data[1:])) | ||||
| } | ||||
|  | ||||
| func TestValidationFails(t *testing.T) { | ||||
| 	var obj FooStruct | ||||
| 	req := requestWithBody("POST", "/", `{"bar": "foo"}`) | ||||
| @ -213,6 +237,23 @@ func testProtoBodyBinding(t *testing.T, b Binding, name, path, badPath, body, ba | ||||
| 	assert.Error(t, err) | ||||
| } | ||||
|  | ||||
| func testMsgPackBodyBinding(t *testing.T, b Binding, name, path, badPath, body, badBody string) { | ||||
| 	assert.Equal(t, b.Name(), name) | ||||
|  | ||||
| 	obj := FooStruct{} | ||||
| 	req := requestWithBody("POST", path, body) | ||||
| 	req.Header.Add("Content-Type", MIMEMSGPACK) | ||||
| 	err := b.Bind(req, &obj) | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.Equal(t, obj.Foo, "bar") | ||||
|  | ||||
| 	obj = FooStruct{} | ||||
| 	req = requestWithBody("POST", badPath, badBody) | ||||
| 	req.Header.Add("Content-Type", MIMEMSGPACK) | ||||
| 	err = MsgPack.Bind(req, &obj) | ||||
| 	assert.Error(t, err) | ||||
| } | ||||
|  | ||||
| func requestWithBody(method, path, body string) (req *http.Request) { | ||||
| 	req, _ = http.NewRequest(method, path, bytes.NewBufferString(body)) | ||||
| 	return | ||||
|  | ||||
							
								
								
									
										28
									
								
								binding/msgpack.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								binding/msgpack.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | ||||
| // Copyright 2017 Manu Martinez-Almeida.  All rights reserved. | ||||
| // Use of this source code is governed by a MIT style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| package binding | ||||
|  | ||||
| import ( | ||||
| 	"net/http" | ||||
|  | ||||
| 	"github.com/ugorji/go/codec" | ||||
| ) | ||||
|  | ||||
| type msgpackBinding struct{} | ||||
|  | ||||
| func (msgpackBinding) Name() string { | ||||
| 	return "msgpack" | ||||
| } | ||||
|  | ||||
| func (msgpackBinding) Bind(req *http.Request, obj interface{}) error { | ||||
|  | ||||
| 	if err := codec.NewDecoder(req.Body, new(codec.MsgpackHandle)).Decode(&obj); err != nil { | ||||
| 		//var decoder *codec.Decoder = codec.NewDecoder(req.Body, &codec.MsgpackHandle) | ||||
| 		//if err := decoder.Decode(&obj); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return validate(obj) | ||||
|  | ||||
| } | ||||
		Reference in New Issue
	
	Block a user