13025: Merge branch 'master' into 13025-keepstore-metrics
[arvados.git] / sdk / R / R / HttpRequest.R
1 source("./R/util.R")
2
3 HttpRequest <- R6::R6Class(
4
5     "HttrRequest",
6
7     public = list(
8
9         validContentTypes = NULL,
10         validVerbs = NULL,
11
12         initialize = function() 
13         {
14             self$validContentTypes <- c("text", "raw")
15             self$validVerbs <- c("GET", "POST", "PUT", "DELETE", "PROPFIND", "MOVE")
16         },
17
18         execute = function(verb, url, headers = NULL, body = NULL, query = NULL,
19                            limit = NULL, offset = NULL, retryTimes = 0)
20         {
21             if(!(verb %in% self$validVerbs))
22                 stop("Http verb is not valid.")
23
24             headers  <- httr::add_headers(unlist(headers))
25             urlQuery <- self$createQuery(query, limit, offset)
26             url      <- paste0(url, urlQuery)
27
28             # times = 1 regular call + numberOfRetries
29             response <- httr::RETRY(verb, url = url, body = body,
30                                     config = headers, times = retryTimes + 1)
31         },
32
33         createQuery = function(filters, limit, offset)
34         {
35             finalQuery <- NULL
36
37             finalQuery <- c(finalQuery, private$createFiltersQuery(filters))
38             finalQuery <- c(finalQuery, private$createLimitQuery(limit))
39             finalQuery <- c(finalQuery, private$createOffsetQuery(offset))
40
41             finalQuery <- finalQuery[!is.null(finalQuery)]
42             finalQuery <- paste0(finalQuery, collapse = "&")
43
44             if(finalQuery != "")
45                 finalQuery <- paste0("/?", finalQuery)
46
47             finalQuery
48         }
49     ),
50
51     private = list(
52
53         createFiltersQuery = function(filters)
54         {
55             if(!is.null(filters))
56             {
57                 filters <- RListToPythonList(filters, ",")
58                 encodedQuery <- URLencode(filters, reserved = T, repeated = T)
59
60                 return(paste0("filters=", encodedQuery))
61             }
62
63             return(NULL)
64         },
65
66         createLimitQuery = function(limit)
67         {
68             if(!is.null(limit))
69             {
70                 limit <- suppressWarnings(as.numeric(limit))
71
72                 if(is.na(limit))
73                     stop("Limit must be a numeric type.")
74                 
75                 return(paste0("limit=", limit))
76             }
77
78             return(NULL)
79         },
80
81         createOffsetQuery = function(offset)
82         {
83             if(!is.null(offset))
84             {
85                 offset <- suppressWarnings(as.numeric(offset))
86
87                 if(is.na(offset))
88                     stop("Offset must be a numeric type.")
89                 
90                 return(paste0("offset=", offset))
91             }
92
93             return(NULL)
94         }
95     ),
96
97     cloneable = FALSE
98 )