Passed
Pull Request — master (#69)
by
unknown
03:52
created

nextcloud.session.catch_connection_error()   A

Complexity

Conditions 2

Size

Total Lines 11
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 9
dl 0
loc 11
rs 9.95
c 0
b 0
f 0
cc 2
nop 1
1
# -*- coding: utf-8 -*-
2
from functools import wraps
3
import requests
4
from .compat import encode_requests_password
5
6
7
class NextCloudConnectionError(Exception):
8
    """ A connection error occurred """
9
10
11
def catch_connection_error(func):
12
13
    @wraps(func)
14
    def wrapper(*args, **kwargs):
15
        try:
16
            return func(*args, **kwargs)
17
        except requests.RequestException as e:
18
            raise NextCloudConnectionError(
19
                'Failed to establish connection to NextCloud', getattr(e.request, 'url', None), e)
20
21
    return wrapper
22
23
24
class Session(object):
25
    """ Session for requesting """
26
27
    def __init__(self, url=None, user=None, password=None, auth=None, session_kwargs=None):
28
        self.session = None
29
        self.auth = None
30
        self._set_credentials(user, password, auth)
31
        self.url = url
32
        self._session_kwargs = session_kwargs or {}
33
34
    def _set_credentials(self, user, password, auth):
35
        if auth:
36
            self.auth = auth
37
        if user:
38
            self.user = user
39
        else:
40
            if isinstance(self.auth, tuple):
41
                (self.user, password) = self.auth
42
                self.auth = None
43
            else:
44
                if isinstance(self.auth, requests.auth.AuthBase):
45
                    self.user = self.auth.username
46
        if not self.auth:
47
            self.auth = (self.user, encode_requests_password(password))
48
49
    def request(self, method, url, **kwargs):
50
        if self.session:
51
            return (self.session.request)(method=method, url=url, **kwargs)
52
        else:
53
            _kwargs = self._session_kwargs
54
            _kwargs.update(kwargs)
55
            if not kwargs.get('auth', False):
56
                _kwargs['auth'] = self.auth
57
            return (requests.request)(method, url, **_kwargs)
58
59
    def login(self, user=None, password=None, auth=None):
60
        """Create a stable session on the server.
61
62
        :param user_id: user id
63
        :param password: password
64
        :param auth: object for any auth method
65
        :raises: HTTPResponseError in case an HTTP error status was returned
66
        """
67
        self.session = requests.Session()
68
        for k in self._session_kwargs:
69
            setattr(self.session, k, self._session_kwargs[k])
70
71
        self._set_credentials(user, password, auth)
72
        self.session.auth = self.auth
73
        try:
74
            resp = self.session.post(self.url)
75
        except requests.exceptions.SSLError as e:
76
            self.logout()
77
            raise e
78
        except Exception as e:
79
            self.logout()
80
            raise e
81
82
    def logout(self):
83
        """Log out the authenticated user and close the session.
84
85
        :returns: True if the operation succeeded, False otherwise
86
        :raises: HTTPResponseError in case an HTTP error status was returned
87
        """
88
        self.session.close()
89
        self.session = None
90
        return True
91