### Summary

The URI module supports a 'src' option to open a file on disk. If the remote end sends a 401 requiring authentication because force_basic_auth is not set then the remote end will never get the file on the retry when urlllib sends the headers again with the Authentication data.

This is documented in urllib: https://docs.python.org/3/library/urllib.request.html#urllib.request.Request

> Note The request will not work as expected if the data object is unable to deliver its content more than once (e.g. a file or an iterable that can produce the content only once) and the request is retried for HTTP redirects or authentication. The data is sent to the HTTP server right away after the headers. There is no support for a 100-continue expectation in the library.

The Ansible Documentation should note this caveat so users can either use body and lookup or force_basic_auth as appropriate for their environment.

### Issue Type

Documentation Report

### Component Name

lib/ansible/modules/uri.py

### Ansible Version

```console
$ ansible --version
ansible 2.9.12
  config file = None
  configured module search path = ['/home/wormley/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/wormley/ansible/lib/python3.8/site-packages/ansible
  executable location = /home/wormley/ansible/bin/ansible
  python version = 3.8.10 (default, Sep 28 2021, 16:10:42) [GCC 9.3.0]
```


### Configuration

```console
$ ansible-config dump --only-changed
```


### OS / Environment

Ubuntu 20.04.3

### Additional Information

Since this is documented behavior of the underlying library should just be a documentation update to save anyone else having to hunt down why it fails in an unexpected way. In our case it was a timeout as the second send the remote end was waiting for Content-Bytes to be sent again which never happened.

### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct
- name: Queue build of a project in Jenkins
  ansible.builtin.uri:
    url: http://{{ jenkins.host }}/job/{{ jenkins.job }}/build?token={{ jenkins.token }}
    user: "{{ jenkins.user }}"
    password: "{{ jenkins.password }}"
    method: GET
    force_basic_auth: yes
    status_code: 201
- name: POST from contents of local file
  ansible.builtin.uri:
    url: https://httpbin.org/post
    method: POST
    src: file.json
- name: POST from contents of remote file
  ansible.builtin.uri:
    url: https://httpbin.org/post
    method: POST
    src: /path/to/my/file.json
    remote_src: yes
- name: Create workspaces in Log analytics Azure
  ansible.builtin.uri:
    url: https://www.mms.microsoft.com/Embedded/Api/ConfigDataSources/LogManagementData/Save
    method: POST
    body_format: json
    status_code: [200, 202]
    return_content: true
    headers:
      Content-Type: application/json
      x-ms-client-workspace-path: /subscriptions/{{ sub_id }}/resourcegroups/{{ res_group }}/providers/microsoft.operationalinsights/workspaces/{{ w_spaces }}
      x-ms-client-platform: ibiza