def parse(cls, conn):
        """Read a request from the HTTP connection ``conn``.

        May raise ``BadHttpRequestError``.
        """

        req = cls(conn)
        req_line = yield from conn.reader.readline()
        logger('HttpRequest').debug('req_line = %r', req_line)
        req._parse_req_line(req_line)

        header_line = yield from conn.reader.readline()
        while len(header_line) > 0 and header_line != b'\r\n':
            try:
                req._parse_header(header_line)
            except BadHttpHeaderError as e:
                # Tolerating 'minor' mistakes
                logger('HttpRequest').debug(traceback.format_exc())
            header_line = yield from conn.reader.readline()
        return req