2016-02-29 06:56:21 +01:00
|
|
|
"""High-level tests."""
|
2016-03-09 14:58:34 +01:00
|
|
|
import pytest
|
|
|
|
|
2019-09-16 13:26:18 +02:00
|
|
|
from httpie.status import ExitStatus
|
2021-06-15 14:48:44 +02:00
|
|
|
from .fixtures import FILE_PATH_ARG, FILE_CONTENT
|
2021-05-05 14:13:39 +02:00
|
|
|
from .utils import http, HTTP_OK
|
2021-06-15 14:48:44 +02:00
|
|
|
from .utils.matching import assert_output_matches, Expect, ExpectSequence
|
2016-02-29 06:56:21 +01:00
|
|
|
|
|
|
|
|
2016-03-05 19:09:52 +01:00
|
|
|
def test_follow_all_redirects_shown(httpbin):
|
|
|
|
r = http('--follow', '--all', 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
|
|
|
|
|
|
|
|
|
2016-03-09 14:58:34 +01:00
|
|
|
@pytest.mark.parametrize('follow_flag', ['--follow', '-F'])
|
|
|
|
def test_follow_without_all_redirects_hidden(httpbin, follow_flag):
|
|
|
|
r = http(follow_flag, httpbin.url + '/redirect/2')
|
2016-02-29 07:31:27 +01:00
|
|
|
assert r.count('HTTP/1.1') == 1
|
|
|
|
assert HTTP_OK in r
|
2016-02-29 06:56:21 +01:00
|
|
|
|
|
|
|
|
2021-06-09 09:43:06 +02:00
|
|
|
@pytest.mark.xfail(True, reason="https://github.com/httpie/httpie/issues/1082")
|
|
|
|
def test_follow_output_options_used_for_redirects(httpbin):
|
|
|
|
r = http('--follow', '--print=H', httpbin.url + '/redirect/2')
|
|
|
|
assert r.count('GET /') == 1
|
|
|
|
assert HTTP_OK not in r
|
|
|
|
|
|
|
|
|
2016-03-05 19:09:52 +01:00
|
|
|
def test_follow_all_output_options_used_for_redirects(httpbin):
|
|
|
|
r = http('--check-status',
|
|
|
|
'--follow',
|
|
|
|
'--all',
|
|
|
|
'--print=H',
|
|
|
|
httpbin.url + '/redirect/2')
|
|
|
|
assert r.count('GET /') == 3
|
|
|
|
assert HTTP_OK not in r
|
|
|
|
|
2019-09-03 17:14:39 +02:00
|
|
|
#
|
|
|
|
# def test_follow_redirect_output_options(httpbin):
|
|
|
|
# r = http('--check-status',
|
|
|
|
# '--follow',
|
|
|
|
# '--all',
|
|
|
|
# '--print=h',
|
|
|
|
# '--history-print=H',
|
|
|
|
# httpbin.url + '/redirect/2')
|
|
|
|
# assert r.count('GET /') == 2
|
|
|
|
# assert 'HTTP/1.1 302 FOUND' not in r
|
|
|
|
# assert HTTP_OK in r
|
|
|
|
#
|
2016-02-29 06:56:21 +01:00
|
|
|
|
2016-02-29 07:31:27 +01:00
|
|
|
|
|
|
|
def test_max_redirects(httpbin):
|
2019-09-03 17:14:39 +02:00
|
|
|
r = http(
|
|
|
|
'--max-redirects=1',
|
|
|
|
'--follow',
|
|
|
|
httpbin.url + '/redirect/3',
|
|
|
|
tolerate_error_exit_status=True,
|
|
|
|
)
|
2016-02-29 07:31:27 +01:00
|
|
|
assert r.exit_status == ExitStatus.ERROR_TOO_MANY_REDIRECTS
|
2021-06-15 13:39:46 +02:00
|
|
|
|
|
|
|
|
|
|
|
def test_http_307_allow_redirect_post(httpbin):
|
|
|
|
r = http('--follow', 'POST', httpbin.url + '/redirect-to',
|
|
|
|
f'url=={httpbin.url}/post', 'status_code==307',
|
|
|
|
'@' + FILE_PATH_ARG)
|
|
|
|
assert HTTP_OK in r
|
|
|
|
|
|
|
|
|
2021-06-15 17:24:26 +02:00
|
|
|
@pytest.mark.parametrize('status_code', [307, 308])
|
|
|
|
def test_verbose_follow_redirect_with_repost(httpbin, status_code):
|
|
|
|
# <https://developer.mozilla.org/en-US/docs/Web/HTTP/Redirections>
|
|
|
|
r = http(
|
|
|
|
'--follow',
|
|
|
|
'--verbose',
|
|
|
|
httpbin.url + '/redirect-to',
|
|
|
|
f'url=={httpbin.url}/post',
|
|
|
|
f'status_code=={status_code}',
|
|
|
|
'@' + FILE_PATH_ARG,
|
|
|
|
)
|
|
|
|
assert f'HTTP/1.1 {status_code}' in r
|
2021-06-15 13:39:46 +02:00
|
|
|
assert r.count('POST /redirect-to') == 1
|
|
|
|
assert r.count('POST /post') == 1
|
2021-06-15 14:48:44 +02:00
|
|
|
assert r.count(FILE_CONTENT) == 3 # two requests + final response contain it
|
2021-06-15 13:39:46 +02:00
|
|
|
assert HTTP_OK in r
|
2021-06-15 14:48:44 +02:00
|
|
|
assert_output_matches(r, [
|
|
|
|
*ExpectSequence.TERMINAL_REQUEST,
|
|
|
|
Expect.RESPONSE_HEADERS,
|
|
|
|
Expect.SEPARATOR,
|
|
|
|
*ExpectSequence.TERMINAL_EXCHANGE,
|
|
|
|
])
|