def safe_request(prog, method, *args, arg_encoding="UTF-8", out=stdout): parser = ArgumentParser(prog, usage="%(prog)s {:s} [options] uri [uri ...]".format(method)) parser.add_argument("-1", "--single-receiver", action="store_true") parser.add_argument("-r", "--rx-buffer-size", metavar="SIZE", default=4194304) parser.add_argument("-v", "--verbose", action="store_true") parser.add_argument("-vv", "--very-verbose", action="store_true") parser.add_argument("uri", nargs="+") parsed = parser.parse_args(args) if parsed.verbose: watch("shortwave.http", level=INFO) if parsed.very_verbose: watch("shortwave.transmission", level=DEBUG) if parsed.single_receiver: receiver = HTTP.Rx() receiver.start() else: receiver = None connections = [] http = None try: for uri in parsed.uri: scheme, authority, path, query, fragment = parse_uri(uri.encode(arg_encoding)) if scheme and scheme != b"http": raise ValueError("Non-HTTP URI: %r" % uri) if authority: http = HTTP(authority, receiver, rx_buffer_size=parsed.rx_buffer_size) connections.append(http) target = build_uri(path=path, query=query, fragment=fragment) http.append(getattr(HTTPRequest, method)(target), ResponseWriter(out)) finally: for http in connections: http.close() if receiver: receiver.stop()
def test_can_parse_uri_without_scheme_but_with_port(self): scheme, authority, path, query, fragment = parse_uri(b"//example.com:8080") assert scheme is None assert authority == b"example.com:8080" assert path == b"" assert query is None assert fragment is None
def test_can_parse_uri_with_root_path(self): scheme, authority, path, query, fragment = parse_uri(b"foo://example.com/") assert scheme == b"foo" assert authority == b"example.com" assert path == b"/" assert query is None assert fragment is None
def test_can_parse_only_fragment(self): scheme, authority, path, query, fragment = parse_uri(b"#foo") assert scheme is None assert authority is None assert path == b"" assert query is None assert fragment == b"foo"
def test_can_parse_only_query(self): scheme, authority, path, query, fragment = parse_uri(b"?foo=bar") assert scheme is None assert authority is None assert path == b"" assert query == b"foo=bar" assert fragment is None
def test_can_parse_relative_path_uri(self): scheme, authority, path, query, fragment = parse_uri(b"foo/bar") assert scheme is None assert authority is None assert path == b"foo/bar" assert query is None assert fragment is None
def test_can_parse_empty_string_uri(self): scheme, authority, path, query, fragment = parse_uri(b"") assert scheme is None assert authority is None assert path == b"" assert query is None assert fragment is None
def test_can_parse_none_uri(self): scheme, authority, path, query, fragment = parse_uri(None) assert scheme is None assert authority is None assert path is None assert query is None assert fragment is None
def test_can_parse_full_uri(self): scheme, authority, path, query, fragment = parse_uri(b"foo://bob@[email protected]:8042" b"/over/there?name=ferret#nose") assert scheme == b"foo" assert authority == b"bob@[email protected]:8042" assert path == b"/over/there" assert query == b"name=ferret" assert fragment == b"nose"
def delete(prog, method, *args, arg_encoding="UTF-8", out=stdout): parser = ArgumentParser(prog, usage="%(prog)s {:s} [options] uri".format(method)) parser.add_argument("-r", "--rx-buffer-size", metavar="SIZE", default=4194304) parser.add_argument("-v", "--verbose", action="store_true") parser.add_argument("-vv", "--very-verbose", action="store_true") parser.add_argument("uri") parsed = parser.parse_args(args) if parsed.verbose: watch("shortwave.http", level=INFO) if parsed.very_verbose: watch("shortwave.transmission", level=DEBUG) scheme, authority, path, query, fragment = parse_uri(parsed.uri.encode(arg_encoding)) http = HTTP(authority, rx_buffer_size=parsed.rx_buffer_size, connection="close") target = build_uri(path=path, query=query, fragment=fragment) headers = {} try: http.append(HTTPRequest.delete(target, **headers), ResponseWriter(out)) finally: http.close()