1 # Copyright (C) The Arvados Authors. All rights reserved.
3 # SPDX-License-Identifier: Apache-2.0
5 RESTService <- R6::R6Class(
16 initialize = function(token, rawHost,
19 webDavHostName = NULL)
23 self$httpParser <- httpParser
24 self$numRetries <- numRetries
26 private$rawHostName <- rawHost
27 private$webDavHostName <- webDavHostName
30 setNumConnRetries = function(newNumOfRetries)
32 self$numRetries <- newNumOfRetries
35 getWebDavHostName = function()
37 if(is.null(private$webDavHostName))
39 publicConfigURL <- paste0("https://", private$rawHostName,
42 serverResponse <- self$http$exec("GET", publicConfigURL, retryTimes = self$numRetries)
44 configDocument <- self$httpParser$parseJSONResponse(serverResponse)
45 private$webDavHostName <- configDocument$Services$WebDAVDownload$ExternalURL
47 if(is.null(private$webDavHostName))
48 stop("Unable to find WebDAV server.")
51 private$webDavHostName
54 create = function(files, uuid)
56 sapply(files, function(filePath)
58 private$createNewFile(filePath, uuid, "text/html")
62 delete = function(relativePath, uuid)
64 fileURL <- paste0(self$getWebDavHostName(), "c=",
65 uuid, "/", relativePath);
66 headers <- list(Authorization = paste("OAuth2", self$token))
68 serverResponse <- self$http$exec("DELETE", fileURL, headers,
69 retryTimes = self$numRetries)
71 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
72 stop(paste("Server code:", serverResponse$status_code))
77 move = function(from, to, uuid)
79 collectionURL <- paste0(self$getWebDavHostName(), "c=", uuid, "/")
80 fromURL <- paste0(collectionURL, from)
81 toURL <- paste0(collectionURL, trimFromStart(to, "/"))
83 headers <- list("Authorization" = paste("OAuth2", self$token),
84 "Destination" = toURL)
86 serverResponse <- self$http$exec("MOVE", fromURL, headers,
87 retryTimes = self$numRetries)
89 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
90 stop(paste("Server code:", serverResponse$status_code))
95 copy = function(from, to, uuid)
97 collectionURL <- paste0(self$getWebDavHostName(), "c=", uuid, "/")
98 fromURL <- paste0(collectionURL, from)
99 toURL <- paste0(collectionURL, trimFromStart(to, "/"))
101 headers <- list("Authorization" = paste("OAuth2", self$token),
102 "Destination" = toURL)
104 serverResponse <- self$http$exec("COPY", fromURL, headers,
105 retryTimes = self$numRetries)
107 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
108 stop(paste("Server code:", serverResponse$status_code))
113 getCollectionContent = function(uuid)
115 collectionURL <- URLencode(paste0(self$getWebDavHostName(),
118 headers <- list("Authorization" = paste("Bearer", self$token))
120 response <- self$http$exec("PROPFIND", collectionURL, headers,
121 retryTimes = self$numRetries)
123 if(all(response == ""))
124 stop("Response is empty, request may be misconfigured")
126 if(response$status_code < 200 || response$status_code >= 300)
127 stop(paste("Server code:", response$status_code))
129 self$httpParser$getFileNamesFromResponse(response, collectionURL)
132 getResourceSize = function(relativePath, uuid)
134 collectionURL <- URLencode(paste0(self$getWebDavHostName(),
137 subcollectionURL <- paste0(collectionURL, "/", relativePath);
139 headers <- list("Authorization" = paste("OAuth2", self$token))
141 response <- self$http$exec("PROPFIND", subcollectionURL, headers,
142 retryTimes = self$numRetries)
144 if(all(response == ""))
145 stop("Response is empty, request may be misconfigured")
147 if(response$status_code < 200 || response$status_code >= 300)
148 stop(paste("Server code:", response$status_code))
150 sizes <- self$httpParser$getFileSizesFromResponse(response,
155 read = function(relativePath, uuid, contentType = "raw", offset = 0, length = 0)
157 fileURL <- paste0(self$getWebDavHostName(),
158 "c=", uuid, "/", relativePath);
160 range <- paste0("bytes=", offset, "-")
163 range = paste0(range, offset + length - 1)
165 if(offset == 0 && length == 0)
167 headers <- list(Authorization = paste("OAuth2", self$token))
171 headers <- list(Authorization = paste("OAuth2", self$token),
175 if(!(contentType %in% self$httpParser$validContentTypes))
176 stop("Invalid contentType. Please use text or raw.")
178 serverResponse <- self$http$exec("GET", fileURL, headers,
179 retryTimes = self$numRetries)
181 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
182 stop(paste("Server code:", serverResponse$status_code))
184 self$httpParser$parseResponse(serverResponse, contentType)
187 write = function(relativePath, uuid, content, contentType)
189 fileURL <- paste0(self$getWebDavHostName(),
190 "c=", uuid, "/", relativePath);
191 headers <- list(Authorization = paste("OAuth2", self$token),
192 "Content-Type" = contentType)
195 serverResponse <- self$http$exec("PUT", fileURL, headers, body,
196 retryTimes = self$numRetries)
198 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
199 stop(paste("Server code:", serverResponse$status_code))
201 self$httpParser$parseResponse(serverResponse, "text")
204 getConnection = function(relativePath, uuid, openMode)
206 fileURL <- paste0(self$getWebDavHostName(),
207 "c=", uuid, "/", relativePath);
208 headers <- list(Authorization = paste("OAuth2", self$token))
210 conn <- self$http$getConnection(fileURL, headers, openMode)
216 webDavHostName = NULL,
219 createNewFile = function(relativePath, uuid, contentType)
221 fileURL <- paste0(self$getWebDavHostName(), "c=",
222 uuid, "/", relativePath)
223 headers <- list(Authorization = paste("OAuth2", self$token),
224 "Content-Type" = contentType)
227 serverResponse <- self$http$exec("PUT", fileURL, headers, body,
228 retryTimes = self$numRetries)
230 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
231 stop(paste("Server code:", serverResponse$status_code))
233 paste("File created:", relativePath)