07defca90f4c99e8be9f8a73f7412f398ab1a701
[arvados.git] / sdk / R / R / HttpRequest.R
1 # Copyright (C) The Arvados Authors. All rights reserved.
2 #
3 # SPDX-License-Identifier: Apache-2.0
4
5 source("./R/util.R")
6
7 HttpRequest <- R6::R6Class(
8
9     "HttrRequest",
10
11     public = list(
12
13         validContentTypes = NULL,
14         validVerbs = NULL,
15
16         initialize = function()
17         {
18             self$validContentTypes <- c("text", "raw")
19             self$validVerbs <- c("GET", "POST", "PUT", "DELETE", "PROPFIND", "MOVE", "COPY")
20         },
21
22         exec = function(verb, url, headers = NULL, body = NULL, queryParams = NULL,
23                         retryTimes = 0)
24         {
25             if(!(verb %in% self$validVerbs))
26                 stop("Http verb is not valid.")
27
28             urlQuery <- self$createQuery(queryParams)
29             url      <- paste0(url, urlQuery)
30
31             config <- httr::add_headers(unlist(headers))
32             if(toString(Sys.getenv("ARVADOS_API_HOST_INSECURE") == "TRUE"))
33                config$options = list(ssl_verifypeer = 0L)
34
35             # times = 1 regular call + numberOfRetries
36             response <- httr::RETRY(verb, url = url, body = body,
37                                     config = config, times = retryTimes + 1)
38         },
39
40         createQuery = function(queryParams)
41         {
42             queryParams <- Filter(Negate(is.null), queryParams)
43
44             query <- sapply(queryParams, function(param)
45             {
46                 if(is.list(param) || length(param) > 1)
47                     param <- RListToPythonList(param, ",")
48
49                 URLencode(as.character(param), reserved = T, repeated = T)
50
51             }, USE.NAMES = TRUE)
52
53             if(length(query) > 0)
54             {
55                 query <- paste0(names(query), "=", query, collapse = "&")
56
57                 return(paste0("/?", query))
58             }
59
60             return("")
61         },
62
63         getConnection = function(url, headers, openMode)
64         {
65             h <- curl::new_handle()
66             curl::handle_setheaders(h, .list = headers)
67
68             if(toString(Sys.getenv("ARVADOS_API_HOST_INSECURE") == "TRUE"))
69                curl::handle_setopt(h, ssl_verifypeer = 0L)
70
71             conn <- curl::curl(url = url, open = openMode, handle = h)
72         }
73     ),
74
75     cloneable = FALSE
76 )