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 discoveryDocumentURL <- paste0("https://", private$rawHostName,
40 "/discovery/v1/apis/arvados/v1/rest")
42 headers <- list(Authorization = paste("OAuth2", self$token))
44 serverResponse <- self$http$exec("GET", discoveryDocumentURL, headers,
45 retryTimes = self$numRetries)
47 discoveryDocument <- self$httpParser$parseJSONResponse(serverResponse)
48 private$webDavHostName <- discoveryDocument$keepWebServiceUrl
50 if(is.null(private$webDavHostName))
51 stop("Unable to find WebDAV server.")
54 private$webDavHostName
57 create = function(files, uuid)
59 sapply(files, function(filePath)
61 private$createNewFile(filePath, uuid, "text/html")
65 delete = function(relativePath, uuid)
67 fileURL <- paste0(self$getWebDavHostName(), "c=",
68 uuid, "/", relativePath);
69 headers <- list(Authorization = paste("OAuth2", self$token))
71 serverResponse <- self$http$exec("DELETE", fileURL, headers,
72 retryTimes = self$numRetries)
74 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
75 stop(paste("Server code:", serverResponse$status_code))
80 move = function(from, to, uuid)
82 collectionURL <- paste0(self$getWebDavHostName(), "c=", uuid, "/")
83 fromURL <- paste0(collectionURL, from)
84 toURL <- paste0(collectionURL, trimFromStart(to, "/"))
86 headers <- list("Authorization" = paste("OAuth2", self$token),
87 "Destination" = toURL)
89 serverResponse <- self$http$exec("MOVE", fromURL, headers,
90 retryTimes = self$numRetries)
92 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
93 stop(paste("Server code:", serverResponse$status_code))
98 copy = function(from, to, uuid)
100 collectionURL <- paste0(self$getWebDavHostName(), "c=", uuid, "/")
101 fromURL <- paste0(collectionURL, from)
102 toURL <- paste0(collectionURL, trimFromStart(to, "/"))
104 headers <- list("Authorization" = paste("OAuth2", self$token),
105 "Destination" = toURL)
107 serverResponse <- self$http$exec("COPY", fromURL, headers,
108 retryTimes = self$numRetries)
110 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
111 stop(paste("Server code:", serverResponse$status_code))
116 getCollectionContent = function(uuid)
118 collectionURL <- URLencode(paste0(self$getWebDavHostName(),
121 headers <- list("Authorization" = paste("OAuth2", self$token))
123 response <- self$http$exec("PROPFIND", collectionURL, headers,
124 retryTimes = self$numRetries)
126 if(all(response == ""))
127 stop("Response is empty, request may be misconfigured")
129 if(response$status_code < 200 || response$status_code >= 300)
130 stop(paste("Server code:", response$status_code))
132 self$httpParser$getFileNamesFromResponse(response, collectionURL)
135 getResourceSize = function(relativePath, uuid)
137 collectionURL <- URLencode(paste0(self$getWebDavHostName(),
140 subcollectionURL <- paste0(collectionURL, "/", relativePath);
142 headers <- list("Authorization" = paste("OAuth2", self$token))
144 response <- self$http$exec("PROPFIND", subcollectionURL, headers,
145 retryTimes = self$numRetries)
147 if(all(response == ""))
148 stop("Response is empty, request may be misconfigured")
150 if(response$status_code < 200 || response$status_code >= 300)
151 stop(paste("Server code:", response$status_code))
153 sizes <- self$httpParser$getFileSizesFromResponse(response,
158 read = function(relativePath, uuid, contentType = "raw", offset = 0, length = 0)
160 fileURL <- paste0(self$getWebDavHostName(),
161 "c=", uuid, "/", relativePath);
163 range <- paste0("bytes=", offset, "-")
166 range = paste0(range, offset + length - 1)
168 if(offset == 0 && length == 0)
170 headers <- list(Authorization = paste("OAuth2", self$token))
174 headers <- list(Authorization = paste("OAuth2", self$token),
178 if(!(contentType %in% self$httpParser$validContentTypes))
179 stop("Invalid contentType. Please use text or raw.")
181 serverResponse <- self$http$exec("GET", fileURL, headers,
182 retryTimes = self$numRetries)
184 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
185 stop(paste("Server code:", serverResponse$status_code))
187 self$httpParser$parseResponse(serverResponse, contentType)
190 write = function(relativePath, uuid, content, contentType)
192 fileURL <- paste0(self$getWebDavHostName(),
193 "c=", uuid, "/", relativePath);
194 headers <- list(Authorization = paste("OAuth2", self$token),
195 "Content-Type" = contentType)
198 serverResponse <- self$http$exec("PUT", fileURL, headers, body,
199 retryTimes = self$numRetries)
201 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
202 stop(paste("Server code:", serverResponse$status_code))
204 self$httpParser$parseResponse(serverResponse, "text")
207 getConnection = function(relativePath, uuid, openMode)
209 fileURL <- paste0(self$getWebDavHostName(),
210 "c=", uuid, "/", relativePath);
211 headers <- list(Authorization = paste("OAuth2", self$token))
213 conn <- self$http$getConnection(fileURL, headers, openMode)
219 webDavHostName = NULL,
222 createNewFile = function(relativePath, uuid, contentType)
224 fileURL <- paste0(self$getWebDavHostName(), "c=",
225 uuid, "/", relativePath)
226 headers <- list(Authorization = paste("OAuth2", self$token),
227 "Content-Type" = contentType)
230 serverResponse <- self$http$exec("PUT", fileURL, headers, body,
231 retryTimes = self$numRetries)
233 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
234 stop(paste("Server code:", serverResponse$status_code))
236 paste("File created:", relativePath)