class _ContentHandler(tornado.web.RequestHandler): SUPPORTED_METHODS = ['GET'] @tornado.web.asynchronous @gen.coroutine def get(self, path): try: content = self.content(path) self.set_header('Content-Type', content.mime) if content.has_file() and os.name != 'nt': self.stream = PipeIOStream(content.open_fd()) self.stream.read_until_close(callback=self.on_file_end, streaming_callback=self.on_chunk) else: self.finish(content.get_data()) except NotAuthorizedError: self.write(exception_message()) self.send_error(403) except FileNotFoundError: self.send_error(404) except: log.exception('error') self.send_error(500) def on_file_end(self, s): if s: self.write(s) self.finish() # close connection def on_chunk(self, chunk): self.write(chunk) self.flush()
def test_pipe_iostream(self): r, w = os.pipe() rs = PipeIOStream(r, io_loop=self.io_loop) ws = PipeIOStream(w, io_loop=self.io_loop) ws.write(b"hel") ws.write(b"lo world") rs.read_until(b' ', callback=self.stop) data = self.wait() self.assertEqual(data, b"hello ") rs.read_bytes(3, self.stop) data = self.wait() self.assertEqual(data, b"wor") ws.close() rs.read_until_close(self.stop) data = self.wait() self.assertEqual(data, b"ld") rs.close()
def test_pipe_iostream(self): r, w = os.pipe() rs = PipeIOStream(r, io_loop=self.io_loop) ws = PipeIOStream(w, io_loop=self.io_loop) ws.write(b"hel") ws.write(b"lo world") rs.read_until(b" ", callback=self.stop) data = self.wait() self.assertEqual(data, b"hello ") rs.read_bytes(3, self.stop) data = self.wait() self.assertEqual(data, b"wor") ws.close() rs.read_until_close(self.stop) data = self.wait() self.assertEqual(data, b"ld") rs.close()