def test_host_and_address(self): data = 'GET localhost/right_address HTTP/1.0\r\n\r\n' req = HttpRequest.from_bytes(data.encode()) self.assertTrue(req.valid) self.assertEqual(req.address, '/right_address') self.assertEqual(req.headers['Host'], 'localhost') data = 'GET /right_address HTTP/1.1\r\nHost: localhost\r\n\r\n' req = HttpRequest.from_bytes(data.encode()) self.assertTrue(req.valid) self.assertEqual(req.address, '/right_address') self.assertEqual(req.headers['Host'], 'localhost')
async def _handle_request(self, data: bytes, reader: asyncio.StreamReader) -> \ Tuple[HttpResponse, bool]: req = HttpRequest.from_bytes(data) if 'Content-Length' in req.headers and req.form is None: length = int(req.headers['Content-Length']) file_data = await reader.read(length) while len(file_data) < length: file_data += await reader.read(length - len(file_data)) data += file_data req = HttpRequest.from_bytes(data) if req.address not in self.handlers: return HttpResponse(Code.PAGE_NOT_FOUND), False handler = self.handlers[req.address] res = handler(req) return res, req.headers['Connection'] == 'keep-alive'
def test_params(self): data = 'GET /addr?a=1&b=param_b&c=abracadabra HTTP/1.1\r\n' \ 'Host: abc\r\n' \ '\r\n' req = HttpRequest.from_bytes(data.encode()) self.assertTrue(req.valid) self.assertDictEqual(req.params, { 'a': '1', 'b': 'param_b', 'c': 'abracadabra' })
def simple_test(self): server = Server() @server.text('page') def test_func(request): return 'test' response = test_func(HttpRequest(Method.GET, 'page')) self.assertIsInstance(response, HttpResponse) self.assertEqual(response.text_data, b'test') self.assertIn(test_func, server.handlers['page'])
def test_cookies(self): data = 'GET /addr HTTP/1.1\r\n' \ 'Host: abc\r\n' \ 'Cookie: a=1; b=cookie_b; c=lorem ipsum\r\n' \ '\r\n' req = HttpRequest.from_bytes(data.encode()) self.assertTrue(req.valid) self.assertDictEqual(req.cookies, { 'a': '1', 'b': 'cookie_b', 'c': 'lorem ipsum' })
def test_headers(self): data = 'GET /addr HTTP/1.1\r\n' \ 'Host: abc\r\n' \ 'a: 1\r\n' \ 'b: header_b\r\n' \ 'c: lorem ipsum\r\n' \ '\r\n' req = HttpRequest.from_bytes(data.encode()) self.assertTrue(req.valid) self.assertDictEqual( req.headers, { 'a': '1', 'b': 'header_b', 'c': 'lorem ipsum', 'Host': 'abc', 'Connection': 'keep-alive' })
def test_post_simple(self): data = b'POST / HTTP/1.1\r\n' \ b'Host: server\r\n' \ b'\r\n' req = HttpRequest.from_bytes(data) self.assertEqual(req.method, Method.POST)
def assert_invalid(self, data): try: req = HttpRequest.from_bytes(data) except Exception: self.fail() self.assertFalse(req.valid)
def test_method(self): data = 'GET 127.0.0.1/ HTTP/1.0\r\n\r\n' req = HttpRequest.from_bytes(data.encode()) self.assertEqual(req.method, Method.GET)