From a62ba4aaa3f9aa47095a04953acde28e47d77290 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20W=C3=BCrbach?= Date: Wed, 11 Nov 2020 23:44:16 +0100 Subject: [PATCH] Populate URLDecodedKey in S3Object --- events/s3.go | 16 +++++++++ events/s3_test.go | 7 ++-- events/testdata/s3-event-with-decoded.json | 40 ++++++++++++++++++++++ events/testdata/s3-event.json | 5 ++- 4 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 events/testdata/s3-event-with-decoded.json diff --git a/events/s3.go b/events/s3.go index 471f4121..c10f6f0f 100644 --- a/events/s3.go +++ b/events/s3.go @@ -3,6 +3,8 @@ package events import ( + "encoding/json" + "net/url" "time" ) @@ -54,6 +56,20 @@ type S3Object struct { Sequencer string `json:"sequencer"` } +func (o *S3Object) UnmarshalJSON(data []byte) error { + type rawS3Object S3Object + if err := json.Unmarshal(data, (*rawS3Object)(o)); err != nil { + return err + } + key, err := url.QueryUnescape(o.Key) + if err != nil { + return err + } + o.URLDecodedKey = key + + return nil +} + type S3TestEvent struct { Service string `json:"Service"` Bucket string `json:"Bucket"` diff --git a/events/s3_test.go b/events/s3_test.go index cdaec90e..968bfe6b 100644 --- a/events/s3_test.go +++ b/events/s3_test.go @@ -26,8 +26,11 @@ func TestS3EventMarshaling(t *testing.T) { t.Errorf("could not marshal event. details: %v", err) } - // 4. check result - assert.JSONEq(t, string(inputJSON), string(outputJSON)) + // 4. read expected output JSON from file + exepectedOutputJSON := test.ReadJSONFromFile(t, "./testdata/s3-event-with-decoded.json") + + // 5. check result + assert.JSONEq(t, string(exepectedOutputJSON), string(outputJSON)) } func TestS3TestEventMarshaling(t *testing.T) { diff --git a/events/testdata/s3-event-with-decoded.json b/events/testdata/s3-event-with-decoded.json new file mode 100644 index 00000000..05f5ab5c --- /dev/null +++ b/events/testdata/s3-event-with-decoded.json @@ -0,0 +1,40 @@ +{ + "Records": [ + { + "eventVersion": "2.0", + "eventSource": "aws:s3", + "awsRegion": "us-east-1", + "eventTime": "1970-01-01T00:00:00.123Z", + "eventName": "ObjectCreated:Put", + "userIdentity": { + "principalId": "EXAMPLE" + }, + "requestParameters": { + "sourceIPAddress": "127.0.0.1" + }, + "responseElements": { + "x-amz-request-id": "C3D13FE58DE4C810", + "x-amz-id-2": "FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD" + }, + "s3": { + "s3SchemaVersion": "1.0", + "configurationId": "testConfigRule", + "bucket": { + "name": "sourcebucket", + "ownerIdentity": { + "principalId": "EXAMPLE" + }, + "arn": "arn:aws:s3:::mybucket" + }, + "object": { + "key": "Happy%20Face.jpg", + "urlDecodedKey": "Happy Face.jpg", + "size": 1024, + "versionId": "version", + "eTag": "d41d8cd98f00b204e9800998ecf8427e", + "sequencer": "Happy Sequencer" + } + } + } + ] +} diff --git a/events/testdata/s3-event.json b/events/testdata/s3-event.json index 10546dbc..fab197ec 100644 --- a/events/testdata/s3-event.json +++ b/events/testdata/s3-event.json @@ -12,7 +12,7 @@ "requestParameters": { "sourceIPAddress": "127.0.0.1" }, - "responseElements": { + "responseElements": { "x-amz-request-id": "C3D13FE58DE4C810", "x-amz-id-2": "FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD" }, @@ -27,9 +27,8 @@ "arn": "arn:aws:s3:::mybucket" }, "object": { - "key": "HappyFace.jpg", + "key": "Happy%20Face.jpg", "size": 1024, - "urlDecodedKey": "HappyFace.jpg", "versionId": "version", "eTag": "d41d8cd98f00b204e9800998ecf8427e", "sequencer": "Happy Sequencer"