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, 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 getCollectionContent = function(uuid)
100 collectionURL <- URLencode(paste0(self$getWebDavHostName(),
103 headers <- list("Authorization" = paste("OAuth2", self$token))
105 response <- self$http$exec("PROPFIND", collectionURL, headers,
106 retryTimes = self$numRetries)
108 if(all(response == ""))
109 stop("Response is empty, request may be misconfigured")
111 if(response$status_code < 200 || response$status_code >= 300)
112 stop(paste("Server code:", response$status_code))
114 self$httpParser$getFileNamesFromResponse(response, collectionURL)
117 getResourceSize = function(relativePath, uuid)
119 collectionURL <- URLencode(paste0(self$getWebDavHostName(),
122 subcollectionURL <- paste0(collectionURL, "/", relativePath);
124 headers <- list("Authorization" = paste("OAuth2", self$token))
126 response <- self$http$exec("PROPFIND", subcollectionURL, headers,
127 retryTimes = self$numRetries)
129 if(all(response == ""))
130 stop("Response is empty, request may be misconfigured")
132 if(response$status_code < 200 || response$status_code >= 300)
133 stop(paste("Server code:", response$status_code))
135 sizes <- self$httpParser$getFileSizesFromResponse(response,
140 read = function(relativePath, uuid, contentType = "raw", offset = 0, length = 0)
142 fileURL <- paste0(self$getWebDavHostName(),
143 "c=", uuid, "/", relativePath);
145 range <- paste0("bytes=", offset, "-")
148 range = paste0(range, offset + length - 1)
150 if(offset == 0 && length == 0)
152 headers <- list(Authorization = paste("OAuth2", self$token))
156 headers <- list(Authorization = paste("OAuth2", self$token),
160 if(!(contentType %in% self$httpParser$validContentTypes))
161 stop("Invalid contentType. Please use text or raw.")
163 serverResponse <- self$http$exec("GET", fileURL, headers,
164 retryTimes = self$numRetries)
166 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
167 stop(paste("Server code:", serverResponse$status_code))
169 self$httpParser$parseResponse(serverResponse, contentType)
172 write = function(relativePath, uuid, content, contentType)
174 fileURL <- paste0(self$getWebDavHostName(),
175 "c=", uuid, "/", relativePath);
176 headers <- list(Authorization = paste("OAuth2", self$token),
177 "Content-Type" = contentType)
180 serverResponse <- self$http$exec("PUT", fileURL, headers, body,
181 retryTimes = self$numRetries)
183 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
184 stop(paste("Server code:", serverResponse$status_code))
186 self$httpParser$parseResponse(serverResponse, "text")
189 getConnection = function(uuid, relativePath, openMode)
191 fileURL <- paste0(self$getWebDavHostName(),
192 "c=", uuid, "/", relativePath);
193 headers <- list(Authorization = paste("OAuth2", self$token))
195 h <- curl::new_handle()
196 curl::handle_setheaders(h, .list = headers)
198 conn <- curl::curl(url = fileURL, open = openMode, handle = h)
206 webDavHostName = NULL,
209 createNewFile = function(relativePath, uuid, contentType)
211 fileURL <- paste0(self$getWebDavHostName(), "c=",
212 uuid, "/", relativePath)
213 headers <- list(Authorization = paste("OAuth2", self$token),
214 "Content-Type" = contentType)
217 serverResponse <- self$http$exec("PUT", fileURL, headers, body,
218 retryTimes = self$numRetries)
220 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
221 stop(paste("Server code:", serverResponse$status_code))
223 paste("File created:", relativePath)