Added methods listAllCollections and listAllProjects.
[arvados.git] / sdk / R / R / HttpRequest.R
index ea46beae03c574a34829721fa58c76c636488db7..a1e1f61275263ec63910f5d48a5d017621fb02ff 100644 (file)
@@ -4,12 +4,14 @@ HttpRequest <- R6::R6Class(
 
     public = list(
 
+        validContentTypes = NULL,
+
         initialize = function() 
         {
+            self$validContentTypes <- c("text", "raw")
         },
 
-        GET = function(url, headers = NULL, body = NULL,
-                       queryFilters = NULL, limit = NULL, offset = NULL)
+        GET = function(url, headers = NULL, queryFilters = NULL, limit = NULL, offset = NULL)
         {
             headers <- httr::add_headers(unlist(headers))
             query <- private$createQuery(queryFilters, limit, offset)
@@ -46,23 +48,39 @@ HttpRequest <- R6::R6Class(
             url <- paste0(url, query)
 
             serverResponse <- httr::DELETE(url = url, config = headers)
+        },
+
+        PROPFIND = function(url, headers = NULL)
+        {
+            h <- curl::new_handle()
+            curl::handle_setopt(h, customrequest = "PROPFIND")
+            curl::handle_setheaders(h, .list = headers)
+
+            propfindResponse <- curl::curl_fetch_memory(url, h)
+        },
+
+        MOVE = function(url, headers = NULL)
+        {
+            h <- curl::new_handle()
+            curl::handle_setopt(h, customrequest = "MOVE")
+            curl::handle_setheaders(h, .list = headers)
+
+            propfindResponse <- curl::curl_fetch_memory(url, h)
         }
     ),
 
     private = list(
 
-        #Todo(Fudo): Refactor this and find a better way to build
-        # Python array from R list (recursion?)
         createQuery = function(filters, limit, offset)
         {
-            finalQuery <- "?alt=json"
+            finalQuery <- NULL
 
             if(!is.null(filters))
             {
                 filters <- sapply(filters, function(filter)
                 {
                     if(length(filter) != 3)
-                        stop("Filter list must have exacthey 3 elements.")
+                        stop("Filter list must have exactly 3 elements.")
 
                     attributeAndOperator = filter[c(1, 2)]
                     filterList = filter[[3]]
@@ -95,10 +113,11 @@ HttpRequest <- R6::R6Class(
 
                 encodedQuery <- URLencode(filters, reserved = T, repeated = T)
 
-                finalQuery <- paste0(finalQuery, "&filters=", encodedQuery)
+                encodedQuery <- stringr::str_replace_all(encodedQuery, "%2B", "+")
 
-                #Todo(Fudo): This is a hack for now. Find a proper solution.
-                finalQuery <- stringr::str_replace_all(finalQuery, "%2B", "+")
+                finalQuery <- c(finalQuery, paste0("filters=", encodedQuery))
+
+                finalQuery
             }
 
             if(!is.null(limit))
@@ -106,7 +125,7 @@ HttpRequest <- R6::R6Class(
                 if(!is.numeric(limit))
                     stop("Limit must be a numeric type.")
                 
-                finalQuery <- paste0(finalQuery, "&limit=", limit)
+                finalQuery <- c(finalQuery, paste0("limit=", limit))
             }
 
             if(!is.null(offset))
@@ -114,9 +133,16 @@ HttpRequest <- R6::R6Class(
                 if(!is.numeric(offset))
                     stop("Offset must be a numeric type.")
                 
-                finalQuery <- paste0(finalQuery, "&offset=", offset)
+                finalQuery <- c(finalQuery, paste0("offset=", offset))
             }
 
+            if(length(finalQuery) > 1)
+            {
+                finalQuery <- paste0(finalQuery, collapse = "&")
+            }
+
+            finalQuery <- paste0("/?", finalQuery)
+
             finalQuery
         }
     ),