def test_http_response_parser_code_not_int(self): out = aiohttp.FlowControlDataQueue(self.stream) buf = aiohttp.ParserBuffer() p = protocol.HttpResponseParser()(out, buf) next(p) with self.assertRaises(errors.BadStatusLine) as cm: p.send(b'HTTP/1.1 ttt test\r\n\r\n') self.assertIn('HTTP/1.1 ttt test', str(cm.exception))
def test_http_payload_parser_length_broken(self): msg = protocol.RawRequestMessage('GET', '/', (1, 1), [('CONTENT-LENGTH', 'qwe')], None, None) out = aiohttp.DataQueue(self.stream) buf = aiohttp.ParserBuffer() p = protocol.HttpPayloadParser(msg)(out, buf) self.assertRaises(errors.InvalidHeader, next, p)
def test_http_response_parser_bad_status_line_too_long(self): out = aiohttp.FlowControlDataQueue(self.stream) buf = aiohttp.ParserBuffer() p = protocol.HttpResponseParser(max_headers=2, max_line_size=2)(out, buf) next(p) self.assertRaises(errors.LineTooLong, p.send, b'HTTP/1.1 200 Ok\r\n\r\n')
def test_http_response_parser_bad_version(self): out = aiohttp.FlowControlDataQueue(self.stream) buf = aiohttp.ParserBuffer() p = protocol.HttpResponseParser()(out, buf) next(p) with self.assertRaises(errors.BadStatusLine) as cm: p.send(b'HT/11 200 Ok\r\n\r\n') self.assertEqual('HT/11 200 Ok', cm.exception.args[0])
def test_http_payload_parser_length_wrong(self): msg = protocol.RawRequestMessage( 'GET', '/', (1, 1), CIMultiDict([('CONTENT-LENGTH', '-1')]), [(b'CONTENT-LENGTH', b'-1')], None, None) out = aiohttp.FlowControlDataQueue(self.stream) buf = aiohttp.ParserBuffer() p = protocol.HttpPayloadParser(msg)(out, buf) self.assertRaises(errors.InvalidHeader, next, p)
def test_close_frame_invalid(self, m_parse_frame): def parse_frame(buf): yield return (1, websocket.OPCODE_CLOSE, b'1') m_parse_frame.side_effect = parse_frame buf = aiohttp.ParserBuffer() p = websocket.parse_message(buf) next(p) self.assertRaises(websocket.WebSocketError, p.send, b'')
def test_http_payload_parser_no_length(self): msg = protocol.RawRequestMessage('GET', '/', (1, 1), CIMultiDict(), None, None) out = aiohttp.FlowControlDataQueue(self.stream) buf = aiohttp.ParserBuffer() p = protocol.HttpPayloadParser(msg, readall=False)(out, buf) self.assertRaises(StopIteration, next, p) self.assertEqual(b'', b''.join(out._buffer)) self.assertTrue(out._eof)
def test_http_payload_parser_length_zero(self): msg = protocol.RawRequestMessage( 'GET', '/', (1, 1), CIMultiDict([('CONTENT-LENGTH', '0')]), None, None) out = aiohttp.FlowControlDataQueue(self.stream) buf = aiohttp.ParserBuffer() p = protocol.HttpPayloadParser(msg)(out, buf) self.assertRaises(StopIteration, next, p) self.assertEqual(b'', b''.join(out._buffer))
def test_http_request_parser_max_headers(self): out = aiohttp.FlowControlDataQueue(self.stream) buf = aiohttp.ParserBuffer() p = protocol.HttpRequestParser(8190, 20, 8190)(out, buf) next(p) self.assertRaises( errors.LineTooLong, p.send, b'get /path HTTP/1.1\r\ntest: line\r\ntest2: data\r\n\r\n')
def test_unknown_frame(self, m_parse_frame): def parse_frame(buf): yield return (1, websocket.OPCODE_CONTINUATION, b'') m_parse_frame.side_effect = parse_frame buf = aiohttp.ParserBuffer() p = websocket.parse_message(buf) next(p) self.assertRaises(websocket.WebSocketError, p.send, b'')
def test_http_payload_parser_eof(self): msg = protocol.RawRequestMessage('GET', '/', (1, 1), [], None, None) out = aiohttp.DataQueue() buf = aiohttp.ParserBuffer() p = protocol.HttpPayloadParser(msg, readall=True)(out, buf) next(p) p.send(b'data') p.send(b'line') self.assertRaises(aiohttp.EofStream, p.throw, aiohttp.EofStream()) self.assertEqual(b'dataline', b''.join(out._buffer))
def test_http_payload_parser_websocket(self): msg = protocol.RawRequestMessage( 'GET', '/', (1, 1), CIMultiDict([('SEC-WEBSOCKET-KEY1', '13')]), None, None) out = aiohttp.FlowControlDataQueue(self.stream) buf = aiohttp.ParserBuffer() p = protocol.HttpPayloadParser(msg)(out, buf) next(p) self.assertRaises(StopIteration, p.send, b'1234567890') self.assertEqual(b'12345678', b''.join(d for d, _ in out._buffer))
def test_parse_chunked_payload_extension(self): out = aiohttp.FlowControlDataQueue(self.stream) buf = aiohttp.ParserBuffer() p = protocol.HttpPayloadParser(None).parse_chunked_payload(out, buf) next(p) try: p.send(b'4;test\r\ndata\r\n4\r\nline\r\n0\r\ntest\r\n') except StopIteration: pass self.assertEqual(b'dataline', b''.join(d for d, _ in out._buffer))
def test_parse_frame_length0(self): buf = aiohttp.ParserBuffer() p = websocket.parse_frame(buf) next(p) try: p.send(struct.pack('!BB', 0b00000001, 0b00000000)) except StopIteration as exc: fin, opcode, payload = exc.value self.assertEqual((0, 1, b''), (fin, opcode, payload))
def test_parse_chunked_payload(self): out = aiohttp.DataQueue() buf = aiohttp.ParserBuffer() p = protocol.HttpPayloadParser(None).parse_chunked_payload(out, buf) next(p) try: p.send(b'4\r\ndata\r\n4\r\nline\r\n0\r\ntest\r\n') except StopIteration: pass self.assertEqual(b'dataline', b''.join(out._buffer)) self.assertEqual(b'', bytes(buf))
def test_http_request_parser_two_slashes(self): out = aiohttp.FlowControlDataQueue(self.stream) buf = aiohttp.ParserBuffer() p = protocol.HttpRequestParser()(out, buf) next(p) try: p.send(b'get //path HTTP/1.1\r\n\r\n') except StopIteration: pass self.assertEqual(('GET', '//path', (1, 1), CIMultiDict(), False, None), out._buffer[0][0])
def test_http_payload_parser_eof(self): msg = protocol.RawRequestMessage('GET', '/', (1, 1), CIMultiDict(), None, None) out = aiohttp.FlowControlDataQueue(self.stream) buf = aiohttp.ParserBuffer() p = protocol.HttpPayloadParser(msg, readall=True)(out, buf) next(p) p.send(b'data') p.send(b'line') self.assertRaises(StopIteration, p.throw, aiohttp.EofStream()) self.assertEqual(b'dataline', b''.join(d for d, _ in out._buffer))
def test_http_payload_parser_chunked(self): msg = protocol.RawRequestMessage( 'GET', '/', (1, 1), CIMultiDict([('TRANSFER-ENCODING', 'chunked')]), None, None) out = aiohttp.FlowControlDataQueue(self.stream) buf = aiohttp.ParserBuffer() p = protocol.HttpPayloadParser(msg)(out, buf) next(p) self.assertRaises(StopIteration, p.send, b'4;test\r\ndata\r\n4\r\nline\r\n0\r\ntest\r\n') self.assertEqual(b'dataline', b''.join(d for d, _ in out._buffer))
def test_http_payload_parser_deflate_disabled(self): msg = protocol.RawRequestMessage( 'GET', '/', (1, 1), [('CONTENT-LENGTH', len(self._COMPRESSED))], None, 'deflate') out = aiohttp.DataQueue() buf = aiohttp.ParserBuffer() p = protocol.HttpPayloadParser(msg, compression=False)(out, buf) next(p) self.assertRaises(StopIteration, p.send, self._COMPRESSED) self.assertEqual(self._COMPRESSED, b''.join(out._buffer))
def test_parse_eof_payload(self): out = aiohttp.DataQueue() buf = aiohttp.ParserBuffer() p = protocol.HttpPayloadParser(None).parse_eof_payload(out, buf) next(p) p.send(b'data') try: p.throw(aiohttp.EofStream()) except aiohttp.EofStream: pass self.assertEqual([b'data'], list(out._buffer))
def test_http_payload_parser_deflate(self): msg = protocol.RawRequestMessage( 'GET', '/', (1, 1), CIMultiDict([('CONTENT-LENGTH', len(self._COMPRESSED))]), None, 'deflate') out = aiohttp.FlowControlDataQueue(self.stream) buf = aiohttp.ParserBuffer() p = protocol.HttpPayloadParser(msg)(out, buf) next(p) self.assertRaises(StopIteration, p.send, self._COMPRESSED) self.assertEqual(b'data', b''.join(d for d, _ in out._buffer))
def test_http_request_parser(self): out = aiohttp.DataQueue() buf = aiohttp.ParserBuffer() p = protocol.HttpRequestParser()(out, buf) next(p) try: p.send(b'get /path HTTP/1.1\r\n\r\n') except StopIteration: pass result = out._buffer[0] self.assertEqual(('GET', '/path', (1, 1), deque(), False, None), result)
def test_parse_eof_payload(self): out = aiohttp.FlowControlDataQueue(self.stream) buf = aiohttp.ParserBuffer() p = protocol.HttpPayloadParser(None).parse_eof_payload(out, buf) next(p) p.send(b'data') try: p.throw(aiohttp.EofStream()) except StopIteration: pass self.assertEqual([(bytearray(b'data'), 4)], list(out._buffer))
def test_parse_chunked_payload_chunks(self): out = aiohttp.FlowControlDataQueue(self.stream) buf = aiohttp.ParserBuffer() p = protocol.HttpPayloadParser(None).parse_chunked_payload(out, buf) next(p) p.send(b'4\r\ndata\r') p.send(b'\n4') p.send(b'\r') p.send(b'\n') p.send(b'line\r\n0\r\n') self.assertRaises(StopIteration, p.send, b'test\r\n') self.assertEqual(b'dataline', b''.join(d for d, _ in out._buffer))
def test_close_frame(self, m_parse_frame): def parse_frame(buf): yield return (1, websocket.OPCODE_CLOSE, b'') m_parse_frame.side_effect = parse_frame p = websocket.parse_message(aiohttp.ParserBuffer()) next(p) try: p.send(b'') except StopIteration as exc: res = exc.value self.assertEqual(res, (websocket.OPCODE_CLOSE, 0, ''))
def test_http_request_parser_eof(self): # HttpRequestParser does fail on EofStream() out = aiohttp.FlowControlDataQueue(self.stream) buf = aiohttp.ParserBuffer() p = protocol.HttpRequestParser()(out, buf) next(p) p.send(b'get /path HTTP/1.1\r\n') try: p.throw(aiohttp.EofStream()) except aiohttp.EofStream: pass self.assertFalse(out._buffer)
def test_http_response_parser_no_reason(self): out = aiohttp.FlowControlDataQueue(self.stream) buf = aiohttp.ParserBuffer() p = protocol.HttpResponseParser()(out, buf) next(p) try: p.send(b'HTTP/1.1 200\r\n\r\n') except StopIteration: pass v, s, r = out._buffer[0][0][:3] self.assertEqual(v, (1, 1)) self.assertEqual(s, 200) self.assertEqual(r, '')
def test_simple_binary(self, m_parse_frame): def parse_frame(buf): yield return (1, websocket.OPCODE_BINARY, b'binary') m_parse_frame.side_effect = parse_frame buf = aiohttp.ParserBuffer() p = websocket.parse_message(buf) next(p) try: p.send(b'') except StopIteration as exc: res = exc.value self.assertEqual(res, (websocket.OPCODE_BINARY, b'binary', ''))
def test_http_request_parser_utf8(self): out = aiohttp.FlowControlDataQueue(self.stream) buf = aiohttp.ParserBuffer() p = protocol.HttpRequestParser()(out, buf) next(p) msg = 'get /path HTTP/1.1\r\nx-test:тест\r\n\r\n'.encode('utf-8') try: p.send(msg) except StopIteration: pass result = out._buffer[0] self.assertEqual( ('GET', '/path', (1, 1), CIMultiDict([('X-TEST', 'тест')]), False, None), result)
def test_http_payload_parser_length(self): msg = protocol.RawRequestMessage('GET', '/', (1, 1), [('CONTENT-LENGTH', '2')], None, None) out = aiohttp.DataQueue() buf = aiohttp.ParserBuffer() p = protocol.HttpPayloadParser(msg)(out, buf) next(p) try: p.send(b'1245') except StopIteration: pass self.assertEqual(b'12', b''.join(out._buffer)) self.assertEqual(b'45', bytes(buf))