1 RESTService <- R6::R6Class(
12 initialize = function(token, rawHost,
15 webDavHostName = NULL)
19 self$httpParser <- httpParser
20 self$numRetries <- numRetries
22 private$rawHostName <- rawHost
23 private$webDavHostName <- webDavHostName
26 setNumConnRetries = function(newNumOfRetries)
28 self$numRetries <- newNumOfRetries
31 getWebDavHostName = function()
33 if(is.null(private$webDavHostName))
35 discoveryDocumentURL <- paste0("https://", private$rawHostName,
36 "/discovery/v1/apis/arvados/v1/rest")
38 headers <- list(Authorization = paste("OAuth2", self$token))
40 serverResponse <- self$http$execute("GET", discoveryDocumentURL, headers,
41 retryTimes = self$numRetries)
43 discoveryDocument <- self$httpParser$parseJSONResponse(serverResponse)
44 private$webDavHostName <- discoveryDocument$keepWebServiceUrl
46 if(is.null(private$webDavHostName))
47 stop("Unable to find WebDAV server.")
50 private$webDavHostName
54 fetchAllItems = function(resourceURL, filters)
56 headers <- list(Authorization = paste("OAuth2", self$token))
59 itemsAvailable <- .Machine$integer.max
61 while(length(items) < itemsAvailable)
63 serverResponse <- self$http$execute(verb = "GET",
70 retryTimes = self$numRetries)
72 parsedResponse <- self$httpParser$parseJSONResponse(serverResponse)
74 if(!is.null(parsedResponse$errors))
75 stop(parsedResponse$errors)
77 items <- c(items, parsedResponse$items)
78 offset <- length(items)
79 itemsAvailable <- parsedResponse$items_available
85 create = function(files, uuid)
87 sapply(files, function(filePath)
89 private$createNewFile(filePath, uuid, "text/html")
93 delete = function(relativePath, uuid)
95 fileURL <- paste0(self$getWebDavHostName(), "c=",
96 uuid, "/", relativePath);
97 headers <- list(Authorization = paste("OAuth2", self$token))
99 serverResponse <- self$http$execute("DELETE", fileURL, headers,
100 retryTimes = self$numRetries)
102 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
103 stop(paste("Server code:", serverResponse$status_code))
108 move = function(from, to, uuid)
110 collectionURL <- paste0(self$getWebDavHostName(), "c=", uuid, "/")
111 fromURL <- paste0(collectionURL, from)
112 toURL <- paste0(collectionURL, to)
114 headers <- list("Authorization" = paste("OAuth2", self$token),
115 "Destination" = toURL)
117 serverResponse <- self$http$execute("MOVE", fromURL, headers,
118 retryTimes = self$numRetries)
120 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
121 stop(paste("Server code:", serverResponse$status_code))
126 getCollectionContent = function(uuid)
128 collectionURL <- URLencode(paste0(self$getWebDavHostName(),
131 headers <- list("Authorization" = paste("OAuth2", self$token))
133 response <- self$http$execute("PROPFIND", collectionURL, headers,
134 retryTimes = self$numRetries)
136 if(all(response == ""))
137 stop("Response is empty, request may be misconfigured")
139 if(response$status_code < 200 || response$status_code >= 300)
140 stop(paste("Server code:", response$status_code))
142 self$httpParser$getFileNamesFromResponse(response, collectionURL)
145 getResourceSize = function(relativePath, uuid)
147 collectionURL <- URLencode(paste0(self$getWebDavHostName(),
150 subcollectionURL <- paste0(collectionURL, "/", relativePath);
152 headers <- list("Authorization" = paste("OAuth2", self$token))
154 response <- self$http$execute("PROPFIND", subcollectionURL, headers,
155 retryTimes = self$numRetries)
157 if(all(response == ""))
158 stop("Response is empty, request may be misconfigured")
160 if(response$status_code < 200 || response$status_code >= 300)
161 stop(paste("Server code:", response$status_code))
163 sizes <- self$httpParser$getFileSizesFromResponse(response,
168 read = function(relativePath, uuid, contentType = "raw", offset = 0, length = 0)
170 fileURL <- paste0(self$getWebDavHostName(),
171 "c=", uuid, "/", relativePath);
173 range <- paste0("bytes=", offset, "-")
176 range = paste0(range, offset + length - 1)
178 if(offset == 0 && length == 0)
180 headers <- list(Authorization = paste("OAuth2", self$token))
184 headers <- list(Authorization = paste("OAuth2", self$token),
188 if(!(contentType %in% self$httpParser$validContentTypes))
189 stop("Invalid contentType. Please use text or raw.")
191 serverResponse <- self$http$execute("GET", fileURL, headers,
192 retryTimes = self$numRetries)
194 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
195 stop(paste("Server code:", serverResponse$status_code))
197 self$httpParser$parseResponse(serverResponse, contentType)
200 write = function(relativePath, uuid, content, contentType)
202 fileURL <- paste0(self$getWebDavHostName(),
203 "c=", uuid, "/", relativePath);
204 headers <- list(Authorization = paste("OAuth2", self$token),
205 "Content-Type" = contentType)
208 serverResponse <- self$http$execute("PUT", fileURL, headers, body,
209 retryTimes = self$numRetries)
211 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
212 stop(paste("Server code:", serverResponse$status_code))
214 self$httpParser$parseResponse(serverResponse, "text")
217 getConnection = function(uuid, relativePath, openMode)
219 fileURL <- paste0(self$getWebDavHostName(),
220 "c=", uuid, "/", relativePath);
221 headers <- list(Authorization = paste("OAuth2", self$token))
223 h <- curl::new_handle()
224 curl::handle_setheaders(h, .list = headers)
226 conn <- curl::curl(url = fileURL, open = openMode, handle = h)
234 webDavHostName = NULL,
237 createNewFile = function(relativePath, uuid, contentType)
239 fileURL <- paste0(self$getWebDavHostName(), "c=",
240 uuid, "/", relativePath)
241 headers <- list(Authorization = paste("OAuth2", self$token),
242 "Content-Type" = contentType)
245 serverResponse <- self$http$execute("PUT", fileURL, headers, body,
246 retryTimes = self$numRetries)
248 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
249 stop(paste("Server code:", serverResponse$status_code))
251 paste("File created:", relativePath)