# NOTE: The HTTP HEAD turns into an HTTP GET
- name: Test HTTP 301 using HEAD
  uri:
    url: https://{{ httpbin_host }}/redirect-to?status_code=301&url=https://{{ httpbin_host }}/anything
    follow_redirects: urllib2
    return_content: yes
    method: HEAD
  register: http_301_head

- assert:
    that:
    - http_301_head is successful
    - http_301_head.json.data == ''
    - http_301_head.json.method == 'GET'
    - http_301_head.json.url == 'https://{{ httpbin_host }}/anything'
    - http_301_head.redirected == true
    - http_301_head.status == 200
    - http_301_head.url == 'https://{{ httpbin_host }}/anything'

- name: Test HTTP 301 using GET
  uri:
    url: https://{{ httpbin_host }}/redirect-to?status_code=301&url=https://{{ httpbin_host }}/anything
    follow_redirects: urllib2
    return_content: yes
    method: GET
  register: http_301_get

- assert:
    that:
    - http_301_get is successful
    - http_301_get.json.data == ''
    - http_301_get.json.method == 'GET'
    - http_301_get.json.url == 'https://{{ httpbin_host }}/anything'
    - http_301_get.redirected == true
    - http_301_get.status == 200
    - http_301_get.url == 'https://{{ httpbin_host }}/anything'

# NOTE: The HTTP POST turns into an HTTP GET
- name: Test HTTP 301 using POST
  uri:
    url: https://{{ httpbin_host }}/redirect-to?status_code=301&url=https://{{ httpbin_host }}/anything
    follow_redirects: urllib2
    return_content: yes
    method: POST
    body: '{ "foo": "bar" }'
    body_format: json
  register: http_301_post

- assert:
    that:
    - http_301_post is successful
    - http_301_post.json.data == ''
    - http_301_post.json.method == 'GET'
    - http_301_post.json.url == 'https://{{ httpbin_host }}/anything'
    - http_301_post.redirected == true
    - http_301_post.status == 200
    - http_301_post.url == 'https://{{ httpbin_host }}/anything'

# NOTE: The HTTP HEAD turns into an HTTP GET
- name: Test HTTP 302 using HEAD
  uri:
    url: https://{{ httpbin_host }}/redirect-to?status_code=302&url=https://{{ httpbin_host }}/anything
    follow_redirects: urllib2
    return_content: yes
    method: HEAD
  register: http_302_head

- assert:
    that:
    - http_302_head is successful
    - http_302_head.json.data == ''
    - http_302_head.json.method == 'GET'
    - http_302_head.json.url == 'https://{{ httpbin_host }}/anything'
    - http_302_head.redirected == true
    - http_302_head.status == 200
    - http_302_head.url == 'https://{{ httpbin_host }}/anything'

- name: Test HTTP 302 using GET
  uri:
    url: https://{{ httpbin_host }}/redirect-to?status_code=302&url=https://{{ httpbin_host }}/anything
    follow_redirects: urllib2
    return_content: yes
    method: GET
  register: http_302_get

- assert:
    that:
    - http_302_get is successful
    - http_302_get.json.data == ''
    - http_302_get.json.method == 'GET'
    - http_302_get.json.url == 'https://{{ httpbin_host }}/anything'
    - http_302_get.redirected == true
    - http_302_get.status == 200
    - http_302_get.url == 'https://{{ httpbin_host }}/anything'

# NOTE: The HTTP POST turns into an HTTP GET
- name: Test HTTP 302 using POST
  uri:
    url: https://{{ httpbin_host }}/redirect-to?status_code=302&url=https://{{ httpbin_host }}/anything
    follow_redirects: urllib2
    return_content: yes
    method: POST
    body: '{ "foo": "bar" }'
    body_format: json
  register: http_302_post

- assert:
    that:
    - http_302_post is successful
    - http_302_post.json.data == ''
    - http_302_post.json.method == 'GET'
    - http_302_post.json.url == 'https://{{ httpbin_host }}/anything'
    - http_302_post.redirected == true
    - http_302_post.status == 200
    - http_302_post.url == 'https://{{ httpbin_host }}/anything'

