### 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
- Independently of this option, if the reported Content-type is "application/json", then the JSON is
        always loaded into a key called C(json) in the dictionary results.
    type: bool
    default: no
  force_basic_auth:
    description:
      - Force the sending of the Basic authentication header upon initial request.
      - The library used by the uri module only sends authentication information when a webservice
        responds to an initial request with a 401 status. Since some basic auth services do not properly
        send a 401, logins will fail.
    type: bool
    default: no
  follow_redirects:
    description:
      - Whether or not the URI module should follow redirects. C(all) will follow all redirects.
        C(safe) will follow only "safe" redirects, where "safe" means that the client is only
        doing a GET or HEAD on the URI to which it is being redirected. C(none) will not follow
        any redirects. Note that C(yes) and C(no) choices are accepted for backwards compatibility,
        where C(yes) is the equivalent of C(all) and C(no) is the equivalent of C(safe). C(yes) and C(no)
        are deprecated and will be removed in some future version of Ansible.
    type: str
    choices: ['all', 'no', 'none', 'safe', 'urllib2', 'yes']
    default: safe
  creates:
    description:
      - A filename, when it already exists, this step will not be run.
    type: path
  removes:
    description:
      - A filename, when it does not exist, this step will not be run.