Skip to content

Emit Binary, but receives Structured #301

Closed
@lholmquist

Description

@lholmquist

Describe 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

@lance @grant thoughts?

Metadata

Metadata

Assignees

Labels

module/transport/httpIssues related to the HTTP transport protocol implementationtype/bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions