def post(self): """ Handle post request. Extract data. Call event handler and optionally send a reply event. """ if not self.model.ready: self.model.load() try: body = json.loads(self.request.body) except json.decoder.JSONDecodeError as e: raise tornado.web.HTTPError( status_code=HTTPStatus.BAD_REQUEST, reason="Unrecognized request format: %s" % e, ) # Extract payload from request request_handler: RequestHandler = get_request_handler( self.protocol, body) request_handler.validate() request = request_handler.extract_request() # Create event from request body event = v02.Event() http_marshaller = marshaller.NewDefaultHTTPMarshaller() event = http_marshaller.FromRequest(event, self.request.headers, self.request.body, json.loads) logging.debug(json.dumps(event.Properties())) # Extract any desired request headers headers = {} for (key, val) in self.request.headers.get_all(): headers[key] = val response = self.model.process_event(request, headers) if response is not None: responseStr = json.dumps(response) # Create event from response if reply_url is active if not self.reply_url == "": if event.EventID() is None or event.EventID() == "": resp_event_id = uuid.uuid1().hex else: resp_event_id = event.EventID() revent = ( v02.Event().SetContentType("application/json").SetData( responseStr).SetEventID(resp_event_id).SetSource( self.event_source).SetEventType( self.event_type).SetExtensions( event.Extensions())) logging.debug(json.dumps(revent.Properties())) sendCloudEvent(revent, self.reply_url) self.write(json.dumps(response))
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 do_POST(self): logging.info('POST received') content_type = self.headers.get('Content-Type') content_len = int(self.headers.get('Content-Length')) headers = dict(self.headers) data = self.rfile.read(content_len) data = data.decode('utf-8') logging.info(content_type) logging.info(data) if content_type != 'application/json': logging.info('Not JSON') data = io.StringIO(data) try: event = v02.Event() event = m.FromRequest(event, headers, data, json.loads) except Exception as e: logging.error(f"Event error: {e}") raise logging.info(event) func(event) self.send_response(204) self.end_headers() return
async def is_ok(request): m.FromRequest( v02.Event(), dict(request.headers), request.body, lambda x: x ) return response.text("OK")
def test_default_http_marshaller_with_binary(): m = marshaller.NewDefaultHTTPMarshaller() event = m.FromRequest(v02.Event(), data.headers, io.StringIO(json.dumps(data.body)), json.load) assert event is not None assert event.Get("type") == (data.ce_type, True) assert event.Get("data") == (data.body, True) assert event.Get("id") == (data.ce_id, True)
async def echo(request): event = m.FromRequest( v02.Event(), dict(request.headers), request.body, lambda x: x ) hs, body = m.ToRequest(event, converters.TypeBinary, lambda x: x) return response.text(body, headers=hs)
def test_extensions_are_set_upstream(): extensions = {'extension-key': 'extension-value'} event = (v02.Event().SetExtensions(extensions)) m = marshaller.NewDefaultHTTPMarshaller() new_headers, body = m.ToRequest(event, converters.TypeBinary, lambda x: x) assert event.Extensions() == extensions assert "ce-extension-key" in new_headers
def test_web_app_echo(): _, r = app.test_client.post("/echo", headers=test_data.headers[v02.Event], data=test_data.body) assert r.status == 200 event = m.FromRequest(v02.Event(), dict(r.headers), r.body, lambda x: x) assert event is not None props = event.Properties() for key in test_data.headers[v02.Event].keys(): if key == "Content-Type": assert "contenttype" in props else: assert key.lstrip("ce-") in props
def test_default_http_marshaller_with_structured(): m = marshaller.NewDefaultHTTPMarshaller() event = m.FromRequest( v02.Event(), {"Content-Type": "application/cloudevents+json"}, io.StringIO(json.dumps(data.ce)), lambda x: x.read(), ) assert event is not None assert event.Get("type") == (data.ce_type, True) assert event.Get("id") == (data.ce_id, True)
def test_structured_converter_upstream(): m = marshaller.NewHTTPMarshaller( [structured.NewJSONHTTPCloudEventConverter()]) event = m.FromRequest( v02.Event(), {"Content-Type": "application/cloudevents+json"}, io.StringIO(json.dumps(data.ce)), lambda x: x.read(), ) assert event is not None assert event.Get("type") == (data.ce_type, True) assert event.Get("id") == (data.ce_id, True)
def do_POST(self): content_type = self.headers.get('Content-Type') content_len = int(self.headers.get('Content-Length')) headers = dict(self.headers) data = self.rfile.read(content_len) data = data.decode('utf-8') event = v02.Event() event = m.FromRequest(event, headers, data, str) run_event(event) self.send_response(204) self.end_headers() return
def callback(message): print(message) print(sink_url) event = (v02.Event().SetContentType("application/json").SetData( message.data.decode()).SetEventID("xxx-yyy-zzz-www").SetSource( "google cloud storage").SetEventTime( str(message.attributes['eventTime'])).SetEventType( str(message.attributes['eventType']))) m = marshaller.NewDefaultHTTPMarshaller() headers, body = m.ToRequest(event, converters.TypeStructured, json.dumps) requests.post(sink_url, data=body.getvalue(), headers=headers) message.ack()
def do_POST(self): content_type = self.headers.get('Content-Type') content_len = int(self.headers.get('Content-Length')) headers = dict(self.headers) data = self.rfile.read(content_len) data = data.decode('utf-8') if content_type != 'application/json': data = io.StringIO(data) event = v02.Event() event = m.FromRequest(event, headers, data, json.loads) func(event) self.send_response(204) self.end_headers() return
def test_structured_event_to_request_upstream(): copy_of_ce = copy.deepcopy(data.ce) m = marshaller.NewDefaultHTTPMarshaller() http_headers = {"content-type": "application/cloudevents+json"} event = m.FromRequest(v02.Event(), http_headers, io.StringIO(json.dumps(data.ce)), lambda x: x.read()) assert event is not None assert event.Get("type") == (data.ce_type, True) assert event.Get("id") == (data.ce_id, True) new_headers, _ = m.ToRequest(event, converters.TypeStructured, lambda x: x) for key in new_headers: if key == "content-type": assert new_headers[key] == http_headers[key] continue assert key in copy_of_ce
def test_binary_event_to_request_upstream(): m = marshaller.NewDefaultHTTPMarshaller() event = m.FromRequest( v02.Event(), {"Content-Type": "application/cloudevents+json"}, io.StringIO(json.dumps(data.ce)), lambda x: x.read(), ) assert event is not None assert event.Get("type") == (data.ce_type, True) assert event.Get("id") == (data.ce_id, True) new_headers, _ = m.ToRequest(event, converters.TypeBinary, lambda x: x) assert new_headers is not None assert "ce-specversion" in new_headers
def test_event_pipeline_upstream(): event = ( v02.Event() .SetContentType(data.contentType) .SetData(data.body) .SetEventID(data.ce_id) .SetSource(data.source) .SetEventTime(data.eventTime) .SetEventType(data.ce_type) ) m = marshaller.NewDefaultHTTPMarshaller() new_headers, body = m.ToRequest(event, converters.TypeBinary, lambda x: x) assert new_headers is not None assert "ce-specversion" in new_headers assert "ce-type" in new_headers assert "ce-source" in new_headers assert "ce-id" in new_headers assert "ce-time" in new_headers assert "content-type" in new_headers assert isinstance(body, str) assert data.body == body
def handle(): m = marshaller.NewDefaultHTTPMarshaller() event = m.FromRequest(v02.Event(), request.headers, request.data, unpack) return func(event.Data(), event)
# Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import json import io import requests import sys from cloudevents.sdk import marshaller from cloudevents.sdk.event import v02 if __name__ == "__main__": if len(sys.argv) < 2: sys.exit("Usage: python with_requests.py " "<CloudEvent source URL>") url = sys.argv[1] response = requests.get(url) response.raise_for_status() headers = response.headers data = io.BytesIO(response.content) event = v02.Event() http_marshaller = marshaller.NewDefaultHTTPMarshaller() event = http_marshaller.FromRequest(event, headers, data, json.load) print(json.dumps(event.Properties()))