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$exec("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
53 create = function(files, uuid)
55 sapply(files, function(filePath)
57 private$createNewFile(filePath, uuid, "text/html")
61 delete = function(relativePath, uuid)
63 fileURL <- paste0(self$getWebDavHostName(), "c=",
64 uuid, "/", relativePath);
65 headers <- list(Authorization = paste("OAuth2", self$token))
67 serverResponse <- self$http$exec("DELETE", fileURL, headers,
68 retryTimes = self$numRetries)
70 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
71 stop(paste("Server code:", serverResponse$status_code))
76 move = function(from, to, uuid)
78 collectionURL <- paste0(self$getWebDavHostName(), "c=", uuid, "/")
79 fromURL <- paste0(collectionURL, from)
80 toURL <- paste0(collectionURL, to)
82 headers <- list("Authorization" = paste("OAuth2", self$token),
83 "Destination" = toURL)
85 serverResponse <- self$http$exec("MOVE", fromURL, headers,
86 retryTimes = self$numRetries)
88 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
89 stop(paste("Server code:", serverResponse$status_code))
94 getCollectionContent = function(uuid)
96 collectionURL <- URLencode(paste0(self$getWebDavHostName(),
99 headers <- list("Authorization" = paste("OAuth2", self$token))
101 response <- self$http$exec("PROPFIND", collectionURL, headers,
102 retryTimes = self$numRetries)
104 if(all(response == ""))
105 stop("Response is empty, request may be misconfigured")
107 if(response$status_code < 200 || response$status_code >= 300)
108 stop(paste("Server code:", response$status_code))
110 self$httpParser$getFileNamesFromResponse(response, collectionURL)
113 getResourceSize = function(relativePath, uuid)
115 collectionURL <- URLencode(paste0(self$getWebDavHostName(),
118 subcollectionURL <- paste0(collectionURL, "/", relativePath);
120 headers <- list("Authorization" = paste("OAuth2", self$token))
122 response <- self$http$exec("PROPFIND", subcollectionURL, headers,
123 retryTimes = self$numRetries)
125 if(all(response == ""))
126 stop("Response is empty, request may be misconfigured")
128 if(response$status_code < 200 || response$status_code >= 300)
129 stop(paste("Server code:", response$status_code))
131 sizes <- self$httpParser$getFileSizesFromResponse(response,
136 read = function(relativePath, uuid, contentType = "raw", offset = 0, length = 0)
138 fileURL <- paste0(self$getWebDavHostName(),
139 "c=", uuid, "/", relativePath);
141 range <- paste0("bytes=", offset, "-")
144 range = paste0(range, offset + length - 1)
146 if(offset == 0 && length == 0)
148 headers <- list(Authorization = paste("OAuth2", self$token))
152 headers <- list(Authorization = paste("OAuth2", self$token),
156 if(!(contentType %in% self$httpParser$validContentTypes))
157 stop("Invalid contentType. Please use text or raw.")
159 serverResponse <- self$http$exec("GET", fileURL, headers,
160 retryTimes = self$numRetries)
162 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
163 stop(paste("Server code:", serverResponse$status_code))
165 self$httpParser$parseResponse(serverResponse, contentType)
168 write = function(relativePath, uuid, content, contentType)
170 fileURL <- paste0(self$getWebDavHostName(),
171 "c=", uuid, "/", relativePath);
172 headers <- list(Authorization = paste("OAuth2", self$token),
173 "Content-Type" = contentType)
176 serverResponse <- self$http$exec("PUT", fileURL, headers, body,
177 retryTimes = self$numRetries)
179 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
180 stop(paste("Server code:", serverResponse$status_code))
182 self$httpParser$parseResponse(serverResponse, "text")
185 getConnection = function(uuid, relativePath, openMode)
187 fileURL <- paste0(self$getWebDavHostName(),
188 "c=", uuid, "/", relativePath);
189 headers <- list(Authorization = paste("OAuth2", self$token))
191 h <- curl::new_handle()
192 curl::handle_setheaders(h, .list = headers)
194 conn <- curl::curl(url = fileURL, open = openMode, handle = h)
202 webDavHostName = NULL,
205 createNewFile = function(relativePath, uuid, contentType)
207 fileURL <- paste0(self$getWebDavHostName(), "c=",
208 uuid, "/", relativePath)
209 headers <- list(Authorization = paste("OAuth2", self$token),
210 "Content-Type" = contentType)
213 serverResponse <- self$http$exec("PUT", fileURL, headers, body,
214 retryTimes = self$numRetries)
216 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
217 stop(paste("Server code:", serverResponse$status_code))
219 paste("File created:", relativePath)