Merge remote-tracking branch 'stanhu/add-threaded-requests' into feature/add_threaded_requests
Conflicts: setup.py
This commit is contained in:
commit
dc2d29d1e8
|
@ -15,6 +15,7 @@ from raven.transport.http import HTTPTransport
|
|||
from raven.transport.gevent import GeventedHTTPTransport
|
||||
from raven.transport.requests import RequestsHTTPTransport
|
||||
from raven.transport.threaded import ThreadedHTTPTransport
|
||||
from raven.transport.threaded_requests import ThreadedRequestsHTTPTransport
|
||||
from raven.transport.twisted import TwistedHTTPTransport
|
||||
from raven.transport.tornado import TornadoHTTPTransport
|
||||
from raven.transport.udp import UDPTransport
|
||||
|
@ -78,6 +79,7 @@ default_transports = [
|
|||
GeventedHTTPTransport,
|
||||
TwistedHTTPTransport,
|
||||
RequestsHTTPTransport,
|
||||
ThreadedRequestsHTTPTransport,
|
||||
TornadoHTTPTransport,
|
||||
UDPTransport,
|
||||
EventletHTTPTransport,
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
"""
|
||||
raven.transport.threaded_requests
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
:copyright: (c) 2010-2012 by the Sentry Team, see AUTHORS for more details.
|
||||
:license: BSD, see LICENSE for more details.
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
|
||||
from raven.transport.base import AsyncTransport
|
||||
from raven.transport import RequestsHTTPTransport
|
||||
from raven.transport.threaded import AsyncWorker
|
||||
|
||||
|
||||
class ThreadedRequestsHTTPTransport(AsyncTransport, RequestsHTTPTransport):
|
||||
|
||||
scheme = ['threaded+requests+http', 'threaded+requests+https']
|
||||
|
||||
def get_worker(self):
|
||||
if not hasattr(self, '_worker'):
|
||||
self._worker = AsyncWorker()
|
||||
return self._worker
|
||||
|
||||
def send_sync(self, data, headers, success_cb, failure_cb):
|
||||
try:
|
||||
super(ThreadedRequestsHTTPTransport, self).send(data, headers)
|
||||
except Exception as e:
|
||||
failure_cb(e)
|
||||
else:
|
||||
success_cb()
|
||||
|
||||
def async_send(self, data, headers, success_cb, failure_cb):
|
||||
self.get_worker().queue(
|
||||
self.send_sync, data, headers, success_cb, failure_cb)
|
1
setup.py
1
setup.py
|
@ -72,6 +72,7 @@ tests_require = [
|
|||
'pytest',
|
||||
'pytest-cov>=1.4',
|
||||
'pytest-django',
|
||||
'requests',
|
||||
'tornado',
|
||||
'webob',
|
||||
'webtest',
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
import mock
|
||||
import time
|
||||
from raven.utils.testutils import TestCase
|
||||
|
||||
from raven.base import Client
|
||||
from raven.transport.threaded_requests import ThreadedRequestsHTTPTransport
|
||||
from raven.utils.urlparse import urlparse
|
||||
|
||||
|
||||
class DummyThreadedScheme(ThreadedRequestsHTTPTransport):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(ThreadedRequestsHTTPTransport, self).__init__(*args, **kwargs)
|
||||
self.events = []
|
||||
self.send_delay = 0
|
||||
|
||||
def send_sync(self, data, headers, success_cb, failure_cb):
|
||||
# delay sending the message, to allow us to test that the shutdown
|
||||
# hook waits correctly
|
||||
time.sleep(self.send_delay)
|
||||
|
||||
self.events.append((data, headers, success_cb, failure_cb))
|
||||
|
||||
|
||||
class ThreadedTransportTest(TestCase):
|
||||
def setUp(self):
|
||||
self.url = "threaded+requests+http://some_username:some_password@localhost:8143/1"
|
||||
self.client = Client(dsn=self.url)
|
||||
|
||||
@mock.patch('raven.transport.requests.post')
|
||||
def test_does_send(self, send):
|
||||
self.client.captureMessage(message='foo')
|
||||
|
||||
time.sleep(0.1)
|
||||
|
||||
self.assertEqual(send.call_count, 1)
|
||||
expected_url = 'http://localhost:8143/api/1/store/'
|
||||
self.assertEqual(expected_url, send.call_args[0][0])
|
||||
|
||||
def test_shutdown_waits_for_send(self):
|
||||
url = urlparse(self.url)
|
||||
transport = DummyThreadedScheme(url)
|
||||
transport.send_delay = 0.5
|
||||
|
||||
data = self.client.build_msg('raven.events.Message', message='foo')
|
||||
transport.async_send(data, None, None, None)
|
||||
|
||||
time.sleep(0.1)
|
||||
|
||||
# this should wait for the message to get sent
|
||||
transport.get_worker().main_thread_terminated()
|
||||
|
||||
self.assertEqual(len(transport.events), 1)
|
|
@ -0,0 +1,20 @@
|
|||
from __future__ import absolute_import
|
||||
|
||||
import mock
|
||||
|
||||
from raven.utils.testutils import TestCase
|
||||
from raven.base import Client
|
||||
|
||||
|
||||
class RequestsTransportTest(TestCase):
|
||||
def setUp(self):
|
||||
self.client = Client(
|
||||
dsn="requests+http://some_username:some_password@localhost:8143/1",
|
||||
)
|
||||
|
||||
@mock.patch('raven.transport.requests.post')
|
||||
def test_does_send(self, post):
|
||||
self.client.captureMessage(message='foo')
|
||||
self.assertEqual(post.call_count, 1)
|
||||
expected_url = 'http://localhost:8143/api/1/store/'
|
||||
self.assertEqual(expected_url, post.call_args[0][0])
|
Loading…
Reference in New Issue