Merge branch 'master' of git.curoverse.com:arvados into 11876-r-sdk
[arvados.git] / sdk / R / R / HttpRequest.R
1 HttpRequest <- R6::R6Class(
2
3     "HttrRequest",
4
5     public = list(
6
7         initialize = function() 
8         {
9         },
10
11         GET = function(url, headers = NULL, queryFilters = NULL, limit = NULL, offset = NULL)
12         {
13             headers <- httr::add_headers(unlist(headers))
14             query <- private$createQuery(queryFilters, limit, offset)
15             url <- paste0(url, query)
16
17             serverResponse <- httr::GET(url = url, config = headers)
18         },
19
20         PUT = function(url, headers = NULL, body = NULL,
21                        queryFilters = NULL, limit = 100, offset = 0)
22         {
23             headers <- httr::add_headers(unlist(headers))
24             query <- private$createQuery(queryFilters, limit, offset)
25             url <- paste0(url, query)
26
27             serverResponse <- httr::PUT(url = url, config = headers, body = body)
28         },
29
30         POST = function(url, headers = NULL, body = NULL,
31                         queryFilters = NULL, limit = 100, offset = 0)
32         {
33             headers <- httr::add_headers(unlist(headers))
34             query <- private$createQuery(queryFilters, limit, offset)
35             url <- paste0(url, query)
36
37             serverResponse <- httr::POST(url = url, config = headers, body = body)
38         },
39
40         DELETE = function(url, headers = NULL, body = NULL,
41                           queryFilters = NULL, limit = NULL, offset = NULL)
42         {
43             headers <- httr::add_headers(unlist(headers))
44             query <- private$createQuery(queryFilters, limit, offset)
45             url <- paste0(url, query)
46
47             serverResponse <- httr::DELETE(url = url, config = headers)
48         },
49
50         PROPFIND = function(url, headers = NULL)
51         {
52             h <- curl::new_handle()
53             curl::handle_setopt(h, customrequest = "PROPFIND")
54             curl::handle_setheaders(h, .list = headers)
55
56             propfindResponse <- curl::curl_fetch_memory(url, h)
57         }
58     ),
59
60     private = list(
61
62         #Todo(Fudo): Refactor this and find a better way to build
63         # Python array from R list (recursion?)
64         createQuery = function(filters, limit, offset)
65         {
66             finalQuery <- NULL
67
68             if(!is.null(filters))
69             {
70                 filters <- sapply(filters, function(filter)
71                 {
72                     if(length(filter) != 3)
73                         stop("Filter list must have exacthey 3 elements.")
74
75                     attributeAndOperator = filter[c(1, 2)]
76                     filterList = filter[[3]]
77                     filterListIsPrimitive = TRUE
78                     if(length(filterList) > 1)
79                         filterListIsPrimitive = FALSE
80
81                     attributeAndOperator <- sapply(attributeAndOperator, function(component) {
82                         component <- paste0("\"", component, "\"")
83                     })
84
85                     filterList <- sapply(unlist(filterList), function(filter) {
86                         filter <- paste0("\"", filter, "\"")
87                     })
88
89                     filterList <- paste(filterList, collapse = ",+")
90
91                     if(!filterListIsPrimitive)
92                         filterList <- paste0("[", filterList, "]")
93
94                     filter <- c(attributeAndOperator, filterList)
95
96                     queryParameter <- paste(filter, collapse = ",+")
97                     queryParameter <- paste0("[", queryParameter, "]")
98         
99                 })
100
101                 filters <- paste(filters, collapse = ",+")
102                 filters <- paste0("[", filters, "]")
103
104                 encodedQuery <- URLencode(filters, reserved = T, repeated = T)
105
106                 #Todo(Fudo): This is a hack for now. Find a proper solution.
107                 encodedQuery <- stringr::str_replace_all(encodedQuery, "%2B", "+")
108
109                 finalQuery <- c(finalQuery, paste0("filters=", encodedQuery))
110
111                 finalQuery
112             }
113
114             if(!is.null(limit))
115             {
116                 if(!is.numeric(limit))
117                     stop("Limit must be a numeric type.")
118                 
119                 finalQuery <- c(finalQuery, paste0("limit=", limit))
120             }
121
122             if(!is.null(offset))
123             {
124                 if(!is.numeric(offset))
125                     stop("Offset must be a numeric type.")
126                 
127                 finalQuery <- c(finalQuery, paste0("offset=", offset))
128             }
129
130             if(length(finalQuery) > 1)
131             {
132                 finalQuery <- paste0(finalQuery, collapse = "&")
133                 finalQuery <- paste0("?", finalQuery)
134             }
135
136             finalQuery
137         }
138     ),
139
140     cloneable = FALSE
141 )