Tools to work with the Google DNS over HTTPS API in R https://cinc.rud.is/web/packages/gdns/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

zbulk-query.R 2.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #' Vectorized query, returning only answers in a data frame
  2. #'
  3. #' @param entities character vector of entities to query
  4. #' @param type RR type can be represented as a number in [1, 65535] or canonical
  5. #' string (A, aaaa, etc). More information on RR types can be
  6. #' found \href{http://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-4}{here}.
  7. #' @param edns_client_subnet The edns0-client-subnet option. Format is an IP
  8. #' address with a subnet mask. Examples: \code{1.2.3.4/24},
  9. #' \code{2001:700:300::/48}.\cr
  10. #' If you are using DNS-over-HTTPS because of privacy concerns, and do
  11. #' not want any part of your IP address to be sent to authoritative
  12. #' nameservers for geographic location accuracy, use
  13. #' \code{edns_client_subnet=0.0.0.0/0}. Google Public DNS normally sends
  14. #' approximate network information (usually replacing the last part of
  15. #' your IPv4 address with zeroes). \code{0.0.0.0/0} is the default.
  16. #' @return \code{data.frame} of only answers (use \code{query()} for detailed responses)
  17. #' @references \url{https://developers.google.com/speed/public-dns/docs/dns-over-https}
  18. #' @export
  19. #' @note this is a fairly naive function. It expects \code{Answer} to be one of the
  20. #' return value list slots. The intent for it was to make it easier
  21. #' to do bulk forward queries. It will get smarter in future versions.
  22. #' @examples
  23. #' hosts <- c("rud.is", "r-project.org", "rstudio.com", "apple.com")
  24. #' gdns::bulk_query(hosts)
  25. bulk_query <- function(entities, type = 1, edns_client_subnet = "0.0.0.0/0") {
  26. lapply(
  27. entities,
  28. query, type = type, edns_client_subnet = edns_client_subnet
  29. ) -> results
  30. lapply(seq_along(results), function(idx) {
  31. if (length(results[[idx]]$Answer) == 0) {
  32. data.frame(
  33. entity = entities[idx],
  34. name = NA_character_,
  35. type = NA_character_,
  36. TTL = NA_character_,
  37. data = NA_character_,
  38. stringsAsFactors = FALSE
  39. )
  40. } else {
  41. results[[idx]]$Answer$entity <- entities[[idx]]
  42. results[[idx]]$Answer
  43. }
  44. }) -> xlst
  45. xdf <- do.call(rbind.data.frame, xlst)
  46. class(xdf) <- c("tbl_df", "tbl", "data.frame")
  47. xdf
  48. }