# NOTE: The HTTP HEAD turns into an HTTP GET
- name: Test HTTP 303 using HEAD
  uri:
    url: https://{{ httpbin_host }}/redirect-to?status_code=303&url=https://{{ httpbin_host }}/anything
    follow_redirects: urllib2
    return_content: yes
    method: HEAD
  register: http_303_head

- assert:
    that:
    - http_303_head is successful
    - http_303_head.json.data == ''
    - http_303_head.json.method == 'GET'
    - http_303_head.json.url == 'https://{{ httpbin_host }}/anything'
    - http_303_head.redirected == true
    - http_303_head.status == 200
    - http_303_head.url == 'https://{{ httpbin_host }}/anything'

- name: Test HTTP 303 using GET
  uri:
    url: https://{{ httpbin_host }}/redirect-to?status_code=303&url=https://{{ httpbin_host }}/anything
    follow_redirects: urllib2
    return_content: yes
    method: GET
  register: http_303_get

- assert:
    that:
    - http_303_get is successful
    - http_303_get.json.data == ''
    - http_303_get.json.method == 'GET'
    - http_303_get.json.url == 'https://{{ httpbin_host }}/anything'
    - http_303_get.redirected == true
    - http_303_get.status == 200
    - http_303_get.url == 'https://{{ httpbin_host }}/anything'

# NOTE: The HTTP POST turns into an HTTP GET
- name: Test HTTP 303 using POST
  uri:
    url: https://{{ httpbin_host }}/redirect-to?status_code=303&url=https://{{ httpbin_host }}/anything
    follow_redirects: urllib2
    return_content: yes
    method: POST
    body: '{ "foo": "bar" }'
    body_format: json
  register: http_303_post

- assert:
    that:
    - http_303_post is successful
    - http_303_post.json.data == ''
    - http_303_post.json.method == 'GET'
    - http_303_post.json.url == 'https://{{ httpbin_host }}/anything'
    - http_303_post.redirected == true
    - http_303_post.status == 200
    - http_303_post.url == 'https://{{ httpbin_host }}/anything'

# NOTE: The HTTP HEAD turns into an HTTP GET
- name: Test HTTP 307 using HEAD
  uri:
    url: https://{{ httpbin_host }}/redirect-to?status_code=307&url=https://{{ httpbin_host }}/anything
    follow_redirects: urllib2
    return_content: yes
    method: HEAD
  register: http_307_head

- assert:
    that:
    - http_307_head is successful
    - http_307_head.json.data == ''
    - http_307_head.json.method == 'GET'
    - http_307_head.json.url == 'https://{{ httpbin_host }}/anything'
    - http_307_head.redirected == true
    - http_307_head.status == 200
    - http_307_head.url == 'https://{{ httpbin_host }}/anything'

- name: Test HTTP 307 using GET
  uri:
    url: https://{{ httpbin_host }}/redirect-to?status_code=307&url=https://{{ httpbin_host }}/anything
    follow_redirects: urllib2
    return_content: yes
    method: GET
  register: http_307_get

- assert:
    that:
    - http_307_get is successful
    - http_307_get.json.data == ''
    - http_307_get.json.method == 'GET'
    - http_307_get.json.url == 'https://{{ httpbin_host }}/anything'
    - http_307_get.redirected == true
    - http_307_get.status == 200
    - http_307_get.url == 'https://{{ httpbin_host }}/anything'

# FIXME: This is fixed in https://github.com/ansible/ansible/pull/36809
- name: Test HTTP 307 using POST
  uri:
    url: https://{{ httpbin_host }}/redirect-to?status_code=307&url=https://{{ httpbin_host }}/anything
    follow_redirects: urllib2
    return_content: yes
    method: POST
    body: '{ "foo": "bar" }'
    body_format: json
  ignore_errors: yes
  register: http_307_post

- assert:
    that:
    - http_307_post is failure
    - http_307_post.json is not defined
    - http_307_post.location == 'https://{{ httpbin_host }}/anything'
    - "http_307_post.msg == 'Status code was 307 and not [200]: HTTP Error 307: TEMPORARY REDIRECT'"
    - http_307_post.redirected == false
    - http_307_post.status == 307
    - http_307_post.url == 'https://{{ httpbin_host }}/redirect-to?status_code=307&url=https://{{ httpbin_host }}/anything'

