def get_http_header(self) -> Response: '''Return the HTTP header. It only attempts to read the first 4 KiB of the payload. Returns: Response, None: Returns an instance of :class:`.http.request.Response` or None. ''' with wpull.util.reset_file_offset(self.block_file): data = self.block_file.read(4096) match = re.match(br'(.*?\r?\n\r?\n)', data) if not match: return status_line, dummy, field_str = match.group(1).partition(b'\n') try: version, code, reason = Response.parse_status_line(status_line) except ValueError: return response = Response(status_code=code, reason=reason, version=version) try: response.fields.parse(field_str, strict=False) except ValueError: return return response
def get_http_header(self) -> Response: '''Return the HTTP header. It only attempts to read the first 4 KiB of the payload. Returns: Response, None: Returns an instance of :class:`.http.request.Response` or None. ''' with wpull.util.reset_file_offset(self.block_file): data = self.block_file.read(4096) match = re.match(br'(.*?\r?\n\r?\n)', data) if not match: return status_line, dummy, field_str = match.group(1).partition(b'\n') try: version, code, reason = Response.parse_status_line(status_line) except ValueError: return response = Response(status_code=code, reason=reason, version=version) try: response.fields.parse(field_str, strict=False) except ValueError: return return response
def test_parse_status_line(self): version, code, msg = Response.parse_status_line(b'HTTP/1.0 200 OK') self.assertEqual('HTTP/1.0', version) self.assertEqual(200, code) self.assertEqual('OK', msg) version, code, msg = Response.parse_status_line( b'HTTP/1.0 404 Not Found') self.assertEqual('HTTP/1.0', version) self.assertEqual(404, code) self.assertEqual('Not Found', msg) version, code, msg = Response.parse_status_line(b'HTTP/1.1 200 OK') self.assertEqual('HTTP/1.1', version) self.assertEqual(200, code) self.assertEqual('OK', msg) version, code, msg = Response.parse_status_line(b'HTTP/1.1 200') self.assertEqual('HTTP/1.1', version) self.assertEqual(200, code) self.assertEqual('', msg) version, code, msg = Response.parse_status_line(b'HTTP/1.1 200 ') self.assertEqual('HTTP/1.1', version) self.assertEqual(200, code) self.assertEqual('', msg) version, code, msg = Response.parse_status_line( 'HTTP/1.1 200 ððð'.encode('latin-1')) self.assertEqual('HTTP/1.1', version) self.assertEqual(200, code) self.assertEqual('ððð', msg) self.assertRaises( ProtocolError, Response.parse_status_line, b'HTTP/1.0' ) self.assertRaises( ProtocolError, Response.parse_status_line, b'HTTP/2.0' ) version, code, msg = Response.parse_status_line( b'HTTP/1.0 404 N\x99t \x0eounz\r\n') self.assertEqual('HTTP/1.0', version) self.assertEqual(404, code) self.assertEqual(b'N\x99t \x0eounz'.decode('latin-1'), msg)
def test_parse_status_line(self): version, code, msg = Response.parse_status_line(b'HTTP/1.0 200 OK') self.assertEqual('HTTP/1.0', version) self.assertEqual(200, code) self.assertEqual('OK', msg) version, code, msg = Response.parse_status_line( b'HTTP/1.0 404 Not Found') self.assertEqual('HTTP/1.0', version) self.assertEqual(404, code) self.assertEqual('Not Found', msg) version, code, msg = Response.parse_status_line(b'HTTP/1.1 200 OK') self.assertEqual('HTTP/1.1', version) self.assertEqual(200, code) self.assertEqual('OK', msg) version, code, msg = Response.parse_status_line(b'HTTP/1.1 200') self.assertEqual('HTTP/1.1', version) self.assertEqual(200, code) self.assertEqual('', msg) version, code, msg = Response.parse_status_line(b'HTTP/1.1 200 ') self.assertEqual('HTTP/1.1', version) self.assertEqual(200, code) self.assertEqual('', msg) version, code, msg = Response.parse_status_line( 'HTTP/1.1 200 ððð'.encode('latin-1')) self.assertEqual('HTTP/1.1', version) self.assertEqual(200, code) self.assertEqual('ððð', msg) self.assertRaises(ProtocolError, Response.parse_status_line, b'HTTP/1.0') self.assertRaises(ProtocolError, Response.parse_status_line, b'HTTP/2.0') version, code, msg = Response.parse_status_line( b'HTTP/1.0 404 N\x99t \x0eounz\r\n') self.assertEqual('HTTP/1.0', version) self.assertEqual(404, code) self.assertEqual(b'N\x99t \x0eounz'.decode('latin-1'), msg)