From f2163279c915b3ff678592bff15373bc13d4881e Mon Sep 17 00:00:00 2001 From: Mirco Grillo Date: Fri, 8 Oct 2021 14:42:40 +0200 Subject: [PATCH] Fix incorrect parsing when using CloudSQL db url Add test for covering it --- environ/environ.py | 6 +++++- tests/fixtures.py | 2 ++ tests/test_env.py | 3 +++ tests/test_env.txt | 1 + 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/environ/environ.py b/environ/environ.py index 1ebbb8d7..676d04b4 100644 --- a/environ/environ.py +++ b/environ/environ.py @@ -157,6 +157,7 @@ class Env: "xapian": "haystack.backends.xapian_backend.XapianEngine", "simple": "haystack.backends.simple_backend.SimpleEngine", } + CLOUDSQL = 'cloudsql' def __init__(self, **scheme): self.smart_cast = True @@ -502,7 +503,10 @@ def db_url_config(cls, url, engine=None): 'PORT': _cast_int(url.port) or '', }) - if url.scheme in cls.POSTGRES_FAMILY and path.startswith('/'): + if ( + url.scheme in cls.POSTGRES_FAMILY and path.startswith('/') + or cls.CLOUDSQL in path and path.startswith('/') + ): config['HOST'], config['NAME'] = path.rsplit('/', 1) if url.scheme == 'oracle' and path == '': diff --git a/tests/fixtures.py b/tests/fixtures.py index 782123df..25213ac7 100644 --- a/tests/fixtures.py +++ b/tests/fixtures.py @@ -13,6 +13,7 @@ class FakeEnv: URL = 'http://www.google.com/' POSTGRES = 'postgres://uf07k1:wegauwhg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722' MYSQL = 'mysql://bea6eb0:69772142@us-cdbr-east.cleardb.com/heroku_97681?reconnect=true' + MYSQL_CLOUDSQL_URL = 'mysql://djuser:hidden-password@//cloudsql/arvore-codelab:us-central1:mysqlinstance/mydatabase' MYSQLGIS = 'mysqlgis://user:password@127.0.0.1/some_database' SQLITE = 'sqlite:////full/path/to/your/database/file.sqlite' ORACLE_TNS = 'oracle://user:password@sid/' @@ -67,6 +68,7 @@ def generate_data(cls): DATABASE_ORACLE_TNS_URL=cls.ORACLE_TNS, DATABASE_REDSHIFT_URL=cls.REDSHIFT, DATABASE_CUSTOM_BACKEND_URL=cls.CUSTOM_BACKEND, + DATABASE_MYSQL_CLOUDSQL_URL=cls.MYSQL_CLOUDSQL_URL, CACHE_URL=cls.MEMCACHE, CACHE_REDIS=cls.REDIS, EMAIL_URL=cls.EMAIL, diff --git a/tests/test_env.py b/tests/test_env.py index 81aa6545..0be9a60a 100644 --- a/tests/test_env.py +++ b/tests/test_env.py @@ -218,6 +218,8 @@ def test_url_encoded_parts(self): '/full/path/to/your/database/file.sqlite', '', '', '', ''), ('DATABASE_CUSTOM_BACKEND_URL', 'custom.backend', 'database', 'example.com', 'user', 'password', 5430), + ('DATABASE_MYSQL_CLOUDSQL_URL', 'django.db.backends.mysql', 'mydatabase', + '/cloudsql/arvore-codelab:us-central1:mysqlinstance', 'djuser', 'hidden-password', ''), ], ids=[ 'postgres', @@ -228,6 +230,7 @@ def test_url_encoded_parts(self): 'redshift', 'sqlite', 'custom', + 'cloudsql', ], ) def test_db_url_value(self, var, engine, name, host, user, passwd, port): diff --git a/tests/test_env.txt b/tests/test_env.txt index 60ea78c3..c6363ed3 100644 --- a/tests/test_env.txt +++ b/tests/test_env.txt @@ -1,5 +1,6 @@ DICT_VAR=foo=bar,test=on DATABASE_MYSQL_URL=mysql://bea6eb0:69772142@us-cdbr-east.cleardb.com/heroku_97681?reconnect=true +DATABASE_MYSQL_CLOUDSQL_URL=mysql://djuser:hidden-password@//cloudsql/arvore-codelab:us-central1:mysqlinstance/mydatabase DATABASE_MYSQL_GIS_URL=mysqlgis://user:password@127.0.0.1/some_database CACHE_URL=memcache://127.0.0.1:11211 CACHE_REDIS=rediscache://127.0.0.1:6379/1?client_class=django_redis.client.DefaultClient&password=secret