diff --git a/httpie/input.py b/httpie/input.py index ff0bf03407..88bc3c87e6 100644 --- a/httpie/input.py +++ b/httpie/input.py @@ -21,6 +21,10 @@ from httpie.utils import load_json_preserve_order +# ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) +# +URL_SCHEME_RE = re.compile(r'^[a-z][a-z0-9.+-]*://', re.IGNORECASE) + HTTP_POST = 'POST' HTTP_GET = 'GET' HTTP = 'http://' @@ -132,7 +136,7 @@ def parse_args(self, env, args=None, namespace=None): self._parse_items() if not self.args.ignore_stdin and not env.stdin_isatty: self._body_from_file(self.env.stdin) - if not (self.args.url.startswith((HTTP, HTTPS))): + if not URL_SCHEME_RE.match(self.args.url): scheme = HTTP # See if we're using curl style shorthand for localhost (:3000/foo) diff --git a/tests/test_cli.py b/tests/test_cli.py index f5754edc77..73f68f7138 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -2,9 +2,9 @@ import json # noinspection PyCompatibility import argparse -import os import pytest +from requests.exceptions import InvalidSchema from httpie import input from httpie.input import KeyValue, KeyValueArgType, DataDict @@ -321,3 +321,12 @@ def test_ignore_stdin_cannot_prompt_password(self, httpbin): error_exit_ok=True) assert r.exit_status == ExitStatus.ERROR assert 'because --ignore-stdin' in r.stderr + + +class TestSchemes: + + def test_custom_scheme(self): + # InvalidSchema is expected because HTTPie + # shouldn't touch a formally valid scheme. + with pytest.raises(InvalidSchema): + http('foo+bar-BAZ.123://bah')