Example #1
0
class ProxyResponse(object):
    '''Asynchronous wsgi response.
    '''
    _headers = None
    _done = False

    def __init__(self, environ, start_response, response):
        self.environ = environ
        self.start_response = start_response
        self.queue = Queue()
        response.on_finished.add_errback(self.error)
        self.setup(response)

    def setup(self, response):
        response.bind_event('data_processed', self.data_processed)

    def __iter__(self):
        while True:
            try:
                yield self.queue.get(wait=not self._done)
            except Empty:
                break

    def data_processed(self, response, **kw):
        '''Receive data from the requesting HTTP client.'''
        status = response.get_status()
        if status == '100 Continue':
            stream = self.environ.get('wsgi.input') or io.BytesIO()
            body = yield stream.read()
            response.transport.write(body)
        if response.parser.is_headers_complete():
            if self._headers is None:
                headers = self.remove_hop_headers(response.headers)
                self._headers = Headers(headers, kind='server')
                # start the response
                self.start_response(status, list(self._headers))
            body = response.recv_body()
            if response.parser.is_message_complete():
                self._done = True
            self.queue.put(body)

    def error(self, failure):
        '''Handle a failure.'''
        if not self._done:
            uri = self.environ['RAW_URI']
            msg = 'Oops! Could not find %s' % uri
            html = wsgi.HtmlDocument(title=msg)
            html.body.append('<h1>%s</h1>' % msg)
            data = html.render()
            resp = wsgi.WsgiResponse(504, data, content_type='text/html')
            self.start_response(resp.status, resp.get_headers(),
                                failure.exc_info)
            self._done = True
            self.queue.put(resp.content[0])

    def remove_hop_headers(self, headers):
        for header, value in headers:
            if header.lower() not in wsgi.HOP_HEADERS:
                yield header, value
Example #2
0
class ProxyResponse(object):
    """Asynchronous wsgi response.
    """

    _headers = None
    _done = False

    def __init__(self, environ, start_response, response):
        self.environ = environ
        self.start_response = start_response
        self.queue = Queue()
        response.on_finished.add_errback(self.error)
        self.setup(response)

    def setup(self, response):
        response.bind_event("data_processed", self.data_processed)

    def __iter__(self):
        while True:
            try:
                yield self.queue.get(wait=not self._done)
            except Empty:
                break

    def data_processed(self, response, **kw):
        """Receive data from the requesting HTTP client."""
        status = response.get_status()
        if status == "100 Continue":
            stream = self.environ.get("wsgi.input") or io.BytesIO()
            body = yield stream.read()
            response.transport.write(body)
        if response.parser.is_headers_complete():
            if self._headers is None:
                headers = self.remove_hop_headers(response.headers)
                self._headers = Headers(headers, kind="server")
                # start the response
                self.start_response(status, list(self._headers))
            body = response.recv_body()
            if response.parser.is_message_complete():
                self._done = True
            self.queue.put(body)

    def error(self, failure):
        """Handle a failure."""
        if not self._done:
            uri = self.environ["RAW_URI"]
            msg = "Oops! Could not find %s" % uri
            html = wsgi.HtmlDocument(title=msg)
            html.body.append("<h1>%s</h1>" % msg)
            data = html.render()
            resp = wsgi.WsgiResponse(504, data, content_type="text/html")
            self.start_response(resp.status, resp.get_headers(), failure.exc_info)
            self._done = True
            self.queue.put(resp.content[0])

    def remove_hop_headers(self, headers):
        for header, value in headers:
            if header.lower() not in wsgi.HOP_HEADERS:
                yield header, value
Example #3
0
class MessageHandler(ws.WS):
    def __init__(self):
        self.queue = Queue()

    def get(self):
        return self.queue.get()

    def on_message(self, websocket, message):
        self.queue.put(message)
Example #4
0
 def test_get_nowait(self):
     q = Queue()
     self.assertRaises(Empty, q.get_nowait)
     self.assertRaises(Empty, q.get, wait=False)
     r = q.put('ciao')
     self.assertIsInstance(r, Deferred)
     self.assertTrue(r.done())
     self.assertEqual(r.result, None)
     self.assertEqual(q.get_nowait(), 'ciao')
     self.assertRaises(Empty, q.get_nowait)
Example #5
0
 def test_maxsize(self):
     q = Queue(maxsize=2)
     self.assertEqual(q.maxsize, 2)
     yield self.async.assertEqual(q.put('hello'), None)
     yield self.async.assertEqual(q.put('ciao'), None)
     self.assertEqual(q.qsize(), 2)
     self.assertTrue(q.full())
     start = default_timer()
     yield self.async.assertRaises(Full, q.put, 'ciao', timeout=0.5)
     self.assertTrue(default_timer()-start >= 0.5)
