Skip to content

Commit 13a1398

Browse files
authored
introduce openapi3filter.RegisteredBodyDecoder (#340)
Signed-off-by: Pierre Fenoll <[email protected]>
1 parent 45c1543 commit 13a1398

File tree

2 files changed

+35
-22
lines changed

2 files changed

+35
-22
lines changed

openapi3filter/req_resp_decoder.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -767,10 +767,19 @@ type BodyDecoder func(io.Reader, http.Header, *openapi3.SchemaRef, EncodingFn) (
767767
// By default, there is content type "application/json" is supported only.
768768
var bodyDecoders = make(map[string]BodyDecoder)
769769

770+
// RegisteredBodyDecoder returns the registered body decoder for the given content type.
771+
//
772+
// If no decoder was registered for the given content type, nil is returned.
773+
// This call is not thread-safe: body decoders should not be created/destroyed by multiple goroutines.
774+
func RegisteredBodyDecoder(contentType string) BodyDecoder {
775+
return bodyDecoders[contentType]
776+
}
777+
770778
// RegisterBodyDecoder registers a request body's decoder for a content type.
771779
//
772780
// If a decoder for the specified content type already exists, the function replaces
773781
// it with the specified decoder.
782+
// This call is not thread-safe: body decoders should not be created/destroyed by multiple goroutines.
774783
func RegisterBodyDecoder(contentType string, decoder BodyDecoder) {
775784
if contentType == "" {
776785
panic("contentType is empty")
@@ -784,6 +793,7 @@ func RegisterBodyDecoder(contentType string, decoder BodyDecoder) {
784793
// UnregisterBodyDecoder dissociates a body decoder from a content type.
785794
//
786795
// Decoding this content type will result in an error.
796+
// This call is not thread-safe: body decoders should not be created/destroyed by multiple goroutines.
787797
func UnregisterBodyDecoder(contentType string) {
788798
if contentType == "" {
789799
panic("contentType is empty")

openapi3filter/req_resp_decoder_test.go

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1187,39 +1187,42 @@ func newTestMultipartForm(parts []*testFormPart) (io.Reader, string, error) {
11871187
}
11881188

11891189
func TestRegisterAndUnregisterBodyDecoder(t *testing.T) {
1190-
var (
1191-
contentType = "text/csv"
1192-
decoder = func(body io.Reader, h http.Header, schema *openapi3.SchemaRef, encFn EncodingFn) (interface{}, error) {
1193-
data, err := ioutil.ReadAll(body)
1194-
if err != nil {
1195-
return nil, err
1196-
}
1197-
var vv []interface{}
1198-
for _, v := range strings.Split(string(data), ",") {
1199-
vv = append(vv, v)
1200-
}
1201-
return vv, nil
1190+
var decoder BodyDecoder
1191+
decoder = func(body io.Reader, h http.Header, schema *openapi3.SchemaRef, encFn EncodingFn) (decoded interface{}, err error) {
1192+
var data []byte
1193+
if data, err = ioutil.ReadAll(body); err != nil {
1194+
return
12021195
}
1203-
schema = openapi3.NewArraySchema().WithItems(openapi3.NewStringSchema()).NewRef()
1204-
encFn = func(string) *openapi3.Encoding { return nil }
1205-
body = strings.NewReader("foo,bar")
1206-
want = []interface{}{"foo", "bar"}
1207-
wantErr = &ParseError{Kind: KindUnsupportedFormat}
1208-
)
1196+
return strings.Split(string(data), ","), nil
1197+
}
1198+
contentType := "text/csv"
12091199
h := make(http.Header)
12101200
h.Set(headerCT, contentType)
12111201

1202+
originalDecoder := RegisteredBodyDecoder(contentType)
1203+
require.Nil(t, originalDecoder)
1204+
12121205
RegisterBodyDecoder(contentType, decoder)
1206+
require.Equal(t, fmt.Sprintf("%v", decoder), fmt.Sprintf("%v", RegisteredBodyDecoder(contentType)))
1207+
1208+
body := strings.NewReader("foo,bar")
1209+
schema := openapi3.NewArraySchema().WithItems(openapi3.NewStringSchema()).NewRef()
1210+
encFn := func(string) *openapi3.Encoding { return nil }
12131211
got, err := decodeBody(body, h, schema, encFn)
12141212

12151213
require.NoError(t, err)
1216-
require.Truef(t, reflect.DeepEqual(got, want), "got %v, want %v", got, want)
1214+
require.Equal(t, []string{"foo", "bar"}, got)
12171215

12181216
UnregisterBodyDecoder(contentType)
1219-
_, err = decodeBody(body, h, schema, encFn)
12201217

1221-
require.Error(t, err)
1222-
require.Truef(t, matchParseError(err, wantErr), "got error:\n%v\nwant error:\n%v", err, wantErr)
1218+
originalDecoder = RegisteredBodyDecoder(contentType)
1219+
require.Nil(t, originalDecoder)
1220+
1221+
_, err = decodeBody(body, h, schema, encFn)
1222+
require.Equal(t, &ParseError{
1223+
Kind: KindUnsupportedFormat,
1224+
Reason: prefixUnsupportedCT + ` "text/csv"`,
1225+
}, err)
12231226
}
12241227

12251228
func matchParseError(got, want error) bool {

0 commit comments

Comments
 (0)