forked from EnterpriseyIntranet/nextcloud-API
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrequester.py
More file actions
170 lines (134 loc) · 5.85 KB
/
requester.py
File metadata and controls
170 lines (134 loc) · 5.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# -*- coding: utf-8 -*-
import requests
from functools import wraps
from .response import WebDAVResponse, OCSResponse
class NextCloudConnectionError(Exception):
""" A connection error occurred """
def catch_connection_error(func):
@wraps(func)
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except requests.RequestException as e:
raise NextCloudConnectionError("Failed to establish connection to NextCloud",
getattr(e.request, 'url', None), e)
return wrapper
class Requester(object):
def __init__(self, endpoint, user, passwd, json_output=False):
self.query_components = []
self.json_output = json_output
self.base_url = endpoint
self.h_get = {"OCS-APIRequest": "true",
"Accept": "application/json"}
self.h_post = {"OCS-APIRequest": "true",
"Content-Type": "application/json"}
self.auth_pk = (user, passwd)
self.API_URL = None
self.SUCCESS_CODE = None
def rtn(self, resp):
if self.json_output:
return resp.json()
else:
return resp.content.decode("UTF-8")
@catch_connection_error
def get(self, url="", params=None):
url = self.get_full_url(url)
res = requests.get(url, auth=self.auth_pk, headers=self.h_get, params=params)
return self.rtn(res)
@catch_connection_error
def post(self, url="", data=None):
url = self.get_full_url(url)
res = requests.post(url, auth=self.auth_pk, json=data, headers=self.h_post)
return self.rtn(res)
@catch_connection_error
def put_with_timestamp(self, url="", data=None, timestamp=None):
h_post = self.h_post
if isinstance(timestamp, (float, int)):
h_post["X-OC-MTIME"] = f"{timestamp:.0f}"
url = self.get_full_url(url)
res = requests.put(url, auth=self.auth_pk, data=data, headers=h_post)
return self.rtn(res)
@catch_connection_error
def put(self, url="", data=None):
url = self.get_full_url(url)
res = requests.put(url, auth=self.auth_pk, data=data, headers=self.h_post)
return self.rtn(res)
@catch_connection_error
def delete(self, url="", data=None):
url = self.get_full_url(url)
res = requests.delete(url, auth=self.auth_pk, data=data, headers=self.h_post)
return self.rtn(res)
def get_full_url(self, additional_url=""):
"""
Build full url for request to NextCloud api
Construct url from self.base_url, self.API_URL, additional_url (if given),
add format=json param if self.json
:param additional_url: str
add to url after api_url
:return: str
"""
if additional_url and not str(additional_url).startswith("/"):
additional_url = "/{}".format(additional_url)
if self.json_output:
self.query_components.append("format=json")
ret = "{base_url}{api_url}{additional_url}".format(
base_url=self.base_url, api_url=self.API_URL, additional_url=additional_url)
if self.json_output:
ret += "?format=json"
return ret
class OCSRequester(Requester):
""" Requester for OCS API """
def rtn(self, resp):
return OCSResponse(response=resp,
json_output=self.json_output, success_code=self.SUCCESS_CODE)
class WebDAVRequester(Requester):
""" Requester for WebDAV API """
def __init__(self, *args, **kwargs):
super(WebDAVRequester, self).__init__(*args, **kwargs)
def rtn(self, resp, data=None):
return WebDAVResponse(response=resp, data=data)
@catch_connection_error
def propfind(self, additional_url="", headers=None, data=None):
url = self.get_full_url(additional_url=additional_url)
res = requests.request('PROPFIND', url, auth=self.auth_pk, headers=headers, data=data)
return self.rtn(res)
@catch_connection_error
def proppatch(self, additional_url="", data=None):
url = self.get_full_url(additional_url=additional_url)
res = requests.request('PROPPATCH', url, auth=self.auth_pk, data=data)
return self.rtn(resp=res)
@catch_connection_error
def report(self, additional_url="", data=None):
url = self.get_full_url(additional_url=additional_url)
res = requests.request('REPORT', url, auth=self.auth_pk, data=data)
return self.rtn(resp=res)
@catch_connection_error
def download(self, url="", params=None):
url = self.get_full_url(url)
res = requests.get(url, auth=self.auth_pk, headers=self.h_get, params=params)
return self.rtn(resp=res, data=res.content)
@catch_connection_error
def make_collection(self, additional_url=""):
url = self.get_full_url(additional_url=additional_url)
res = requests.request("MKCOL", url=url, auth=self.auth_pk)
return self.rtn(resp=res)
@catch_connection_error
def move(self, url, destination, overwrite=False):
url = self.get_full_url(additional_url=url)
destionation_url = self.get_full_url(additional_url=destination)
headers = {
"Destination": destionation_url.encode('utf-8'),
"Overwrite": "T" if overwrite else "F"
}
res = requests.request("MOVE", url=url, auth=self.auth_pk, headers=headers)
return self.rtn(resp=res)
@catch_connection_error
def copy(self, url, destination, overwrite=False):
url = self.get_full_url(additional_url=url)
destionation_url = self.get_full_url(additional_url=destination)
headers = {
"Destination": destionation_url,
"Overwrite": "T" if overwrite else "F"
}
res = requests.request("COPY", url=url, auth=self.auth_pk, headers=headers)
return self.rtn(resp=res)