Esempio n. 1
0
    def _forward_event_http(self, event):
        '''POST the event to the correct URL'''
        url = yield self._get_event_url(event)

        if url is None:
            return

        (url, auth) = self._split_url_and_credentials(urlparse(url))

        # Construct token auth headers if configured
        auth_token = yield self._get_event_auth_token(event)

        if auth_token:
            headers = {
                'Authorization': [
                    'Token %s' % (auth_token,)]
            }
        else:
            headers = {}

        msg = api_from_event(self.channel_id, event)

        if msg['event_type'] is None:
            logging.exception("Discarding unrecognised event %r" % (event,))
            return

        config = self.get_static_config()
        resp = yield post(url, msg, timeout=config.event_url_timeout,
                          auth=auth, headers=headers)

        if resp and request_failed(resp):
            logging.exception(
                'Error sending event, received HTTP code %r with body %r. '
                'Event: %r' % (resp.code, (yield resp.content()), event))
Esempio n. 2
0
    def _forward_event_http(self, event):
        '''POST the event to the correct URL'''
        url = yield self._get_event_url(event)

        if url is None:
            return

        (url, auth) = self._split_url_and_credentials(urlparse(url))

        # Construct token auth headers if configured
        auth_token = yield self._get_event_auth_token(event)

        if auth_token:
            headers = {'Authorization': ['Token %s' % (auth_token, )]}
        else:
            headers = {}

        msg = api_from_event(self.channel_id, event)

        if msg['event_type'] is None:
            logging.exception("Discarding unrecognised event %r" % (event, ))
            return

        config = self.get_static_config()
        resp = yield post(url,
                          msg,
                          timeout=config.event_url_timeout,
                          auth=auth,
                          headers=headers)

        if resp and request_failed(resp):
            logging.exception(
                'Error sending event, received HTTP code %r with body %r. '
                'Event: %r' % (resp.code, (yield resp.content()), event))
Esempio n. 3
0
 def test_api_from_event_ack(self):
     self.assertEqual(api_from_event('channel-23', TransportEvent(
         event_type='ack',
         user_message_id='msg-21',
         sent_message_id='msg-21',
         timestamp=date(2321, 2, 3),
     )), {
         'event_type': 'submitted',
         'channel_id': 'channel-23',
         'message_id': 'msg-21',
         'timestamp': date(2321, 2, 3),
         'event_details': {},
     })
Esempio n. 4
0
 def test_api_from_event_dr_failed(self):
     self.assertEqual(api_from_event('channel-23', TransportEvent(
         event_type='delivery_report',
         user_message_id='msg-21',
         timestamp=date(2321, 2, 3),
         delivery_status='failed',
     )), {
         'event_type': 'delivery_failed',
         'channel_id': 'channel-23',
         'message_id': 'msg-21',
         'timestamp': date(2321, 2, 3),
         'event_details': {},
     })
Esempio n. 5
0
 def test_api_from_event_nack(self):
     self.assertEqual(api_from_event('channel-23', TransportEvent(
         event_type='nack',
         user_message_id='msg-21',
         timestamp=date(2321, 2, 3),
         nack_reason='too many lemons',
     )), {
         'event_type': 'rejected',
         'channel_id': 'channel-23',
         'message_id': 'msg-21',
         'timestamp': date(2321, 2, 3),
         'event_details': {'reason': 'too many lemons'},
     })
Esempio n. 6
0
    def test_api_from_event_unknown_type(self):
        event = TransportEvent(event_type='ack',
                               user_message_id='msg-21',
                               sent_message_id='msg-21',
                               timestamp=date(2321, 2, 3))

        event['event_type'] = 'unknown'

        self.assertEqual(
            api_from_event('channel-23', event), {
                'event_type': None,
                'channel_id': 'channel-23',
                'message_id': 'msg-21',
                'timestamp': date(2321, 2, 3),
                'event_details': {},
            })
Esempio n. 7
0
    def test_api_from_event_dr_unknown(self):
        event = TransportEvent(event_type='delivery_report',
                               user_message_id='msg-21',
                               timestamp=date(2321, 2, 3),
                               delivery_status='pending')

        event['delivery_status'] = 'unknown'

        self.assertEqual(
            api_from_event('channel-23', event), {
                'event_type': None,
                'channel_id': 'channel-23',
                'message_id': 'msg-21',
                'timestamp': date(2321, 2, 3),
                'event_details': {},
            })
Esempio n. 8
0
 def test_api_from_event_dr_failed(self):
     self.assertEqual(
         api_from_event(
             'channel-23',
             TransportEvent(
                 event_type='delivery_report',
                 user_message_id='msg-21',
                 timestamp=date(2321, 2, 3),
                 delivery_status='failed',
             )), {
                 'event_type': 'delivery_failed',
                 'channel_id': 'channel-23',
                 'message_id': 'msg-21',
                 'timestamp': date(2321, 2, 3),
                 'event_details': {},
             })
