This commit is contained in:
Tim Vergenz 2024-12-27 03:46:04 +01:00 committed by GitHub
commit dc034d6fbc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 36 additions and 46 deletions

View File

@ -203,6 +203,8 @@ class HTTPieArgumentParser(BaseHTTPieArgumentParser):
}
def _process_url(self):
self.args.url = self.args.base_url + self.args.url
if self.args.url.startswith('://'):
# Paste URL & add space shortcut: `http ://pie.dev` → `http://pie.dev`
self.args.url = self.args.url[3:]
@ -412,39 +414,11 @@ class HTTPieArgumentParser(BaseHTTPieArgumentParser):
"""
if self.args.method is None:
# Invoked as `http URL'.
assert not self.args.request_items
if self.has_input_data:
self.args.method = HTTP_POST
else:
self.args.method = HTTP_GET
# FIXME: False positive, e.g., "localhost" matches but is a valid URL.
elif not re.match('^[a-zA-Z]+$', self.args.method):
# Invoked as `http URL item+'. The URL is now in `args.method`
# and the first ITEM is now incorrectly in `args.url`.
try:
# Parse the URL as an ITEM and store it as the first ITEM arg.
self.args.request_items.insert(0, KeyValueArgType(
*SEPARATOR_GROUP_ALL_ITEMS).__call__(self.args.url))
except argparse.ArgumentTypeError as e:
if self.args.traceback:
raise
self.error(e.args[0])
else:
# Set the URL correctly
self.args.url = self.args.method
# Infer the method
has_data = (
self.has_input_data
or any(
item.sep in SEPARATOR_GROUP_DATA_ITEMS
for item in self.args.request_items)
)
self.args.method = HTTP_POST if has_data else HTTP_GET
def _parse_items(self):
"""
Parse `args.request_items` into `args.headers`, `args.data`,

View File

@ -53,24 +53,6 @@ positional_arguments = options.add_group(
Only URL is required.
""",
)
positional_arguments.add_argument(
dest='method',
metavar='METHOD',
nargs=Qualifiers.OPTIONAL,
default=None,
short_help='The HTTP method to be used for the request (GET, POST, PUT, DELETE, ...).',
help="""
The HTTP method to be used for the request (GET, POST, PUT, DELETE, ...).
This argument can be omitted in which case HTTPie will use POST if there
is some data to be sent, otherwise GET:
$ http example.org # => GET
$ http example.org hello=world # => POST
""",
)
positional_arguments.add_argument(
dest='url',
metavar='URL',
@ -84,6 +66,8 @@ positional_arguments.add_argument(
$ http :3000 # => http://localhost:3000
$ http :/foo # => http://localhost/foo
Prefixed with --base-url before default scheme or shorthand processing take place.
""",
)
positional_arguments.add_argument(
@ -705,12 +689,39 @@ authentication.add_argument(
network = options.add_group('Network')
network.add_argument(
'--method',
'-X',
metavar='METHOD',
default=None,
short_help='The HTTP method to be used for the request (GET, POST, PUT, DELETE, ...).',
help="""
The HTTP method to be used for the request (GET, POST, PUT, DELETE, ...).
This argument can be omitted in which case HTTPie will use POST if there
is some data to be sent, otherwise GET:
$ http example.org # => GET
$ http example.org hello=world # => POST
""",
)
network.add_argument(
'--offline',
default=False,
action='store_true',
short_help='Build the request and print it but dont actually send it.'
)
network.add_argument(
'--base-url',
default='',
short_help='String to prepend to the request URL.',
help="""
String to prepend to the request URL before --default-scheme and/or localhost
shorthand are processed. If specified multiple times, last value is used.
"""
)
network.add_argument(
'--proxy',
default=[],

View File

@ -375,3 +375,8 @@ class TestSchemes:
def test_scheme_when_invoked_as_https(self, httpbin_secure):
url = f'{httpbin_secure.host}:{httpbin_secure.port}'
assert HTTP_OK in http(url, program_name='https')
class TestBaseUrl:
def test_base_url(self):
assert False, 'Needs tests'