1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
clientForAccount <- function(account) {
serverInfo <- serverInfo(account$server)
account$certificate <- serverInfo$certificate
serverUrl <- parseHttpUrl(serverInfo$url)
if (isShinyappsServer(account$server)) {
shinyAppsClient(serverUrl, account)
} else if (isPositCloudServer(account$server)) {
cloudClient(serverUrl, account)
} else {
connectClient(serverUrl, account)
}
}
# Appropriate when the list API includes "count" and "total" fields in the response JSON and the API
# supports pagination with the query arguments count=PAGE_SIZE&offset=STARTING_POINT.
listRequest <- function(service, authInfo, path, query, listName, page = 100,
max = NULL) {
# accumulate multiple pages of results
offset <- 0
results <- list()
repeat {
# add query params
queryWithList <- paste(query, "&count=", page, "&offset=", offset, sep = "")
# make request and append the results
response <- GET(service, authInfo, path, queryWithList)
results <- append(results, response[[listName]])
# update the offset
offset <- offset + response$count
# get all results if no max was specified
if (is.null(max)) {
max <- response$total
}
# exit if we've got them all
if (length(results) >= response$total || length(results) >= max)
break
}
return(results)
}
# /__api__/applications response with { applications: [], count: M, total: N, continuation: "CONTINUATION" }
# To paginate, use the query arguments cont=CONTINUATION&start=START&count=MAX
listApplicationsRequest <- function(service, authInfo, path, query, listName, page = 100,
max = NULL) {
# accumulate multiple pages of results
start <- 0
cont <- ""
results <- list()
repeat {
# add query params
queryWithList <- paste(query,
"&count=", page,
"&start=", start,
"&cont=", cont,
sep = "")
# make request and append the results
response <- GET(service, authInfo, path, queryWithList)
results <- append(results, response[[listName]])
# update the starting point for the next request
start <- start + response$count
cont <- response$continuation
# get all results if no max was specified
if (is.null(max)) {
max <- response$total
}
# exit if we've got them all
if (length(results) >= response$total || length(results) >= max)
break
}
return(results)
}
filterQuery <- function(param, value, operator = NULL) {
if (is.null(operator)) {
op <- ":"
} else {
op <- paste(":", operator, ":", sep = "")
}
q <- paste("filter=", param, op, value, sep = "")
return(q)
}
isContentType <- function(x, contentType) {
grepl(contentType, x, fixed = TRUE)
}
uploadCloudBundle <- function(client,
application_id,
bundlePath,
verbose = FALSE) {
# Step 1. Create presigned URL and register pending bundle.
bundleSize <- file.info(bundlePath)$size
bundle <- client$createBundle(
application_id,
content_type = "application/x-tar",
content_length = bundleSize,
checksum = fileMD5(bundlePath)
)
# Step 2. Upload Bundle to presigned URL
logger <- verboseLogger(verbose)
logger("Starting upload now")
if (!uploadBundle(bundle, bundleSize, bundlePath)) {
stop("Could not upload file.")
}
logger("Upload complete")
# Step 3. Upload revise bundle status.
response <- client$updateBundleStatus(bundle$id, status = "ready")
# Step 4. Retrieve updated bundle post status change
client$getBundle(bundle$id)
}
uploadBundle <- function(bundle, bundleSize, bundlePath) {
presigned_service <- parseHttpUrl(bundle$presigned_url)
headers <- list()
headers$`Content-Type` <- "application/x-tar"
headers$`Content-Length` <- bundleSize
# AWS requires a base64 encoded hash
headers$`Content-MD5` <- bundle$presigned_checksum
# AWS seems very sensitive to additional headers (likely becauseit was not included and signed
# for when the presigned link was created). So the lower level library is used here.
http <- httpFunction()
response <- http(
presigned_service$protocol,
presigned_service$host,
presigned_service$port,
"PUT",
presigned_service$path,
headers,
headers$`Content-Type`,
bundlePath
)
response$status == 200
}
|