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