Emit Binary, but receives Structured
See original GitHub issueDescribe the Bug
I was playing around with a small example where i Emit a binary cloud event. something like this:
'use strict';
const { Emitter, CloudEvent } = require('cloudevents');
const em = new Emitter({ url: 'http://localhost:3000/cloudeventy' });
const ce = new CloudEvent({
type: 'com.lholmquist.cloudeventy.fun',
source: 'fun-with-cloud-events',
data: 'DATA'
});
em.send(ce)
.then(response => {
console.log(response);
})
.catch(err => {
console.log(err);
});
Then i have a basic express.js application running on port 3000 with the route cloudeventy
to receive the event coming in, which looks similar to this:
app.post('/cloudeventy', (req, res) => {
console.log(req.headers);
const ce = Receiver.accept(req.headers, req.body);
res.send('...');
});
However, I get an error saying that “Cannot read property specversion of undefned”.
I also console logged out my request headers too.
{
accept: 'application/json, text/plain, */*',
'content-type': 'application/cloudevents+json; charset=utf-8',
'ce-id': '51568118-f04b-4491-9895-a0e1bfa4ac09',
'ce-type': 'com.lholmquist.cloudeventy.fun',
'ce-source': 'fun-with-cloud-events',
'ce-specversion': '1.0',
'ce-time': '2020-08-04T23:39:35.162Z',
'user-agent': 'axios/0.19.2',
'content-length': '4',
host: 'localhost:3000',
connection: 'close'
}
TypeError: Cannot read property 'specversion' of undefined
at getVersion (/home/lucasholmquist/develop/just-playing/fun-with-cloudevents/node_modules/cloudevents/dist/transport/receiver.js:92:79)
at Function.accept (/home/lucasholmquist/develop/just-playing/fun-with-cloudevents/node_modules/cloudevents/dist/transport/receiver.js:45:25)
at /home/lucasholmquist/develop/just-playing/fun-with-cloudevents/index.js:14:23
at Layer.handle [as handle_request] (/home/lucasholmquist/develop/just-playing/fun-with-cloudevents/node_modules/express/lib/router/layer.js:95:5)
at next (/home/lucasholmquist/develop/just-playing/fun-with-cloudevents/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/home/lucasholmquist/develop/just-playing/fun-with-cloudevents/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/home/lucasholmquist/develop/just-playing/fun-with-cloudevents/node_modules/express/lib/router/layer.js:95:5)
at /home/lucasholmquist/develop/just-playing/fun-with-cloudevents/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/home/lucasholmquist/develop/just-playing/fun-with-cloudevents/node_modules/express/lib/router/index.js:335:12)
at next (/home/lucasholmquist/develop/just-playing/fun-with-cloudevents/node_modules/express/lib/router/index.js:275:10)
When i step through the code on the receiving end, it treats it as a structured event, not a binary event, even though that was how it was sent.
There is code to determine the mode, that parses the content-type header. https://github.com/cloudevents/sdk-javascript/blob/master/src/transport/receiver.ts#L66 and if it sees application/cloudevents
then it says it is a “structured” event. The problem is that both the structured and binary emitters add the same content-type header.
Binary Emitter Headers: https://github.com/cloudevents/sdk-javascript/blob/master/src/transport/http/binary_emitter.ts#L23
Structured Emitter Headers: https://github.com/cloudevents/sdk-javascript/blob/master/src/transport/http/structured_emitter.ts#L8
It seems that the check for “Binary Headers” should happen first, unless the headers are wrong for the binary version
Extra Context:
These code examples i gave above i think would make a good example, since we don’t have an emitter example yet
Issue Analytics
- State:
- Created 3 years ago
- Comments:10 (10 by maintainers)
assigning to myself to fix if no one minds