#' Return information about Splash interaction with a website in HAR format. #' #' It includes information about requests made, responses received, timings, headers, etc and #' is incredibly detailed, full of information on every component loaded. #' #' @md #' @param response_body When `TRUE`, response content is included in the HAR records #' @inheritParams render_html #' @family splash_renderers #' @return a [HARtools] `har` object #' @references [Splash docs](http://splash.readthedocs.io/en/stable/index.html) #' @export render_har <- function(splash_obj = splash_local, url, base_url, response_body=FALSE, timeout=30, resource_timeout, wait=0, proxy, js, js_src, filters, allowed_domains, allowed_content_types, forbidden_content_types, viewport="1024x768", images, headers, body, http_method, save_args, load_args, http2 = FALSE, engine = c("webkit", "chromium")) { wait <- check_wait(wait) engine <- match.arg(engine[1], c("webkit", "chromium")) http2 <- ifelse(engine == "chromium", 1, as.integer(as.logical(http2[1]))) list( url = url, timeout = timeout, wait = wait, viewport = jsonlite::unbox(viewport), response_body = as.numeric(response_body), http2 = http2, engine = engine ) -> params if (!missing(base_url)) params$base_url <- jsonlite::unbox(base_url) if (!missing(resource_timeout)) params$resource_timeout <- resource_timeout if (!missing(proxy)) params$proxy <- jsonlite::unbox(proxy) if (!missing(js)) params$js <- jsonlite::unbox(js) if (!missing(js_src)) params$js_src <- jsonlite::unbox(js_src) if (!missing(filters)) params$filters <- jsonlite::unbox(filters) if (!missing(allowed_domains)) params$allowed_domains <- jsonlite::unbox(allowed_domains) if (!missing(allowed_content_types)) params$allowed_content_types <- jsonlite::unbox(allowed_content_types) if (!missing(forbidden_content_types)) params$forbidden_content_types <- jsonlite::unbox(forbidden_content_types) if (!missing(images)) params$images <- as.numeric(images) if (!missing(headers)) params$headers <- headers if (!missing(body)) params$body <- jsonlite::unbox(body) if (!missing(http_method)) params$http_method <- jsonlite::unbox(http_method) if (!missing(save_args)) params$save_args <- jsonlite::unbox(save_args) if (!missing(load_args)) params$load_args <- jsonlite::unbox(load_args) if (is.null(splash_obj$user)) { res <- httr::GET(splash_url(splash_obj), path="render.har", encode="json", query=params) } else { res <- httr::GET( splash_url(splash_obj), path="render.har", encode="json", query=params, httr::authenticate(splash_obj$user, splash_obj$pass) ) } check_or_report_status(res) out <- httr::content(res, as="text", encoding="UTF-8") spl <- jsonlite::fromJSON(out, flatten=FALSE, simplifyVector=FALSE) as_har(spl) } #' Turn a generic Splash HAR response into a HAR object #' #' @param splash_resp splash response object #' @export as_har <- function(splash_resp) { if (is.raw(splash_resp)) splash_resp <- jsonlite::fromJSON(rawToChar(splash_resp), flatten=FALSE, simplifyVector=FALSE) sphar <- list( log=list( version=splash_resp$log$version, creator=splash_resp$log$creator, browser=splash_resp$log$browser, pages=splash_resp$log$pages, entries=splash_resp$log$entries ) ) class(sphar$log$creator) <- c("harcreator", "list") class(sphar$log$version) <- c("harversion", "character") class(sphar$log$browser) <- c("harbrowser", "list") class(sphar$log$pages) <- c("harpages", "list") class(sphar$log$entries) <- c("harentries", "list") class(sphar$log) <- c("harlog", "list") class(sphar) <- c("har", "list") for (i in 1:length(sphar$log$pages)) class(sphar$log$pages[[i]]) <- c("harpage", "list") for (i in 1:length(sphar$log$entries)) { class(sphar$log$entries[[i]]) <- c("harentry", "list") class(sphar$log$entries[[i]]$request) <- c("harrequest", "list") class(sphar$log$entries[[i]]$response) <- c("harresponse", "list") } sphar }