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

nextcloud.requester.OCSRequester.rtn()   A

Complexity

Conditions 1

Size

Total Lines 3
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

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