def parse(cls, s): if '\r\n\r\n' not in s: raise MessageParsingError("Bad message (no CRLFCRLF found)") head, content = s.split('\r\n\r\n', 1) if not content: content = None if '\r\n' not in head: first_line = head hdrs = '' else: first_line, hdrs = head.split('\r\n', 1) headers = Headers.parse(hdrs) r = first_line.split(None, 2) if len(r) != 3: raise MessageParsingError("Bad first line: " + first_line) if r[0] == cls.version: code = int(r[1]) reason = r[2] return Response(code, reason, headers, content) elif r[2] == cls.version: method = r[0] uri = URI.parse(r[1]) return Request(method, uri, headers, content) else: raise MessageParsingError("Bad first line: " + first_line)