diff --git a/src/transport/receiver.ts b/src/transport/receiver.ts index 15c1867..48fcd1d 100644 --- a/src/transport/receiver.ts +++ b/src/transport/receiver.ts @@ -1,4 +1,4 @@ -import { Headers } from "./http/headers"; +import { Headers, sanitize } from "./http/headers"; import { CloudEvent, Version, ValidationError } from ".."; import { BinaryHTTPReceiver as BinaryReceiver } from "./http/binary_receiver"; import { StructuredHTTPReceiver as StructuredReceiver } from "./http/structured_receiver"; @@ -60,8 +60,9 @@ export class Receiver { * @return {CloudEvent} A new {CloudEvent} instance */ accept(headers: Headers, body: string | Record | CloudEventV1 | CloudEventV03): CloudEvent { - const mode: Mode = getMode(headers); - const version = getVersion(mode, headers, body); + const cleanHeaders: Headers = sanitize(headers); + const mode: Mode = getMode(cleanHeaders); + const version = getVersion(mode, cleanHeaders, body); switch (version) { case Version.V1: return this.receivers.v1[mode].parse(body, headers); diff --git a/test/http_receiver_test.ts b/test/http_receiver_test.ts index 1c21c39..b21a049 100644 --- a/test/http_receiver_test.ts +++ b/test/http_receiver_test.ts @@ -52,6 +52,35 @@ describe("HTTP Transport Binding Receiver for CloudEvents", () => { expect(typeof event.data).to.equal("object"); expect((event.data as Record).lunch).to.equal("sushi"); }); + + it("Recognizes headers in title case for binary events", () => { + const binaryHeaders = { + "Content-Type": "application/json; charset=utf-8", + "ce-specversion": specversion, + "ce-id": id, + "ce-type": type, + "ce-source": source, + }; + + const event: CloudEvent = receiver.accept(binaryHeaders, data); + expect(event.validate()).to.be.true; + expect((event.data as Record).lunch).to.equal("sushi"); + }); + + it("Recognizes headers in title case for structured events", () => { + const structuredHeaders = { "Content-Type": "application/cloudevents+json" }; + const payload = { + id, + type, + source, + data, + specversion, + }; + + const event: CloudEvent = receiver.accept(structuredHeaders, payload); + expect(event.validate()).to.be.true; + expect((event.data as Record).lunch).to.equal("sushi"); + }); }); describe("V1", () => {