File tree Expand file tree Collapse file tree 2 files changed +41
-6
lines changed
Expand file tree Collapse file tree 2 files changed +41
-6
lines changed Original file line number Diff line number Diff line change @@ -176,6 +176,7 @@ class Connection(object):
176176 """
177177
178178 _sock = None
179+ _rfile = None
179180 _auth_plugin_name = ''
180181 _closed = False
181182 _secure = False
@@ -372,6 +373,8 @@ def open(self):
372373
373374 def _force_close (self ):
374375 """Close connection without QUIT message"""
376+ if self ._rfile :
377+ self ._rfile .close ()
375378 if self ._sock :
376379 try :
377380 self ._sock .close ()
@@ -600,12 +603,7 @@ def connect(self, sock=None):
600603 if self .autocommit_mode is not None :
601604 self .autocommit (self .autocommit_mode )
602605 except BaseException as e :
603- self ._rfile = None
604- if sock is not None :
605- try :
606- sock .close ()
607- except : # noqa
608- pass
606+ self ._force_close ()
609607
610608 if isinstance (e , (OSError , IOError , socket .error )):
611609 exc = err .OperationalError (
Original file line number Diff line number Diff line change @@ -565,3 +565,40 @@ def test_commit_during_multi_result(self):
565565 con .commit ()
566566 cur .execute ("SELECT 3" )
567567 self .assertEqual (cur .fetchone ()[0 ], 3 )
568+
569+ def test_force_close_closes_socketio (self ):
570+ con = self .connect ()
571+ sock = con ._sock
572+ fileno = sock .fileno ()
573+ rfile = con ._rfile
574+
575+ con ._force_close ()
576+ assert rfile .closed
577+ assert sock ._closed
578+ assert sock .fileno () != fileno # should be set to -1
579+
580+ def test_socket_closed_on_exception_in_connect (self ):
581+ con = self .connect (defer_connect = True )
582+ sock = None
583+ rfile = None
584+ fileno = - 1
585+
586+ def _request_authentication ():
587+ nonlocal sock , rfile , fileno
588+ sock = con ._sock
589+ assert sock is not None
590+ fileno = sock .fileno ()
591+ rfile = con ._rfile
592+ assert rfile is not None
593+ raise TypeError
594+
595+ con ._request_authentication = _request_authentication
596+
597+ with pytest .raises (TypeError ):
598+ con .connect ()
599+ assert not con .open
600+ assert con ._rfile is None
601+ assert con ._sock is None
602+ assert rfile .closed
603+ assert sock ._closed
604+ assert sock .fileno () != fileno # should be set to -1
You can’t perform that action at this time.
0 commit comments