Story #8167
Updated by bmbouter almost 4 years ago
## Motivation
For proxy authorization to be sent to proxies using the `PROXY-AUTHORIZATION` header, we need to set that data on the aiohttp session. Currently the only way to specify proxy authorization is in embedded in the proxy_url.
## Implementation
1. Add a `proxy_username` and `proxy_password` fields to the Remote MasterModel. These are optional fields.
2. Ensure that if one is specified, they both are specified (this is at the serializer level).
3. Have the `DownloaderFactory` read these values and set them on the aiohttp session correctly.
## Moving proxy credentials out of proxy_url
As part of this story proxy credentials will no longer be allow to be stored on the proxy_url. So for this story the following also needs to be done:
* Validation needs to be added for proxy_url that disallows users to put a username and/or password in the proxy_url. If the user does it should fail validation and they should be directed to use the `proxy_username` and `proxy_password` setting.
* A data migration needs to be made which will remove any credentials stored in existing remotes and move them to the `proxy_username` and `proxy_password` fields at migration time.
## Notes
Use the `proxy_pass` parameter on the aiohttp session like the example below from [the `aiohttp` client proxy config docs](https://docs.aiohttp.org/en/stable/client_advanced.html#proxy-support):
```
async with aiohttp.ClientSession() as session:
proxy_auth = aiohttp.BasicAuth('user', 'pass')
async with session.get("http://python.org",
proxy="http://proxy.com",
proxy_auth=proxy_auth) as resp:
print(resp.status)
```