コード例 #1
0
class ControlledConnection:
    def __init__(self, data, limit, leave_open=False):
        self._reader = StreamReader(limit)
        self._reader.feed_data(data)
        if not leave_open:
            self._reader.feed_eof()
        self._mock_write_data = b""

    def get_mock_write_data(self):
        return self._mock_write_data

    async def read(self, size):
        try:
            return await self._reader.read(min(size, 100))
        except Exception:
            raise MalformedDataError

    async def readuntil(self, delim):
        try:
            return await self._reader.readuntil(delim)
        except Exception:
            raise MalformedDataError

    async def readexactly(self, amount):
        try:
            return await self._reader.readexactly(amount)
        except Exception:
            raise MalformedDataError

    async def write(self, data):
        self._mock_write_data += data

    def close(self):
        pass
コード例 #2
0
 def make(data, *, limit=None):
     if limit is not None:
         r = StreamReader(loop=event_loop, limit=limit)
     else:
         r = StreamReader(loop=event_loop)
     w = mock_stream_writers()
     r.feed_data(data)
     r.feed_eof()
     return r, w
コード例 #3
0
 def make(data, *, limit=None, exc=None):
     if limit is not None:
         r = StreamReader(loop=event_loop, limit=limit)
     else:
         r = StreamReader(loop=event_loop)
     w = mock_stream_writers()
     r.feed_data(data)
     if exc is not None:
         r.set_exception(exc)
     else:
         r.feed_eof()
     return r, w
コード例 #4
0
def stream_reader_writer_slots_before_units(hass):
    """Create a StreamReader and fill it with connection messages."""
    reader = StreamReader()
    reader.feed_data(
        b"\x1b[H\x1b[2JWelcome to the Folding@home Client command server.\n")
    reader.feed_data(b"OK\n")
    reader.feed_data(b"> \n")
    reader.feed_data(b"> \n")
    reader.feed_data(b"> \n")
    reader.feed_data(b"> \n")
    reader.feed_data(b"PyON 1 slots\n")
    reader.feed_data(
        b'[{"id": "00", "status": "READY", "description": "cpu: 3", "options": {"idle": "false"}, "reason": "", "idle": False}]\n'
    )
    reader.feed_data(b"---\n")
    reader.feed_data(b"> \n")
    reader.feed_data(b"> \n")
    reader.feed_data(b"> \n")
    reader.feed_data(b"> \n")
    reader.feed_data(b"PyON 1 units\n")
    reader.feed_data(b"""[{
        "id": "00",
        "state": "RUNNING",
        "error": "NO_ERROR",
        "project": 11777,
        "run": 0,
        "clone": 17250,
        "gen": 0,
        "core": "0x22",
        "unit": "0x00000003287234c95e774a8488c5d4ea",
        "percentdone": "72.51%",
        "eta": "1 hours 04 mins",
        "ppd": "359072",
        "creditestimate": "58183",
        "waitingon": "",
        "nextattempt": "0.00 secs",
        "timeremaining": "8.08 days",
        "totalframes": 100,
        "framesdone": 72,
        "assigned": "2020-03-28T08: 33: 55Z",
        "timeout": "2020-03-29T08: 33: 55Z",
        "deadline": "2020-04-05T13: 21: 54Z",
        "ws": "40.114.52.201",
        "cs": "13.82.98.119",
        "attempts": 0,
        "slot": "00",
        "tpf": "2 mins 20 secs",
        "basecredit": "9405"
    }
    ]\n""")
    reader.feed_data(b"---\n")
    reader.feed_data(b"> \n")
    reader.feed_data(b"> \n")
    reader.feed_data(b"> \n")
    reader.feed_data(b"> \n")
    reader.feed_eof()
    stream_writer = AsyncMock()
    stream_writer.close = MagicMock()
    return (reader, stream_writer)
