Passed
Pull Request — master (#69)
by
unknown
01:04
created

nextcloud.requester.Requester.rtn()   A

Complexity

Conditions 2

Size

Total Lines 5
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 4
dl 0
loc 5
rs 10
c 0
b 0
f 0
cc 2
nop 2
1
# -*- coding: utf-8 -*-
2
from .response import WebDAVResponse, OCSResponse
3
from .compat import encode_string
4
from .session import catch_connection_error
5
6
7
# from six.moves.urllib import parse
8
def _prepare_url(s):
9
    return encode_string(s)
10
#     if six.PY2 and isinstance(s, unicode):  # noqa: F821
11
#         return parse.urlparse(s).path
12
#     return s
13
14
15
16
class Requester(object):
17
18
    def __init__(self, session, json_output=None, url=None,
19
                 success_code=None):
20
        self.query_components = []
21
        self.h_get = {'OCS-APIRequest': 'true'}
22
        self.h_post = {'OCS-APIRequest': 'true',
23
                       'Content-Type': 'application/x-www-form-urlencoded'}
24
        self.session = session
25
        self.json_output = None
26
        self.API_URL = None
27
        self.SUCCESS_CODE = None
28
29
    def rtn(self, resp):
30
        if self.json_output:
31
            return resp.json()
32
        else:
33
            return resp.content.decode('UTF-8')
34
35
    @catch_connection_error
36
    def get(self, url='', params=None, headers=None):
37
        url = self.get_full_url(url)
38
        res = self.session.request('get', url, headers=(headers or self.h_get),
39
                                   params=params)
40
        return self.rtn(res)
41
42
    @catch_connection_error
43
    def post(self, url='', data=None, headers=None):
44
        url = self.get_full_url(url)
45
        res = self.session.request(
46
            'post', url, data=data, headers=(headers or self.h_post))
47
        return self.rtn(res)
48
49
    @catch_connection_error
50
    def put_with_timestamp(self, url='', data=None, timestamp=None, headers=None):
51
        h_post = headers or self.h_post
52
        if isinstance(timestamp, (float, int)):
53
            h_post['X-OC-MTIME'] = '%.0f' % timestamp
54
        url = self.get_full_url(url)
55
        res = self.session.request('put', url, data=data, headers=h_post)
56
        return self.rtn(res)
57
58
    @catch_connection_error
59
    def put(self, url='', data=None, headers=None):
60
        url = self.get_full_url(url)
61
        res = self.session.request(
62
            'put', url, data=data, headers=(headers or self.h_post))
63
        return self.rtn(res)
64
65
    @catch_connection_error
66
    def delete(self, url='', data=None, headers=None):
67
        url = self.get_full_url(url)
68
        res = self.session.request(
69
            'delete', url, data=data, headers=(headers or self.h_post))
70
        return self.rtn(res)
71
72
    def get_full_url(self, additional_url=''):
73
        """
74
        Build full url for request to NextCloud api
75
76
        Construct url from base_url, API_URL and additional_url (if given),
77
        add format=json param if self.json
78
79
        :param additional_url: str
80
            add to url after api_url
81
        :return: str
82
        """
83
        if isinstance(additional_url, int):
84
            additional_url = str(additional_url)
85
86
        if additional_url:
87
            additional_url = _prepare_url(additional_url)
88
            if not additional_url.startswith('/'):
89
                additional_url = '/{}'.format(additional_url)
90
        if self.json_output:
91
            self.query_components.append('format=json')
92
        ret = '{base_url}{api_url}{additional_url}'.format(base_url=(self.session.url),
93
                                                           api_url=(
94
                                                               self.API_URL),
95
                                                           additional_url=additional_url)
96
        if self.json_output:
97
            ret += '?format=json'
98
99
        return ret
100
101
102
class OCSRequester(Requester):
103
    __doc__ = ' Requester for OCS API '
104
105
    def rtn(self, resp):
106
        return OCSResponse(response=resp, json_output=(self.json_output),
107
                           success_code=(self.SUCCESS_CODE))
108
109
110
class WebDAVRequester(Requester):
111
    __doc__ = ' Requester for WebDAV API '
112
113
    def __init__(self, *args, **kwargs):
114
        (super(WebDAVRequester, self).__init__)(*args, **kwargs)
115
116
    def rtn(self, resp, data=None):
117
        return WebDAVResponse(response=resp, data=data,
118
                              success_code=self.SUCCESS_CODE)
119
120
    @catch_connection_error
121
    def propfind(self, additional_url='', headers=None, data=None):
122
        url = self.get_full_url(additional_url=additional_url)
123
        res = self.session.request('PROPFIND', url, headers=headers, data=data)
124
        return self.rtn(res)
125
126
    @catch_connection_error
127
    def proppatch(self, additional_url='', data=None):
128
        url = self.get_full_url(additional_url=additional_url)
129
        res = self.session.request('PROPPATCH', url, data=data)
130
        return self.rtn(resp=res)
131
132
    @catch_connection_error
133
    def report(self, additional_url='', data=None):
134
        url = self.get_full_url(additional_url=additional_url)
135
        res = self.session.request('REPORT', url, data=data)
136
        return self.rtn(resp=res)
137
138
    @catch_connection_error
139
    def download(self, url='', params=None):
140
        url = self.get_full_url(url)
141
        res = self.session.request(
142
            'get', url, headers=(self.h_get), params=params)
143
        return self.rtn(resp=res, data=(res.content))
144
145
    @catch_connection_error
146
    def make_collection(self, additional_url=''):
147
        url = self.get_full_url(additional_url=additional_url)
148
        res = self.session.request('MKCOL', url=url)
149
        return self.rtn(resp=res)
150
151
    @catch_connection_error
152
    def move(self, url, destination, overwrite=False):
153
        url = self.get_full_url(additional_url=url)
154
        destination_url = self.get_full_url(additional_url=destination)
155
        headers = {'Destination': destination_url.encode('utf-8'),
156
                   'Overwrite': 'T' if overwrite else 'F'}
157
        res = self.session.request('MOVE', url=url, headers=headers)
158
        return self.rtn(resp=res)
159
160
    @catch_connection_error
161
    def copy(self, url, destination, overwrite=False):
162
        url = self.get_full_url(additional_url=url)
163
        destination_url = self.get_full_url(additional_url=destination)
164
        headers = {'Destination': destination_url.encode('utf-8'),
165
                   'Overwrite': 'T' if overwrite else 'F'}
166
        res = self.session.request('COPY', url=url, headers=headers)
167
        return self.rtn(resp=res)
168