1 RESTService <- R6::R6Class(
13 initialize = function(token, hostName,
16 webDavHostName = NULL)
21 self$hostName <- paste0("https://", hostName,
22 "/arvados/", version, "/")
24 self$httpParser <- httpParser
25 self$numRetries <- numRetries
27 private$rawHostName <- hostName
28 private$webDavHostName <- webDavHostName
31 setNumConnRetries = function(newNumOfRetries)
33 self$numRetries <- newNumOfRetries
36 getWebDavHostName = function()
38 if(is.null(private$webDavHostName))
40 discoveryDocumentURL <- paste0("https://", private$rawHostName,
41 "/discovery/v1/apis/arvados/v1/rest")
43 headers <- list(Authorization = paste("OAuth2", self$token))
45 serverResponse <- self$http$execute("GET", discoveryDocumentURL, headers,
46 retryTimes = self$numRetries)
48 discoveryDocument <- self$httpParser$parseJSONResponse(serverResponse)
49 private$webDavHostName <- discoveryDocument$keepWebServiceUrl
51 if(is.null(private$webDavHostName))
52 stop("Unable to find WebDAV server.")
55 private$webDavHostName
58 getResource = function(resource, uuid)
60 resourceURL <- paste0(self$hostName, resource, "/", uuid)
61 headers <- list(Authorization = paste("OAuth2", self$token))
63 serverResponse <- self$http$execute("GET", resourceURL, headers,
64 retryTimes = self$numRetries)
66 resource <- self$httpParser$parseJSONResponse(serverResponse)
68 if(!is.null(resource$errors))
74 listResources = function(resource, filters = NULL, limit = 100, offset = 0)
76 resourceURL <- paste0(self$hostName, resource)
77 headers <- list(Authorization = paste("OAuth2", self$token))
80 serverResponse <- self$http$execute("GET", resourceURL, headers, body,
81 filters, limit, offset,
84 resources <- self$httpParser$parseJSONResponse(serverResponse)
86 if(!is.null(resources$errors))
87 stop(resources$errors)
92 fetchAllItems = function(resourceURL, filters)
94 headers <- list(Authorization = paste("OAuth2", self$token))
97 itemsAvailable <- .Machine$integer.max
99 while(length(items) < itemsAvailable)
101 serverResponse <- self$http$execute(verb = "GET",
108 retryTimes = self$numRetries)
110 parsedResponse <- self$httpParser$parseJSONResponse(serverResponse)
112 if(!is.null(parsedResponse$errors))
113 stop(parsedResponse$errors)
115 items <- c(items, parsedResponse$items)
116 offset <- length(items)
117 itemsAvailable <- parsedResponse$items_available
123 deleteResource = function(resource, uuid)
125 collectionURL <- paste0(self$hostName, resource, "/", uuid)
126 headers <- list("Authorization" = paste("OAuth2", self$token),
127 "Content-Type" = "application/json")
129 serverResponse <- self$http$execute("DELETE", collectionURL, headers,
130 retryTimes = self$numRetries)
132 removedResource <- self$httpParser$parseJSONResponse(serverResponse)
134 if(!is.null(removedResource$errors))
135 stop(removedResource$errors)
140 updateResource = function(resource, uuid, newContent)
142 resourceURL <- paste0(self$hostName, resource, "/", uuid)
143 headers <- list("Authorization" = paste("OAuth2", self$token),
144 "Content-Type" = "application/json")
146 newContent <- jsonlite::toJSON(newContent, auto_unbox = T)
148 serverResponse <- self$http$execute("PUT", resourceURL, headers, newContent,
149 retryTimes = self$numRetries)
151 updatedResource <- self$httpParser$parseJSONResponse(serverResponse)
153 if(!is.null(updatedResource$errors))
154 stop(updatedResource$errors)
159 createResource = function(resource, content)
161 resourceURL <- paste0(self$hostName, resource)
162 headers <- list("Authorization" = paste("OAuth2", self$token),
163 "Content-Type" = "application/json")
165 content <- jsonlite::toJSON(content, auto_unbox = T)
167 serverResponse <- self$http$execute("POST", resourceURL, headers, content,
168 retryTimes = self$numRetries)
170 newResource <- self$httpParser$parseJSONResponse(serverResponse)
172 if(!is.null(newResource$errors))
173 stop(newResource$errors)
178 create = function(files, uuid)
180 sapply(files, function(filePath)
182 private$createNewFile(filePath, uuid, "text/html")
186 delete = function(relativePath, uuid)
188 fileURL <- paste0(self$getWebDavHostName(), "c=",
189 uuid, "/", relativePath);
190 headers <- list(Authorization = paste("OAuth2", self$token))
192 serverResponse <- self$http$execute("DELETE", fileURL, headers,
193 retryTimes = self$numRetries)
195 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
196 stop(paste("Server code:", serverResponse$status_code))
201 move = function(from, to, uuid)
203 collectionURL <- paste0(self$getWebDavHostName(), "c=", uuid, "/")
204 fromURL <- paste0(collectionURL, from)
205 toURL <- paste0(collectionURL, to)
207 headers <- list("Authorization" = paste("OAuth2", self$token),
208 "Destination" = toURL)
210 serverResponse <- self$http$execute("MOVE", fromURL, headers,
211 retryTimes = self$numRetries)
213 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
214 stop(paste("Server code:", serverResponse$status_code))
219 getCollectionContent = function(uuid)
221 collectionURL <- URLencode(paste0(self$getWebDavHostName(),
224 headers <- list("Authorization" = paste("OAuth2", self$token))
226 response <- self$http$execute("PROPFIND", collectionURL, headers,
227 retryTimes = self$numRetries)
229 if(all(response == ""))
230 stop("Response is empty, request may be misconfigured")
232 if(response$status_code < 200 || response$status_code >= 300)
233 stop(paste("Server code:", response$status_code))
235 self$httpParser$getFileNamesFromResponse(response, collectionURL)
238 getResourceSize = function(relativePath, uuid)
240 collectionURL <- URLencode(paste0(self$getWebDavHostName(),
243 subcollectionURL <- paste0(collectionURL, "/", relativePath);
245 headers <- list("Authorization" = paste("OAuth2", self$token))
247 response <- self$http$execute("PROPFIND", subcollectionURL, headers,
248 retryTimes = self$numRetries)
250 if(all(response == ""))
251 stop("Response is empty, request may be misconfigured")
253 if(response$status_code < 200 || response$status_code >= 300)
254 stop(paste("Server code:", response$status_code))
256 sizes <- self$httpParser$getFileSizesFromResponse(response,
261 read = function(relativePath, uuid, contentType = "raw", offset = 0, length = 0)
263 fileURL <- paste0(self$getWebDavHostName(),
264 "c=", uuid, "/", relativePath);
266 range <- paste0("bytes=", offset, "-")
269 range = paste0(range, offset + length - 1)
271 if(offset == 0 && length == 0)
273 headers <- list(Authorization = paste("OAuth2", self$token))
277 headers <- list(Authorization = paste("OAuth2", self$token),
281 if(!(contentType %in% self$httpParser$validContentTypes))
282 stop("Invalid contentType. Please use text or raw.")
284 serverResponse <- self$http$execute("GET", fileURL, headers,
285 retryTimes = self$numRetries)
287 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
288 stop(paste("Server code:", serverResponse$status_code))
290 self$httpParser$parseResponse(serverResponse, contentType)
293 write = function(relativePath, uuid, content, contentType)
295 fileURL <- paste0(self$getWebDavHostName(),
296 "c=", uuid, "/", relativePath);
297 headers <- list(Authorization = paste("OAuth2", self$token),
298 "Content-Type" = contentType)
301 serverResponse <- self$http$execute("PUT", fileURL, headers, body,
302 retryTimes = self$numRetries)
304 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
305 stop(paste("Server code:", serverResponse$status_code))
307 self$httpParser$parseResponse(serverResponse, "text")
310 getConnection = function(uuid, relativePath, openMode)
312 fileURL <- paste0(self$getWebDavHostName(),
313 "c=", uuid, "/", relativePath);
314 headers <- list(Authorization = paste("OAuth2", self$token))
316 h <- curl::new_handle()
317 curl::handle_setheaders(h, .list = headers)
319 conn <- curl::curl(url = fileURL, open = openMode, handle = h)
327 webDavHostName = NULL,
330 createNewFile = function(relativePath, uuid, contentType)
332 fileURL <- paste0(self$getWebDavHostName(), "c=",
333 uuid, "/", relativePath)
334 headers <- list(Authorization = paste("OAuth2", self$token),
335 "Content-Type" = contentType)
338 serverResponse <- self$http$execute("PUT", fileURL, headers, body,
339 retryTimes = self$numRetries)
341 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
342 stop(paste("Server code:", serverResponse$status_code))
344 paste("File created:", relativePath)