Skip to content
This repository was archived by the owner on Aug 30, 2024. It is now read-only.

Commit cec434a

Browse files
authored
Merge pull request #229 from cloudant/218-session-still-active-after-client-disconnect
Fix request session so all requests fail after client is disconnected
2 parents 938e997 + 0925a39 commit cec434a

File tree

8 files changed

+52
-28
lines changed

8 files changed

+52
-28
lines changed

CHANGES.rst

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
2.2.0 (Unreleased)
1+
2.1.2 (Unreleased)
22
==================
3+
- [FIXED] Requests session is no longer valid after disconnect.
34

45
2.1.1 (2016-10-03)
56
==================

src/cloudant/client.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,7 @@ def connect(self):
8080
self.r_session.mount(self.server_url, self.adapter)
8181
if self._client_user_header is not None:
8282
self.r_session.headers.update(self._client_user_header)
83-
if not self.admin_party:
84-
self.r_session.auth = (self._user, self._auth_token)
85-
self.session_login(self._user, self._auth_token)
83+
self.session_login(self._user, self._auth_token)
8684
self._client_session = self.session()
8785
# Utilize an event hook to append to the response message
8886
# using :func:`~cloudant.common_util.append_response_error_content`

src/cloudant/database.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,18 @@ def __init__(self, client, database_name, fetch_limit=100):
5454
self.client = client
5555
self._database_host = client.server_url
5656
self.database_name = database_name
57-
self.r_session = client.r_session
5857
self._fetch_limit = fetch_limit
5958
self.result = Result(self.all_docs)
6059

60+
@property
61+
def r_session(self):
62+
"""
63+
Returns the ``r_session`` from the client instance used by the database.
64+
65+
:returns: Client ``r_session``
66+
"""
67+
return self.client.r_session
68+
6169
@property
6270
def admin_party(self):
6371
"""

src/cloudant/document.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,20 @@ def __init__(self, database, document_id=None):
6060
self._database = database
6161
self._database_host = self._client.server_url
6262
self._database_name = database.database_name
63-
self.r_session = database.r_session
6463
self._document_id = document_id
6564
if self._document_id is not None:
6665
self['_id'] = self._document_id
6766
self.encoder = self._client.encoder
6867

68+
@property
69+
def r_session(self):
70+
"""
71+
Returns the database instance ``r_session`` used by the document.
72+
73+
:returns: Client ``r_session``
74+
"""
75+
return self._client.r_session
76+
6977
@property
7078
def document_url(self):
7179
"""

tests/unit/client_tests.py

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ def test_couchdb_context_helper(self):
5454
with couchdb(self.user, self.pwd, url=self.url) as c:
5555
self.assertIsInstance(c, CouchDB)
5656
self.assertIsInstance(c.r_session, requests.Session)
57-
self.assertEqual(c.r_session.auth, (self.user, self.pwd))
5857
except Exception as err:
5958
self.fail('Exception {0} was raised.'.format(str(err)))
6059

@@ -88,17 +87,10 @@ def test_constructor_with_url(self):
8887
def test_connect(self):
8988
"""
9089
Test connect and disconnect functionality.
91-
Client r_session_auth is not set in CouchDB Admin Party mode.
9290
"""
9391
try:
9492
self.client.connect()
9593
self.assertIsInstance(self.client.r_session, requests.Session)
96-
if self.client.admin_party:
97-
self.assertIsNone(self.client.r_session.auth)
98-
else:
99-
self.assertEqual(
100-
self.client.r_session.auth, (self.user, self.pwd)
101-
)
10294
finally:
10395
self.client.disconnect()
10496
self.assertIsNone(self.client.r_session)
@@ -110,12 +102,6 @@ def test_auto_connect(self):
110102
try:
111103
self.set_up_client(auto_connect=True)
112104
self.assertIsInstance(self.client.r_session, requests.Session)
113-
if self.client.admin_party:
114-
self.assertIsNone(self.client.r_session.auth)
115-
else:
116-
self.assertEqual(
117-
self.client.r_session.auth, (self.user, self.pwd)
118-
)
119105
finally:
120106
self.client.disconnect()
121107
self.assertIsNone(self.client.r_session)
@@ -130,12 +116,6 @@ def test_multiple_connect(self):
130116
self.set_up_client(auto_connect=True)
131117
self.client.connect()
132118
self.assertIsInstance(self.client.r_session, requests.Session)
133-
if self.client.admin_party:
134-
self.assertIsNone(self.client.r_session.auth)
135-
else:
136-
self.assertEqual(
137-
self.client.r_session.auth, (self.user, self.pwd)
138-
)
139119
finally:
140120
self.client.disconnect()
141121
self.assertIsNone(self.client.r_session)
@@ -447,7 +427,6 @@ def test_cloudant_context_helper(self):
447427
with cloudant(self.user, self.pwd, account=self.account) as c:
448428
self.assertIsInstance(c, Cloudant)
449429
self.assertIsInstance(c.r_session, requests.Session)
450-
self.assertEqual(c.r_session.auth, (self.user, self.pwd))
451430
except Exception as err:
452431
self.fail('Exception {0} was raised.'.format(str(err)))
453432

tests/unit/database_tests.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -785,6 +785,20 @@ def test_update_handler_raises_httperror(self):
785785
data={'message': 'hello'},
786786
params={'field': 'new_field', 'value': 'new_value'})
787787

788+
def test_database_request_fails_after_client_disconnects(self):
789+
"""
790+
Test that after disconnecting from a client any objects created based
791+
on that client are not able to make requests.
792+
"""
793+
self.client.disconnect()
794+
795+
try:
796+
with self.assertRaises(AttributeError):
797+
self.db.metadata()
798+
self.assertIsNone(self.db.r_session)
799+
finally:
800+
self.client.connect()
801+
788802
@unittest.skipUnless(
789803
os.environ.get('RUN_CLOUDANT_TESTS') is not None,
790804
'Skipping Cloudant specific Database tests'

tests/unit/document_tests.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -722,5 +722,22 @@ def test_attachment_management(self):
722722
finally:
723723
attachment.close()
724724

725+
def test_document_request_fails_after_client_disconnects(self):
726+
"""
727+
Test that after disconnecting from a client any objects created based
728+
on that client are not able to make requests.
729+
"""
730+
self.client.connect()
731+
doc = Document(self.db, 'julia001')
732+
doc.save()
733+
self.client.disconnect()
734+
735+
try:
736+
with self.assertRaises(AttributeError):
737+
doc.fetch()
738+
self.assertIsNone(doc.r_session)
739+
finally:
740+
self.client.connect()
741+
725742
if __name__ == '__main__':
726743
unittest.main()

tests/unit/replicator_tests.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import uuid
2727
import time
2828
import requests
29-
import os
3029

3130
from cloudant.replicator import Replicator
3231
from cloudant.document import Document

0 commit comments

Comments
 (0)