From 2ab67552a097522a82fd250b8b36995a9bc2cd80 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Mon, 24 May 2021 11:12:11 -0400 Subject: URL parsing fixes Fixed a long-standing issue with :class:`.URL` where query parameters following the question mark would not be parsed correctly if the URL did not contain a database portion with a backslash. Fixed issue where an ``@`` sign in the database portion of a URL would not be interpreted correctly if the URL also had a username:password section. Fixes: #6329 Fixes: #6482 Change-Id: I6cb6478affa49b618335b947a74e64090657a98c --- lib/sqlalchemy/engine/url.py | 39 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 22 deletions(-) (limited to 'lib/sqlalchemy') diff --git a/lib/sqlalchemy/engine/url.py b/lib/sqlalchemy/engine/url.py index 7898f9121..f60b9d56d 100644 --- a/lib/sqlalchemy/engine/url.py +++ b/lib/sqlalchemy/engine/url.py @@ -702,16 +702,17 @@ def _parse_rfc1738_args(name): (?P[\w\+]+):// (?: (?P[^:/]*) - (?::(?P.*))? + (?::(?P[^@]*))? @)? (?: (?: - \[(?P[^/]+)\] | - (?P[^/:]+) + \[(?P[^/\?]+)\] | + (?P[^/:\?]+) )? - (?::(?P[^/]*))? + (?::(?P[^/\?]*))? )? - (?:/(?P.*))? + (?:/(?P[^\?]*))? + (?:\?(?P.*))? """, re.X, ) @@ -719,23 +720,17 @@ def _parse_rfc1738_args(name): m = pattern.match(name) if m is not None: components = m.groupdict() - if components["database"] is not None: - tokens = components["database"].split("?", 2) - components["database"] = tokens[0] - - if len(tokens) > 1: - query = {} - - for key, value in util.parse_qsl(tokens[1]): - if util.py2k: - key = key.encode("ascii") - if key in query: - query[key] = util.to_list(query[key]) - query[key].append(value) - else: - query[key] = value - else: - query = None + if components["query"] is not None: + query = {} + + for key, value in util.parse_qsl(components["query"]): + if util.py2k: + key = key.encode("ascii") + if key in query: + query[key] = util.to_list(query[key]) + query[key].append(value) + else: + query[key] = value else: query = None components["query"] = query -- cgit v1.2.1