From 64f8d6b20267ea719bc8c6df2f59d7ec2f7f233c Mon Sep 17 00:00:00 2001 From: Dennis Glot <31706897+gl-ot@users.noreply.github.com> Date: Wed, 17 Mar 2021 23:50:26 +0300 Subject: [PATCH] GODRIVER-1919 Support decoding ObjectIDs from hex strings in BSON (#610) --- bson/bsoncodec/default_value_decoders.go | 4 ++++ bson/bsoncodec/default_value_decoders_test.go | 11 +++++++++++ 2 files changed, 15 insertions(+) diff --git a/bson/bsoncodec/default_value_decoders.go b/bson/bsoncodec/default_value_decoders.go index 0402265d93..18919e3c40 100644 --- a/bson/bsoncodec/default_value_decoders.go +++ b/bson/bsoncodec/default_value_decoders.go @@ -718,6 +718,7 @@ func (dvd DefaultValueDecoders) UndefinedDecodeValue(dc DecodeContext, vr bsonrw return nil } +// Accept both 12-byte string and pretty-printed 24-byte hex string formats. func (dvd DefaultValueDecoders) objectIDDecodeType(dc DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) { if t != tOID { return emptyValue, ValueDecoderError{ @@ -740,6 +741,9 @@ func (dvd DefaultValueDecoders) objectIDDecodeType(dc DecodeContext, vr bsonrw.V if err != nil { return emptyValue, err } + if oid, err = primitive.ObjectIDFromHex(str); err == nil { + break + } if len(str) != 12 { return emptyValue, fmt.Errorf("an ObjectID string must be exactly 12 bytes long (got %v)", len(str)) } diff --git a/bson/bsoncodec/default_value_decoders_test.go b/bson/bsoncodec/default_value_decoders_test.go index b7fc2b5636..c1a0f6e0d9 100644 --- a/bson/bsoncodec/default_value_decoders_test.go +++ b/bson/bsoncodec/default_value_decoders_test.go @@ -1118,6 +1118,17 @@ func TestDefaultValueDecoders(t *testing.T) { bsonrwtest.ReadString, nil, }, + { + "success/string-hex", + primitive.ObjectID{0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62}, + nil, + &bsonrwtest.ValueReaderWriter{ + BSONType: bsontype.String, + Return: "303132333435363738396162", + }, + bsonrwtest.ReadString, + nil, + }, { "decode null", primitive.ObjectID{},