From 1ebdd60807282fe5db836289035d53186465f609 Mon Sep 17 00:00:00 2001 From: mehmet turac Date: Sun, 17 May 2026 06:20:42 +0300 Subject: [PATCH 1/2] Fix intermixed options on older Python --- httpie/cli/argparser.py | 5 ++++- tests/test_cli.py | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/httpie/cli/argparser.py b/httpie/cli/argparser.py index 9bf09b3b73..89cdbf125f 100644 --- a/httpie/cli/argparser.py +++ b/httpie/cli/argparser.py @@ -156,7 +156,10 @@ def parse_args( ) -> argparse.Namespace: self.env = env self.env.args = namespace = namespace or argparse.Namespace() - self.args, no_options = super().parse_known_args(args, namespace) + self.args, no_options = super().parse_known_intermixed_args( + args, + namespace, + ) if self.args.debug: self.args.traceback = True self.has_stdin_data = ( diff --git a/tests/test_cli.py b/tests/test_cli.py index 2cd27574af..34e11bb404 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -149,6 +149,23 @@ def test_multiple_text_fields_with_same_field_name(self): ] +class TestIntermixedOptions: + def test_output_option_after_url_keeps_request_items(self): + r = http( + '--offline', + '--ignore-stdin', + 'post', + 'pie.dev/post', + '-v', + 'header1:xyz', + 'x=1', + ) + + assert r.exit_status == ExitStatus.SUCCESS + assert 'header1: xyz' in r + assert '"x": "1"' in r + + class TestQuerystring: def test_query_string_params_in_url(self, httpbin): r = http('--print=Hhb', 'GET', httpbin + '/get?a=1&b=2') From f6e0f1cb61bbad12f75c942153024d278497f9fd Mon Sep 17 00:00:00 2001 From: mehmet turac Date: Sun, 17 May 2026 06:35:47 +0300 Subject: [PATCH 2/2] Preserve parser behavior for trailing request items --- httpie/cli/argparser.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/httpie/cli/argparser.py b/httpie/cli/argparser.py index 89cdbf125f..30653a2b75 100644 --- a/httpie/cli/argparser.py +++ b/httpie/cli/argparser.py @@ -156,10 +156,21 @@ def parse_args( ) -> argparse.Namespace: self.env = env self.env.args = namespace = namespace or argparse.Namespace() - self.args, no_options = super().parse_known_intermixed_args( - args, - namespace, - ) + self.args, no_options = super().parse_known_args(args, namespace) + if self.args.url: + request_items = [ + option for option in no_options if not option.startswith('-') + ] + if request_items: + request_item_type = KeyValueArgType(*SEPARATOR_GROUP_ALL_ITEMS) + self.args.request_items = [ + *(self.args.request_items or []), + *(request_item_type(item) for item in request_items), + ] + no_options = [ + option for option in no_options + if option.startswith('-') + ] if self.args.debug: self.args.traceback = True self.has_stdin_data = (