mirror of
https://github.com/httpie/cli.git
synced 2025-02-01 12:57:57 +02:00
Added --show-redirects and --max-redirects
Closes #157, #183, #188, #246
This commit is contained in:
parent
c6d4f6cdf6
commit
356e043651
@ -9,8 +9,11 @@ This project adheres to `Semantic Versioning <http://semver.org/>`_.
|
|||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
* Added ``Content-Type`` of files uploaded in ``multipart/form-data`` requests
|
* Added ``Content-Type`` of files uploaded in ``multipart/form-data`` requests
|
||||||
|
* Added ``--show-redirects, -R`` to show intermediate responses with ``--follow``
|
||||||
|
* Added ``--max-redirects`` (default 30)
|
||||||
* Added ``-A`` as short name for ``--auth-type``
|
* Added ``-A`` as short name for ``--auth-type``
|
||||||
* Changed the default color style back to ``solarized`` as it supports
|
* Added ``-F`` as short name for ``--follow``
|
||||||
|
* Changed the default color style back to``solarized`` as it supports
|
||||||
both the light and dark terminal background mode
|
both the light and dark terminal background mode
|
||||||
* Fixed ``--session`` when used with ``--download``
|
* Fixed ``--session`` when used with ``--download``
|
||||||
* Fixed handling of ``Content-Type`` with multiple ``+subtype`` parts
|
* Fixed handling of ``Content-Type`` with multiple ``+subtype`` parts
|
||||||
|
16
README.rst
16
README.rst
@ -623,6 +623,21 @@ Auth Plugins
|
|||||||
* `httpie-jwt-auth <https://github.com/teracyhq/httpie-jwt-auth>`_: JWTAuth (JSON Web Tokens)
|
* `httpie-jwt-auth <https://github.com/teracyhq/httpie-jwt-auth>`_: JWTAuth (JSON Web Tokens)
|
||||||
|
|
||||||
|
|
||||||
|
==============
|
||||||
|
HTTP Redirects
|
||||||
|
==============
|
||||||
|
|
||||||
|
By default, HTTP redirects are not followed and only the first
|
||||||
|
response is shown. To instruct HTTPie to follow the ``Location`` header of
|
||||||
|
``30x`` responses and show the final response instead, use the ``--follow, -F`` option.
|
||||||
|
|
||||||
|
If you additionally wish to see the intermediary requests/responses as well,
|
||||||
|
use the ``--show-redirects, -R`` option as well.
|
||||||
|
|
||||||
|
To change the default limit of maximum 30 redirects, use the
|
||||||
|
``--max-redirects=<limit>`` option.
|
||||||
|
|
||||||
|
|
||||||
=======
|
=======
|
||||||
Proxies
|
Proxies
|
||||||
=======
|
=======
|
||||||
@ -1251,6 +1266,7 @@ Also, the ``--timeout`` option allows to overwrite the default 30s timeout:
|
|||||||
3) echo 'Unexpected HTTP 3xx Redirection!' ;;
|
3) echo 'Unexpected HTTP 3xx Redirection!' ;;
|
||||||
4) echo 'HTTP 4xx Client Error!' ;;
|
4) echo 'HTTP 4xx Client Error!' ;;
|
||||||
5) echo 'HTTP 5xx Server Error!' ;;
|
5) echo 'HTTP 5xx Server Error!' ;;
|
||||||
|
6) echo 'Exceeded --max-redirects=<n> redirects!' ;;
|
||||||
*) echo 'Other Error!' ;;
|
*) echo 'Other Error!' ;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
@ -12,6 +12,7 @@ class ExitStatus:
|
|||||||
OK = 0
|
OK = 0
|
||||||
ERROR = 1
|
ERROR = 1
|
||||||
ERROR_TIMEOUT = 2
|
ERROR_TIMEOUT = 2
|
||||||
|
ERROR_TOO_MANY_REDIRECTS = 6
|
||||||
|
|
||||||
# Used only when requested with --check-status:
|
# Used only when requested with --check-status:
|
||||||
ERROR_HTTP_3XX = 3
|
ERROR_HTTP_3XX = 3
|
||||||
|
@ -380,16 +380,6 @@ sessions.add_argument(
|
|||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
|
|
||||||
sessions.add_argument(
|
|
||||||
'--max-redirects',
|
|
||||||
dest='redirects',
|
|
||||||
default=30,
|
|
||||||
help="""
|
|
||||||
By default, requests has a limit of 30 redirects.
|
|
||||||
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
|
|
||||||
#######################################################################
|
#######################################################################
|
||||||
# Authentication
|
# Authentication
|
||||||
#######################################################################
|
#######################################################################
|
||||||
@ -456,15 +446,35 @@ network.add_argument(
|
|||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
network.add_argument(
|
network.add_argument(
|
||||||
'--follow',
|
'--follow', '-F',
|
||||||
default=False,
|
default=False,
|
||||||
action='store_true',
|
action='store_true',
|
||||||
help="""
|
help="""
|
||||||
Set this flag if full redirects are allowed (e.g. re-POST-ing of data at
|
Follow 30x Location redirects.
|
||||||
new Location).
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
|
|
||||||
|
network.add_argument(
|
||||||
|
'--show-redirects', '-R',
|
||||||
|
default=False,
|
||||||
|
action='store_true',
|
||||||
|
help="""
|
||||||
|
Show all responses within the redirect chain (works with --follow).
|
||||||
|
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
network.add_argument(
|
||||||
|
'--max-redirects',
|
||||||
|
type=int,
|
||||||
|
default=30,
|
||||||
|
help="""
|
||||||
|
By default, requests have a limit of 30 redirects (works with --follow).
|
||||||
|
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
network.add_argument(
|
network.add_argument(
|
||||||
'--verify',
|
'--verify',
|
||||||
default='yes',
|
default='yes',
|
||||||
|
@ -113,8 +113,12 @@ def main(args=sys.argv[1:], env=Environment(), error=None):
|
|||||||
|
|
||||||
last_response = get_response(args, config_dir=env.config.directory)
|
last_response = get_response(args, config_dir=env.config.directory)
|
||||||
|
|
||||||
redirect_chain = last_response.history + [last_response]
|
if args.show_redirects:
|
||||||
for response in redirect_chain:
|
responses = last_response.history + [last_response]
|
||||||
|
else:
|
||||||
|
responses = [last_response]
|
||||||
|
|
||||||
|
for response in responses:
|
||||||
|
|
||||||
if exit_status != ExitStatus.OK:
|
if exit_status != ExitStatus.OK:
|
||||||
break
|
break
|
||||||
@ -183,7 +187,9 @@ def main(args=sys.argv[1:], env=Environment(), error=None):
|
|||||||
except requests.Timeout:
|
except requests.Timeout:
|
||||||
exit_status = ExitStatus.ERROR_TIMEOUT
|
exit_status = ExitStatus.ERROR_TIMEOUT
|
||||||
error('Request timed out (%ss).', args.timeout)
|
error('Request timed out (%ss).', args.timeout)
|
||||||
|
except requests.TooManyRedirects:
|
||||||
|
exit_status = ExitStatus.ERROR_TOO_MANY_REDIRECTS
|
||||||
|
error('Too many redirects (--max-redirects=%s).', args.max_redirects)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
# TODO: Better distinction between expected and unexpected errors.
|
# TODO: Better distinction between expected and unexpected errors.
|
||||||
# Network errors vs. bugs, etc.
|
# Network errors vs. bugs, etc.
|
||||||
|
@ -12,7 +12,7 @@ def patharg(path):
|
|||||||
return path.replace('\\', '\\\\\\')
|
return path.replace('\\', '\\\\\\')
|
||||||
|
|
||||||
|
|
||||||
FIXTURES_ROOT = path.join(path.abspath(path.dirname(__file__)), 'fixtures')
|
FIXTURES_ROOT = path.join(path.abspath(path.dirname(__file__)))
|
||||||
FILE_PATH = path.join(FIXTURES_ROOT, 'test.txt')
|
FILE_PATH = path.join(FIXTURES_ROOT, 'test.txt')
|
||||||
JSON_FILE_PATH = path.join(FIXTURES_ROOT, 'test.json')
|
JSON_FILE_PATH = path.join(FIXTURES_ROOT, 'test.json')
|
||||||
BIN_FILE_PATH = path.join(FIXTURES_ROOT, 'test.bin')
|
BIN_FILE_PATH = path.join(FIXTURES_ROOT, 'test.bin')
|
22
tests/test_redirects.py
Normal file
22
tests/test_redirects.py
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
"""High-level tests."""
|
||||||
|
from httpie import ExitStatus
|
||||||
|
from utils import http, HTTP_OK
|
||||||
|
|
||||||
|
|
||||||
|
class TestRedirects:
|
||||||
|
|
||||||
|
def test_follow_no_show_redirects(self, httpbin):
|
||||||
|
r = http('--follow', httpbin.url + '/redirect/2')
|
||||||
|
assert r.count('HTTP/1.1') == 1
|
||||||
|
assert HTTP_OK in r
|
||||||
|
|
||||||
|
def test_follow_show_redirects(self, httpbin):
|
||||||
|
r = http('--follow', '--show-redirects', httpbin.url + '/redirect/2')
|
||||||
|
assert r.count('HTTP/1.1') == 3
|
||||||
|
assert r.count('HTTP/1.1 302 FOUND', 2)
|
||||||
|
assert HTTP_OK in r
|
||||||
|
|
||||||
|
def test_max_redirects(self, httpbin):
|
||||||
|
r = http('--max-redirects=2', '--follow', httpbin.url + '/redirect/3',
|
||||||
|
error_exit_ok=True)
|
||||||
|
assert r.exit_status == ExitStatus.ERROR_TOO_MANY_REDIRECTS
|
Loading…
x
Reference in New Issue
Block a user