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))
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))
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': {}, })
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': {}, })
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'}, })
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': {}, })
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': {}, })
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': {}, })
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': {}, })
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': {}, })
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), )
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': {}, })
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)
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], })
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, }))
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], })
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' }, })
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))
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)
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)
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))
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)
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, })
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, })