+# Copyright (C) The Arvados Authors. All rights reserved.
+#
+# SPDX-License-Identifier: Apache-2.0
+
RESTService <- R6::R6Class(
"RESTService",
public = list(
- hostName = NULL,
token = NULL,
http = NULL,
httpParser = NULL,
numRetries = NULL,
- initialize = function(token, hostName,
+ initialize = function(token, rawHost,
http, httpParser,
numRetries = 0,
webDavHostName = NULL)
{
- version <- "v1"
-
- self$token <- token
- self$hostName <- paste0("https://", hostName,
- "/arvados/", version, "/")
- self$http <- http
- self$httpParser <- httpParser
- self$numRetries <- numRetries
+ self$token <- token
+ self$http <- http
+ self$httpParser <- httpParser
+ self$numRetries <- numRetries
- private$rawHostName <- hostName
+ private$rawHostName <- rawHost
private$webDavHostName <- webDavHostName
},
{
if(is.null(private$webDavHostName))
{
- discoveryDocumentURL <- paste0("https://", private$rawHostName,
- "/discovery/v1/apis/arvados/v1/rest")
+ publicConfigURL <- paste0("https://", private$rawHostName,
+ "/arvados/v1/config")
- headers <- list(Authorization = paste("OAuth2", self$token))
+ serverResponse <- self$http$exec("GET", publicConfigURL, retryTimes = self$numRetries)
- serverResponse <- self$http$execute("GET", discoveryDocumentURL, headers,
- retryTimes = self$numRetries)
-
- discoveryDocument <- self$httpParser$parseJSONResponse(serverResponse)
- private$webDavHostName <- discoveryDocument$keepWebServiceUrl
+ configDocument <- self$httpParser$parseJSONResponse(serverResponse)
+ private$webDavHostName <- configDocument$Services$WebDAVDownload$ExternalURL
if(is.null(private$webDavHostName))
stop("Unable to find WebDAV server.")
private$webDavHostName
},
- getResource = function(resource, uuid)
- {
- resourceURL <- paste0(self$hostName, resource, "/", uuid)
- headers <- list(Authorization = paste("OAuth2", self$token))
-
- serverResponse <- self$http$execute("GET", resourceURL, headers,
- retryTimes = self$numRetries)
-
- resource <- self$httpParser$parseJSONResponse(serverResponse)
-
- if(!is.null(resource$errors))
- stop(resource$errors)
-
- resource
- },
-
- listResources = function(resource, filters = NULL, limit = 100, offset = 0)
- {
- resourceURL <- paste0(self$hostName, resource)
- headers <- list(Authorization = paste("OAuth2", self$token))
- body <- NULL
-
- serverResponse <- self$http$execute("GET", resourceURL, headers, body,
- filters, limit, offset,
- self$numRetries)
-
- resources <- self$httpParser$parseJSONResponse(serverResponse)
-
- if(!is.null(resources$errors))
- stop(resources$errors)
-
- resources
- },
-
- fetchAllItems = function(resourceURL, filters)
- {
- headers <- list(Authorization = paste("OAuth2", self$token))
-
- offset <- 0
- itemsAvailable <- .Machine$integer.max
- items <- c()
- while(length(items) < itemsAvailable)
- {
- serverResponse <- self$http$execute(verb = "GET",
- url = resourceURL,
- headers = headers,
- body = NULL,
- query = filters,
- limit = NULL,
- offset = offset,
- retryTimes = self$numRetries)
-
- parsedResponse <- self$httpParser$parseJSONResponse(serverResponse)
-
- if(!is.null(parsedResponse$errors))
- stop(parsedResponse$errors)
-
- items <- c(items, parsedResponse$items)
- offset <- length(items)
- itemsAvailable <- parsedResponse$items_available
- }
-
- items
- },
-
- deleteResource = function(resource, uuid)
- {
- collectionURL <- paste0(self$hostName, resource, "/", uuid)
- headers <- list("Authorization" = paste("OAuth2", self$token),
- "Content-Type" = "application/json")
-
- serverResponse <- self$http$execute("DELETE", collectionURL, headers,
- retryTimes = self$numRetries)
-
- removedResource <- self$httpParser$parseJSONResponse(serverResponse)
-
- if(!is.null(removedResource$errors))
- stop(removedResource$errors)
-
- removedResource
- },
-
- updateResource = function(resource, uuid, newContent)
- {
- resourceURL <- paste0(self$hostName, resource, "/", uuid)
- headers <- list("Authorization" = paste("OAuth2", self$token),
- "Content-Type" = "application/json")
-
- newContent <- jsonlite::toJSON(newContent, auto_unbox = T)
-
- serverResponse <- self$http$execute("PUT", resourceURL, headers, newContent,
- retryTimes = self$numRetries)
-
- updatedResource <- self$httpParser$parseJSONResponse(serverResponse)
-
- if(!is.null(updatedResource$errors))
- stop(updatedResource$errors)
-
- updatedResource
- },
-
- createResource = function(resource, content)
- {
- resourceURL <- paste0(self$hostName, resource)
- headers <- list("Authorization" = paste("OAuth2", self$token),
- "Content-Type" = "application/json")
-
- content <- jsonlite::toJSON(content, auto_unbox = T)
-
- serverResponse <- self$http$execute("POST", resourceURL, headers, content,
- retryTimes = self$numRetries)
-
- newResource <- self$httpParser$parseJSONResponse(serverResponse)
-
- if(!is.null(newResource$errors))
- stop(newResource$errors)
-
- newResource
- },
-
create = function(files, uuid)
{
sapply(files, function(filePath)
{
fileURL <- paste0(self$getWebDavHostName(), "c=",
uuid, "/", relativePath);
- headers <- list(Authorization = paste("OAuth2", self$token))
+ headers <- list(Authorization = paste("OAuth2", self$token))
- serverResponse <- self$http$execute("DELETE", fileURL, headers,
- retryTimes = self$numRetries)
+ serverResponse <- self$http$exec("DELETE", fileURL, headers,
+ retryTimes = self$numRetries)
if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
stop(paste("Server code:", serverResponse$status_code))
{
collectionURL <- paste0(self$getWebDavHostName(), "c=", uuid, "/")
fromURL <- paste0(collectionURL, from)
- toURL <- paste0(collectionURL, to)
+ toURL <- paste0(collectionURL, trimFromStart(to, "/"))
headers <- list("Authorization" = paste("OAuth2", self$token),
- "Destination" = toURL)
+ "Destination" = toURL)
- serverResponse <- self$http$execute("MOVE", fromURL, headers,
- retryTimes = self$numRetries)
+ serverResponse <- self$http$exec("MOVE", fromURL, headers,
+ retryTimes = self$numRetries)
+
+ if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
+ stop(paste("Server code:", serverResponse$status_code))
+
+ serverResponse
+ },
+
+ copy = function(from, to, uuid)
+ {
+ collectionURL <- paste0(self$getWebDavHostName(), "c=", uuid, "/")
+ fromURL <- paste0(collectionURL, from)
+ toURL <- paste0(collectionURL, trimFromStart(to, "/"))
+
+ headers <- list("Authorization" = paste("OAuth2", self$token),
+ "Destination" = toURL)
+
+ serverResponse <- self$http$exec("COPY", fromURL, headers,
+ retryTimes = self$numRetries)
if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
stop(paste("Server code:", serverResponse$status_code))
collectionURL <- URLencode(paste0(self$getWebDavHostName(),
"c=", uuid))
- headers <- list("Authorization" = paste("OAuth2", self$token))
+ headers <- list("Authorization" = paste("Bearer", self$token))
- response <- self$http$execute("PROPFIND", collectionURL, headers,
- retryTimes = self$numRetries)
+ response <- self$http$exec("PROPFIND", collectionURL, headers,
+ retryTimes = self$numRetries)
if(all(response == ""))
stop("Response is empty, request may be misconfigured")
headers <- list("Authorization" = paste("OAuth2", self$token))
- response <- self$http$execute("PROPFIND", subcollectionURL, headers,
- retryTimes = self$numRetries)
+ response <- self$http$exec("PROPFIND", subcollectionURL, headers,
+ retryTimes = self$numRetries)
if(all(response == ""))
stop("Response is empty, request may be misconfigured")
if(!(contentType %in% self$httpParser$validContentTypes))
stop("Invalid contentType. Please use text or raw.")
- serverResponse <- self$http$execute("GET", fileURL, headers,
- retryTimes = self$numRetries)
+ serverResponse <- self$http$exec("GET", fileURL, headers,
+ retryTimes = self$numRetries)
if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
stop(paste("Server code:", serverResponse$status_code))
"Content-Type" = contentType)
body <- content
- serverResponse <- self$http$execute("PUT", fileURL, headers, body,
- retryTimes = self$numRetries)
+ serverResponse <- self$http$exec("PUT", fileURL, headers, body,
+ retryTimes = self$numRetries)
if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
stop(paste("Server code:", serverResponse$status_code))
self$httpParser$parseResponse(serverResponse, "text")
},
- getConnection = function(uuid, relativePath, openMode)
+ getConnection = function(relativePath, uuid, openMode)
{
- fileURL <- paste0(self$getWebDavHostName(),
+ fileURL <- paste0(self$getWebDavHostName(),
"c=", uuid, "/", relativePath);
headers <- list(Authorization = paste("OAuth2", self$token))
- h <- curl::new_handle()
- curl::handle_setheaders(h, .list = headers)
-
- conn <- curl::curl(url = fileURL, open = openMode, handle = h)
-
- conn
+ conn <- self$http$getConnection(fileURL, headers, openMode)
}
),
{
fileURL <- paste0(self$getWebDavHostName(), "c=",
uuid, "/", relativePath)
- headers <- list(Authorization = paste("OAuth2", self$token),
+ headers <- list(Authorization = paste("OAuth2", self$token),
"Content-Type" = contentType)
body <- NULL
- serverResponse <- self$http$execute("PUT", fileURL, headers, body,
- retryTimes = self$numRetries)
+ serverResponse <- self$http$exec("PUT", fileURL, headers, body,
+ retryTimes = self$numRetries)
if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
stop(paste("Server code:", serverResponse$status_code))