a0e8077bc557e2b1ebfd062eef9ca03a0ebdceab
[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         exec = function(verb, url, headers = NULL, body = NULL, queryParams = NULL,
34                         retryTimes = 0)
35         {
36             if(!(verb %in% self$validVerbs))
37                 stop("Http verb is not valid.")
38
39             headers  <- httr::add_headers(unlist(headers))
40             urlQuery <- self$genQuery(queryParams)
41             url      <- paste0(url, urlQuery)
42
43             # times = 1 regular call + numberOfRetries
44             response <- httr::RETRY(verb, url = url, body = body,
45                                     config = headers, times = retryTimes + 1)
46         },
47
48         createQuery = function(filters, limit, offset)
49         {
50             finalQuery <- NULL
51
52             finalQuery <- c(finalQuery, private$createFiltersQuery(filters))
53             finalQuery <- c(finalQuery, private$createLimitQuery(limit))
54             finalQuery <- c(finalQuery, private$createOffsetQuery(offset))
55
56             finalQuery <- finalQuery[!is.null(finalQuery)]
57             finalQuery <- paste0(finalQuery, collapse = "&")
58
59             if(finalQuery != "")
60                 finalQuery <- paste0("/?", finalQuery)
61
62             finalQuery
63         },
64
65         genQuery = function(queryParams)
66         {
67             queryParams <- Filter(Negate(is.null), queryParams)
68
69             query <- sapply(queryParams, function(param)
70             {
71                 if(is.list(param) || length(param) > 1)
72                     param <- RListToPythonList(param, ",")
73
74                 URLencode(as.character(param), reserved = T, repeated = T)
75
76             }, USE.NAMES = TRUE)
77
78             if(length(query) > 0)
79             {
80                 query <- paste0(names(query), "=", query, collapse = "&")
81
82                 return(paste0("/?", query))
83             }
84
85             return("")
86         }
87     ),
88
89     private = list(
90
91         createFiltersQuery = function(filters)
92         {
93             if(!is.null(filters))
94             {
95                 filters <- RListToPythonList(filters, ",")
96                 encodedQuery <- URLencode(filters, reserved = T, repeated = T)
97
98                 return(paste0("filters=", encodedQuery))
99             }
100
101             return(NULL)
102         },
103
104         createLimitQuery = function(limit)
105         {
106             if(!is.null(limit))
107             {
108                 limit <- suppressWarnings(as.numeric(limit))
109
110                 if(is.na(limit))
111                     stop("Limit must be a numeric type.")
112                 
113                 return(paste0("limit=", limit))
114             }
115
116             return(NULL)
117         },
118
119         createOffsetQuery = function(offset)
120         {
121             if(!is.null(offset))
122             {
123                 offset <- suppressWarnings(as.numeric(offset))
124
125                 if(is.na(offset))
126                     stop("Offset must be a numeric type.")
127                 
128                 return(paste0("offset=", offset))
129             }
130
131             return(NULL)
132         }
133     ),
134
135     cloneable = FALSE
136 )