mirror of
https://github.com/gin-gonic/gin.git
synced 2025-10-21 16:58:08 +08:00
test: remove msgpack and protobuf
This commit is contained in:
parent
4b6df417e4
commit
d27a6796ef
@ -15,9 +15,6 @@ const (
|
|||||||
MIMEPlain = "text/plain"
|
MIMEPlain = "text/plain"
|
||||||
MIMEPOSTForm = "application/x-www-form-urlencoded"
|
MIMEPOSTForm = "application/x-www-form-urlencoded"
|
||||||
MIMEMultipartPOSTForm = "multipart/form-data"
|
MIMEMultipartPOSTForm = "multipart/form-data"
|
||||||
MIMEPROTOBUF = "application/x-protobuf"
|
|
||||||
MIMEMSGPACK = "application/x-msgpack"
|
|
||||||
MIMEMSGPACK2 = "application/msgpack"
|
|
||||||
MIMEYAML = "application/x-yaml"
|
MIMEYAML = "application/x-yaml"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -74,8 +71,6 @@ var (
|
|||||||
Query = queryBinding{}
|
Query = queryBinding{}
|
||||||
FormPost = formPostBinding{}
|
FormPost = formPostBinding{}
|
||||||
FormMultipart = formMultipartBinding{}
|
FormMultipart = formMultipartBinding{}
|
||||||
ProtoBuf = protobufBinding{}
|
|
||||||
MsgPack = msgpackBinding{}
|
|
||||||
YAML = yamlBinding{}
|
YAML = yamlBinding{}
|
||||||
Uri = uriBinding{}
|
Uri = uriBinding{}
|
||||||
)
|
)
|
||||||
@ -92,10 +87,6 @@ func Default(method, contentType string) Binding {
|
|||||||
return JSON
|
return JSON
|
||||||
case MIMEXML, MIMEXML2:
|
case MIMEXML, MIMEXML2:
|
||||||
return XML
|
return XML
|
||||||
case MIMEPROTOBUF:
|
|
||||||
return ProtoBuf
|
|
||||||
case MIMEMSGPACK, MIMEMSGPACK2:
|
|
||||||
return MsgPack
|
|
||||||
case MIMEYAML:
|
case MIMEYAML:
|
||||||
return YAML
|
return YAML
|
||||||
case MIMEMultipartPOSTForm:
|
case MIMEMultipartPOSTForm:
|
||||||
|
@ -1,14 +1,10 @@
|
|||||||
package binding
|
package binding
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin/testdata/protoexample"
|
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/ugorji/go/codec"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestBindingBody(t *testing.T) {
|
func TestBindingBody(t *testing.T) {
|
||||||
@ -31,11 +27,6 @@ func TestBindingBody(t *testing.T) {
|
|||||||
<foo>FOO</foo>
|
<foo>FOO</foo>
|
||||||
</root>`,
|
</root>`,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
name: "MsgPack binding",
|
|
||||||
binding: MsgPack,
|
|
||||||
body: msgPackBody(t),
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
name: "YAML binding",
|
name: "YAML binding",
|
||||||
binding: YAML,
|
binding: YAML,
|
||||||
@ -51,22 +42,3 @@ func TestBindingBody(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func msgPackBody(t *testing.T) string {
|
|
||||||
test := FooStruct{"FOO"}
|
|
||||||
h := new(codec.MsgpackHandle)
|
|
||||||
buf := bytes.NewBuffer(nil)
|
|
||||||
assert.NoError(t, codec.NewEncoder(buf, h).Encode(test))
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestBindingBodyProto(t *testing.T) {
|
|
||||||
test := protoexample.Test{
|
|
||||||
Label: proto.String("FOO"),
|
|
||||||
}
|
|
||||||
data, _ := proto.Marshal(&test)
|
|
||||||
req := requestWithBody("POST", "/", string(data))
|
|
||||||
form := protoexample.Test{}
|
|
||||||
body, _ := ioutil.ReadAll(req.Body)
|
|
||||||
assert.NoError(t, ProtoBuf.BindBody(body, &form))
|
|
||||||
assert.Equal(t, test, form)
|
|
||||||
}
|
|
||||||
|
@ -18,10 +18,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin/testdata/protoexample"
|
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/ugorji/go/codec"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type appkey struct {
|
type appkey struct {
|
||||||
@ -35,12 +32,12 @@ type QueryTest struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type FooStruct struct {
|
type FooStruct struct {
|
||||||
Foo string `msgpack:"foo" json:"foo" form:"foo" xml:"foo" binding:"required"`
|
Foo string `json:"foo" form:"foo" xml:"foo" binding:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type FooBarStruct struct {
|
type FooBarStruct struct {
|
||||||
FooStruct
|
FooStruct
|
||||||
Bar string `msgpack:"bar" json:"bar" form:"bar" xml:"bar" binding:"required"`
|
Bar string `json:"bar" form:"bar" xml:"bar" binding:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type FooBarFileStruct struct {
|
type FooBarFileStruct struct {
|
||||||
@ -57,7 +54,7 @@ type FooBarFileFailStruct struct {
|
|||||||
|
|
||||||
type FooDefaultBarStruct struct {
|
type FooDefaultBarStruct struct {
|
||||||
FooStruct
|
FooStruct
|
||||||
Bar string `msgpack:"bar" json:"bar" form:"bar,default=hello" xml:"bar" binding:"required"`
|
Bar string `json:"bar" form:"bar,default=hello" xml:"bar" binding:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type FooStructUseNumber struct {
|
type FooStructUseNumber struct {
|
||||||
@ -149,12 +146,6 @@ func TestBindingDefault(t *testing.T) {
|
|||||||
assert.Equal(t, FormMultipart, Default("POST", MIMEMultipartPOSTForm))
|
assert.Equal(t, FormMultipart, Default("POST", MIMEMultipartPOSTForm))
|
||||||
assert.Equal(t, FormMultipart, Default("PUT", MIMEMultipartPOSTForm))
|
assert.Equal(t, FormMultipart, Default("PUT", MIMEMultipartPOSTForm))
|
||||||
|
|
||||||
assert.Equal(t, ProtoBuf, Default("POST", MIMEPROTOBUF))
|
|
||||||
assert.Equal(t, ProtoBuf, Default("PUT", MIMEPROTOBUF))
|
|
||||||
|
|
||||||
assert.Equal(t, MsgPack, Default("POST", MIMEMSGPACK))
|
|
||||||
assert.Equal(t, MsgPack, Default("PUT", MIMEMSGPACK2))
|
|
||||||
|
|
||||||
assert.Equal(t, YAML, Default("POST", MIMEYAML))
|
assert.Equal(t, YAML, Default("POST", MIMEYAML))
|
||||||
assert.Equal(t, YAML, Default("PUT", MIMEYAML))
|
assert.Equal(t, YAML, Default("PUT", MIMEYAML))
|
||||||
}
|
}
|
||||||
@ -583,50 +574,6 @@ func TestBindingFormMultipartForMapFail(t *testing.T) {
|
|||||||
assert.Error(t, err)
|
assert.Error(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestBindingProtoBuf(t *testing.T) {
|
|
||||||
test := &protoexample.Test{
|
|
||||||
Label: proto.String("yes"),
|
|
||||||
}
|
|
||||||
data, _ := proto.Marshal(test)
|
|
||||||
|
|
||||||
testProtoBodyBinding(t,
|
|
||||||
ProtoBuf, "protobuf",
|
|
||||||
"/", "/",
|
|
||||||
string(data), string(data[1:]))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestBindingProtoBufFail(t *testing.T) {
|
|
||||||
test := &protoexample.Test{
|
|
||||||
Label: proto.String("yes"),
|
|
||||||
}
|
|
||||||
data, _ := proto.Marshal(test)
|
|
||||||
|
|
||||||
testProtoBodyBindingFail(t,
|
|
||||||
ProtoBuf, "protobuf",
|
|
||||||
"/", "/",
|
|
||||||
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) {
|
func TestValidationFails(t *testing.T) {
|
||||||
var obj FooStruct
|
var obj FooStruct
|
||||||
req := requestWithBody("POST", "/", `{"bar": "foo"}`)
|
req := requestWithBody("POST", "/", `{"bar": "foo"}`)
|
||||||
@ -1119,64 +1066,12 @@ func testBodyBindingFail(t *testing.T, b Binding, name, path, badPath, body, bad
|
|||||||
assert.Error(t, err)
|
assert.Error(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func testProtoBodyBinding(t *testing.T, b Binding, name, path, badPath, body, badBody string) {
|
|
||||||
assert.Equal(t, name, b.Name())
|
|
||||||
|
|
||||||
obj := protoexample.Test{}
|
|
||||||
req := requestWithBody("POST", path, body)
|
|
||||||
req.Header.Add("Content-Type", MIMEPROTOBUF)
|
|
||||||
err := b.Bind(req, &obj)
|
|
||||||
assert.NoError(t, err)
|
|
||||||
assert.Equal(t, "yes", *obj.Label)
|
|
||||||
|
|
||||||
obj = protoexample.Test{}
|
|
||||||
req = requestWithBody("POST", badPath, badBody)
|
|
||||||
req.Header.Add("Content-Type", MIMEPROTOBUF)
|
|
||||||
err = ProtoBuf.Bind(req, &obj)
|
|
||||||
assert.Error(t, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
type hook struct{}
|
type hook struct{}
|
||||||
|
|
||||||
func (h hook) Read([]byte) (int, error) {
|
func (h hook) Read([]byte) (int, error) {
|
||||||
return 0, errors.New("error")
|
return 0, errors.New("error")
|
||||||
}
|
}
|
||||||
|
|
||||||
func testProtoBodyBindingFail(t *testing.T, b Binding, name, path, badPath, body, badBody string) {
|
|
||||||
assert.Equal(t, name, b.Name())
|
|
||||||
|
|
||||||
obj := protoexample.Test{}
|
|
||||||
req := requestWithBody("POST", path, body)
|
|
||||||
|
|
||||||
req.Body = ioutil.NopCloser(&hook{})
|
|
||||||
req.Header.Add("Content-Type", MIMEPROTOBUF)
|
|
||||||
err := b.Bind(req, &obj)
|
|
||||||
assert.Error(t, err)
|
|
||||||
|
|
||||||
obj = protoexample.Test{}
|
|
||||||
req = requestWithBody("POST", badPath, badBody)
|
|
||||||
req.Header.Add("Content-Type", MIMEPROTOBUF)
|
|
||||||
err = ProtoBuf.Bind(req, &obj)
|
|
||||||
assert.Error(t, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
func testMsgPackBodyBinding(t *testing.T, b Binding, name, path, badPath, body, badBody string) {
|
|
||||||
assert.Equal(t, name, b.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, "bar", obj.Foo)
|
|
||||||
|
|
||||||
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) {
|
func requestWithBody(method, path, body string) (req *http.Request) {
|
||||||
req, _ = http.NewRequest(method, path, bytes.NewBufferString(body))
|
req, _ = http.NewRequest(method, path, bytes.NewBufferString(body))
|
||||||
return
|
return
|
||||||
|
@ -1,35 +0,0 @@
|
|||||||
// 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 (
|
|
||||||
"bytes"
|
|
||||||
"io"
|
|
||||||
"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 {
|
|
||||||
return decodeMsgPack(req.Body, obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (msgpackBinding) BindBody(body []byte, obj interface{}) error {
|
|
||||||
return decodeMsgPack(bytes.NewReader(body), obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func decodeMsgPack(r io.Reader, obj interface{}) error {
|
|
||||||
cdc := new(codec.MsgpackHandle)
|
|
||||||
if err := codec.NewDecoder(r, cdc).Decode(&obj); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return validate(obj)
|
|
||||||
}
|
|
@ -1,36 +0,0 @@
|
|||||||
// Copyright 2014 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 (
|
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
)
|
|
||||||
|
|
||||||
type protobufBinding struct{}
|
|
||||||
|
|
||||||
func (protobufBinding) Name() string {
|
|
||||||
return "protobuf"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b protobufBinding) Bind(req *http.Request, obj interface{}) error {
|
|
||||||
buf, err := ioutil.ReadAll(req.Body)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return b.BindBody(buf, obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (protobufBinding) BindBody(body []byte, obj interface{}) error {
|
|
||||||
if err := proto.Unmarshal(body, obj.(proto.Message)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// Here it's same to return validate(obj), but util now we can't add
|
|
||||||
// `binding:""` to the struct which automatically generate by gen-proto
|
|
||||||
return nil
|
|
||||||
// return validate(obj)
|
|
||||||
}
|
|
@ -861,11 +861,6 @@ func (c *Context) YAML(code int, obj interface{}) {
|
|||||||
c.Render(code, render.YAML{Data: obj})
|
c.Render(code, render.YAML{Data: obj})
|
||||||
}
|
}
|
||||||
|
|
||||||
// ProtoBuf serializes the given struct as ProtoBuf into the response body.
|
|
||||||
func (c *Context) ProtoBuf(code int, obj interface{}) {
|
|
||||||
c.Render(code, render.ProtoBuf{Data: obj})
|
|
||||||
}
|
|
||||||
|
|
||||||
// String writes the given string into the response body.
|
// String writes the given string into the response body.
|
||||||
func (c *Context) String(code int, format string, values ...interface{}) {
|
func (c *Context) String(code int, format string, values ...interface{}) {
|
||||||
c.Render(code, render.String{Format: format, Data: values})
|
c.Render(code, render.String{Format: format, Data: values})
|
||||||
|
@ -22,11 +22,8 @@ import (
|
|||||||
|
|
||||||
"github.com/gin-contrib/sse"
|
"github.com/gin-contrib/sse"
|
||||||
"github.com/gin-gonic/gin/binding"
|
"github.com/gin-gonic/gin/binding"
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
testdata "github.com/gin-gonic/gin/testdata/protoexample"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ context.Context = &Context{}
|
var _ context.Context = &Context{}
|
||||||
@ -1018,30 +1015,6 @@ func TestContextRenderYAML(t *testing.T) {
|
|||||||
assert.Equal(t, "application/x-yaml; charset=utf-8", w.Header().Get("Content-Type"))
|
assert.Equal(t, "application/x-yaml; charset=utf-8", w.Header().Get("Content-Type"))
|
||||||
}
|
}
|
||||||
|
|
||||||
// TestContextRenderProtoBuf tests that the response is serialized as ProtoBuf
|
|
||||||
// and Content-Type is set to application/x-protobuf
|
|
||||||
// and we just use the example protobuf to check if the response is correct
|
|
||||||
func TestContextRenderProtoBuf(t *testing.T) {
|
|
||||||
w := httptest.NewRecorder()
|
|
||||||
c, _ := CreateTestContext(w)
|
|
||||||
|
|
||||||
reps := []int64{int64(1), int64(2)}
|
|
||||||
label := "test"
|
|
||||||
data := &testdata.Test{
|
|
||||||
Label: &label,
|
|
||||||
Reps: reps,
|
|
||||||
}
|
|
||||||
|
|
||||||
c.ProtoBuf(http.StatusCreated, data)
|
|
||||||
|
|
||||||
protoData, err := proto.Marshal(data)
|
|
||||||
assert.NoError(t, err)
|
|
||||||
|
|
||||||
assert.Equal(t, http.StatusCreated, w.Code)
|
|
||||||
assert.Equal(t, string(protoData), w.Body.String())
|
|
||||||
assert.Equal(t, "application/x-protobuf", w.Header().Get("Content-Type"))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestContextHeaders(t *testing.T) {
|
func TestContextHeaders(t *testing.T) {
|
||||||
c, _ := CreateTestContext(httptest.NewRecorder())
|
c, _ := CreateTestContext(httptest.NewRecorder())
|
||||||
c.Header("Content-Type", "text/plain")
|
c.Header("Content-Type", "text/plain")
|
||||||
|
2
go.mod
2
go.mod
@ -4,13 +4,11 @@ go 1.12
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3
|
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3
|
||||||
github.com/golang/protobuf v1.3.1
|
|
||||||
github.com/json-iterator/go v1.1.6
|
github.com/json-iterator/go v1.1.6
|
||||||
github.com/mattn/go-isatty v0.0.7
|
github.com/mattn/go-isatty v0.0.7
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
github.com/modern-go/reflect2 v1.0.1 // indirect
|
github.com/modern-go/reflect2 v1.0.1 // indirect
|
||||||
github.com/stretchr/testify v1.3.0
|
github.com/stretchr/testify v1.3.0
|
||||||
github.com/ugorji/go v1.1.4
|
|
||||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c
|
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c
|
||||||
gopkg.in/go-playground/assert.v1 v1.2.1 // indirect
|
gopkg.in/go-playground/assert.v1 v1.2.1 // indirect
|
||||||
gopkg.in/go-playground/validator.v8 v8.18.2
|
gopkg.in/go-playground/validator.v8 v8.18.2
|
||||||
|
4
go.sum
4
go.sum
@ -2,8 +2,6 @@ github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8
|
|||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3 h1:t8FVkw33L+wilf2QiWkw0UV77qRpcH/JHPKGpKa2E8g=
|
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3 h1:t8FVkw33L+wilf2QiWkw0UV77qRpcH/JHPKGpKa2E8g=
|
||||||
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s=
|
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s=
|
||||||
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
|
|
||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
|
||||||
github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs=
|
github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs=
|
||||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||||
github.com/mattn/go-isatty v0.0.7 h1:UvyT9uN+3r7yLEYSlJsbQGdsaB/a0DlgWP3pql6iwOc=
|
github.com/mattn/go-isatty v0.0.7 h1:UvyT9uN+3r7yLEYSlJsbQGdsaB/a0DlgWP3pql6iwOc=
|
||||||
@ -17,8 +15,6 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
|
|||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw=
|
|
||||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c h1:uOCk1iQW6Vc18bnC13MfzScl+wdKBmM9Y9kU7Z83/lw=
|
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c h1:uOCk1iQW6Vc18bnC13MfzScl+wdKBmM9Y9kU7Z83/lw=
|
||||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
@ -1,35 +0,0 @@
|
|||||||
// 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 render
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"github.com/ugorji/go/codec"
|
|
||||||
)
|
|
||||||
|
|
||||||
// MsgPack contains the given interface object.
|
|
||||||
type MsgPack struct {
|
|
||||||
Data interface{}
|
|
||||||
}
|
|
||||||
|
|
||||||
var msgpackContentType = []string{"application/msgpack; charset=utf-8"}
|
|
||||||
|
|
||||||
// WriteContentType (MsgPack) writes MsgPack ContentType.
|
|
||||||
func (r MsgPack) WriteContentType(w http.ResponseWriter) {
|
|
||||||
writeContentType(w, msgpackContentType)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Render (MsgPack) encodes the given interface object and writes data with custom ContentType.
|
|
||||||
func (r MsgPack) Render(w http.ResponseWriter) error {
|
|
||||||
return WriteMsgPack(w, r.Data)
|
|
||||||
}
|
|
||||||
|
|
||||||
// WriteMsgPack writes MsgPack ContentType and encodes the given interface object.
|
|
||||||
func WriteMsgPack(w http.ResponseWriter, obj interface{}) error {
|
|
||||||
writeContentType(w, msgpackContentType)
|
|
||||||
var mh codec.MsgpackHandle
|
|
||||||
return codec.NewEncoder(w, &mh).Encode(obj)
|
|
||||||
}
|
|
@ -1,36 +0,0 @@
|
|||||||
// Copyright 2018 Gin Core Team. All rights reserved.
|
|
||||||
// Use of this source code is governed by a MIT style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package render
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ProtoBuf contains the given interface object.
|
|
||||||
type ProtoBuf struct {
|
|
||||||
Data interface{}
|
|
||||||
}
|
|
||||||
|
|
||||||
var protobufContentType = []string{"application/x-protobuf"}
|
|
||||||
|
|
||||||
// Render (ProtoBuf) marshals the given interface object and writes data with custom ContentType.
|
|
||||||
func (r ProtoBuf) Render(w http.ResponseWriter) error {
|
|
||||||
r.WriteContentType(w)
|
|
||||||
|
|
||||||
bytes, err := proto.Marshal(r.Data.(proto.Message))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = w.Write(bytes)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// WriteContentType (ProtoBuf) writes ProtoBuf ContentType.
|
|
||||||
func (r ProtoBuf) WriteContentType(w http.ResponseWriter) {
|
|
||||||
writeContentType(w, protobufContentType)
|
|
||||||
}
|
|
@ -27,10 +27,8 @@ var (
|
|||||||
_ HTMLRender = HTMLDebug{}
|
_ HTMLRender = HTMLDebug{}
|
||||||
_ HTMLRender = HTMLProduction{}
|
_ HTMLRender = HTMLProduction{}
|
||||||
_ Render = YAML{}
|
_ Render = YAML{}
|
||||||
_ Render = MsgPack{}
|
|
||||||
_ Render = Reader{}
|
_ Render = Reader{}
|
||||||
_ Render = AsciiJSON{}
|
_ Render = AsciiJSON{}
|
||||||
_ Render = ProtoBuf{}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func writeContentType(w http.ResponseWriter, value []string) {
|
func writeContentType(w http.ResponseWriter, value []string) {
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
package render
|
package render
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
"errors"
|
"errors"
|
||||||
"html/template"
|
"html/template"
|
||||||
@ -15,40 +14,12 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/ugorji/go/codec"
|
|
||||||
|
|
||||||
testdata "github.com/gin-gonic/gin/testdata/protoexample"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// TODO unit tests
|
// TODO unit tests
|
||||||
// test errors
|
// test errors
|
||||||
|
|
||||||
func TestRenderMsgPack(t *testing.T) {
|
|
||||||
w := httptest.NewRecorder()
|
|
||||||
data := map[string]interface{}{
|
|
||||||
"foo": "bar",
|
|
||||||
}
|
|
||||||
|
|
||||||
(MsgPack{data}).WriteContentType(w)
|
|
||||||
assert.Equal(t, "application/msgpack; charset=utf-8", w.Header().Get("Content-Type"))
|
|
||||||
|
|
||||||
err := (MsgPack{data}).Render(w)
|
|
||||||
|
|
||||||
assert.NoError(t, err)
|
|
||||||
|
|
||||||
h := new(codec.MsgpackHandle)
|
|
||||||
assert.NotNil(t, h)
|
|
||||||
buf := bytes.NewBuffer([]byte{})
|
|
||||||
assert.NotNil(t, buf)
|
|
||||||
err = codec.NewEncoder(buf, h).Encode(data)
|
|
||||||
|
|
||||||
assert.NoError(t, err)
|
|
||||||
assert.Equal(t, w.Body.String(), string(buf.Bytes()))
|
|
||||||
assert.Equal(t, "application/msgpack; charset=utf-8", w.Header().Get("Content-Type"))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestRenderJSON(t *testing.T) {
|
func TestRenderJSON(t *testing.T) {
|
||||||
w := httptest.NewRecorder()
|
w := httptest.NewRecorder()
|
||||||
data := map[string]interface{}{
|
data := map[string]interface{}{
|
||||||
@ -281,35 +252,6 @@ func TestRenderYAMLFail(t *testing.T) {
|
|||||||
assert.Error(t, err)
|
assert.Error(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// test Protobuf rendering
|
|
||||||
func TestRenderProtoBuf(t *testing.T) {
|
|
||||||
w := httptest.NewRecorder()
|
|
||||||
reps := []int64{int64(1), int64(2)}
|
|
||||||
label := "test"
|
|
||||||
data := &testdata.Test{
|
|
||||||
Label: &label,
|
|
||||||
Reps: reps,
|
|
||||||
}
|
|
||||||
|
|
||||||
(ProtoBuf{data}).WriteContentType(w)
|
|
||||||
protoData, err := proto.Marshal(data)
|
|
||||||
assert.NoError(t, err)
|
|
||||||
assert.Equal(t, "application/x-protobuf", w.Header().Get("Content-Type"))
|
|
||||||
|
|
||||||
err = (ProtoBuf{data}).Render(w)
|
|
||||||
|
|
||||||
assert.NoError(t, err)
|
|
||||||
assert.Equal(t, string(protoData), w.Body.String())
|
|
||||||
assert.Equal(t, "application/x-protobuf", w.Header().Get("Content-Type"))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestRenderProtoBufFail(t *testing.T) {
|
|
||||||
w := httptest.NewRecorder()
|
|
||||||
data := &testdata.Test{}
|
|
||||||
err := (ProtoBuf{data}).Render(w)
|
|
||||||
assert.Error(t, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestRenderXML(t *testing.T) {
|
func TestRenderXML(t *testing.T) {
|
||||||
w := httptest.NewRecorder()
|
w := httptest.NewRecorder()
|
||||||
data := xmlmap{
|
data := xmlmap{
|
||||||
|
113
testdata/protoexample/test.pb.go
vendored
113
testdata/protoexample/test.pb.go
vendored
@ -1,113 +0,0 @@
|
|||||||
// Code generated by protoc-gen-go.
|
|
||||||
// source: test.proto
|
|
||||||
// DO NOT EDIT!
|
|
||||||
|
|
||||||
/*
|
|
||||||
Package protoexample is a generated protocol buffer package.
|
|
||||||
|
|
||||||
It is generated from these files:
|
|
||||||
test.proto
|
|
||||||
|
|
||||||
It has these top-level messages:
|
|
||||||
Test
|
|
||||||
*/
|
|
||||||
package protoexample
|
|
||||||
|
|
||||||
import proto "github.com/golang/protobuf/proto"
|
|
||||||
import math "math"
|
|
||||||
|
|
||||||
// Reference imports to suppress errors if they are not otherwise used.
|
|
||||||
var _ = proto.Marshal
|
|
||||||
var _ = math.Inf
|
|
||||||
|
|
||||||
type FOO int32
|
|
||||||
|
|
||||||
const (
|
|
||||||
FOO_X FOO = 17
|
|
||||||
)
|
|
||||||
|
|
||||||
var FOO_name = map[int32]string{
|
|
||||||
17: "X",
|
|
||||||
}
|
|
||||||
var FOO_value = map[string]int32{
|
|
||||||
"X": 17,
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x FOO) Enum() *FOO {
|
|
||||||
p := new(FOO)
|
|
||||||
*p = x
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
func (x FOO) String() string {
|
|
||||||
return proto.EnumName(FOO_name, int32(x))
|
|
||||||
}
|
|
||||||
func (x *FOO) UnmarshalJSON(data []byte) error {
|
|
||||||
value, err := proto.UnmarshalJSONEnum(FOO_value, data, "FOO")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
*x = FOO(value)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type Test struct {
|
|
||||||
Label *string `protobuf:"bytes,1,req,name=label" json:"label,omitempty"`
|
|
||||||
Type *int32 `protobuf:"varint,2,opt,name=type,def=77" json:"type,omitempty"`
|
|
||||||
Reps []int64 `protobuf:"varint,3,rep,name=reps" json:"reps,omitempty"`
|
|
||||||
Optionalgroup *Test_OptionalGroup `protobuf:"group,4,opt,name=OptionalGroup" json:"optionalgroup,omitempty"`
|
|
||||||
XXX_unrecognized []byte `json:"-"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Test) Reset() { *m = Test{} }
|
|
||||||
func (m *Test) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*Test) ProtoMessage() {}
|
|
||||||
|
|
||||||
const Default_Test_Type int32 = 77
|
|
||||||
|
|
||||||
func (m *Test) GetLabel() string {
|
|
||||||
if m != nil && m.Label != nil {
|
|
||||||
return *m.Label
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Test) GetType() int32 {
|
|
||||||
if m != nil && m.Type != nil {
|
|
||||||
return *m.Type
|
|
||||||
}
|
|
||||||
return Default_Test_Type
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Test) GetReps() []int64 {
|
|
||||||
if m != nil {
|
|
||||||
return m.Reps
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Test) GetOptionalgroup() *Test_OptionalGroup {
|
|
||||||
if m != nil {
|
|
||||||
return m.Optionalgroup
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type Test_OptionalGroup struct {
|
|
||||||
RequiredField *string `protobuf:"bytes,5,req" json:"RequiredField,omitempty"`
|
|
||||||
XXX_unrecognized []byte `json:"-"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Test_OptionalGroup) Reset() { *m = Test_OptionalGroup{} }
|
|
||||||
func (m *Test_OptionalGroup) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*Test_OptionalGroup) ProtoMessage() {}
|
|
||||||
|
|
||||||
func (m *Test_OptionalGroup) GetRequiredField() string {
|
|
||||||
if m != nil && m.RequiredField != nil {
|
|
||||||
return *m.RequiredField
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
proto.RegisterEnum("protoexample.FOO", FOO_name, FOO_value)
|
|
||||||
}
|
|
12
testdata/protoexample/test.proto
vendored
12
testdata/protoexample/test.proto
vendored
@ -1,12 +0,0 @@
|
|||||||
package protoexample;
|
|
||||||
|
|
||||||
enum FOO {X=17;};
|
|
||||||
|
|
||||||
message Test {
|
|
||||||
required string label = 1;
|
|
||||||
optional int32 type = 2[default=77];
|
|
||||||
repeated int64 reps = 3;
|
|
||||||
optional group OptionalGroup = 4{
|
|
||||||
required string RequiredField = 5;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user