Esempio n. 9
0
    def test_api_from_event_dr_unknown(self):
        event = TransportEvent(
            event_type='delivery_report',
            user_message_id='msg-21',
            timestamp=date(2321, 2, 3),
            delivery_status='pending')

        event['delivery_status'] = 'unknown'

        self.assertEqual(api_from_event('channel-23', event), {
            'event_type': None,
            'channel_id': 'channel-23',
            'message_id': 'msg-21',
            'timestamp': date(2321, 2, 3),
            'event_details': {},
        })
Esempio n. 10
0
 def test_api_from_event_ack(self):
     self.assertEqual(
         api_from_event(
             'channel-23',
             TransportEvent(
                 event_type='ack',
                 user_message_id='msg-21',
                 sent_message_id='msg-21',
                 timestamp=date(2321, 2, 3),
             )), {
                 'event_type': 'submitted',
                 'channel_id': 'channel-23',
                 'message_id': 'msg-21',
                 'timestamp': date(2321, 2, 3),
                 'event_details': {},
             })
Esempio n. 11
0
    def test_forward_ack(self):
        event = TransportEvent(
            event_type="ack", user_message_id="msg-21", sent_message_id="msg-21", timestamp="2015-09-22 15:39:44.827794"
        )

        yield self.worker.outbounds.store_event_url(self.worker.channel_id, "msg-21", self.url)

        yield self.worker.consume_ack(event)
        [req] = self.logging_api.requests

        self.assert_request(
            req,
            method="POST",
            headers={"content-type": ["application/json"]},
            body=api_from_event(self.worker.channel_id, event),
        )
Esempio n. 12
0
    def test_api_from_event_unknown_type(self):
        event = TransportEvent(
            event_type='ack',
            user_message_id='msg-21',
            sent_message_id='msg-21',
            timestamp=date(2321, 2, 3))

        event['event_type'] = 'unknown'

        self.assertEqual(api_from_event('channel-23', event), {
            'event_type': None,
            'channel_id': 'channel-23',
            'message_id': 'msg-21',
            'timestamp': date(2321, 2, 3),
            'event_details': {},
        })
Esempio n. 13
0
    def test_forward_dr_http(self):
        event = TransportEvent(event_type='delivery_report',
                               user_message_id='msg-21',
                               delivery_status='pending',
                               timestamp='2015-09-22 15:39:44.827794')

        yield self.worker.outbounds.store_event_url(self.worker.channel_id,
                                                    'msg-21', self.url)

        yield self.worker.consume_delivery_report(event)
        [req] = self.logging_api.requests

        self.assert_request(req,
                            method='POST',
                            headers={'content-type': ['application/json']},
                            body=api_from_event(self.worker.channel_id, event))
        yield self.assert_event_stored(event)
Esempio n. 14
0
 def test_get_message_status_one_event(self):
     '''Returns the event details for last event fields, and list with
     single event for `events`'''
     event = TransportEvent(
         user_message_id='message-id', sent_message_id='message-id',
         event_type='nack', nack_reason='error error')
     yield self.outbounds.store_event('channel-id', 'message-id', event)
     resp = yield self.get('/channels/channel-id/messages/message-id')
     event_dict = api_from_event('channel-id', event)
     event_dict['timestamp'] = str(event_dict['timestamp'])
     yield self.assert_response(
         resp, http.OK, 'message status', {
             'id': 'message-id',
             'last_event_type': 'rejected',
             'last_event_timestamp': str(event['timestamp']),
             'events': [event_dict],
         })
Esempio n. 15
0
File: api.py Progetto: todun/junebug
    def get_message_status(self, request, channel_id, message_id):
        '''Retrieve the status of a message'''
        events = yield self.outbounds.load_all_events(channel_id, message_id)
        events = sorted(
            (api_from_event(channel_id, e) for e in events),
            key=lambda e: e['timestamp'])

        last_event = events[-1] if events else None
        last_event_type = last_event['event_type'] if last_event else None
        last_event_timestamp = last_event['timestamp'] if last_event else None

        returnValue(response(request, 'message status', {
            'id': message_id,
            'last_event_type': last_event_type,
            'last_event_timestamp': last_event_timestamp,
            'events': events,
        }))
Esempio n. 16
0
 def test_get_message_status_one_event(self):
     '''Returns the event details for last event fields, and list with
     single event for `events`'''
     event = TransportEvent(user_message_id='message-id',
                            sent_message_id='message-id',
                            event_type='nack',
                            nack_reason='error error')
     yield self.outbounds.store_event('channel-id', 'message-id', event)
     resp = yield self.get('/channels/channel-id/messages/message-id')
     event_dict = api_from_event('channel-id', event)
     event_dict['timestamp'] = str(event_dict['timestamp'])
     yield self.assert_response(
         resp, http.OK, 'message status', {
             'id': 'message-id',
             'last_event_type': 'rejected',
             'last_event_timestamp': str(event['timestamp']),
             'events': [event_dict],
         })
