Skip to content

Commit b89fb45

Browse files
committed
Fix SSL support in connection pool.
Closes: #119.
1 parent 8ef4459 commit b89fb45

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed

asyncpg/pool.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ async def connect(self):
115115
**self._connect_kwargs)
116116
self._pool._working_addr = con._addr
117117
self._pool._working_opts = con._opts
118+
self._pool._working_ssl_context = con._ssl_context
118119

119120
else:
120121
# We've connected before and have a resolved address
@@ -126,9 +127,10 @@ async def connect(self):
126127
else:
127128
host, port = self._pool._working_addr
128129

129-
con = await self._pool._connect(host=host, port=port,
130-
loop=self._pool._loop,
131-
**self._pool._working_opts)
130+
con = await self._pool._connect(
131+
host=host, port=port, loop=self._pool._loop,
132+
ssl=self._pool._working_ssl_context,
133+
**self._pool._working_opts)
132134

133135
if self._init is not None:
134136
await self._init(con)
@@ -248,7 +250,7 @@ class Pool:
248250
"""
249251

250252
__slots__ = ('_queue', '_loop', '_minsize', '_maxsize',
251-
'_working_addr', '_working_opts',
253+
'_working_addr', '_working_opts', '_working_ssl_context',
252254
'_holders', '_initialized', '_closed')
253255

254256
def __init__(self, *connect_args,
@@ -292,6 +294,7 @@ def __init__(self, *connect_args,
292294

293295
self._working_addr = None
294296
self._working_opts = None
297+
self._working_ssl_context = None
295298

296299
self._closed = False
297300

tests/test_connect.py

+25
Original file line numberDiff line numberDiff line change
@@ -579,3 +579,28 @@ async def test_ssl_connection_default_context(self):
579579
database='postgres',
580580
loop=self.loop,
581581
ssl=True)
582+
583+
async def test_ssl_connection_pool(self):
584+
ssl_context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
585+
ssl_context.load_verify_locations(SSL_CA_CERT_FILE)
586+
587+
pool = await self.create_pool(
588+
host='localhost',
589+
user='ssl_user',
590+
database='postgres',
591+
min_size=5,
592+
max_size=10,
593+
ssl=ssl_context)
594+
595+
async def worker():
596+
async with pool.acquire() as con:
597+
self.assertEqual(await con.fetchval('SELECT 42'), 42)
598+
599+
with self.assertRaises(asyncio.TimeoutError):
600+
await con.execute('SELECT pg_sleep(5)', timeout=0.5)
601+
602+
self.assertEqual(await con.fetchval('SELECT 43'), 43)
603+
604+
tasks = [worker() for _ in range(100)]
605+
await asyncio.gather(*tasks, loop=self.loop)
606+
await pool.close()

0 commit comments

Comments
 (0)