Skip to content

Commit

Permalink
fix(uri): return an error if query value contains separator char
Browse files Browse the repository at this point in the history
  • Loading branch information
tdakkota committed Mar 1, 2023
1 parent 9bd05c9 commit d206e74
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 26 deletions.
4 changes: 2 additions & 2 deletions uri/query_encoder.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ func (e *QueryEncoder) EncodeParam(cfg QueryParameterEncodingConfig, f func(Enco
return err
}

p.serialize()
return nil
// FIXME(tdakkota): probable we should return the error during encoding
return p.serialize()
}

func (e *QueryEncoder) Values() url.Values {
Expand Down
66 changes: 45 additions & 21 deletions uri/query_param_encoder.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,26 +24,26 @@ type queryParamEncoder struct {
explode bool // immutable
}

func (e *queryParamEncoder) serialize() {
func (e *queryParamEncoder) serialize() error {
switch e.typ {
case typeNotSet:
return
return nil
case typeValue:
e.encodeValue()
return e.encodeValue()
case typeArray:
e.encodeArray()
return e.encodeArray()
case typeObject:
e.encodeObject()
return e.encodeObject()
default:
panic("unreachable")
}
}

func (e *queryParamEncoder) encodeValue() {
func (e *queryParamEncoder) encodeValue() error {
switch e.style {
case QueryStyleForm:
e.values[e.paramName] = []string{e.val}
return
return nil
case QueryStyleSpaceDelimited,
QueryStylePipeDelimited,
QueryStyleDeepObject:
Expand All @@ -53,33 +53,45 @@ func (e *queryParamEncoder) encodeValue() {
}
}

func (e *queryParamEncoder) encodeArray() {
func (e *queryParamEncoder) encodeArray() error {
switch e.style {
case QueryStyleForm:
if e.explode {
e.values[e.paramName] = e.items
return
return nil
}

e.values[e.paramName] = []string{strings.Join(e.items, ",")}
return
const sep = ","
for _, v := range e.items {
if err := checkNotContains(v, sep); err != nil {
return err
}
}
e.values[e.paramName] = []string{strings.Join(e.items, sep)}
return nil

case QueryStyleSpaceDelimited:
if e.explode {
e.values[e.paramName] = e.items
return
return nil
}

panic("spaceDelimited with explode: false not supported")

case QueryStylePipeDelimited:
if e.explode {
e.values[e.paramName] = e.items
return
return nil
}

e.values[e.paramName] = []string{strings.Join(e.items, "|")}
return
const sep = "|"
for _, v := range e.items {
if err := checkNotContains(v, sep); err != nil {
return err
}
}
e.values[e.paramName] = []string{strings.Join(e.items, sep)}
return nil

case QueryStyleDeepObject:
panic(fmt.Sprintf("style %q cannot be used for arrays", e.style))
Expand All @@ -89,26 +101,38 @@ func (e *queryParamEncoder) encodeArray() {
}
}

func (e *queryParamEncoder) encodeObject() {
func (e *queryParamEncoder) encodeObject() error {
switch e.style {
case QueryStyleForm:
if e.explode {
for _, f := range e.fields {
e.values[f.Name] = []string{f.Value}
}
return
return nil
}

const (
kvSep = ","
fieldSep = ","
)
var out string

for i, f := range e.fields {
out += f.Name + "," + f.Value
if err := checkNotContains(f.Name, kvSep); err != nil {
return err
}
if err := checkNotContains(f.Value, fieldSep); err != nil {
return err
}

out += f.Name + fieldSep + f.Value
if i != len(e.fields)-1 {
out += ","
out += kvSep
}
}

e.values[e.paramName] = []string{out}
return
return nil

case QueryStyleSpaceDelimited:
panic("object cannot have spaceDelimited style")
Expand All @@ -125,7 +149,7 @@ func (e *queryParamEncoder) encodeObject() {
e.values[e.paramName+"["+f.Name+"]"] = []string{f.Value}
}

return
return nil

default:
panic("unreachable")
Expand Down
6 changes: 3 additions & 3 deletions uri/query_param_encoder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ func TestQueryParamEncoder(t *testing.T) {
values: make(url.Values),
}
require.NoError(t, e.EncodeValue(test.Input))
e.serialize()
require.NoError(t, e.serialize())
require.Equal(t, test.Expect, e.values.Encode(), fmt.Sprintf("Test %d", i+1))
}
})
Expand Down Expand Up @@ -115,7 +115,7 @@ func TestQueryParamEncoder(t *testing.T) {
return nil
})
require.NoError(t, err)
e.serialize()
require.NoError(t, e.serialize())
require.Equal(t, test.Expect, e.values.Encode(), fmt.Sprintf("Test %d", i+1))
}
})
Expand Down Expand Up @@ -174,7 +174,7 @@ func TestQueryParamEncoder(t *testing.T) {
})
require.NoError(t, err)
}
e.serialize()
require.NoError(t, e.serialize())
require.Equal(t, test.Expect, e.values.Encode(), fmt.Sprintf("Test %d", i+1))
}
})
Expand Down

0 comments on commit d206e74

Please sign in to comment.