Example #6
0
 def test_async_get(self):
     q = Queue()
     self.assertEqual(q.qsize(), 0)
     item = maybe_async(q.get())
     self.assertIsInstance(item , Deferred)
     result = yield q.put('Hello')
     self.assertEqual(result, None)
     self.assertTrue(item.done())
     self.assertEqual(item.result, 'Hello')
     self.assertEqual(q.qsize(), 0)
Example #7
0
 def test_timeout(self):
     q = Queue()
     self.assertEqual(q.qsize(), 0)
     start = default_timer()
     try:
         item = yield q.get(timeout=0.5)
     except Empty:
         pass
     self.assertTrue(default_timer()-start >= 0.5)
     self.assertEqual(q.qsize(), 0)
Example #8
0
class MessageHandler(ws.WS):

    def __init__(self):
        self.queue = Queue()

    def get(self):
        return self.queue.get()

    def on_message(self, websocket, message):
        self.queue.put(message)
Example #9
0
 def test_get_nowait(self):
     q = Queue()
     self.assertRaises(Empty, q.get_nowait)
     self.assertRaises(Empty, q.get, wait=False)
     r = q.put('ciao')
     self.assertIsInstance(r, Deferred)
     self.assertTrue(r.done())
     self.assertEqual(r.result, None)
     self.assertEqual(q.get_nowait(), 'ciao')
     self.assertRaises(Empty, q.get_nowait)
Example #10
0
 def test_timeout(self):
     q = Queue()
     self.assertEqual(q.qsize(), 0)
     start = default_timer()
     try:
         item = yield q.get(timeout=0.5)
     except Empty:
         pass
     self.assertTrue(default_timer() - start >= 0.5)
     self.assertEqual(q.qsize(), 0)
Example #11
0
 def test_sync(self):
     q = Queue()
     self.assertEqual(q.qsize(), 0)
     result = yield q.put('hello')
     self.assertEqual(result, None)
     self.assertEqual(q.qsize(), 1)
     item = yield q.get()
     self.assertEqual(item, 'hello')
     self.assertEqual(q.qsize(), 0)
     result = yield q.put('ciao')
     self.assertEqual(result, None)
     self.assertEqual(q.qsize(), 1)
Example #12
0
 def test_put_timeout(self):
     q = Queue(maxsize=2)
     self.assertEqual(q.maxsize, 2)
     yield self.async.assertEqual(q.put('hello'), None)
     yield self.async.assertEqual(q.put('ciao'), None)
     yield self.async.assertRaises(Full, q.put, 'bla1', timeout=0.5)
     result = maybe_async(q.put('bla2'))
     self.assertEqual(q.qsize(), 2)
     item = yield q.get()
     self.assertEqual(item, 'hello')
     self.assertEqual(q.qsize(), 2)
     item = yield q.get()
     self.assertEqual(item, 'ciao')
     item = yield q.get()
     self.assertEqual(item, 'bla2')
     self.assertEqual(q.qsize(), 0)
Example #13
0
class Echo(WS):
    def __init__(self):
        self.queue = Queue()

    def get(self):
        return self.queue.get()

    def on_message(self, ws, message):
        return self.queue.put(message)

    def on_ping(self, ws, body):
        super(Echo, self).on_ping(ws, body)
        return self.queue.put('PING: %s' % body.decode('utf-8'))

    def on_pong(self, ws, body):
        return self.queue.put('PONG: %s' % body.decode('utf-8'))
Example #14
0
class Echo(WS):

    def __init__(self):
        self.queue = Queue()

    def get(self):
        return self.queue.get()

    def on_message(self, ws, message):
        return self.queue.put(message)

    def on_ping(self, ws, body):
        super(Echo, self).on_ping(ws, body)
        return self.queue.put('PING: %s' % body.decode('utf-8'))

    def on_pong(self, ws, body):
        return self.queue.put('PONG: %s' % body.decode('utf-8'))
Example #15
0
 def test_maxsize_callback(self):
     q = Queue(maxsize=2)
     self.assertEqual(q.maxsize, 2)
     yield self. async .assertEqual(q.put('hello'), None)
     yield self. async .assertEqual(q.put('ciao'), None)
     result = maybe_async(q.put('bla'))
     self.assertEqual(q.qsize(), 2)
     item = yield q.get()
     self.assertEqual(item, 'hello')
     self.assertEqual(q.qsize(), 2)
Example #16
0
 def test_sync(self):
     q = Queue()
     self.assertEqual(q.qsize(), 0)
     result = yield q.put('hello')
     self.assertEqual(result, None)
     self.assertEqual(q.qsize(), 1)
     item = yield q.get()
     self.assertEqual(item, 'hello')
     self.assertEqual(q.qsize(), 0)
     result = yield q.put('ciao')
     self.assertEqual(result, None)
     self.assertEqual(q.qsize(), 1)
Example #17
0
 def test_maxsize_callback(self):
     q = Queue(maxsize=2)
     self.assertEqual(q.maxsize, 2)
     yield self.async.assertEqual(q.put('hello'), None)
     yield self.async.assertEqual(q.put('ciao'), None)
     result = maybe_async(q.put('bla'))
     self.assertEqual(q.qsize(), 2)
     item = yield q.get()
     self.assertEqual(item, 'hello')
     self.assertEqual(q.qsize(), 2)
