|
13 | 13 | #' And set these using \code{\link{set_secret_key}}
|
14 | 14 | #'
|
15 | 15 | #' @importFrom stats setNames
|
16 |
| -#' @importFrom httr GET content stop_for_status |
| 16 | +#' @importFrom httr GET content stop_for_status add_headers |
17 | 17 | #' @importFrom xml2 read_xml as_list
|
18 | 18 | #' @importFrom dplyr bind_rows
|
19 |
| -#' @importFrom aws.signature signature_v2_auth |
| 19 | +#' @importFrom aws.signature signature_v4_auth locate_credentials |
20 | 20 | #' @docType package
|
21 | 21 | #' @author Gaurav Sood
|
22 | 22 | NULL
|
|
31 | 31 | #' @param query query list
|
32 | 32 | #' @param key A character string containing an AWS Access Key ID. The default is retrieved from \code{Sys.getenv("AWS_ACCESS_KEY_ID")}.
|
33 | 33 | #' @param secret A character string containing an AWS Secret Access Key. The default is retrieved from \code{Sys.getenv("AWS_SECRET_ACCESS_KEY")}.
|
| 34 | +#' @param verbose A logical indicating whether to be verbose. Default is given by \code{options("verbose")}. |
| 35 | +#' @param session_token Optionally, a character string containing an AWS temporary Session Token. If missing, defaults to value stored in environment variable \env{AWS_SESSION_TOKEN}. |
| 36 | +#' @param region A character string containing the AWS region. If missing, defaults to \dQuote{us-west-1}. |
| 37 | +#' @param headers A list of request headers for the REST call. |
34 | 38 | #' @param \dots Additional arguments passed to \code{\link[httr]{GET}}.
|
35 | 39 | #' @return list
|
36 | 40 |
|
37 |
| -alexa_GET <- function(query, key = Sys.getenv("AWS_ACCESS_KEY_ID"), |
38 |
| - secret = Sys.getenv("AWS_SECRET_ACCESS_KEY"), ...) { |
| 41 | +alexa_GET <- function(query, |
| 42 | + key = Sys.getenv("AWS_ACCESS_KEY_ID"), |
| 43 | + secret = Sys.getenv("AWS_SECRET_ACCESS_KEY"), |
| 44 | + verbose = getOption("verbose", FALSE), |
| 45 | + session_token = NULL, |
| 46 | + region = 'us-west-1', |
| 47 | + headers = list(), |
| 48 | + ...) { |
39 | 49 |
|
40 | 50 | if (identical(key, "") | identical(secret, "")) {
|
41 | 51 | stop("Please set application id and password using set_secret_key(key='key',
|
42 | 52 | secret='secret')).")
|
43 | 53 | }
|
44 |
| - |
45 |
| - sig <- signature_v2_auth(datetime = format(Sys.time(), |
46 |
| - format = "%Y-%m-%dT%H:%M:%SZ", tz = "UTC"), |
| 54 | + |
| 55 | + # locate and validate credentials |
| 56 | + credentials <- locate_credentials(key = key, |
| 57 | + secret = secret, |
| 58 | + session_token = session_token, |
| 59 | + region = region, |
| 60 | + verbose = verbose) |
| 61 | + |
| 62 | + key <- credentials[["key"]] |
| 63 | + secret <- credentials[["secret"]] |
| 64 | + session_token <- credentials[["session_token"]] |
| 65 | + region <- credentials[["region"]] |
| 66 | + |
| 67 | + hostname <- paste0("awis.", region, ".amazonaws.com") |
| 68 | + current <- Sys.time() |
| 69 | + header_timestamp <- format(current, "%Y-%m-%dT%H:%M:%SZ", tz = "UTC") |
| 70 | + canonical_headers <- c(list(host = hostname, |
| 71 | + `x-amz-date` = header_timestamp), headers) |
| 72 | + |
| 73 | + # generate signatures |
| 74 | + Sig <- signature_v4_auth(datetime = format(current, |
| 75 | + "%Y%m%dT%H%M%SZ", tz = "UTC"), |
| 76 | + region = region, |
| 77 | + service = "awis", |
47 | 78 | verb = "GET",
|
48 |
| - service = "awis.amazonaws.com", |
49 |
| - path = "/", |
| 79 | + action = "/api", |
50 | 80 | query_args = query,
|
| 81 | + canonical_headers = canonical_headers, |
| 82 | + request_body = "", |
51 | 83 | key = key,
|
52 |
| - secret = secret) |
53 |
| - |
54 |
| - res <- GET("http://awis.amazonaws.com", query = sig$Query, ...) |
| 84 | + secret = secret, |
| 85 | + session_token = session_token, |
| 86 | + verbose = verbose) |
| 87 | + |
| 88 | + headers[["x-amz-date"]] <- header_timestamp |
| 89 | + headers[["x-amz-content-sha256"]] <- Sig$BodyHash |
| 90 | + if (!is.null(session_token) && session_token != "") { |
| 91 | + headers[["x-amz-security-token"]] <- session_token |
| 92 | + } |
| 93 | + headers[["Authorization"]] <- Sig[["SignatureHeader"]] |
| 94 | + H <- do.call(add_headers, headers) |
| 95 | + |
| 96 | + res <- GET("https://awis.amazonaws.com/api", H, query = query) |
| 97 | + |
55 | 98 | alexa_check(res)
|
56 | 99 | res <- as_list(read_xml(content(res, as = "text", encoding = "utf-8")))
|
57 | 100 |
|
|
0 commit comments