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

nextcloud.requester.Requester.delete()   A

Complexity

Conditions 1

Size

Total Lines 6
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

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