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, relativePath = NULL)
116 collectionURL <- URLencode(paste0(self$getWebDavHostName(),
117 "c=", uuid, "/", relativePath))
119 headers <- list("Authorization" = paste("Bearer", self$token))
121 response <- self$http$exec("PROPFIND", collectionURL, headers,
122 retryTimes = self$numRetries)
124 if(all(response == ""))
125 stop("Response is empty, request may be misconfigured")
127 if(response$status_code < 200 || response$status_code >= 300)
128 stop(paste("Server code:", response$status_code))
130 self$httpParser$getFileNamesFromResponse(response, collectionURL)
133 getResourceSize = function(relativePath, uuid)
135 collectionURL <- URLencode(paste0(self$getWebDavHostName(),
138 subcollectionURL <- paste0(collectionURL, "/", relativePath);
140 headers <- list("Authorization" = paste("OAuth2", self$token))
142 response <- self$http$exec("PROPFIND", subcollectionURL, headers,
143 retryTimes = self$numRetries)
145 if(all(response == ""))
146 stop("Response is empty, request may be misconfigured")
148 if(response$status_code < 200 || response$status_code >= 300)
149 stop(paste("Server code:", response$status_code))
151 sizes <- self$httpParser$getFileSizesFromResponse(response,
156 read = function(relativePath, uuid, contentType = "raw", offset = 0, length = 0)
158 fileURL <- paste0(self$getWebDavHostName(),
159 "c=", uuid, "/", relativePath);
161 range <- paste0("bytes=", offset, "-")
164 range = paste0(range, offset + length - 1)
166 if(offset == 0 && length == 0)
168 headers <- list(Authorization = paste("OAuth2", self$token))
172 headers <- list(Authorization = paste("OAuth2", self$token),
176 if(!(contentType %in% self$httpParser$validContentTypes))
177 stop("Invalid contentType. Please use text or raw.")
179 serverResponse <- self$http$exec("GET", fileURL, headers,
180 retryTimes = self$numRetries)
182 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
183 stop(paste("Server code:", serverResponse$status_code))
185 self$httpParser$parseResponse(serverResponse, contentType)
188 write = function(relativePath, uuid, content, contentType)
190 fileURL <- paste0(self$getWebDavHostName(),
191 "c=", uuid, "/", relativePath);
192 headers <- list(Authorization = paste("OAuth2", self$token),
193 "Content-Type" = contentType)
196 serverResponse <- self$http$exec("PUT", fileURL, headers, body,
197 retryTimes = self$numRetries)
199 if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
200 stop(paste("Server code:", serverResponse$status_code))
202 self$httpParser$parseResponse(serverResponse, "text")
205 getConnection = function(relativePath, uuid, openMode)
207 fileURL <- paste0(self$getWebDavHostName(),
208 "c=", uuid, "/", relativePath);
209 headers <- list(Authorization = paste("OAuth2", self$token))
211 conn <- self$http$getConnection(fileURL, headers, openMode)
217 webDavHostName = NULL,
220 createNewFile = function(relativePath, uuid, contentType)
222 fileURL <- paste0(self$getWebDavHostName(), "c=",
223 uuid, "/", relativePath)
224 headers <- list(Authorization = paste("OAuth2", self$token),
225 "Content-Type" = contentType)
228 serverResponse <- self$http$exec("PUT", fileURL, headers, body,
229 retryTimes = self$numRetries)
231 if (serverResponse$status_code < 200){ # to wyrzuca błędy
232 stop(paste("Server code:", serverResponse$status_code))}
233 else if (serverResponse$status_code >= 300 & serverResponse$status_code < 422) {
234 stop(paste("Server code:", serverResponse$status_code))}
235 else if (serverResponse$status_code == 422 ) {
236 stop(paste("Project of that name already exists. If you want to change it use project_update() instead"))}
238 paste("File created:", relativePath)