33import requests
44from .compat import encode_requests_password
55
6+ import logging
7+ _logger = logging .getLogger (__name__ )
8+
69
710class NextCloudConnectionError (Exception ):
811 """ A connection error occurred """
@@ -31,7 +34,7 @@ def __init__(self, url=None, user=None, password=None, auth=None, session_kwargs
3134 self .auth = None
3235 self .user = None
3336 self ._set_credentials (user , password , auth )
34- self .url = url
37+ self .url = url . rstrip ( '/' )
3538 self ._session_kwargs = session_kwargs or {}
3639
3740 def _set_credentials (self , user , password , auth ):
@@ -41,12 +44,11 @@ def _set_credentials(self, user, password, auth):
4144 self .user = user
4245 else :
4346 if isinstance (self .auth , tuple ):
44- (self .user , password ) = self .auth
45- self .auth = None
47+ self .user = self .auth [0 ]
4648 else :
4749 if isinstance (self .auth , requests .auth .AuthBase ):
4850 self .user = self .auth .username
49- if not self .auth :
51+ if not self .auth and ( self . user and password ) :
5052 self .auth = (self .user , encode_requests_password (password ))
5153
5254 def request (self , method , url , ** kwargs ):
@@ -75,18 +77,35 @@ def login(self, user=None, password=None, auth=None, client=None):
7577 self ._set_credentials (user , password , auth )
7678 self .session .auth = self .auth
7779 if client :
78- try :
79- resp = client .with_attr (json_output = True ).get_user ()
80- if not resp .is_ok :
81- raise NextCloudLoginError (
82- 'Failed to login to NextCloud' , self .url , resp )
83- except requests .exceptions .SSLError as e :
84- self .logout ()
85- raise e
86- except Exception as e :
80+ self ._check_session (client .with_attr (json_output = True ), retry = 3 )
81+
82+
83+ def _check_session (self , client = None , retry = None ):
84+ def _clear ():
85+ if self .session :
8786 self .logout ()
87+
88+ def _raise (e ):
89+ if retry :
90+ _logger .warning ('Retry session check (%s)' , self .url )
91+ return self ._check_session (client , retry = retry - 1 )
92+ else :
93+ _clear ()
8894 raise e
8995
96+ try :
97+ resp = client .get_user ()
98+ if not resp .is_ok :
99+ _raise (NextCloudLoginError (
100+ 'Failed to login to NextCloud' , self .url , resp ))
101+ except requests .exceptions .SSLError as e :
102+ _raise (e )
103+ except NextCloudConnectionError as e :
104+ _raise (e )
105+ except Exception as e :
106+ _clear ()
107+ raise e
108+
90109 def logout (self ):
91110 """Log out the authenticated user and close the session.
92111
0 commit comments