예제 #1
0
    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)
예제 #3
0
            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
예제 #4
0
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)
예제 #6
0
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
예제 #8
0
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)
예제 #11
0
        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
예제 #12
0
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
예제 #14
0
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
예제 #15
0
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
예제 #17
0
 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()))