`requote_uri` changes the original URL

I'm trying to do something like:

```python
>>> import requests
>>> url = "http://beta.url2png.com/v6/P4ED6C68627746/d86b36effc2ea6862a2301273c40a2a2/png/?url=http%3A%2F%2Fwww3.geosc.psu.edu%2F%7Edmb53%2FDaveSTELLA%2FDaisyworld%2Fdaisyworld_model.htm&delay=4&fullpage=false&viewport=1280x1024"
>>> response = request.get(url)
>>> url
'http://beta.url2png.com/v6/P4ED6C68627746/d86b36effc2ea6862a2301273c40a2a2/png/?url=http%3A%2F%2Fwww3.geosc.psu.edu%2F%7Edmb53%2FDaveSTELLA%2FDaisyworld%2Fdaisyworld_model.htm&delay=4&fullpage=false&viewport=1280x1024'
>>> response.request.url
'http://beta.url2png.com/v6/P4ED6C68627746/d86b36effc2ea6862a2301273c40a2a2/png/?url=http%3A%2F%2Fwww3.geosc.psu.edu%2F~dmb53%2FDaveSTELLA%2FDaisyworld%2Fdaisyworld_model.htm&delay=4&fullpage=false&viewport=1280x1024'
```

Note how `%7E` from the original URL is changed to `~` in the actual request. Also note the `d86b36effc2ea6862a2301273c40a2a2` part of the URL. It's a hash of the query string parameters which is required to authorize the request. Since `requests.get` changes the original URL the hash becomes invalid and thus the request can't be authorized.

So, the original URL is a correct URL which you can open in a browser or download using `curl`. However the URL that `requests.get` fetches is invalid and returns `401 Unauthorized` response.

The URL that `requests.get` fetches is not invalid in the sense that it's perfectly legitimate to represent the query string in this manner. The relevant portion of a specification is [RFC 3986 § 2.3](https://tools.ietf.org/html/rfc3986#section-2.3), with added emphasis on the most important section:

>    Characters that are allowed in a URI but do not have a reserved purpose are called unreserved.  These include uppercase and lowercase letters, decimal digits, hyphen, period, underscore, and tilde.
> ...[snip]...
> URIs that differ in the replacement of an unreserved character with its corresponding percent-encoded US-ASCII octet are equivalent: they identify the same resource.
> ...[snip]...
> For consistency, percent-encoded octets in the ranges of ALPHA (%41-%5A and %61-%7A), DIGIT (%30-%39), hyphen (%2D), period (%2E), underscore (%5F), or tilde (%7E) **should not be created by URI producers and, when found in a URI, should be decoded to their corresponding unreserved characters by URI normalizers**.

Requests tries to be intelligent about the URLs that are passed to it, because they do not consistently come encoded or unencoded. Users have passed us in the past both encoded and unencoded URLs, and we generally try to beat them into a fairly consistent shape.

If you don't want us to do that, you can opt-out by using the [PreparedRequest flow](http://docs.python-requests.org/en/master/user/advanced/#prepared-requests) and set the `url` yourself:

```python
from requests import Request, Session

s = Session()
req = Request('GET',  url, data=data, headers=headers)

prepped = s.prepare_request(req)
prepped.url = "http://beta.url2png.com/v6/P4ED6C68627746/d86b36effc2ea6862a2301273c40a2a2/png/?url=http%3A%2F%2Fwww3.geosc.psu.edu%2F%7Edmb53%2FDaveSTELLA%2FDaisyworld%2Fdaisyworld_model.htm&delay=4&fullpage=false&viewport=1280x1024"

resp = s.send(prepped)
print(resp.status_code)
```

It seems that it's a problem with `urllib.urlencode` function then since it doesn't treat tilde as safe character and doesn't allow to override this behavior.

Thank you for the proposed solution.