Better errors for {En,De}codeMulti.

This commit is contained in:
Kamil Kisiel 2013-10-17 10:33:57 -07:00
parent 6186150e83
commit 155134204c
2 changed files with 25 additions and 4 deletions

View file

@ -357,12 +357,17 @@ func CodecsFromPairs(keyPairs ...[]byte) []Codec {
return codecs return codecs
} }
var errNoCodecs = errors.New("securecookie: no codecs provided")
// EncodeMulti encodes a cookie value using a group of codecs. // EncodeMulti encodes a cookie value using a group of codecs.
// //
// The codecs are tried in order. Multiple codecs are accepted to allow // The codecs are tried in order. Multiple codecs are accepted to allow
// key rotation. // key rotation.
func EncodeMulti(name string, value interface{}, func EncodeMulti(name string, value interface{}, codecs ...Codec) (string, error) {
codecs ...Codec) (string, error) { if len(codecs) == 0 {
return "", errNoCodecs
}
var errors MultiError var errors MultiError
for _, codec := range codecs { for _, codec := range codecs {
if encoded, err := codec.Encode(name, value); err == nil { if encoded, err := codec.Encode(name, value); err == nil {
@ -378,8 +383,11 @@ func EncodeMulti(name string, value interface{},
// //
// The codecs are tried in order. Multiple codecs are accepted to allow // The codecs are tried in order. Multiple codecs are accepted to allow
// key rotation. // key rotation.
func DecodeMulti(name string, value string, dst interface{}, func DecodeMulti(name string, value string, dst interface{}, codecs ...Codec) error {
codecs ...Codec) error { if len(codecs) == 0 {
return errNoCodecs
}
var errors MultiError var errors MultiError
for _, codec := range codecs { for _, codec := range codecs {
if err := codec.Decode(name, value, dst); err == nil { if err := codec.Decode(name, value, dst); err == nil {

View file

@ -144,6 +144,19 @@ func TestMultiError(t *testing.T) {
} }
} }
func TestMultiNoCodecs(t *testing.T) {
_, err := EncodeMulti("foo", "bar")
if err != errNoCodecs {
t.Errorf("EncodeMulti: bad value for error, got: %v", err)
}
var dst []byte
err = DecodeMulti("foo", "bar", &dst)
if err != errNoCodecs {
t.Errorf("DecodeMulti: bad value for error, got: %v", err)
}
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
type FooBar struct { type FooBar struct {