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
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
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
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)
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)
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)
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)
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])
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')
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