Example #18
0
 def test_get_nowait_with_putter(self):
     q = Queue(maxsize=2)
     d = q.put('first')
     self.assertTrue(d.done())
     d = q.put('second')
     self.assertTrue(d.done())
     d = q.put('third')
     self.assertFalse(d.done())
     d2 = q.put('fourth')
     self.assertFalse(d2.done())
     # We have a putter waiting for a free slot
     self.assertEqual(q.get_nowait(), 'first')
     self.assertTrue(d.done())
     self.assertFalse(d2.done())
     self.assertEqual(q.get_nowait(), 'second')
     self.assertTrue(d2.done())
     self.assertEqual(q.get_nowait(), 'third')
     self.assertEqual(q.get_nowait(), 'fourth')
Example #19
0
 def test_async_get(self):
     q = Queue()
     self.assertEqual(q.qsize(), 0)
     item = maybe_async(q.get())
     self.assertIsInstance(item, Deferred)
     result = yield q.put('Hello')
     self.assertEqual(result, None)
     self.assertTrue(item.done())
     self.assertEqual(item.result, 'Hello')
     self.assertEqual(q.qsize(), 0)
Example #20
0
 def test_maxsize(self):
     q = Queue(maxsize=2)
     self.assertEqual(q.maxsize, 2)
     yield self. async .assertEqual(q.put('hello'), None)
     yield self. async .assertEqual(q.put('ciao'), None)
     self.assertEqual(q.qsize(), 2)
     self.assertTrue(q.full())
     start = default_timer()
     yield self. async .assertRaises(Full, q.put, 'ciao', timeout=0.5)
     self.assertTrue(default_timer() - start >= 0.5)
Example #21
0
 def test_get_nowait_with_putter(self):
     q = Queue(maxsize=2)
     d = q.put('first')
     self.assertTrue(d.done())
     d = q.put('second')
     self.assertTrue(d.done())
     d = q.put('third')
     self.assertFalse(d.done())
     d2 = q.put('fourth')
     self.assertFalse(d2.done())
     # We have a putter waiting for a free slot
     self.assertEqual(q.get_nowait(), 'first')
     self.assertTrue(d.done())
     self.assertFalse(d2.done())
     self.assertEqual(q.get_nowait(), 'second')
     self.assertTrue(d2.done())
     self.assertEqual(q.get_nowait(), 'third')
     self.assertEqual(q.get_nowait(), 'fourth')
Example #22
0
 def __init__(self):
     self.queue = Queue()
Example #23
0
 def test_put_nowait(self):
     q = Queue(maxsize=2)
     self.assertEqual(q.put_nowait('first'), None)
     self.assertEqual(q.put_nowait('second'), None)
     # the queue is now full
     self.assertRaises(Full, q.put_nowait, 'third')
Example #24
0
 def __init__(self):
     self.queue = Queue()
Example #25
0
 def __init__(self, environ, start_response, response):
     self.environ = environ
     self.start_response = start_response
     self.queue = Queue()
     response.on_finished.add_errback(self.error)
     self.setup(response)
Example #26
0
 def _init(self):
     self._tasks = {}
     self.queue = Queue()
Example #27
0
 def test_put_timeout(self):
     q = Queue(maxsize=2)
     self.assertEqual(q.maxsize, 2)
     yield self. async .assertEqual(q.put('hello'), None)
     yield self. async .assertEqual(q.put('ciao'), None)
     yield self. async .assertRaises(Full, q.put, 'bla1', timeout=0.5)
     result = maybe_async(q.put('bla2'))
     self.assertEqual(q.qsize(), 2)
     item = yield q.get()
     self.assertEqual(item, 'hello')
     self.assertEqual(q.qsize(), 2)
     item = yield q.get()
     self.assertEqual(item, 'ciao')
     item = yield q.get()
     self.assertEqual(item, 'bla2')
     self.assertEqual(q.qsize(), 0)
Example #28
0
 def test_event_loop(self):
     q1 = Queue(event_loop=get_request_loop())
     q2 = Queue(event_loop=get_event_loop())
     q3 = Queue()
     self.assertEqual(q2.event_loop, q3.event_loop)
     self.assertNotEqual(q1.event_loop, q3.event_loop)
Example #29
0
 def test_put_nowait(self):
     q = Queue(maxsize=2)
     self.assertEqual(q.put_nowait('first'), None)
     self.assertEqual(q.put_nowait('second'), None)
     # the queue is now full
     self.assertRaises(Full, q.put_nowait, 'third')
Example #30
0
 def __init__(self, environ, start_response, response):
     self.environ = environ
     self.start_response = start_response
     self.queue = Queue()
     response.on_finished.add_errback(self.error)
     self.setup(response)