Browse Source

removed dplyr, purrr & tibble dependencies

boB Rudis 1 year ago
parent
commit
ed7c02365a
No known key found for this signature in database
11 changed files with 404 additions and 155 deletions
  1. 12
    12
      DESCRIPTION
  2. 0
    9
      NAMESPACE
  3. 4
    0
      NEWS.md
  4. 0
    3
      R/gdns-package.r
  5. 6
    6
      R/spf.r
  6. 132
    0
      R/utils-mappers.R
  7. 90
    0
      R/utils-safely.R
  8. 10
    6
      R/zgdns.r
  9. 148
    117
      README.md
  10. 1
    1
      man/bulk_query.Rd
  11. 1
    1
      man/query.Rd

+ 12
- 12
DESCRIPTION View File

@@ -1,13 +1,16 @@
1 1
 Package: gdns
2
-Title: Tools to Work with Google DNS Over HTTPS API
2
+Title: Tools to Work with Google's 'DNS-over-HTTPS' ('DoH') 'API'
3 3
 Version: 0.2.1
4
-Authors@R: c(person("Bob", "Rudis", email = "bob@rud.is", role = c("aut", "cre")))
4
+Authors@R: c(
5
+        person("Bob", "Rudis", email = "bob@rud.is", role = c("aut", "cre"), 
6
+               comment = c(ORCID = "0000-0001-5670-2640"))
7
+    )
5 8
 Maintainer: Bob Rudis <bob@rud.is>
6
-Description: To address the problem of insecurity of UDP-based DNS requests,
7
-    Google Public DNS offers DNS resolution over an encrypted HTTPS
8
-    connection. DNS-over-HTTPS greatly enhances privacy and security
9
-    between a client and a recursive resolver, and complements DNSSEC
10
-    to provide end-to-end authenticated DNS lookups. Functions that enable
9
+Description: To address the problem of insecurity of 'UDP'-based 'DNS' requests,
10
+    'Google Public DNS' offers 'DNS' resolution over an encrypted 'HTTPS'
11
+    connection. 'DNS-over-HTTPS' greatly enhances privacy and security
12
+    between a client and a recursive resolver, and complements 'DNSSEC'
13
+    to provide end-to-end authenticated 'DNS' lookups. Functions that enable
11 14
     querying individual requests that bulk requests that return detailed
12 15
     responses and bulk requests are both provided. Support for reverse
13 16
     lookups is also provided. See <https://developers.google.com/speed/public-dns/docs/dns-over-https> 
@@ -22,8 +25,5 @@ Suggests:
22 25
 Imports:
23 26
     httr,
24 27
     jsonlite,
25
-    purrr,
26
-    stringi,
27
-    tibble,
28
-    dplyr
29
-RoxygenNote: 6.0.1
28
+    stringi
29
+RoxygenNote: 6.0.1.9000

+ 0
- 9
NAMESPACE View File

@@ -13,19 +13,10 @@ export(spf_ipv6s)
13 13
 export(spf_ptrs)
14 14
 export(split_spf)
15 15
 import(httr)
16
-importFrom(dplyr,as_data_frame)
17
-importFrom(dplyr,bind_cols)
18
-importFrom(dplyr,bind_rows)
19 16
 importFrom(jsonlite,fromJSON)
20
-importFrom(purrr,"%>%")
21
-importFrom(purrr,"%||%")
22
-importFrom(purrr,map)
23
-importFrom(purrr,map_df)
24
-importFrom(purrr,safely)
25 17
 importFrom(stringi,stri_detect_fixed)
26 18
 importFrom(stringi,stri_enc_toutf8)
27 19
 importFrom(stringi,stri_replace_all_regex)
28 20
 importFrom(stringi,stri_split_fixed)
29 21
 importFrom(stringi,stri_split_regex)
30 22
 importFrom(stringi,stri_trim)
31
-importFrom(tibble,data_frame)

+ 4
- 0
NEWS.md View File

@@ -1,3 +1,7 @@
1
+# gdns 0.2.2
2
+
3
+* removed purrr, dplyr and tibble dependencies
4
+
1 5
 # gdns 0.2.1
2 6
 
3 7
 * Fix CRAN checks due to purrr insanity

+ 0
- 3
R/gdns-package.r View File

@@ -25,7 +25,4 @@
25 25
 #'                     stri_replace_all_regex stri_enc_toutf8
26 26
 #'                     stri_detect_fixed
27 27
 #' @importFrom jsonlite fromJSON
28
-#' @importFrom tibble data_frame
29
-#' @importFrom purrr safely map map_df %||% %>%
30
-#' @importFrom dplyr bind_rows bind_cols as_data_frame
31 28
 NULL

+ 6
- 6
R/spf.r View File

@@ -8,7 +8,7 @@
8 8
 #' @param spf_rec a character vector of DNS TXT records
9 9
 #' @export
10 10
 split_spf <- function(spf_rec) {
11
-  purrr::map(spf_rec, .split_spf)
11
+  map(spf_rec, .split_spf)
12 12
 }
13 13
 