コード例 #5
0
class ControlledConnection:
    def __init__(self, limit=100000000):
        self._reader = StreamReader(limit)
        self._mock_write_data = b""
        self._closed = False
        self._closed_by_us = False

    def _feed_data(self, data):
        self._reader.feed_data(data)

    def _feed_eof(self):
        self._reader.feed_eof()

    def _get_mock_write_data(self):
        return self._mock_write_data

    def _check_eof(self):
        if self._reader.at_eof():
            self._closed = True

    async def read(self, size):
        self._check_eof()
        try:
            return await self._reader.read(min(size, 100))
        except Exception:
            self._closed = True
            raise MalformedDataError

    async def readuntil(self, delim):
        self._check_eof()
        try:
            return await self._reader.readuntil(delim)
        except Exception:
            self._closed = True
            raise MalformedDataError

    async def readexactly(self, amount):
        self._check_eof()
        try:
            return await self._reader.readexactly(amount)
        except Exception:
            self._closed = True
            raise MalformedDataError

    async def write(self, data):
        self._mock_write_data += data
        return not self._closed

    async def add_header(self, header):
        pass

    def close(self):
        self._closed = True
        self._closed_by_us = True

    async def wait_closed(self):
        while not self._closed:
            await asyncio.sleep(1)

    def closed_by_us(self):
        return self._closed_by_us
コード例 #6
0
ファイル: h2tp.py プロジェクト: qweasdzxcpkh/rain
class HTTPProtocol(asyncio.Protocol):
    request_cls = Request

    def __init__(self, app=None):
        self.app = app
        self.router = app.router
        self.transport = None
        self.reader = None
        self.writer = None
        self._request: Request = None
        self.keep_alive = False
        self.loop = asyncio.get_event_loop()

    @property
    def request(self):
        if self._request is None:
            self._request = self.request_cls()
            self._request.remote_addr = self.remoteaddr

        return self._request

    @cachedproperty
    def remoteaddr(self):
        return '{}:{}'.format(*self.transport.get_extra_info('peername'))

    def _del_req(self):
        self._request = None

    def connection_made(self, transport):
        self.reader = StreamReader(loop=self.loop)
        self.transport = transport

        self.request.remote_addr = self.remoteaddr
        self.reader.set_transport(transport)

        self.loop.create_task(self.parse())

    def data_received(self, data):
        self.reader.feed_data(data)

    # noinspection PyProtectedMember
    async def parse(self):
        while True:
            req = self.request
            line = await self.reader.readline()

            if not req._f:
                req._f = True
                _ = _parse_first_line(line)
                if not _ or len(_) != 4:
                    req.parse_error = BadRequestError()
                    return await self.finish()

                req.method, req.path, req.query_string, req.hv = _
            else:
                if req._body_length:
                    req._body_lines.append(line)
                    req._body_length += len(line)
                    if req._body_length > req.content_length + 1:
                        raise BadRequestError
                    elif req._body_length == req.content_length + 1:
                        return await self.finish()
                else:
                    if line == b'\r\n':
                        if req.method in {'GET', 'HEAD'
                                          } or not req.content_length:
                            return await self.finish()

                        req._body_length = 1
                        req._body_lines = []
                    else:
                        error = _parse_header_line(line, req)
                        if error is not None:
                            req.parse_error = error
                            return await self.finish()

    async def finish(self):
        req = self.request
        delattr(req, '_f')
        delattr(req, '_body_length')
        self._del_req()

        await self.app.handle(req, self)

        if req.keepalive:
            await self.parse()
        else:
            self.transport.close()

    def send(self, bs):
        self.transport.write(bs)

    def error(self, err, **kwargs):
        handler = self.app.error_handlers.get(err.status)
        if handler:
            return handler(err, **kwargs)
        else:
            return err.make_response(**kwargs)
コード例 #7
0
def connection_prepared_stream_reader():
    """Create a StreamReader and fill it with connection messages."""
    reader = StreamReader()
    reader.feed_data(
        b"\x1b[H\x1b[2JWelcome to the Folding@home Client command server.\n")
    return reader