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