Esempio n. 17
0
 def test_api_from_event_nack(self):
     self.assertEqual(
         api_from_event(
             'channel-23',
             TransportEvent(
                 event_type='nack',
                 user_message_id='msg-21',
                 timestamp=date(2321, 2, 3),
                 nack_reason='too many lemons',
             )), {
                 'event_type': 'rejected',
                 'channel_id': 'channel-23',
                 'message_id': 'msg-21',
                 'timestamp': date(2321, 2, 3),
                 'event_details': {
                     'reason': 'too many lemons'
                 },
             })
Esempio n. 18
0
    def forward_event(self, event):
        url = yield self._get_event_url(event)

        if url is None:
            return

        msg = api_from_event(self.channel_id, event)

        if msg['event_type'] is None:
            logging.exception("Discarding unrecognised event %r" % (event,))
            return

        resp = yield post(url, msg)

        if request_failed(resp):
            logging.exception(
                'Error sending event, received HTTP code %r with body %r. '
                'Event: %r' % (resp.code, (yield resp.content()), event))
Esempio n. 19
0
    def test_forward_dr_http(self):
        event = TransportEvent(
            event_type='delivery_report',
            user_message_id='msg-21',
            delivery_status='pending',
            timestamp='2015-09-22 15:39:44.827794')

        yield self.worker.outbounds.store_event_url(
            self.worker.channel_id, 'msg-21', self.url)

        yield self.worker.consume_delivery_report(event)
        [req] = self.logging_api.requests

        self.assert_request(
            req,
            method='POST',
            headers={'content-type': ['application/json']},
            body=api_from_event(self.worker.channel_id, event))
        yield self.assert_event_stored(event)
Esempio n. 20
0
    def test_forward_nack_http(self):
        event = TransportEvent(event_type='nack',
                               user_message_id='msg-21',
                               nack_reason='too many foos',
                               timestamp='2015-09-22 15:39:44.827794')

        yield self.worker.outbounds.store_message(self.worker.channel_id, {
            'event_url': self.url,
            'message_id': "msg-21",
        })

        yield self.worker.consume_nack(event)
        [req] = self.logging_api.requests

        self.assert_request(req,
                            method='POST',
                            headers={'content-type': ['application/json']},
                            body=api_from_event(self.worker.channel_id, event))
        yield self.assert_event_stored(event)
Esempio n. 21
0
    def _forward_event_http(self, event):
        '''POST the event to the correct URL'''
        url = yield self._get_event_url(event)

        if url is None:
            return

        msg = api_from_event(self.channel_id, event)

        if msg['event_type'] is None:
            logging.exception("Discarding unrecognised event %r" % (event, ))
            return

        resp = yield post(url, msg)

        if request_failed(resp):
            logging.exception(
                'Error sending event, received HTTP code %r with body %r. '
                'Event: %r' % (resp.code, (yield resp.content()), event))
Esempio n. 22
0
    def test_forward_nack_http(self):
        event = TransportEvent(
            event_type='nack',
            user_message_id='msg-21',
            nack_reason='too many foos',
            timestamp='2015-09-22 15:39:44.827794')

        yield self.worker.outbounds.store_message(
            self.worker.channel_id, {
                'event_url': self.url,
                'message_id': "msg-21",
            })

        yield self.worker.consume_nack(event)
        [req] = self.logging_api.requests

        self.assert_request(
            req,
            method='POST',
            headers={'content-type': ['application/json']},
            body=api_from_event(self.worker.channel_id, event))
        yield self.assert_event_stored(event)
Esempio n. 23
0
    def test_get_message_status_multiple_events(self):
        '''Returns the last event details for last event fields, and list with
        all events for `events`'''
        events = []
        event_dicts = []
        for i in range(5):
            event = TransportEvent(
                user_message_id='message-id', sent_message_id='message-id',
                event_type='nack', nack_reason='error error')
            yield self.outbounds.store_event('channel-id', 'message-id', event)
            events.append(event)
            event_dict = api_from_event('channel-id', event)
            event_dict['timestamp'] = str(event_dict['timestamp'])
            event_dicts.append(event_dict)

        resp = yield self.get('/channels/channel-id/messages/message-id')
        yield self.assert_response(
            resp, http.OK, 'message status', {
                'id': 'message-id',
                'last_event_type': 'rejected',
                'last_event_timestamp': event_dicts[-1]['timestamp'],
                'events': event_dicts,
            })
Esempio n. 24
0
    def test_get_message_status_multiple_events(self):
        '''Returns the last event details for last event fields, and list with
        all events for `events`'''
        events = []
        event_dicts = []
        for i in range(5):
            event = TransportEvent(user_message_id='message-id',
                                   sent_message_id='message-id',
                                   event_type='nack',
                                   nack_reason='error error')
            yield self.outbounds.store_event('channel-id', 'message-id', event)
            events.append(event)
            event_dict = api_from_event('channel-id', event)
            event_dict['timestamp'] = str(event_dict['timestamp'])
            event_dicts.append(event_dict)

        resp = yield self.get('/channels/channel-id/messages/message-id')
        yield self.assert_response(
            resp, http.OK, 'message status', {
                'id': 'message-id',
                'last_event_type': 'rejected',
                'last_event_timestamp': event_dicts[-1]['timestamp'],
                'events': event_dicts,
            })