16827: Don't append '/' to requests with query params. Bump version
[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             # times = 1 regular call + numberOfRetries
34             response <- httr::RETRY(verb, url = url, body = body,
35                                     config = config, times = retryTimes + 1)
36         },
37
38         createQuery = function(queryParams)
39         {
40             queryParams <- Filter(Negate(is.null), queryParams)
41
42             query <- sapply(queryParams, function(param)
43             {
44                 if(is.list(param) || length(param) > 1)
45                     param <- RListToPythonList(param, ",")
46
47                 URLencode(as.character(param), reserved = T, repeated = T)
48
49             }, USE.NAMES = TRUE)
50
51             if(length(query) > 0)
52             {
53                 query <- paste0(names(query), "=", query, collapse = "&")
54
55                 return(paste0("?", query))
56             }
57
58             return("")
59         },
60
61         getConnection = function(url, headers, openMode)
62         {
63             h <- curl::new_handle()
64             curl::handle_setheaders(h, .list = headers)
65
66             if(toString(Sys.getenv("ARVADOS_API_HOST_INSECURE") == "TRUE"))
67                curl::handle_setopt(h, ssl_verifypeer = 0L)
68
69             conn <- curl::curl(url = url, open = openMode, handle = h)
70         }
71     ),
72
73     cloneable = FALSE
74 )