+# Copyright (C) The Arvados Authors. All rights reserved.
+#
+# SPDX-License-Identifier: Apache-2.0
+
source("./R/util.R")
HttpRequest <- R6::R6Class(
validContentTypes = NULL,
validVerbs = NULL,
- initialize = function()
+ initialize = function()
{
self$validContentTypes <- c("text", "raw")
- self$validVerbs <- c("GET", "POST", "PUT", "DELETE", "PROPFIND", "MOVE")
+ self$validVerbs <- c("GET", "POST", "PUT", "DELETE", "PROPFIND", "MOVE", "COPY")
},
- execute = function(verb, url, headers = NULL, body = NULL, query = NULL,
- limit = NULL, offset = NULL, retryTimes = 0)
+ exec = function(verb, url, headers = NULL, body = NULL, queryParams = NULL,
+ retryTimes = 0)
{
if(!(verb %in% self$validVerbs))
stop("Http verb is not valid.")
- headers <- httr::add_headers(unlist(headers))
- urlQuery <- self$createQuery(query, limit, offset)
+ urlQuery <- self$createQuery(queryParams)
url <- paste0(url, urlQuery)
+ config <- httr::add_headers(unlist(headers))
+ if(toString(Sys.getenv("ARVADOS_API_HOST_INSECURE") == "TRUE"))
+ config$options = list(ssl_verifypeer = 0L)
+
# times = 1 regular call + numberOfRetries
response <- httr::RETRY(verb, url = url, body = body,
- config = headers, times = retryTimes + 1)
+ config = config, times = retryTimes + 1)
},
- createQuery = function(filters, limit, offset)
+ createQuery = function(queryParams)
{
- finalQuery <- NULL
-
- finalQuery <- c(finalQuery, private$createFiltersQuery(filters))
- finalQuery <- c(finalQuery, private$createLimitQuery(limit))
- finalQuery <- c(finalQuery, private$createOffsetQuery(offset))
-
- finalQuery <- finalQuery[!is.null(finalQuery)]
- finalQuery <- paste0(finalQuery, collapse = "&")
-
- if(finalQuery != "")
- finalQuery <- paste0("/?", finalQuery)
-
- finalQuery
- }
- ),
+ queryParams <- Filter(Negate(is.null), queryParams)
- private = list(
-
- createFiltersQuery = function(filters)
- {
- if(!is.null(filters))
+ query <- sapply(queryParams, function(param)
{
- filters <- RListToPythonList(filters, ",")
- encodedQuery <- URLencode(filters, reserved = T, repeated = T)
+ if(is.list(param) || length(param) > 1)
+ param <- RListToPythonList(param, ",")
- return(paste0("filters=", encodedQuery))
- }
+ URLencode(as.character(param), reserved = T, repeated = T)
- return(NULL)
- },
+ }, USE.NAMES = TRUE)
- createLimitQuery = function(limit)
- {
- if(!is.null(limit))
+ if(length(query) > 0)
{
- limit <- suppressWarnings(as.numeric(limit))
+ query <- paste0(names(query), "=", query, collapse = "&")
- if(is.na(limit))
- stop("Limit must be a numeric type.")
-
- return(paste0("limit=", limit))
+ return(paste0("/?", query))
}
- return(NULL)
+ return("")
},
- createOffsetQuery = function(offset)
+ getConnection = function(url, headers, openMode)
{
- if(!is.null(offset))
- {
- offset <- suppressWarnings(as.numeric(offset))
+ h <- curl::new_handle()
+ curl::handle_setheaders(h, .list = headers)
- if(is.na(offset))
- stop("Offset must be a numeric type.")
-
- return(paste0("offset=", offset))
- }
+ if(toString(Sys.getenv("ARVADOS_API_HOST_INSECURE") == "TRUE"))
+ curl::handle_setopt(h, ssl_verifypeer = 0L)
- return(NULL)
+ conn <- curl::curl(url = url, open = openMode, handle = h)
}
),