14 14
 .split_spf <- function(spf_rec) {
@@ -73,7 +73,7 @@ passes_all <- function(spf_rec) {
73 73
 #' @param spf_rec a character vector of DNS TXT records
74 74
 #' @export
75 75
 spf_ipv4s <- function(spf_rec) {
76
-  purrr::map(split_spf(spf_rec), function(x) {
76
+  map(split_spf(spf_rec), function(x) {
77 77
     stringi::stri_replace_all_regex(grep("ip4", x, value=TRUE), "^ip4:", "")
78 78
   })
79 79
 }
@@ -81,7 +81,7 @@ spf_ipv4s <- function(spf_rec) {
81 81
 #' @rdname spf_ipv4s
82 82
 #' @export
83 83
 spf_ipv6s <- function(spf_rec) {
84
-  purrr::map(split_spf(spf_rec), function(x) {
84
+  map(split_spf(spf_rec), function(x) {
85 85
     stringi::stri_replace_all_regex(grep("ip6", x, value=TRUE), "^ip6:", "")
86 86
   })
87 87
 }
@@ -89,7 +89,7 @@ spf_ipv6s <- function(spf_rec) {
89 89
 #' @rdname spf_ipv4s
90 90
 #' @export
91 91
 spf_includes <- function(spf_rec) {
92
-  purrr::map(split_spf(spf_rec), function(x) {
92
+  map(split_spf(spf_rec), function(x) {
93 93
     stringi::stri_replace_all_regex(grep("include", x, value=TRUE), "^include:", "")
94 94
   })
95 95
 }
@@ -97,7 +97,7 @@ spf_includes <- function(spf_rec) {
97 97
 #' @rdname spf_ipv4s
98 98
 #' @export
99 99
 spf_ptrs <- function(spf_rec) {
100
-  purrr::map(split_spf(spf_rec), function(x) {
100
+  map(split_spf(spf_rec), function(x) {
101 101
     stringi::stri_replace_all_regex(grep("ptr", x, value=TRUE), "^ptr[:]", "")
102 102
   })
103 103
 }
@@ -105,7 +105,7 @@ spf_ptrs <- function(spf_rec) {
105 105
 #' @rdname spf_ipv4s
106 106
 #' @export
107 107
 spf_exists <- function(spf_rec) {
108
-  purrr::map(split_spf(spf_rec), function(x) {
108
+  map(split_spf(spf_rec), function(x) {
109 109
     stringi::stri_replace_all_regex(grep("exists", x, value=TRUE), "^exists:", "")
110 110
   })
111 111
 }

+ 132
- 0
R/utils-mappers.R View File

@@ -0,0 +1,132 @@
1
+# NOTE these aren't 100% equivalent to the purrr mappers but cover very common use-cases
2
+#
3
+# NOTE formula function (e.g. ~{}) are 100% supported
4
+
5
+map <- function(.x, .f, ...) {
6
+
7
+  if (inherits(.f, "formula")) {
8
+    .body <- dimnames(attr(terms(.f), "factors"))[[1]]
9
+    .f <- function(.x, . = .x) {}
10
+    body(.f) <- as.expression(parse(text=.body))
11
+  }
12
+
13
+  if (inherits(.f, "function")) {
14
+    lapply(.x, .f, ...)
15
+  } else if (is.numeric(.f)) {
16
+    lapply(.x, `[`, .f)
17
+  }
18
+
19
+}
20
+
21
+map2 <- function(.x, .y, .f, ...) {
22
+
23
+  if (inherits(.f, "formula")) {
24
+    .body <- dimnames(attr(terms(.f), "factors"))[[1]]
25
+    .f <- function(.x, .y, . = .x) {}
26
+    body(.f) <- as.expression(parse(text=.body))
27
+  }
28
+
29
+  if (inherits(.f, "function")) {
30
+    mapply(.f, .x, .y, ..., SIMPLIFY=FALSE, USE.NAMES=FALSE)
31
+  }
32
+
33
+}
34
+
35
+map_chr <- function(.x, .f, ...) {
36
+  as.character(unlist(map(.x, .f, ...), use.names = FALSE))
37
+}
38
+
39
+map2_chr <- function(.x, .y, .f, ...) {
40
+  as.character(unlist(map2(.x, .y, .f, ...), use.names = FALSE))
41
+}
42
+
43
+map_lgl <- function(.x, .f, ...) {
44
+  as.logical(unlist(map(.x, .f, ...), use.names = FALSE))
45
+}
46
+
47
+map2_lgl <- function(.x, .y, .f, ...) {
48
+  as.logical(unlist(map2(.x, .y, .f, ...), use.names = FALSE))
49
+}
50
+
51
+map_dbl <- function(.x, .f, ...) {
52
+  as.double(unlist(map(.x, .f, ...), use.names = FALSE))
53
+}
54
+
55
+map2_dbl <- function(.x, .y, .f, ...) {
56
+  as.double(unlist(map2(.x, .y, .f, ...), use.names = FALSE))
57
+}
58
+
59
+map_int <- function(.x, .f, ...) {
60
+  as.integer(unlist(map(.x, .f, ...), use.names = FALSE))
61
+}
62
+
63
+map2_int <- function(.x, .y, .f, ...) {
64
+  as.integer(unlist(map2(.x, .y, .f, ...), use.names = FALSE))
65
+}
66
+
67
+
68
+map_df <- function(.x, .f, ..., .id=NULL) {
69
+
70
+  res <- map(.x, .f, ...)
71
+  out <- bind_rows(res, .id=.id)
72
+  out
73
+
74
+}
75
+
76
+map2_df <- function(.x, .y, .f, ..., .id=NULL) {
77
+
78
+  res <- map(.x, .y, .f, ...)
79
+  out <- bind_rows(res, .id = .id)
80
+  out
81
+
82
+}
83
+
84
+# this has limitations and is more like 75% of dplyr::bind_rows()
85
+# this is also orders of magnitude slower than dplyr::bind_rows()
86
+bind_rows <- function(..., .id = NULL) {
87
+
88
+  res <- list(...)
89
+
90
+  if (length(res) == 1) res <- res[[1]]
91
+
92
+  cols <- unique(unlist(lapply(res, names), use.names = FALSE))
93
+
94
+  if (!is.null(.id)) {
95
+    inthere <- cols[.id %in% cols]
96
+    if (length(inthere) > 0) {
97
+      .id <- make.unique(c(inthere, .id))[2]
98
+    }
99
+  }
100
+
101
+  id_vals <- if (is.null(names(res))) 1:length(res) else names(res)
102
+
103
+  saf <- default.stringsAsFactors()
104
+  options(stringsAsFactors = FALSE)
105
+  on.exit(options(stringsAsFactors = saf))
106
+
107
+  idx <- 1
108
+  do.call(
109
+    rbind.data.frame,
110
+    lapply(res, function(.x) {
111
+      x_names <- names(.x)
112
+      moar_names <- setdiff(cols, x_names)
113
+      if (length(moar_names) > 0) {
114
+        for (i in 1:length(moar_names)) {
115
+          .x[[moar_names[i]]] <- rep(NA, length(.x[[1]]))
116
+        }
117
+      }
118
+      if (!is.null(.id)) {
119
+        .x[[.id]] <- id_vals[idx]
120
+        idx <<- idx + 1
121
+      }
122
+      .x
123
+    })
124
+  ) -> out
125
+
126
+  rownames(out) <- NULL
127
+
128
+  class(out) <- c("tbl_df", "tbl", "data.frame")
129
+
130
+  out
131
+
132
+}

+ 90
- 0
R/utils-safely.R View File

@@ -0,0 +1,90 @@
1
+# Less cool counterparts to purrr's side-effect capture-rs
2
+#
3
+# Most of the helper functions are 100% from output.R in purrr repo
4
+#
5
+# @param quiet Hide errors (`TRUE`, the default), or display them
6
+#   as they occur?
7
+# @param otherwise Default value to use when an error occurs.
8
+#
9
+# @return `safely`: wrapped function instead returns a list with
10
+#   components `result` and `error`. One value is always `NULL`.
11
+#
12
+#   `quietly`: wrapped function instead returns a list with components
13
+#   `result`, `output`, `messages` and `warnings`.
14
+#
15
+#   `possibly`: wrapped function uses a default value (`otherwise`)
16
+#   whenever an error occurs.
17
+safely <- function(.f, otherwise = NULL, quiet = TRUE) {
18
+  function(...) capture_error(.f(...), otherwise, quiet)
19
+}
20
+
21
+quietly <- function(.f) {
22
+  function(...) capture_output(.f(...))
23
+}
24
+
25
+possibly <- function(.f, otherwise, quiet = TRUE) {
26
+  force(otherwise)
27
+  function(...) {
28
+    tryCatch(.f(...),
29
+      error = function(e) {
30
+        if (!quiet)
31
+          message("Error: ", e$message)
32
+        otherwise
33
+      },
34
+      interrupt = function(e) {
35
+        stop("Terminated by user", call. = FALSE)
36
+      }
37
+    )
38
+  }
39
+}
40
+
41
+capture_error <- function(code, otherwise = NULL, quiet = TRUE) {
42
+  tryCatch(
43
+    list(result = code, error = NULL),
44
+    error = function(e) {
45
+      if (!quiet)
46
+        message("Error: ", e$message)
47
+
48
+      list(result = otherwise, error = e)
49
+    },
50
+    interrupt = function(e) {
51
+      stop("Terminated by user", call. = FALSE)
52
+    }
53
+  )
54
+}
55
+
56
+capture_output <- function(code) {
57
+  warnings <- character()
58
+  wHandler <- function(w) {
59
+    warnings <<- c(warnings, w$message)
60
+    invokeRestart("muffleWarning")
61
+  }
62
+
63
+  messages <- character()
64
+  mHandler <- function(m) {
65
+    messages <<- c(messages, m$message)
66
+    invokeRestart("muffleMessage")
67
+  }
68
+
69
+  temp <- file()
70
+  sink(temp)
71
+  on.exit({
72
+    sink()
73
+    close(temp)
74
+  })
75
+
76
+  result <- withCallingHandlers(
77
+    code,
78
+    warning = wHandler,
79
+    message = mHandler
80
+  )
81
+
82
+  output <- paste0(readLines(temp, warn = FALSE), collapse = "\n")
83
+
84
+  list(
85
+    result = result,
86
+    output = output,
87
+    warnings = warnings,
88
+    messages = messages
89
+  )
90
+}

R/gdns.r → R/zgdns.r View File

@@ -1,7 +1,7 @@
1 1
 ipv4_regex <-
2 2
   "^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"
3 3
 
4
-S_GET <- purrr::safely(GET)
4
+S_GET <- safely(httr::GET)
5 5
 
6 6
 #' Perform DNS over HTTPS queries using Google
7 7
 #'
@@ -57,10 +57,14 @@ query <- function(name, type="1", edns_client_subnet="0.0.0.0/0") {
57 57
                    sep="", collapse=".")
58 58
   }
59 59
 
60
-  res <- S_GET("https://dns.google.com/resolve",
61
-               query=list(name=name,
62
-                          type=type,
63
-                          edns_client_subnet=edns_client_subnet))
60
+  res <- S_GET(
61
+    url = "https://dns.google.com/resolve",
62
+    query = list(
63
+      name = name,
64
+      type = type,
65
+      edns_client_subnet = edns_client_subnet
66
+    )
67
+  )
64 68
 
65 69
   if (!is.null(res$result)) {
66 70
     stop_for_status(res$result)
@@ -100,5 +104,5 @@ query <- function(name, type="1", edns_client_subnet="0.0.0.0/0") {
100 104
 #' gdns::bulk_query(hosts)
101 105
 bulk_query <- function(entities, type=1, edns_client_subnet="0.0.0.0/0") {
102 106
   results <- map(entities, gdns::query, type=type, edns_client_subnet=edns_client_subnet)
103
-  map_df(results, "Answer")
107
+  map_df(results, ~.x$Answer)
104 108
 }

+ 148
- 117
README.md View File

@@ -1,29 +1,41 @@
1 1
 
2 2
 <!-- README.md is generated from README.Rmd. Please edit that file -->
3
-[![Travis-CI Build Status](https://travis-ci.org/hrbrmstr/gdns.svg?branch=master)](https://travis-ci.org/hrbrmstr/gdns)
3
+
4
+[![Travis-CI Build
5
+Status](https://travis-ci.org/hrbrmstr/gdns.svg?branch=master)](https://travis-ci.org/hrbrmstr/gdns)
4 6
 
5 7
 `gdns` : Tools to work with the Google DNS over HTTPS API
6 8
 
7
-Traditional DNS queries and responses are sent over UDP or TCP without encryption. This is vulnerable to eavesdropping and spoofing (including DNS-based Internet filtering). Responses from recursive resolvers to clients are the most vulnerable to undesired or malicious changes, while communications between recursive resolvers and authoritative nameservers often incorporate additional protection.
9
+Traditional DNS queries and responses are sent over UDP or TCP without
10
+encryption. This is vulnerable to eavesdropping and spoofing (including
11
+DNS-based Internet filtering). Responses from recursive resolvers to
12
+clients are the most vulnerable to undesired or malicious changes, while
13
+communications between recursive resolvers and authoritative nameservers
14
+often incorporate additional protection.
8 15
 
9
-To address this problem, Google Public DNS offers DNS resolution over an encrypted HTTPS connection. DNS-over-HTTPS greatly enhances privacy and security between a client and a recursive resolver, and complements DNSSEC to provide end-to-end authenticated DNS lookups.
16
+To address this problem, Google Public DNS offers DNS resolution over an
17
+encrypted HTTPS connection. DNS-over-HTTPS greatly enhances privacy and
18
+security between a client and a recursive resolver, and complements
19
+DNSSEC to provide end-to-end authenticated DNS lookups.
10 20
 
11
-More info at <https://developers.google.com/speed/public-dns/docs/dns-over-https>.
21
+More info at
22
+<https://developers.google.com/speed/public-dns/docs/dns-over-https>.
12 23
 
13 24
 The following functions are implemented:
14 25
 
15
--   `bulk_query`: Vectorized query, returning only answers in a data frame
16
--   `has_spf`: Test for whether a DNS TXT record is an SPF record
17
--   `is_hard_fail`: SPF "all" type test
18
--   `is_soft_fail`: SPF "all" type test
19
--   `passes_all`: SPF "all" type test
20
--   `query`: Perform DNS over HTTPS queries using Google
21
--   `spf_exists`: SPF field extraction functions
22
--   `spf_includes`: SPF field extraction functions
23
--   `spf_ipv4s`: SPF field extraction functions
24
--   `spf_ipv6s`: SPF field extraction functions
25
--   `spf_ptrs`: SPF field extraction functions
26
--   `split_spf`: Split out all SPF records in a domain's TXT record
26
+  - `bulk_query`: Vectorized query, returning only answers in a data
27
+    frame
28
+  - `has_spf`: Test for whether a DNS TXT record is an SPF record
29
+  - `is_hard_fail`: SPF “all” type test
30
+  - `is_soft_fail`: SPF “all” type test
31
+  - `passes_all`: SPF “all” type test
32
+  - `query`: Perform DNS over HTTPS queries using Google
33
+  - `spf_exists`: SPF field extraction functions
34
+  - `spf_includes`: SPF field extraction functions
35
+  - `spf_ipv4s`: SPF field extraction functions
36
+  - `spf_ipv6s`: SPF field extraction functions
37
+  - `spf_ptrs`: SPF field extraction functions
38
+  - `split_spf`: Split out all SPF records in a domain’s TXT record
27 39
 
28 40
 ### Installation
29 41
 
@@ -38,7 +50,7 @@ library(gdns)
38 50
 
39 51
 # current verison
40 52
 packageVersion("gdns")
41
-#> [1] '0.2.0.9000'
53
+#> [1] '0.2.1'
42 54
 
43 55
 query("rud.is")
44 56
 #> $Status
@@ -64,17 +76,14 @@ query("rud.is")
64 76
 #> 1 rud.is.    1
65 77
 #> 
66 78
 #> $Answer
67
-#>      name type  TTL            data
68
-#> 1 rud.is.    1 3599 104.236.112.222
79
+#>      name type TTL            data
80
+#> 1 rud.is.    1 277 104.236.112.222
69 81
 #> 
70 82
 #> $Additional
71 83
 #> list()
72 84
 #> 
73 85
 #> $edns_client_subnet
74 86
 #> [1] "0.0.0.0/0"
75
-#> 
76
-#> $Comment
77
-#> [1] "Response from dns.mwebdns.net.(84.246.124.75)"
78 87
 
79 88
 query("example.com", "255") # "ANY" query
80 89
 #> $Status
@@ -101,54 +110,53 @@ query("example.com", "255") # "ANY" query
101 110
 #> 
102 111
 #> $Answer
103 112
 #>            name type   TTL
104
-#> 1  example.com.    6  3599
105
-#> 2  example.com.   46 21599
106
-#> 3  example.com.   46 21599
107
-#> 4  example.com.   46  3599
108
-#> 5  example.com.   46    59
109
-#> 6  example.com.   46 21599
110
-#> 7  example.com.   46  3599
111
-#> 8  example.com.   46  3599
112
-#> 9  example.com.   46  3599
113
-#> 10 example.com.   47  3599
114
-#> 11 example.com.    2 21599
115
-#> 12 example.com.    2 21599
116
-#> 13 example.com.   28 21599
117
-#> 14 example.com.    1 21599
118
-#> 15 example.com.   16    59
119
-#> 16 example.com.   16    59
120
-#> 17 example.com.   48  3599
121
-#> 18 example.com.   48  3599
122
-#> 19 example.com.   48  3599
113
+#> 1  example.com.   46 21548
114
+#> 2  example.com.   46 21548
115
+#> 3  example.com.   46  3548
116
+#> 4  example.com.   46     8
117
+#> 5  example.com.   46 21548
118
+#> 6  example.com.   46  3548
119
+#> 7  example.com.   46  3548
120
+#> 8  example.com.   46  3548
121
+#> 9  example.com.   47  3548
122
+#> 10 example.com.    2 21548
123
+#> 11 example.com.    2 21548
124
+#> 12 example.com.   28 21548
125
+#> 13 example.com.    1 21548
126
+#> 14 example.com.   16     8
127
+#> 15 example.com.   16     8
128
+#> 16 example.com.   48  3548
129
+#> 17 example.com.   48  3548
130
+#> 18 example.com.   48  3548
131
+#> 19 example.com.   48  3548
132
+#> 20 example.com.    6  3548
123 133
 #>                                                                                                                                                                                                                                                                                                                                                                                                                 data
124
-#> 1                                                                                                                                                                                                                                                                                                                                            sns.dns.icann.org. noc.dns.icann.org. 2015082662 7200 3600 1209600 3600
125
-#> 2                                                                                                                                                                               a 8 2 86400 1476095331 1474297785 1704 example.com. OnhJa3/aHkvePBvBME3nlZrkU/rdenyaquFgSYI/wKPq2/ZJVZGhv0TVBMJ5l6GZujqnyBfq9cvvb88//koi17oNjR5JEv2cv4rLT5pud3VhQdVrHD7fU8BV/YnCpP3ikXJMgjf6sAhgL7FZKLtpv7cFXnqznfRCTZ3HKkpBtAB0ZZw=
126
-#> 3                                                                                                                                                                              ns 8 2 86400 1476218628 1474362585 1704 example.com. dxPw4KtqLRMR/P1MB7umTClO/Tgf5X2ukJApKd133OMPhsy7c2N3QIxW4TLxZnCezUewDE1D86HBnGi1kGw4pN4W83lI37L6pTjIkDUtrc1acISOwg9Q9JM74On9/qKTGpTi7aSGVA5t4biLKqPm00a1Yu/VNPOxeLQPyYNjUYspNZ8=
127
-#> 4                                                                                                                                                                              soa 8 2 3600 1476508736 1474722585 1704 example.com. rHojLwiWn5xVU8noy1se7gRjiNI6GJdDcxwO1GU1qUs3Un4y7LyENjrK8qOv2z6EhblBOhPnrgnNMzEPPH3w+5azpU6xAH+jJHO4tExj4Pc3zzQ1sfFx1k8xWPfJjiWnUtUsk19y8vVqHvLXltvVItXlCClzljA0XyNUi1fvYjHbQxI=
128
-#> 5                                                                                                                                                                                txt 8 2 60 1476051975 1474218584 1704 example.com. FBZiE56Ux4VY5AMVtgitLIBWi+UteNSFh4BWwJksVRRt/7OoH7iD6h4UDqP8rNbk9qvXmRo4Ce2vROCbNkdTy/IDEoKo+Urfm69TuI2UTbl/nnQ2UtfMIEC83yywYRWdra5BPkt67SQhHSc4N7QHblABFbm2jPuu2+uOqaRCpfeoWYo=
129
-#> 6                                                                                                                                                                            aaaa 8 2 86400 1475967038 1474146584 1704 example.com. ZQgPaEBxSxHCPhOES76xksqOVYSRtNIieIwTwIo4Oceq0NGzjOyI+8wrgs79QHqs4e5SRe67hVX2rSaJ9Q167+TuQz57ZtyqeOZ+x+cgULyT1Q+8N0ZJlHpZS4i2VfR1xT+quG+0m9wtye8wA3Hl2mWPyTjtsH7mjoS7/U/ZQMJwi44=
130
-#> 7                                                                                                                                                                             nsec 8 2 3600 1475694918 1473887384 1704 example.com. XTCfotH8+cSDgNrFnCNWt4lx64yTnVzwOMZsFgynNSGS5LzY0VfRl7UvTH2WDVzdsIHgKpPBOUwv/DvjNhAMzUgHFlaK/A+U1aFa16/YQkqkIqqfnCA4EgBdhIK4FM3dSIVcpaj3PhGFKvMG4RBvoMAWLRXE3gKf3306CJzX1sfKdsA=
131
-#> 8  dnskey 8 2 3600 1476561735 1474722585 31406 example.com. Oup7snCR/5iUmTuGyHfCfFCisTeqaJ8RHD6aE9wZQR2CCkKZHXO9dzfUL1gA6T35p4T0XeM+TMlv1uZhX157RnanPwyZluancmm5cNz5ub0vG7G/O4DxnSoLmATYoBJ7Ub9Ul4iWFUE7nvyJ23X2MhX6XTiplXYPnztiem6rJLV84JiemoKtvapWchRhFi4w4Y+BdjHfY7IRERjQYNhVuaus5+EeppIoot9srsj2suXePGC7dE0R8z9K/BTYvQi76kBlJzzF9fNNy5JvyZPEUpXATuRD7KfxBsWHaFajOnYOb1eDAL/C0H3hhjVBov2Pexp7YDIsJzIa2g8850LruQ==
132
-#> 9  dnskey 8 2 3600 1476561735 1474722585 45620 example.com. f+aO6V+QKA4XgTC0Vqow59jBP/NlX6f7EEbaoXts0lp7Vaj/DBrhnS/sT4BbJb3VK1MvuPmNre5t0eyOeNCjbjrwIM2uf41GFuBI0AFxQx7o2PIdf1vrXsDnUGsZrMkYMv4gr802S7MXsvMdMN5cM0AA5Zol888sLP1yrHIcfNxG8hoUn3dS0L6nd/OxkL70+NjHBTjBQLqkLsK92ryJ0CWrzcJElszBRqfQfYGV/sJ84Ko4tjnBqRuki/rmTW5KQYdE7NI+MvERtGnep7RHb02Luk7BFPPD3uh353EYSAOVHrMH4fte6mJGcj3vxErfSWakRUXQpovLNcqYZNxoGQ==
133
-#> 10                                                                                                                                                                                                                                                                                                                                                              www.example.com. A NS SOA TXT AAAA RRSIG NSEC DNSKEY
134
-#> 11                                                                                                                                                                                                                                                                                                                                                                                               a.iana-servers.net.
135
-#> 12                                                                                                                                                                                                                                                                                                                                                                                               b.iana-servers.net.
136
-#> 13                                                                                                                                                                                                                                                                                                                                                                                2606:2800:220:1:248:1893:25c8:1946
137
-#> 14                                                                                                                                                                                                                                                                                                                                                                                                     93.184.216.34
138
-#> 15                                                                                                                                                                                                                                                                                                                                                                                                     "v=spf1 -all"
139
-#> 16                                                                                                                                                                                                                                                                                                                                                             "$Id: example.com 4415 2015-08-24 20:12:23Z davids $"
140
-#> 17                                                                                                                                                                                                                      256 3 8 AwEAAa3d68DfyIs03nGYpi3a9YX+f/wln3g6dhWWzjUUqp6CGXuaOdEHfS8zI/5JdGKi8Xoc4YmjPGfiCJIkCiQnMKn/QFygpZs41ANLdPp2jJlJhFA6IHE/xxTCxJfNhsdEAOGlMORN9Zu1XLUBo/IuCDUvUzZPgalivd/m9L+Jr4kxbg3v
134
+#> 1                                                                                                                                                                                   a 8 2 86400 1530064725 1528271786 4354 example.com. gpgx3XIhF4XZg5Nw0eo7TmCD1zfKX9YtMq9PuSh3eAc4fJrvyS/VWy2bz/KYhgiXQe6PvtOLZbgTT2O9knkHIlAsmnznEowSrgWYaCkkkNnoC8Ii1Ikg87PCZ7FffTposk/4HRG6yXZlo9+++YZAfAC0cc9FFYpQXqxVLf9/aDQ=
135
+#> 2                                                                                                                                                                                  ns 8 2 86400 1530070167 1528286186 4354 example.com. tVZnWX3VxO+XqrDS76S6RpLYvGluZIQkai0aWx3pzjjhqi+qKO7WtjcIYmOgehBB2t3TVC9cv1rhb21SDBZPNtgtpWAR/W3hPK1FA4AhDW3tDwk0vZ8VnxRS6YZRdubY5xx8f+88auYUZNauK3SsAcKj4k9IaeMLinzpie0ydKk=
136
+#> 3                                                                                                                                                                                  soa 8 2 3600 1530144931 1528300586 4354 example.com. oDz3EMYugQZ5zJV2Wwr76heKzbOB8cDgol+HD0DTPPNkBHkU33thZI3kwtD/KE7YFbwlD86is5Qgy4sVOToEcxs6Th2+bxkwkSDbnNCfpqXg9FP2nknfsYdN8UHIOcsbjo8pAEQrwbOBnRhkfgh+B2jXCeR8wcYIDtlfyjIG5dw=
137
+#> 4                                                                                                                                                                                    txt 8 2 60 1530100194 1528250186 4354 example.com. PRVGxCX8Sghw9xQv+ITTpIHbpku543BNEVSA0LZVIZ2p5r3kPb4vlID/jSzFTOhgLhdkB0OAMG3dvWxNXT3fOBiv8c/UZHdwjJdneLeoHILiAa4Y3HSC+t4kcs+9qRFzj4EQgXwr0zWLDoZTa9bkhoVdaC8q+oL+TyjiwgG6RXs=
138
+#> 5                                                                                                                                                                                aaaa 8 2 86400 1528834805 1526975786 4354 example.com. lRAUeTu/Wr7mobPHuh29z66cqqnCQXvUcSWYNsrdJvWIUaaGNUtz800bQQuZah3tZbJeSbDV+LivN8pFYrTPR9AVyTi1uD7x8qH+3MckgKezJ199e1twfbpl0O44zSFlrI7SxEaWhTnUGM2xafyH0HZUr1Eg/5nxDFlmaVfxet8=
139
+#> 6                                                                                                                                                                                 nsec 8 2 3600 1530145868 1528300586 4354 example.com. NV0BbCZT7yXFnrJhEV1atS0QBbkDmojtUw9PIxDOUJzEZtWql5qJ5iMJl2z8ghmRwurnRAskBOZaT1jstyf/X8wBS8T05uc6KgfiFdoeseIWfTd9+9y6E9ESHmsSLDyHlbex6k3XAb5c4GWSyZ058JpSUyQbpnTC0fxEONxiFT4=
140
+#> 7  dnskey 8 2 3600 1530072436 1528278986 31406 example.com. exstuS89vtBrpvN+6XK49NWMrQmUoHJAAMzLMCi5w3xUczvo9hQWi3yfDVk7Rdtv61IFEFRTIVVCoM0kpWmgp1NwOPKNSUxg3OVO5++PGoCE7hI8fhW/xdiOUC1dHHk/zuWRoriERykgNvo6yzegBmXbOyf7WCh1csoGuk+RmIWykngZw9wCX+qjdO1G8y8DMmwzEzDc3fBN9v2at3lo+VK/uhR4Tu6rr4rxkYqqgz02TIkHr14GsCa4hlf8/s2UhaWKil5ja51HgFsR2fLHRwZ1x1toejaxMekJvVcarhNYodU83q8qZ0Yoa8GIKpdS70chj4ZrLiUkBhV2KEtytg==
141
+#> 8  dnskey 8 2 3600 1530072436 1528278986 45620 example.com. Kd2iq2xmcg5GJmNOQiHjZKDKHH+MyDagSjXuTJKiJFXSpgMzZUl9Gnr+LsDTiLaddotsBo3OXQODZDlIB5jlI7/hkt/kYOb8d1ns+hd5jmTyFowhOiQAxpWUlZkvXvVQ5gAnefxGCx78/4JtFnTMGADiAYEIMXZm+qtjn9/YJKtkgmgutxcVjTDAl7zVdvN+uyR5g/f2Rm5x1aWLIfmAtg0Nv5xFKZTduPse8PrKsGHC3uezWRshbOYugOxp/Ui6Ru6PNBaeUBGuKwQw2XcB9H65PE4wj14mcCcQk5wTL8VfeaW6WQ6y+dgtwMGoUCnF2Eaj/5Gnv2mW+1VMv0jIqg==
142
+#> 9                                                                                                                                                                                                                                                                                                                                                               www.example.com. A NS SOA TXT AAAA RRSIG NSEC DNSKEY
143
+#> 10                                                                                                                                                                                                                                                                                                                                                                                               a.iana-servers.net.
144
+#> 11                                                                                                                                                                                                                                                                                                                                                                                               b.iana-servers.net.
145
+#> 12                                                                                                                                                                                                                                                                                                                                                                                2606:2800:220:1:248:1893:25c8:1946
146
+#> 13                                                                                                                                                                                                                                                                                                                                                                                                     93.184.216.34
147
+#> 14                                                                                                                                                                                                                                                                                                                                                                                                     "v=spf1 -all"
148
+#> 15                                                                                                                                                                                                                                                                                                                                                             "$Id: example.com 4415 2015-08-24 20:12:23Z davids $"
149
+#> 16                                                                                                                                                                                                                          256 3 8 AwEAAa1e3aHzKml+EtBvA6ZVztOV+AByi8/9akkbL9COtasbKc1VBbHS6w8uHGqHaEMXzriWtXAwlSzHMgIxJ1y0fXcB/h4Yg8qNnJvgSU1JAKvYLJMkdAk+P5XbdGtpUNCh4d9NEZkY/lFClYo8iyIAVeifDeaeaEQIRKbPZLLwtgr1
150
+#> 17                                                                                                                                                                                                                          256 3 8 AwEAAbpTkuNZuxDDAwDW46cAroMR10zm9MsdVnXT+m/4HtbGstC4LIt8WU3CRayoXZyO6zDwxAytkuKxuEWVCAVA7ligFPR8Ta/BoR91H66dj8OPExAq6ugqKsQDKP906j5cF9Rsr9k0rEjvh2MptStkzCSaBB3FulTj14pBX1MZ8x9n
141 151
 #> 18                                              257 3 8 AwEAAZ0aqu1rJ6orJynrRfNpPmayJZoAx9Ic2/Rl9VQWLMHyjxxem3VUSoNUIFXERQbj0A9Ogp0zDM9YIccKLRd6LmWiDCt7UJQxVdD+heb5Ec4qlqGmyX9MDabkvX2NvMwsUecbYBq8oXeTT9LRmCUt9KUt/WOi6DKECxoG/bWTykrXyBR8elD+SQY43OAVjlWrVltHxgp4/rhBCvRbmdflunaPIgu27eE2U4myDSLT8a4A0rB5uHG4PkOa9dIRs9y00M2mWf4lyPee7vi5few2dbayHXmieGcaAHrx76NGAABeY393xjlmDNcUkF1gpNWUla4fWZbbaYQzA93mLdrng+M=
142 152
 #> 19                                              257 3 8 AwEAAbOFAxl+Lkt0UMglZizKEC1AxUu8zlj65KYatR5wBWMrh18TYzK/ig6Y1t5YTWCO68bynorpNu9fqNFALX7bVl9/gybA0v0EhF+dgXmoUfRX7ksMGgBvtfa2/Y9a3klXNLqkTszIQ4PEMVCjtryl19Be9/PkFeC9ITjgMRQsQhmB39eyMYnal+f3bUxKk4fq7cuEU0dbRpue4H/N6jPucXWOwiMAkTJhghqgy+o9FfIp+tR/emKao94/wpVXDcPf5B18j7xz2SvTTxiuqCzCMtsxnikZHcoh1j4g+Y1B8zIMIvrEM+pZGhh/Yuf4RwCBgaYCi9hpiMWVvS4WBzx0/lU=
153
+#> 20                                                                                                                                                                                                                                                                                                                                           sns.dns.icann.org. noc.dns.icann.org. 2018050812 7200 3600 1209600 3600
143 154
 #> 
144 155
 #> $Additional
145 156
 #> list()
146 157
 #> 
147 158
 #> $edns_client_subnet
148 159
 #> [1] "0.0.0.0/0"
149
-#> 
150
-#> $Comment
151
-#> [1] "Response from 199.43.135.53"
152 160
 
153 161
 query("microsoft.com", "MX")
154 162
 #> $Status
@@ -175,13 +183,16 @@ query("microsoft.com", "MX")
175 183
 #> 
176 184
 #> $Answer
177 185
 #>             name type  TTL                                          data
178
-#> 1 microsoft.com.   15 1509 10 microsoft-com.mail.protection.outlook.com.
186
+#> 1 microsoft.com.   15 3599 10 microsoft-com.mail.protection.outlook.com.
179 187
 #> 
180 188
 #> $Additional
181 189
 #> list()
182 190
 #> 
183 191
 #> $edns_client_subnet
184 192
 #> [1] "0.0.0.0/0"
193
+#> 
194
+#> $Comment
195
+#> [1] "Response from 193.221.113.53."
185 196
 
186 197
 query("google-public-dns-a.google.com", "TXT")
187 198
 #> $Status
@@ -217,7 +228,7 @@ query("google-public-dns-a.google.com", "TXT")
217 228
 #> [1] "0.0.0.0/0"
218 229
 #> 
219 230
 #> $Comment
220
-#> [1] "Response from 216.239.36.10"
231
+#> [1] "Response from 216.239.32.10."
221 232
 
222 233
 query("apple.com")
223 234
 #> $Status
@@ -244,9 +255,9 @@ query("apple.com")
244 255
 #> 
245 256
 #> $Answer
246 257
 #>         name type  TTL          data
247
-#> 1 apple.com.    1 3413 17.172.224.47
248
-#> 2 apple.com.    1 3413  17.178.96.59
249
-#> 3 apple.com.    1 3413 17.142.160.59
258
+#> 1 apple.com.    1 3592 17.172.224.47
259
+#> 2 apple.com.    1 3592  17.178.96.59
260
+#> 3 apple.com.    1 3592 17.142.160.59
250 261
 #> 
251 262
 #> $Additional
252 263
 #> list()
@@ -278,46 +289,57 @@ query("17.142.160.59", "PTR")
278 289
 #> 1 59.160.142.17.in-addr.arpa.   12
279 290
 #> 
280 291
 #> $Answer
281
-#>                           name type  TTL                           data
282
-#> 1  59.160.142.17.in-addr.arpa.   12 3025                 apples-msk.ru.
283
-#> 2  59.160.142.17.in-addr.arpa.   12 3025                     icloud.se.
284
-#> 3  59.160.142.17.in-addr.arpa.   12 3025                     icloud.es.
285
-#> 4  59.160.142.17.in-addr.arpa.   12 3025                     icloud.om.
286
-#> 5  59.160.142.17.in-addr.arpa.   12 3025                   icloudo.com.
287
-#> 6  59.160.142.17.in-addr.arpa.   12 3025                     icloud.ch.
288
-#> 7  59.160.142.17.in-addr.arpa.   12 3025                     icloud.fr.
289
-#> 8  59.160.142.17.in-addr.arpa.   12 3025                   icloude.com.
290
-#> 9  59.160.142.17.in-addr.arpa.   12 3025          camelspaceeffect.com.
291
-#> 10 59.160.142.17.in-addr.arpa.   12 3025                 camelphat.com.
292
-#> 11 59.160.142.17.in-addr.arpa.   12 3025              alchemysynth.com.
293
-#> 12 59.160.142.17.in-addr.arpa.   12 3025                    openni.org.
294
-#> 13 59.160.142.17.in-addr.arpa.   12 3025                      swell.am.
295
-#> 14 59.160.142.17.in-addr.arpa.   12 3025                  appleweb.net.
296
-#> 15 59.160.142.17.in-addr.arpa.   12 3025                     apple.com.
297
-#> 16 59.160.142.17.in-addr.arpa.   12 3025        pv-apple-com.apple.com.
298
-#> 17 59.160.142.17.in-addr.arpa.   12 3025                ripmixburn.com.
299
-#> 18 59.160.142.17.in-addr.arpa.   12 3025                   yessql.info.
300
-#> 19 59.160.142.17.in-addr.arpa.   12 3025               webobjects.info.
301
-#> 20 59.160.142.17.in-addr.arpa.   12 3025                     ubnw.info.
302
-#> 21 59.160.142.17.in-addr.arpa.   12 3025                 skyvines.info.
303
-#> 22 59.160.142.17.in-addr.arpa.   12 3025            shopdifferent.info.
304
-#> 23 59.160.142.17.in-addr.arpa.   12 3025                 sherlock.info.
305
-#> 24 59.160.142.17.in-addr.arpa.   12 3025              quicktimetv.info.
306
-#> 25 59.160.142.17.in-addr.arpa.   12 3025            quicktimelive.info.
307
-#> 26 59.160.142.17.in-addr.arpa.   12 3025                 powermac.info.
308
-#> 27 59.160.142.17.in-addr.arpa.   12 3025                powerbook.info.
309
-#> 28 59.160.142.17.in-addr.arpa.   12 3025                   macosx.info.
310
-#> 29 59.160.142.17.in-addr.arpa.   12 3025               appleshare.info.
311
-#> 30 59.160.142.17.in-addr.arpa.   12 3025              applescript.info.
312
-#> 31 59.160.142.17.in-addr.arpa.   12 3025         applepaysupplies.info.
313
-#> 32 59.160.142.17.in-addr.arpa.   12 3025 applepaymerchantsupplies.info.
314
-#> 33 59.160.142.17.in-addr.arpa.   12 3025                 applepay.info.
315
-#> 34 59.160.142.17.in-addr.arpa.   12 3025             applemasters.info.
316
-#> 35 59.160.142.17.in-addr.arpa.   12 3025                appleexpo.info.
317
-#> 36 59.160.142.17.in-addr.arpa.   12 3025         applecomputerinc.info.
318
-#> 37 59.160.142.17.in-addr.arpa.   12 3025              applecentre.info.
319
-#> 38 59.160.142.17.in-addr.arpa.   12 3025                 airtunes.info.
320
-#> 39 59.160.142.17.in-addr.arpa.   12 3025                      apple.by.
292
+#>                           name type TTL                           data
293
+#> 1  59.160.142.17.in-addr.arpa.   12 907                      imac.one.
294
+#> 2  59.160.142.17.in-addr.arpa.   12 907                       mac.one.
295
+#> 3  59.160.142.17.in-addr.arpa.   12 907                  itunes.earth.
296
+#> 4  59.160.142.17.in-addr.arpa.   12 907                     chomp.com.
297
+#> 5  59.160.142.17.in-addr.arpa.   12 907                   iphone.host.
298
+#> 6  59.160.142.17.in-addr.arpa.   12 907                ripmixburn.com.
299
+#> 7  59.160.142.17.in-addr.arpa.   12 907                   yessql.info.
300
+#> 8  59.160.142.17.in-addr.arpa.   12 907               webobjects.info.
301
+#> 9  59.160.142.17.in-addr.arpa.   12 907                     ubnw.info.
302
+#> 10 59.160.142.17.in-addr.arpa.   12 907                 skyvines.info.
303
+#> 11 59.160.142.17.in-addr.arpa.   12 907            shopdifferent.info.
304
+#> 12 59.160.142.17.in-addr.arpa.   12 907                 sherlock.info.
305
+#> 13 59.160.142.17.in-addr.arpa.   12 907              quicktimetv.info.
306
+#> 14 59.160.142.17.in-addr.arpa.   12 907            quicktimelive.info.
307
+#> 15 59.160.142.17.in-addr.arpa.   12 907                 powermac.info.
308
+#> 16 59.160.142.17.in-addr.arpa.   12 907                powerbook.info.
309
+#> 17 59.160.142.17.in-addr.arpa.   12 907                   macosx.info.
310
+#> 18 59.160.142.17.in-addr.arpa.   12 907               appleshare.info.
311
+#> 19 59.160.142.17.in-addr.arpa.   12 907              applescript.info.
312
+#> 20 59.160.142.17.in-addr.arpa.   12 907         applepaysupplies.info.
313
+#> 21 59.160.142.17.in-addr.arpa.   12 907 applepaymerchantsupplies.info.
314
+#> 22 59.160.142.17.in-addr.arpa.   12 907                 applepay.info.
315
+#> 23 59.160.142.17.in-addr.arpa.   12 907             applemasters.info.
316
+#> 24 59.160.142.17.in-addr.arpa.   12 907                appleexpo.info.
317
+#> 25 59.160.142.17.in-addr.arpa.   12 907         applecomputerinc.info.
318
+#> 26 59.160.142.17.in-addr.arpa.   12 907              applecentre.info.
319
+#> 27 59.160.142.17.in-addr.arpa.   12 907                 airtunes.info.
320
+#> 28 59.160.142.17.in-addr.arpa.   12 907                      apple.by.
321
+#> 29 59.160.142.17.in-addr.arpa.   12 907                 apples-msk.ru.
322
+#> 30 59.160.142.17.in-addr.arpa.   12 907                     icloud.se.
323
+#> 31 59.160.142.17.in-addr.arpa.   12 907                     icloud.es.
324
+#> 32 59.160.142.17.in-addr.arpa.   12 907                     icloud.om.
325
+#> 33 59.160.142.17.in-addr.arpa.   12 907                   icloudo.com.
326
+#> 34 59.160.142.17.in-addr.arpa.   12 907                     icloud.ch.
327
+#> 35 59.160.142.17.in-addr.arpa.   12 907                     icloud.fr.
328
+#> 36 59.160.142.17.in-addr.arpa.   12 907                   icloude.com.
329
+#> 37 59.160.142.17.in-addr.arpa.   12 907          camelspaceeffect.com.
330
+#> 38 59.160.142.17.in-addr.arpa.   12 907                 camelphat.com.
331
+#> 39 59.160.142.17.in-addr.arpa.   12 907              alchemysynth.com.
332
+#> 40 59.160.142.17.in-addr.arpa.   12 907                    openni.org.
333
+#> 41 59.160.142.17.in-addr.arpa.   12 907                      swell.am.
334
+#> 42 59.160.142.17.in-addr.arpa.   12 907                  appleweb.net.
335
+#> 43 59.160.142.17.in-addr.arpa.   12 907                     apple.com.
336
+#> 44 59.160.142.17.in-addr.arpa.   12 907        pv-apple-com.apple.com.
337
+#> 45 59.160.142.17.in-addr.arpa.   12 907                     ipad.host.
338
+#> 46 59.160.142.17.in-addr.arpa.   12 907                   appleid.org.
339
+#> 47 59.160.142.17.in-addr.arpa.   12 907                     apple.xyz.
340
+#> 48 59.160.142.17.in-addr.arpa.   12 907           searchads-apple.com.
341
+#> 49 59.160.142.17.in-addr.arpa.   12 907              airport.brussels.
342
+#> 50 59.160.142.17.in-addr.arpa.   12 907                  ipadpro.buzz.
321 343
 #> 
322 344
 #> $Additional
323 345
 #> list()
@@ -328,13 +350,13 @@ query("17.142.160.59", "PTR")
328 350
 hosts <- c("rud.is", "dds.ec", "r-project.org", "rstudio.com", "apple.com")
329 351
 gdns::bulk_query(hosts)
330 352
 #>             name type  TTL            data
331
-#> 1        rud.is.    1 3598 104.236.112.222
332
-#> 2        dds.ec.    1  299   162.243.111.4
333
-#> 3 r-project.org.    1 3072   137.208.57.37
334
-#> 4   rstudio.com.    1 3599    45.79.156.36
335
-#> 5     apple.com.    1 3415   17.172.224.47
336
-#> 6     apple.com.    1 3415    17.178.96.59
337
-#> 7     apple.com.    1 3415   17.142.160.59
353
+#> 1        rud.is.    1  276 104.236.112.222
354
+#> 2        dds.ec.    1  599    185.53.178.9
355
+#> 3 r-project.org.    1 4806   137.208.57.37
356
+#> 4   rstudio.com.    1 3599   104.196.200.5
357
+#> 5     apple.com.    1 3585   17.172.224.47
358
+#> 6     apple.com.    1 3585    17.178.96.59
359
+#> 7     apple.com.    1 3585   17.142.160.59
338 360
 ```
339 361
 
340 362
 ### Test Results
@@ -344,15 +366,24 @@ library(gdns)
344 366
 library(testthat)
345 367
 
346 368
 date()
347
-#> [1] "Thu Sep 29 09:44:11 2016"
369
+#> [1] "Wed Jun  6 15:28:43 2018"
348 370
 
349 371
 test_dir("tests/")
350
-#> testthat results ========================================================================================================
372
+#> ✔ | OK F W S | Context
373
+#> ══ testthat results  ════════════════════════════════════════════════════════════
351 374
 #> OK: 2 SKIPPED: 0 FAILED: 0
352 375
 #> 
353
-#> DONE ===================================================================================================================
376
+#> ══ Results ══════════════════════════════════════════════════════════════════════
377
+#> Duration: 0.3 s
378
+#> 
379
+#> OK:       0
380
+#> Failed:   0
381
+#> Warnings: 0
382
+#> Skipped:  0
354 383
 ```
355 384
 
356 385
 ### Code of Conduct
357 386
 
358
-Please note that this project is released with a [Contributor Code of Conduct](CONDUCT.md). By participating in this project you agree to abide by its terms.
387
+Please note that this project is released with a [Contributor Code of
388
+Conduct](CONDUCT.md). By participating in this project you agree to
389
+abide by its terms.

+ 1
- 1
man/bulk_query.Rd View File

@@ -1,5 +1,5 @@
1 1
 % Generated by roxygen2: do not edit by hand
2
-% Please edit documentation in R/gdns.r
2
+% Please edit documentation in R/zgdns.r
3 3
 \name{bulk_query}
4 4
 \alias{bulk_query}
5 5
 \title{Vectorized query, returning only answers in a data frame}

+ 1
- 1
man/query.Rd View File

@@ -1,5 +1,5 @@
1 1
 % Generated by roxygen2: do not edit by hand
2
-% Please edit documentation in R/gdns.r
2
+% Please edit documentation in R/zgdns.r
3 3
 \name{query}
4 4
 \alias{query}
5 5
 \title{Perform DNS over HTTPS queries using Google}

Loading…
Cancel
Save