コード例 #1
0
def parse_headers(headers):
    authority = headers.get(':authority', '').encode()
    method = headers.get(':method', 'GET').encode()
    scheme = headers.get(':scheme', 'https').encode()
    path = headers.get(':path', '/').encode()

    headers.pop(":method", None)
    headers.pop(":scheme", None)
    headers.pop(":path", None)

    host = None
    port = None

    if path == b'*' or path.startswith(b"/"):
        first_line_format = "relative"
    elif method == b'CONNECT':  # pragma: no cover
        raise NotImplementedError("CONNECT over HTTP/2 is not implemented.")
    else:  # pragma: no cover
        first_line_format = "absolute"
        # FIXME: verify if path or :host contains what we need
        scheme, host, port, _ = url.parse(path)

    if authority:
        host, _, port = authority.partition(b':')

    if not host:
        host = b'localhost'

    if not port:
        port = 443 if scheme == b'https' else 80

    port = int(port)

    return first_line_format, method, scheme, host, port, path
コード例 #2
0
def _read_request_line(rfile):
    try:
        line = _get_first_line(rfile)
    except exceptions.HttpReadDisconnect:
        # We want to provide a better error message.
        raise exceptions.HttpReadDisconnect("Client disconnected")

    try:
        method, path, http_version = line.split()

        if path == b"*" or path.startswith(b"/"):
            form = "relative"
            scheme, host, port = None, None, None
        elif method == b"CONNECT":
            form = "authority"
            host, port = _parse_authority_form(path)
            scheme, path = None, None
        else:
            form = "absolute"
            scheme, host, port, path = url.parse(path)

        _check_http_version(http_version)
    except ValueError:
        raise exceptions.HttpSyntaxException("Bad HTTP request line: {}".format(line))

    return form, method, scheme, host, port, path, http_version
コード例 #3
0
ファイル: utils.py プロジェクト: laborautonomo/mitmproxy
def parse_headers(headers):
    authority = headers.get(':authority', '').encode()
    method = headers.get(':method', 'GET').encode()
    scheme = headers.get(':scheme', 'https').encode()
    path = headers.get(':path', '/').encode()

    headers.clear(":method")
    headers.clear(":scheme")
    headers.clear(":path")

    host = None
    port = None

    if path == b'*' or path.startswith(b"/"):
        first_line_format = "relative"
    elif method == b'CONNECT':  # pragma: no cover
        raise NotImplementedError("CONNECT over HTTP/2 is not implemented.")
    else:  # pragma: no cover
        first_line_format = "absolute"
        # FIXME: verify if path or :host contains what we need
        scheme, host, port, _ = url.parse(path)

    if authority:
        host, _, port = authority.partition(b':')

    if not host:
        host = b'localhost'

    if not port:
        port = 443 if scheme == b'https' else 80

    port = int(port)

    return first_line_format, method, scheme, host, port, path
コード例 #4
0
ファイル: config.py プロジェクト: weloverandom/mitmproxy
def parse_server_spec(spec):
    try:
        p = url.parse(spec)
        if p[0] not in (b"http", b"https"):
            raise ValueError()
    except ValueError:
        raise exceptions.OptionsError("Invalid server specification: %s" %
                                      spec)
    host, port = p[1:3]
    address = tcp.Address((host.decode("ascii"), port))
    scheme = p[0].decode("ascii").lower()
    return ServerSpec(scheme, address)
コード例 #5
0
ファイル: cmdline.py プロジェクト: tdickers/mitmproxy
def parse_server_spec(spec):
    try:
        p = url.parse(spec)
        if p[0] not in ("http", "https"):
            raise ValueError()
    except ValueError:
        raise configargparse.ArgumentTypeError(
            "Invalid server specification: %s" % spec)

    address = tcp.Address(p[1:3])
    scheme = p[0].lower()
    return config.ServerSpec(scheme, address)
