public = list(
validContentTypes = NULL,
+ validVerbs = NULL,
initialize = function()
{
self$validContentTypes <- c("text", "raw")
+ self$validVerbs <- c("GET", "POST", "PUT", "DELETE", "PROPFIND", "MOVE")
},
- GET = function(url, headers = NULL, queryFilters = NULL, limit = NULL, offset = NULL)
+ execute = function(verb, url, headers = NULL, body = NULL, query = NULL,
+ limit = NULL, offset = NULL, retryTimes = 3)
{
- headers <- httr::add_headers(unlist(headers))
- query <- self$createQuery(queryFilters, limit, offset)
- url <- paste0(url, query)
+ if(!(verb %in% self$validVerbs))
+ stop("Http verb is not valid.")
- serverResponse <- httr::GET(url = url, config = headers)
- },
-
- PUT = function(url, headers = NULL, body = NULL,
- queryFilters = NULL, limit = NULL, offset = NULL)
- {
- headers <- httr::add_headers(unlist(headers))
- query <- self$createQuery(queryFilters, limit, offset)
- url <- paste0(url, query)
-
- serverResponse <- httr::PUT(url = url, config = headers, body = body)
- },
-
- POST = function(url, headers = NULL, body = NULL,
- queryFilters = NULL, limit = NULL, offset = NULL)
- {
- headers <- httr::add_headers(unlist(headers))
- query <- self$createQuery(queryFilters, limit, offset)
- url <- paste0(url, query)
-
- serverResponse <- httr::POST(url = url, config = headers, body = body)
- },
-
- DELETE = function(url, headers = NULL, body = NULL,
- queryFilters = NULL, limit = NULL, offset = NULL)
- {
- headers <- httr::add_headers(unlist(headers))
- query <- self$createQuery(queryFilters, limit, offset)
- 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)
+ headers <- httr::add_headers(unlist(headers))
+ urlQuery <- self$createQuery(query, limit, offset)
+ url <- paste0(url, urlQuery)
- propfindResponse <- curl::curl_fetch_memory(url, h)
+ response <- httr::RETRY(verb, url = url, body = body,
+ config = headers, times = retryTimes)
},
createQuery = function(filters, limit, offset)
public = list(
- hostName = NULL,
- token = NULL,
- http = NULL,
- httpParser = NULL,
+ hostName = NULL,
+ token = NULL,
+ http = NULL,
+ httpParser = NULL,
initialize = function(token, hostName, webDavHostName = NULL, http, httpParser)
{
headers <- list(Authorization = paste("OAuth2", self$token))
- serverResponse <- self$http$GET(discoveryDocumentURL, headers)
+ serverResponse <- self$http$execute("GET", discoveryDocumentURL, headers)
discoveryDocument <- self$httpParser$parseJSONResponse(serverResponse)
private$webDavHostName <- discoveryDocument$keepWebServiceUrl
resourceURL <- paste0(self$hostName, resource, "/", uuid)
headers <- list(Authorization = paste("OAuth2", self$token))
- serverResponse <- self$http$GET(resourceURL, headers)
+ serverResponse <- self$http$execute("GET", resourceURL, headers)
resource <- self$httpParser$parseJSONResponse(serverResponse)
{
resourceURL <- paste0(self$hostName, resource)
headers <- list(Authorization = paste("OAuth2", self$token))
+ body <- NULL
- serverResponse <- self$http$GET(resourceURL, headers, filters,
- limit, offset)
+ serverResponse <- self$http$execute("GET", resourceURL, headers, body,
+ filters, limit, offset)
resources <- self$httpParser$parseJSONResponse(serverResponse)
items <- c()
while(length(items) < itemsAvailable)
{
- serverResponse <- self$http$GET(url = resourceURL,
- headers = headers,
- queryFilters = filters,
- limit = NULL,
- offset = offset)
+ serverResponse <- self$http$execute(verb = "GET",
+ url = resourceURL,
+ headers = headers,
+ body = NULL,
+ query = filters,
+ limit = NULL,
+ offset = offset)
parsedResponse <- self$httpParser$parseJSONResponse(serverResponse)
headers <- list("Authorization" = paste("OAuth2", self$token),
"Content-Type" = "application/json")
- serverResponse <- self$http$DELETE(collectionURL, headers)
+ serverResponse <- self$http$execute("DELETE", collectionURL, headers)
removedResource <- self$httpParser$parseJSONResponse(serverResponse)
newContent <- jsonlite::toJSON(newContent, auto_unbox = T)
- serverResponse <- self$http$PUT(resourceURL, headers, newContent)
+ serverResponse <- self$http$execute("PUT", resourceURL, headers, newContent)
updatedResource <- self$httpParser$parseJSONResponse(serverResponse)
content <- jsonlite::toJSON(content, auto_unbox = T)
- serverResponse <- self$http$POST(resourceURL, headers, content)
+ serverResponse <- self$http$execute("POST", resourceURL, headers, content)
newResource <- self$httpParser$parseJSONResponse(serverResponse)
uuid, "/", relativePath);
headers <- list(Authorization = paste("OAuth2", self$token))
- serverResponse <- self$http$DELETE(fileURL, headers)
+ serverResponse <- self$http$execute("DELETE", fileURL, headers)
if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
stop(paste("Server code:", serverResponse$status_code))
headers <- list("Authorization" = paste("OAuth2", self$token),
"Destination" = toURL)
- serverResponse <- self$http$MOVE(fromURL, headers)
+ serverResponse <- self$http$execute("MOVE", fromURL, headers)
if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
stop(paste("Server code:", serverResponse$status_code))
headers <- list("Authorization" = paste("OAuth2", self$token))
- response <- self$http$PROPFIND(collectionURL, headers)
+ response <- self$http$execute("PROPFIND", collectionURL, headers)
if(all(response == ""))
stop("Response is empty, request may be misconfigured")
headers <- list("Authorization" = paste("OAuth2", self$token))
- response <- self$http$PROPFIND(subcollectionURL, headers)
+ response <- self$http$execute("PROPFIND", subcollectionURL, headers)
if(all(response == ""))
stop("Response is empty, request may be misconfigured")
if(!(contentType %in% self$httpParser$validContentTypes))
stop("Invalid contentType. Please use text or raw.")
- serverResponse <- self$http$GET(fileURL, headers)
+ serverResponse <- self$http$execute("GET", fileURL, headers)
if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
stop(paste("Server code:", serverResponse$status_code))
"Content-Type" = contentType)
body <- content
- serverResponse <- self$http$PUT(fileURL, headers, body)
+ serverResponse <- self$http$execute("PUT", fileURL, headers, body)
if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
stop(paste("Server code:", serverResponse$status_code))
"Content-Type" = contentType)
body <- NULL
- serverResponse <- self$http$PUT(fileURL, headers, body)
+ serverResponse <- self$http$execute("PUT", fileURL, headers, body)
if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
stop(paste("Server code:", serverResponse$status_code))
else
self$content <- serverResponse
- self$expectedURL <- expectedURL
- self$URLIsProperlyConfigured <- FALSE
- self$expectedQueryFilters <- expectedFilters
- self$queryFiltersAreCorrect <- FALSE
+ self$expectedURL <- expectedURL
+ self$URLIsProperlyConfigured <- FALSE
+ self$expectedQueryFilters <- expectedFilters
+ self$queryFiltersAreCorrect <- FALSE
self$requestHeaderContainsAuthorizationField <- FALSE
- self$requestHeaderContainsDestinationField <- FALSE
- self$requestHeaderContainsRangeField <- FALSE
- self$requestHeaderContainsContentTypeField <- FALSE
- self$JSONEncodedBodyIsProvided <- FALSE
- self$requestBodyIsProvided <- FALSE
+ self$requestHeaderContainsDestinationField <- FALSE
+ self$requestHeaderContainsRangeField <- FALSE
+ self$requestHeaderContainsContentTypeField <- FALSE
+ self$JSONEncodedBodyIsProvided <- FALSE
+ self$requestBodyIsProvided <- FALSE
- self$numberOfGETRequests <- 0
+ self$numberOfGETRequests <- 0
self$numberOfDELETERequests <- 0
- self$numberOfPUTRequests <- 0
- self$numberOfPOSTRequests <- 0
- self$numberOfMOVERequests <- 0
+ self$numberOfPUTRequests <- 0
+ self$numberOfPOSTRequests <- 0
+ self$numberOfMOVERequests <- 0
self$serverMaxElementsPerRequest <- 5
},
- GET = function(url, headers = NULL, queryFilters = NULL, limit = NULL, offset = NULL)
+ execute = function(verb, url, headers = NULL, body = NULL, query = NULL,
+ limit = NULL, offset = NULL, retryTimes = 3)
{
private$validateURL(url)
private$validateHeaders(headers)
private$validateFilters(queryFilters)
- self$numberOfGETRequests <- self$numberOfGETRequests + 1
+ private$validateBody(body)
- if(!is.null(self$content$items_available))
+ if(verb == "GET")
+ self$numberOfGETRequests <- self$numberOfGETRequests + 1
+ else if(verb == "POST")
+ self$numberOfPOSTRequests <- self$numberOfPOSTRequests + 1
+ else if(verb == "PUT")
+ self$numberOfPUTRequests <- self$numberOfPUTRequests + 1
+ else if(verb == "DELETE")
+ self$numberOfDELETERequests <- self$numberOfDELETERequests + 1
+ else if(verb == "MOVE")
+ self$numberOfMOVERequests <- self$numberOfMOVERequests + 1
+ else if(verb == "PROPFIND")
{
- return(private$getElements(offset, limit))
+ return(self$content)
}
+
+ if(!is.null(self$content$items_available))
+ return(private$getElements(offset, limit))
else
return(self$content)
- },
-
- PUT = function(url, headers = NULL, body = NULL,
- queryFilters = NULL, limit = NULL, offset = NULL)
- {
- private$validateURL(url)
- private$validateHeaders(headers)
- private$validateBody(body)
- self$numberOfPUTRequests <- self$numberOfPUTRequests + 1
-
- self$content
- },
-
- POST = function(url, headers = NULL, body = NULL,
- queryFilters = NULL, limit = NULL, offset = NULL)
- {
- private$validateURL(url)
- private$validateHeaders(headers)
- private$validateBody(body)
- self$numberOfPOSTRequests <- self$numberOfPOSTRequests + 1
-
- self$content
- },
-
- DELETE = function(url, headers = NULL, body = NULL,
- queryFilters = NULL, limit = NULL, offset = NULL)
- {
- private$validateURL(url)
- private$validateHeaders(headers)
- self$numberOfDELETERequests <- self$numberOfDELETERequests + 1
- self$content
- },
-
- PROPFIND = function(url, headers = NULL)
- {
- private$validateURL(url)
- private$validateHeaders(headers)
- self$content
- },
-
- MOVE = function(url, headers = NULL)
- {
- private$validateURL(url)
- private$validateHeaders(headers)
- self$numberOfMOVERequests <- self$numberOfMOVERequests + 1
- self$content
}
),
validateBody = function(body)
{
- if(!is.null(body) && class(body) == "json")
- self$JSONEncodedBodyIsProvided <- TRUE
-
if(!is.null(body))
{
self$requestBodyIsProvided <- TRUE
context("Http Request")
+test_that("execyte raises exception if http verb is not valid", {
+
+ http <- HttpRequest$new()
+ expect_that(http$execute("FAKE VERB", "url"),
+ throws_error("Http verb is not valid."))
+})
+
test_that(paste("createQuery generates and encodes query portion of http",
"request based on filters, limit and offset parameters"), {