Collection classes no longer use each others private state.
[arvados.git] / sdk / R / R / HttpRequest.R
1 HttpRequest <- R6::R6Class(
2
3     "HttrRequest",
4
5     public = list(
6
7         validContentTypes = NULL,
8
9         initialize = function() 
10         {
11             self$validContentTypes <- c("text", "raw")
12         },
13
14         GET = function(url, headers = NULL, queryFilters = NULL, limit = NULL, offset = NULL)
15         {
16             headers <- httr::add_headers(unlist(headers))
17             query <- private$createQuery(queryFilters, limit, offset)
18             url <- paste0(url, query)
19
20             serverResponse <- httr::GET(url = url, config = headers)
21         },
22
23         PUT = function(url, headers = NULL, body = NULL,
24                        queryFilters = NULL, limit = NULL, offset = NULL)
25         {
26             headers <- httr::add_headers(unlist(headers))
27             query <- private$createQuery(queryFilters, limit, offset)
28             url <- paste0(url, query)
29             print(url)
30
31             serverResponse <- httr::PUT(url = url, config = headers, body = body)
32         },
33
34         POST = function(url, headers = NULL, body = NULL,
35                         queryFilters = NULL, limit = NULL, offset = NULL)
36         {
37             headers <- httr::add_headers(unlist(headers))
38             query <- private$createQuery(queryFilters, limit, offset)
39             url <- paste0(url, query)
40
41             serverResponse <- httr::POST(url = url, config = headers, body = body)
42         },
43
44         DELETE = function(url, headers = NULL, body = NULL,
45                           queryFilters = NULL, limit = NULL, offset = NULL)
46         {
47             headers <- httr::add_headers(unlist(headers))
48             query <- private$createQuery(queryFilters, limit, offset)
49             url <- paste0(url, query)
50
51             serverResponse <- httr::DELETE(url = url, config = headers)
52         },
53
54         PROPFIND = function(url, headers = NULL)
55         {
56             h <- curl::new_handle()
57             curl::handle_setopt(h, customrequest = "PROPFIND")
58             curl::handle_setheaders(h, .list = headers)
59
60             propfindResponse <- curl::curl_fetch_memory(url, h)
61         },
62
63         MOVE = function(url, headers = NULL)
64         {
65             h <- curl::new_handle()
66             curl::handle_setopt(h, customrequest = "MOVE")
67             curl::handle_setheaders(h, .list = headers)
68
69             propfindResponse <- curl::curl_fetch_memory(url, h)
70         }
71     ),
72
73     private = list(
74
75         createQuery = function(filters, limit, offset)
76         {
77             finalQuery <- NULL
78
79             if(!is.null(filters))
80             {
81                 filters <- sapply(filters, function(filter)
82                 {
83                     if(length(filter) != 3)
84                         stop("Filter list must have exactly 3 elements.")
85
86                     attributeAndOperator = filter[c(1, 2)]
87                     filterList = filter[[3]]
88                     filterListIsPrimitive = TRUE
89                     if(length(filterList) > 1)
90                         filterListIsPrimitive = FALSE
91
92                     attributeAndOperator <- sapply(attributeAndOperator, function(component) {
93                         component <- paste0("\"", component, "\"")
94                     })
95
96                     filterList <- sapply(unlist(filterList), function(filter) {
97                         filter <- paste0("\"", filter, "\"")
98                     })
99
100                     filterList <- paste(filterList, collapse = ",+")
101
102                     if(!filterListIsPrimitive)
103                         filterList <- paste0("[", filterList, "]")
104
105                     filter <- c(attributeAndOperator, filterList)
106
107                     queryParameter <- paste(filter, collapse = ",+")
108                     queryParameter <- paste0("[", queryParameter, "]")
109         
110                 })
111
112                 filters <- paste(filters, collapse = ",+")
113                 filters <- paste0("[", filters, "]")
114
115                 encodedQuery <- URLencode(filters, reserved = T, repeated = T)
116
117                 encodedQuery <- stringr::str_replace_all(encodedQuery, "%2B", "+")
118
119                 finalQuery <- c(finalQuery, paste0("filters=", encodedQuery))
120
121                 finalQuery
122             }
123
124             if(!is.null(limit))
125             {
126                 if(!is.numeric(limit))
127                     stop("Limit must be a numeric type.")
128                 
129                 finalQuery <- c(finalQuery, paste0("limit=", limit))
130             }
131
132             if(!is.null(offset))
133             {
134                 if(!is.numeric(offset))
135                     stop("Offset must be a numeric type.")
136                 
137                 finalQuery <- c(finalQuery, paste0("offset=", offset))
138             }
139
140             if(length(finalQuery) > 1)
141             {
142                 finalQuery <- paste0(finalQuery, collapse = "&")
143             }
144
145             if(!is.null(finalQuery))
146                 finalQuery <- paste0("/?", finalQuery)
147
148             finalQuery
149         }
150     ),
151
152     cloneable = FALSE
153 )