# FIXME: This is fixed in https://github.com/ansible/ansible/pull/36809
- name: Test HTTP 308 using HEAD
  uri:
    url: https://{{ httpbin_host }}/redirect-to?status_code=308&url=https://{{ httpbin_host }}/anything
    follow_redirects: urllib2
    return_content: yes
    method: HEAD
  ignore_errors: yes
  register: http_308_head

- assert:
    that:
    - http_308_head is failure
    - http_308_head.json is not defined
    - http_308_head.location == 'https://{{ httpbin_host }}/anything'
    - "'Status code was 308 and not [200]: HTTP Error 308: ' in http_308_head.msg"
    - http_308_head.redirected == false
    - http_308_head.status == 308
    - http_308_head.url == 'https://{{ httpbin_host }}/redirect-to?status_code=308&url=https://{{ httpbin_host }}/anything'
  # Python 3.10 and earlier do not support HTTP 308 responses.
  # See: https://github.com/python/cpython/issues/84501
  when: ansible_python_version is version('3.11', '<')

# NOTE: The HTTP HEAD turns into an HTTP GET
- assert:
    that:
    - http_308_head is successful
    - http_308_head.json.data == ''
    - http_308_head.json.method == 'GET'
    - http_308_head.json.url == 'https://{{ httpbin_host }}/anything'
    - http_308_head.redirected == true
    - http_308_head.status == 200
    - http_308_head.url == 'https://{{ httpbin_host }}/anything'
  # Python 3.11 introduced support for HTTP 308 responses.
  # See: https://github.com/python/cpython/issues/84501
  when: ansible_python_version is version('3.11', '>=')

# FIXME: This is fixed in https://github.com/ansible/ansible/pull/36809
- name: Test HTTP 308 using GET
  uri:
    url: https://{{ httpbin_host }}/redirect-to?status_code=308&url=https://{{ httpbin_host }}/anything
    follow_redirects: urllib2
    return_content: yes
    method: GET
  ignore_errors: yes
  register: http_308_get

- assert:
    that:
    - http_308_get is failure
    - http_308_get.json is not defined
    - http_308_get.location == 'https://{{ httpbin_host }}/anything'
    - "'Status code was 308 and not [200]: HTTP Error 308: ' in http_308_get.msg"
    - http_308_get.redirected == false
    - http_308_get.status == 308
    - http_308_get.url == 'https://{{ httpbin_host }}/redirect-to?status_code=308&url=https://{{ httpbin_host }}/anything'
  # Python 3.10 and earlier do not support HTTP 308 responses.
  # See: https://github.com/python/cpython/issues/84501
  when: ansible_python_version is version('3.11', '<')

- assert:
    that:
    - http_308_get is successful
    - http_308_get.json.data == ''
    - http_308_get.json.method == 'GET'
    - http_308_get.json.url == 'https://{{ httpbin_host }}/anything'
    - http_308_get.redirected == true
    - http_308_get.status == 200
    - http_308_get.url == 'https://{{ httpbin_host }}/anything'
  # Python 3.11 introduced support for HTTP 308 responses.
  # See: https://github.com/python/cpython/issues/84501
  when: ansible_python_version is version('3.11', '>=')

# FIXME: This is fixed in https://github.com/ansible/ansible/pull/36809
- name: Test HTTP 308 using POST
  uri:
    url: https://{{ httpbin_host }}/redirect-to?status_code=308&url=https://{{ httpbin_host }}/anything
    follow_redirects: urllib2
    return_content: yes
    method: POST
    body: '{ "foo": "bar" }'
    body_format: json
  ignore_errors: yes
  register: http_308_post

- assert:
    that:
    - http_308_post is failure
    - http_308_post.json is not defined
    - http_308_post.location == 'https://{{ httpbin_host }}/anything'
    - "'Status code was 308 and not [200]: HTTP Error 308: ' in http_308_post.msg"
    - http_308_post.redirected == false
    - http_308_post.status == 308
    - http_308_post.url == 'https://{{ httpbin_host }}/redirect-to?status_code=308&url=https://{{ httpbin_host }}/anything'
