From cc0ecc0adb4970ab7a0ffc04fe26684de57ade13 Mon Sep 17 00:00:00 2001 From: Yuzhong Zhang Date: Fri, 4 Sep 2026 09:04:07 +0000 Subject: [PATCH] Fix intermixed optional flags before/after URL on all Pythons Use parse_known_intermixed_args so -v between METHOD and URL (and after URL on Python < 3.13) no longer drops request items. Keeps --no-* extras. Fixes #1838 --- httpie/cli/argparser.py | 2 +- tests/test_cli.py | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/httpie/cli/argparser.py b/httpie/cli/argparser.py index 9bf09b3b73..636a7dcf20 100644 --- a/httpie/cli/argparser.py +++ b/httpie/cli/argparser.py @@ -156,7 +156,7 @@ 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..9f4ba48336 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -317,6 +317,27 @@ def test_guess_when_method_set_but_invalid_and_item_exists(self): ] +class TestIntermixedOptions: + """Optional flags may appear before, between, or after positionals.""" + + @pytest.mark.parametrize('args', [ + # Flag after URL (fails on Python < 3.13 with parse_known_args). + ['--offline', '--ignore-stdin', 'post', 'pie.dev/post', '-v', + 'header1:xyz', 'x=1'], + # Flag between METHOD and URL (fails on all Python versions). + ['--offline', '--ignore-stdin', 'post', '-v', 'pie.dev/post', + 'header1:xyz', 'x=1'], + # Flag before METHOD (already works). + ['--offline', '--ignore-stdin', '-v', 'post', 'pie.dev/post', + 'header1:xyz', 'x=1'], + ]) + def test_verbose_flag_position_keeps_request_items(self, args): + r = http(*args) + assert r.exit_status == ExitStatus.SUCCESS + assert 'header1: xyz' in r + assert '"x": "1"' in r + + class TestNoOptions: def test_valid_no_options(self, httpbin):