def do_POST(self): # Process an HTTP POST request and return a response with an HTTP 200 status. content_len = int(self.headers.get('Content-Length')) request_body = self.rfile.read(content_len) m = marshaller.NewHTTPMarshaller( [binary.NewBinaryHTTPCloudEventConverter()]) event = m.FromRequest(v1.Event(), self.headers, io.BytesIO(request_body), lambda x: json.load(x)) event_type = event.EventType() assert event_type in ALLOWED_EVENT_TYPES extensions = event.Extensions() extensions["djangoapp"] = FakeSourceModel._meta.app_label extensions["djangomodel"] = FakeSourceModel._meta.model_name event_data = event.Data() if event_type in ("django.orm.post.init", "django.orm.pre.save", "django.orm.post.save", "django.orm.pre.delete", "django.orm.post.delete", "django.orm.m2m.change"): assert "data" in event_data instance_data = event_data["data"] assert "id" in instance_data and "name" in instance_data and "enabled" in instance_data assert event_data["db_table"] == FakeSourceModel._meta.db_table check_expected_kwargs(event_type, event_data["signal_kwargs"]) self.send_response(requests.codes.ok) self.end_headers() return
def test_binary_converter_upstream(): m = marshaller.NewHTTPMarshaller( [binary.NewBinaryHTTPCloudEventConverter()]) event = m.FromRequest(v02.Event(), data.headers, None, lambda x: x) assert event is not None assert event.Get("type") == (data.ce_type, True) assert event.Get("id") == (data.ce_id, True)
def test_from_request_cannot_read(binary_headers): with pytest.raises(exceptions.UnsupportedEventConverter): m = marshaller.HTTPMarshaller([binary.NewBinaryHTTPCloudEventConverter()]) m.FromRequest(v1.Event(), {}, "") with pytest.raises(exceptions.UnsupportedEventConverter): m = marshaller.HTTPMarshaller([structured.NewJSONHTTPCloudEventConverter()]) m.FromRequest(v1.Event(), binary_headers, "")
def test_binary_converter_upstream(event_class): m = marshaller.NewHTTPMarshaller( [binary.NewBinaryHTTPCloudEventConverter()]) event = m.FromRequest(event_class(), data.headers[event_class], None, lambda x: x) assert event is not None assert event.EventType() == data.ce_type assert event.EventID() == data.ce_id assert event.ContentType() == data.contentType
def test_unsupported_event_configuration(): m = marshaller.NewHTTPMarshaller( [binary.NewBinaryHTTPCloudEventConverter()]) pytest.raises( exceptions.UnsupportedEventConverter, m.FromRequest, v01.Event(), {"Content-Type": "application/cloudevents+json"}, io.StringIO(json.dumps(data.json_ce[v02.Event])), lambda x: x.read(), )
def NewDefaultHTTPMarshaller() -> HTTPMarshaller: """ Creates the default HTTP marshaller with both structured and binary converters :return: an instance of HTTP marshaller :rtype: cloudevents.sdk.marshaller.HTTPMarshaller """ return HTTPMarshaller([ structured.NewJSONHTTPCloudEventConverter(), binary.NewBinaryHTTPCloudEventConverter(), ])
def test_binary_converter_v01(): m = marshaller.NewHTTPMarshaller( [binary.NewBinaryHTTPCloudEventConverter()]) pytest.raises( exceptions.UnsupportedEventConverter, m.FromRequest, v01.Event, {}, None, lambda x: x, )
def send_cloudevent(sender, **kwargs): sink_url = os.environ.get(settings.CLOUDEVENTS_ENV["SINK_VAR"]) if sink_url is not None: event = get_cloudevent_from_signal(sender, **kwargs) m = marshaller.NewHTTPMarshaller( [binary.NewBinaryHTTPCloudEventConverter()]) headers, body = m.ToRequest(event, converters.TypeBinary, json.dumps) response = requests.post(sink_url, headers=headers, data=body) response.raise_for_status()
def default_handler(event): from django.conf import settings sink_url = os.environ.get(settings.CLOUDEVENTS_ENV["SINK_VAR"]) if sink_url is not None: m = marshaller.NewHTTPMarshaller([binary.NewBinaryHTTPCloudEventConverter()]) headers, body = m.ToRequest(event, converters.TypeBinary, json.dumps) response = requests.post(sink_url, headers=headers, data=body) response.raise_for_status()
def target(): # Deserialize the HTTP request into a CloudEvent try: logging.info('Deserializing CloudEvent in binary format') # Instantiate the Binary Format marshaller mb = marshaller.NewHTTPMarshaller( [binary.NewBinaryHTTPCloudEventConverter()]) ce = mb.FromRequest(v1.Event(), request.headers, request.stream.read(), lambda x: x) except: logging.warning( 'Deserializing application/cloudevents+json CloudEvent') # Instantiate the JSON Structured CloudEvent marshaller m = marshaller.NewHTTPMarshaller( [structured.NewJSONHTTPCloudEventConverter()]) ce = m.FromRequest() except: logging.warning('Could not deserialize CloudEvent') # Create a CloudEvent to send as response data = 'Data received was not understandable as a CloudEvent' event = ( v1.Event().SetContentType("text/plain").SetData(data).SetEventID( str(uuid.uuid4())).SetSource("from_your_own_target"). SetSubject("your_event_subject").SetEventTime( datetime.now( timezone.utc).astimezone().isoformat()).SetEventType( "io.triggermesh.target.byown")) return app.response_class(response=body, headers=headers, status=400) # Do your Transformation or Target work based on the eventype if ce.EventType() == "io.triggermesh.byown.create": logging.info("Create event type") elif ce.EventType() == "io.triggermesh.byown.delete": logging.info("Delete event type") else: logging.warning("Unknown event type %s" % ce.EventType()) # Create a CloudEvent to send as response data = 'this is some data' event = (v1.Event().SetContentType("text/plain").SetData(data).SetEventID( str(uuid.uuid4())).SetSource("from_your_own_target").SetSubject( "your_event_subject").SetEventTime( datetime.now( timezone.utc).astimezone().isoformat()).SetEventType( "io.triggermesh.target.byown")) # Prepare the Header and Body to send a request back as a CloudEvent m = marshaller.NewHTTPMarshaller( [structured.NewJSONHTTPCloudEventConverter()]) headers, body = m.ToRequest(event, converters.TypeStructured, lambda x: x) return app.response_class(response=body, headers=headers, status=200)
def dispatch(self, event_type, subject, payload): if isinstance(subject, str): subject = subject_factory(subject) _event_info = subject.event_info() _id = str(uuid.uuid4()) logging.debug("new event id: {}".format(_id)) event = v1.Event() event.SetContentType('application/json') event.SetEventID(_id) event.SetSource(self._source) event.SetSubject(str(subject)) event.SetEventTime( datetime.utcnow().replace(tzinfo=pytz.UTC).isoformat()) event.SetEventType(event_type) # set extended properties ext_props = subject.get_ext_props() property_name = payload.get(PayloadConst.PROPERTY_NAME, None) if property_name is not None: ext_props.update({"propertyname": property_name}) event.SetExtensions(ext_props) event.Set('Originid', str(_event_info.get("originid", _id))) event.SetData(payload) m = marshaller.NewHTTPMarshaller( [binary.NewBinaryHTTPCloudEventConverter()]) headers, body = m.ToRequest(event, converters.TypeBinary, lambda x: json.dumps(x, cls=_JSONEncoder)) # headers['Ce-Originid'] = str(_event_info.get("Originid", _id)) if callable(self._dispatch_url): dispatch_url = self._dispatch_url(subject, event_type) else: dispatch_url = self._dispatch_url response = requests.post(dispatch_url, headers=headers, data=body) response.raise_for_status() if self._test: return _id, response.status_code, headers return _id