コード例 #6
0
ファイル: config.py プロジェクト: Splat/mitmproxy
def parse_server_spec(spec):
    try:
        p = url.parse(spec)
        if p[0] not in (b"http", b"https"):
            raise ValueError()
    except ValueError:
        raise exceptions.OptionsError(
            "Invalid server specification: %s" % spec
        )
    host, port = p[1:3]
    address = tcp.Address((host.decode("ascii"), port))
    scheme = p[0].decode("ascii").lower()
    return ServerSpec(scheme, address)
コード例 #7
0
ファイル: cmdline.py プロジェクト: exploitprotocol/mitmproxy
def parse_server_spec(spec):
    try:
        p = url.parse(spec)
        if p[0] not in ("http", "https"):
            raise ValueError()
    except ValueError:
        raise configargparse.ArgumentTypeError(
            "Invalid server specification: %s" % spec
        )

    address = tcp.Address(p[1:3])
    scheme = p[0].lower()
    return config.ServerSpec(scheme, address)
コード例 #8
0
ファイル: http.py プロジェクト: skywind0218/mitmproxy
 def resolve(self, settings, msg=None):
     tokens = self.tokens[:]
     if self.ws:
         if not self.method:
             tokens.insert(1, Method("get"))
         for i in netlib.websockets.client_handshake_headers().fields:
             if not get_header(i[0], self.headers):
                 tokens.append(
                     Header(base.TokValueLiteral(i[0].decode()),
                            base.TokValueLiteral(i[1].decode())))
     if not self.raw:
         if not get_header(b"Content-Length", self.headers):
             if self.body:
                 length = sum(len(i) for i in self.body.values(settings))
                 tokens.append(
                     Header(
                         base.TokValueLiteral("Content-Length"),
                         base.TokValueLiteral(str(length)),
                     ))
         if settings.request_host:
             if not get_header(b"Host", self.headers):
                 h = settings.request_host
                 if self.path:
                     path = b"".join(self.path.values({})).decode(
                         "ascii", errors="ignore")
                     try:
                         _, h, _, _ = url.parse(path)
                         h = h.decode("ascii", errors="ignore")
                     except ValueError:
                         pass
                 tokens.append(
                     Header(base.TokValueLiteral("Host"),
                            base.TokValueLiteral(h)))
     intermediate = self.__class__(tokens)
     return self.__class__(
         [i.resolve(settings, intermediate) for i in tokens])
コード例 #9
0
def test_parse():
    with tutils.raises(ValueError):
        url.parse("")

    s, h, po, pa = url.parse(b"http://foo.com:8888/test")
    assert s == b"http"
    assert h == b"foo.com"
    assert po == 8888
    assert pa == b"/test"

    s, h, po, pa = url.parse("http://foo/bar")
    assert s == b"http"
    assert h == b"foo"
    assert po == 80
    assert pa == b"/bar"

    s, h, po, pa = url.parse(b"http://*****:*****@foo/bar")
    assert s == b"http"
    assert h == b"foo"
    assert po == 80
    assert pa == b"/bar"

    s, h, po, pa = url.parse(b"http://foo")
    assert pa == b"/"

    s, h, po, pa = url.parse(b"https://foo")
    assert po == 443

    with tutils.raises(ValueError):
        url.parse(b"https://foo:bar")

    # Invalid IDNA
    with tutils.raises(ValueError):
        url.parse("http://\xfafoo")
    # Invalid PATH
    with tutils.raises(ValueError):
        url.parse("http:/\xc6/localhost:56121")
    # Null byte in host
    with tutils.raises(ValueError):
        url.parse("http://foo\0")
    # Port out of range
    _, _, port, _ = url.parse("http://foo:999999")
    assert port == 80
    # Invalid IPv6 URL - see http://www.ietf.org/rfc/rfc2732.txt
    with tutils.raises(ValueError):
        url.parse('http://lo[calhost')
