def test_then1(self): a = Deferred() d1 = Deferred() d2 = d1.then().add_callback(lambda r: a.callback(r+2)) d1.callback(1) self.assertEqual(a.result, 3) self.assertEqual(d1.result, 1) self.assertEqual(d2.result, 3)
def test_then1(self): a = Deferred() d1 = Deferred() d2 = d1.then().add_callback(lambda r: a.callback(r + 2)) d1.callback(1) self.assertEqual(a.result, 3) self.assertEqual(d1.result, 1) self.assertEqual(d2.result, 3)
def test_fail_then1(self): a = Deferred() d1 = Deferred() d2 = d1.then().add_callback(lambda r: a.callback(r+2))\ .add_errback(a.callback) d1.callback('bla') self.assertIsInstance(a.result.error, TypeError) self.assertEqual(d1.result, 'bla') self.assertIsInstance(d2.result.error, TypeError) mute_failure(self, a.result)
class StreamReader: _expect_sent = None _waiting = None def __init__(self, headers, parser, transport=None): self.headers = headers self.parser = parser self.transport = transport self.buffer = b'' self.on_message_complete = Deferred() def __repr__(self): return repr(self.transport) __str__ = __repr__ def done(self): '''``True`` when the full HTTP message has been read. ''' return self.on_message_complete.done() def protocol(self): version = self.parser.get_version() return "HTTP/%s" % ".".join(('%s' % v for v in version)) def waiting_expect(self): '''``True`` when the client is waiting for 100 Continue. ''' if self._expect_sent is None: if (not self.parser.is_message_complete() and self.headers.has('expect', '100-continue')): return True self._expect_sent = '' return False def recv(self): '''Read bytes in the buffer. ''' if self.waiting_expect(): if self.parser.get_version() < (1, 1): raise HttpException(status=417) else: msg = '%s 100 Continue\r\n\r\n' % self.protocol() self._expect_sent = msg self.transport.write(msg.encode(DEFAULT_CHARSET)) return self.parser.recv_body() def read(self, maxbuf=None): '''Return bytes in the buffer. If the stream is not yet ready, return a :class:`pulsar.Deferred` which results in the bytes read. ''' if not self._waiting: body = self.recv() if self.done(): return self._getvalue(body, maxbuf) else: self._waiting = self.on_message_complete.then() return self._waiting.add_callback( lambda r: self._getvalue(body, maxbuf)) else: return self._waiting def fail(self): if self.waiting_expect(): raise HttpException(status=417) ## INTERNALS def _getvalue(self, body, maxbuf): if self.buffer: body = self.buffer + body body = body + self.recv() if maxbuf and len(body) > maxbuf: body, self.buffer = body[:maxbuf], body[maxbuf:] return body def data_processed(self, protocol, data=None): '''Callback by the protocol when new body data is received.''' if self.parser.is_message_complete(): self.on_message_complete.callback(None)