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

nextcloud.requester.Requester.rtn()   A

Complexity

Conditions 2

Size

Total Lines 4
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

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