def get_http_header(self): '''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(version, code, reason) try: response.fields.parse(field_str, strict=False) except ValueError: return return response
def get_http_header(self): '''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(version, code, reason) try: response.fields.parse(field_str, strict=False) except ValueError: return return response
def _read_response_header(self, response_factory): '''Read the response's HTTP status line and header fields.''' _logger.debug('Reading header.') response_header_data = yield self._io_stream.read_until_regex( br'\r?\n\r?\n') self._events.response_data.fire(response_header_data) status_line, header = response_header_data.split(b'\n', 1) version, status_code, status_reason = Response.parse_status_line( status_line) response = response_factory(version, status_code, status_reason) response.fields.parse(header, strict=False) self._events.pre_response.fire(response) raise tornado.gen.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 _read_response_header(self, response_factory): '''Read the response's HTTP status line and header fields.''' _logger.debug('Reading header.') response_header_data = yield self._io_stream.read_until_regex( br'\r?\n\r?\n' ) self._events.response_data.fire(response_header_data) status_line, header = response_header_data.split(b'\n', 1) version, status_code, status_reason = Response.parse_status_line( status_line) response = response_factory(version, status_code, status_reason) response.fields.parse(header, strict=False) self._events.pre_response.fire(response) raise tornado.gen.Return(response)