diff --git a/httpie/cli/argparser.py b/httpie/cli/argparser.py index 9bf09b3b73..4d8986add3 100644 --- a/httpie/cli/argparser.py +++ b/httpie/cli/argparser.py @@ -203,6 +203,8 @@ def _process_request_type(self): } 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 @@ def _guess_method(self): """ 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`, diff --git a/httpie/cli/definition.py b/httpie/cli/definition.py index 0e5f91edf7..97a5b306ae 100644 --- a/httpie/cli/definition.py +++ b/httpie/cli/definition.py @@ -47,24 +47,6 @@ 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', @@ -78,6 +60,8 @@ $ 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( @@ -697,12 +681,39 @@ def format_auth_help(auth_plugins_mapping, *, isolation_mode: bool = False): 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 don’t 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=[], diff --git a/tests/test_cli.py b/tests/test_cli.py index 6504c8a980..e9626d2757 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -375,3 +375,8 @@ def test_default_scheme_option(self, httpbin_secure): 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'