コード例 #10
0
ファイル: connections.py プロジェクト: tomixu/mitmproxy
    def read_request(
        self,
        __rfile,
        include_body=True,
        body_size_limit=None,
        allow_empty=False,
    ):
        if body_size_limit is not None:
            raise NotImplementedError()

        self.perform_connection_preface()

        timestamp_start = time.time()
        if hasattr(self.tcp_handler.rfile, "reset_timestamps"):
            self.tcp_handler.rfile.reset_timestamps()

        stream_id, headers, body = self._receive_transmission(
            include_body=include_body,
        )

        if hasattr(self.tcp_handler.rfile, "first_byte_timestamp"):
            # more accurate timestamp_start
            timestamp_start = self.tcp_handler.rfile.first_byte_timestamp

        timestamp_end = time.time()

        authority = headers.get(':authority', b'')
        method = headers.get(':method', 'GET')
        scheme = headers.get(':scheme', 'https')
        path = headers.get(':path', '/')

        headers.clear(":method")
        headers.clear(":scheme")
        headers.clear(":path")

        host = None
        port = None

        if path == '*' or path.startswith("/"):
            first_line_format = "relative"
        elif method == 'CONNECT':
            first_line_format = "authority"
            if ":" in authority:
                host, port = authority.split(":", 1)
            else:
                host = authority
        else:
            first_line_format = "absolute"
            # FIXME: verify if path or :host contains what we need
            scheme, host, port, _ = url.parse(path)
            scheme = scheme.decode('ascii')
            host = host.decode('ascii')

        if host is None:
            host = 'localhost'
        if port is None:
            port = 80 if scheme == 'http' else 443
        port = int(port)

        request = netlib.http.request.Request(
            first_line_format,
            method.encode('ascii'),
            scheme.encode('ascii'),
            host.encode('ascii'),
            port,
            path.encode('ascii'),
            b"HTTP/2.0",
            headers,
            body,
            timestamp_start,
            timestamp_end,
        )
        request.stream_id = stream_id

        return request
コード例 #11
0
ファイル: http2.py プロジェクト: seiyap70/mitmproxy
    def read_request(
        self,
        __rfile,
        include_body=True,
        body_size_limit=None,
        allow_empty=False,
    ):
        if body_size_limit is not None:
            raise NotImplementedError()

        self.perform_connection_preface()

        timestamp_start = time.time()
        if hasattr(self.tcp_handler.rfile, "reset_timestamps"):
            self.tcp_handler.rfile.reset_timestamps()

        stream_id, headers, body = self._receive_transmission(
            include_body=include_body, )

        if hasattr(self.tcp_handler.rfile, "first_byte_timestamp"):
            # more accurate timestamp_start
            timestamp_start = self.tcp_handler.rfile.first_byte_timestamp

        timestamp_end = time.time()

        authority = headers.get(':authority', b'')
        method = headers.get(':method', 'GET')
        scheme = headers.get(':scheme', 'https')
        path = headers.get(':path', '/')

        headers.clear(":method")
        headers.clear(":scheme")
        headers.clear(":path")

        host = None
        port = None

        if path == '*' or path.startswith("/"):
            first_line_format = "relative"
        elif method == 'CONNECT':
            first_line_format = "authority"
            if ":" in authority:
                host, port = authority.split(":", 1)
            else:
                host = authority
        else:
            first_line_format = "absolute"
            # FIXME: verify if path or :host contains what we need
            scheme, host, port, _ = url.parse(path)
            scheme = scheme.decode('ascii')
            host = host.decode('ascii')

        if host is None:
            host = 'localhost'
        if port is None:
            port = 80 if scheme == 'http' else 443
        port = int(port)

        request = netlib.http.request.Request(
            first_line_format,
            method.encode('ascii'),
            scheme.encode('ascii'),
            host.encode('ascii'),
            port,
            path.encode('ascii'),
            b"HTTP/2.0",
            headers,
            body,
            timestamp_start,
            timestamp_end,
        )
        request.stream_id = stream_id

        return request