|
1 | 1 | import logging
|
2 | 2 | import sys
|
3 |
| -from urllib.parse import urlparse, uses_netloc |
| 3 | +from urllib.parse import urlparse, uses_netloc, quote_plus |
4 | 4 |
|
5 | 5 | import wrapt
|
6 | 6 | from sqlalchemy.sql.expression import ClauseElement
|
|
14 | 14 | def _sql_meta(engine_instance, args):
|
15 | 15 | try:
|
16 | 16 | metadata = {}
|
17 |
| - url = urlparse(str(engine_instance.engine.url)) |
| 17 | + # Workaround for https://github.com/sqlalchemy/sqlalchemy/issues/10662 |
| 18 | + # sqlalchemy.engine.url.URL's __repr__ does not url encode username nor password. |
| 19 | + # This will continue to work once sqlalchemy fixes the bug. |
| 20 | + sa_url = engine_instance.engine.url |
| 21 | + username = sa_url.username |
| 22 | + sa_url = sa_url._replace(username=None, password=None) |
| 23 | + url = urlparse(str(sa_url)) |
| 24 | + name = url.netloc |
| 25 | + if username: |
| 26 | + # Restore url encoded username |
| 27 | + quoted_username = quote_plus(username) |
| 28 | + url = url._replace(netloc='{}@{}'.format(quoted_username, url.netloc)) |
18 | 29 | # Add Scheme to uses_netloc or // will be missing from url.
|
19 | 30 | uses_netloc.append(url.scheme)
|
20 |
| - if url.password is None: |
21 |
| - metadata['url'] = url.geturl() |
22 |
| - name = url.netloc |
23 |
| - else: |
24 |
| - # Strip password from URL |
25 |
| - host_info = url.netloc.rpartition('@')[-1] |
26 |
| - parts = url._replace(netloc='{}@{}'.format(url.username, host_info)) |
27 |
| - metadata['url'] = parts.geturl() |
28 |
| - name = host_info |
| 31 | + metadata['url'] = url.geturl() |
29 | 32 | metadata['user'] = url.username
|
30 | 33 | metadata['database_type'] = engine_instance.engine.name
|
31 | 34 | try:
|
|
0 commit comments