|
|
|
---
|
|
|
|
output: rmarkdown::github_document
|
|
|
|
editor_options:
|
|
|
|
chunk_output_type: console
|
|
|
|
---
|
|
|
|
```{r pkg-knitr-opts, include=FALSE}
|
|
|
|
hrbrpkghelpr::global_opts()
|
|
|
|
```
|
|
|
|
|
|
|
|
```{r badges, results='asis', echo=FALSE, cache=FALSE}
|
|
|
|
hrbrpkghelpr::stinking_badges(branch = "batman")
|
|
|
|
```
|
|
|
|
|
|
|
|
```{r description, results='asis', echo=FALSE, cache=FALSE}
|
|
|
|
hrbrpkghelpr::yank_title_and_description()
|
|
|
|
```
|
|
|
|
|
|
|
|
## What's Inside The Tin
|
|
|
|
|
|
|
|
The following functions are implemented:
|
|
|
|
|
|
|
|
```{r ingredients, results='asis', echo=FALSE, cache=FALSE}
|
|
|
|
hrbrpkghelpr::describe_ingredients()
|
|
|
|
```
|
|
|
|
|
|
|
|
## Installation
|
|
|
|
|
|
|
|
```{r install-ex, results='asis', echo=FALSE, cache=FALSE}
|
|
|
|
hrbrpkghelpr::install_block()
|
|
|
|
```
|
|
|
|
|
|
|
|
## Usage
|
|
|
|
|
|
|
|
```{r lib-ex}
|
|
|
|
library(construe)
|
|
|
|
|
|
|
|
# current version
|
|
|
|
packageVersion("construe")
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
### Requests
|
|
|
|
|
|
|
|
```{r ex01}
|
|
|
|
paste0(c(
|
|
|
|
"GET /uri.cgi HTTP/1.1\r\n",
|
|
|
|
"User-Agent: Mozilla/5.0\r\n",
|
|
|
|
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n",
|
|
|
|
"Host: 127.0.0.1\r\n", "\r\n"
|
|
|
|
), collapse = "") -> req
|
|
|
|
|
|
|
|
req_raw <- charToRaw(req)
|
|
|
|
|
|
|
|
parse_request(req)
|
|
|
|
|
|
|
|
parse_request_raw(req_raw)
|
|
|
|
|
|
|
|
microbenchmark::microbenchmark(
|
|
|
|
parse_request = parse_request(req),
|
|
|
|
parse_request_raw = parse_request_raw(req_raw)
|
|
|
|
)
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### Responses
|
|
|
|
|
|
|
|
```{r ex02}
|
|
|
|
paste0(c(
|
|
|
|
"HTTP/1.1 200 OK\r\n",
|
|
|
|
"Server: nginx/1.2.1\r\n",
|
|
|
|
"Content-Type: text/html\r\n",
|
|
|
|
"Content-Length: 8\r\n",
|
|
|
|
"Connection: keep-alive\r\n",
|
|
|
|
"\r\n",
|
|
|
|
"<html />"
|
|
|
|
), collapse = "") -> resp
|
|
|
|
|
|
|
|
resp_raw <- charToRaw(resp)
|
|
|
|
|
|
|
|
parse_response(resp)
|
|
|
|
|
|
|
|
parse_response_raw(resp_raw)
|
|
|
|
|
|
|
|
microbenchmark::microbenchmark(
|
|
|
|
parse_response = parse_response(resp),
|
|
|
|
parse_response_raw = parse_response_raw(resp_raw)
|
|
|
|
)
|
|
|
|
```
|
|
|
|
|
|
|
|
### curl output example
|
|
|
|
|
|
|
|
`HEAD` request:
|
|
|
|
|
|
|
|
```{r curl-01}
|
|
|
|
sys::exec_internal(
|
|
|
|
cmd = "curl",
|
|
|
|
args = c("--include", "--head", "--silent", "https://httpbin.org/")
|
|
|
|
) -> res
|
|
|
|
|
|
|
|
str(parse_response(rawToChar(res$stdout)), 2)
|
|
|
|
|
|
|
|
curl::curl_fetch_memory(
|
|
|
|
"https://httpbin.org/",
|
|
|
|
handle = curl::new_handle(
|
|
|
|
nobody = TRUE
|
|
|
|
)
|
|
|
|
) -> res
|
|
|
|
|
|
|
|
str(construe::parse_response_raw(res$headers), 2)
|
|
|
|
|
|
|
|
curl::curl_fetch_memory(
|
|
|
|
"http://rud.is/b",
|
|
|
|
handle = curl::new_handle(
|
|
|
|
nobody = TRUE,
|
|
|
|
followlocation = TRUE
|
|
|
|
)
|
|
|
|
) -> res
|
|
|
|
|
|
|
|
rawToChar(res$headers) %>%
|
|
|
|
strsplit("(?m)\r\n\r\n", perl = TRUE) %>%
|
|
|
|
unlist() %>%
|
|
|
|
lapply(construe::parse_response) %>%
|
|
|
|
str(2)
|
|
|
|
```
|
|
|
|
|
|
|
|
`GET` request:
|
|
|
|
|
|
|
|
```{r curl-02}
|
|
|
|
sys::exec_internal(
|
|
|
|
cmd = "curl",
|
|
|
|
args = c("--include", "--silent", "https://httpbin.org/")
|
|
|
|
) -> res
|
|
|
|
|
|
|
|
str(parse_response_raw(res$stdout), 2)
|
|
|
|
|
|
|
|
res <- curl::curl_fetch_memory("https://httpbin.org/")
|
|
|
|
|
|
|
|
str(construe::parse_response_raw(res$headers), 2)
|
|
|
|
```
|
|
|
|
|
|
|
|
### URLs
|
|
|
|
|
|
|
|
```{r ex03}
|
|
|
|
c(
|
|
|
|
"git+ssh://example.com/path/file",
|
|
|
|
"https://example.com/path/file",
|
|
|
|
"http://www.example.com/dir/subdir?param=1¶m=2;param%20=%20#fragment",
|
|
|
|
"http://www.example.com",
|
|
|
|
"http://username@www.example.com/dir/subdir?param=1¶m=2;param%20=%20#fragment",
|
|
|
|
"http://username:passwd@www.example.com/dir/subdir?param=1¶m=2;param%20=%20#fragment",
|
|
|
|
"http://www.example.com:8080/dir/subdir?param=1¶m=2;param%20=%20#fragment",
|
|
|
|
"http://username:passwd@www.example.com:8080/dir/subdir?param=1¶m=2;param%20=%20#fragment",
|
|
|
|
"ftp://username:passwd@ftp.example.com/dir/filename.ext",
|
|
|
|
"mailto:username@example.com",
|
|
|
|
"svn+ssh://hostname-01.org/path/to/file",
|
|
|
|
"xddp::://///blah.wat/?"
|
|
|
|
) -> turls
|
|
|
|
|
|
|
|
parse_url(turls)
|
|
|
|
|
|
|
|
microbenchmark::microbenchmark(
|
|
|
|
parse_url = parse_url(turls[1])
|
|
|
|
)
|
|
|
|
```
|
|
|
|
|
|
|
|
### Parse headers from Palo Alto `HEAD` requests
|
|
|
|
|
|
|
|
```{r why}
|
|
|
|
hdr <- read_file_raw(system.file("extdat", "example.hdr", package = "construe"))
|
|
|
|
|
|
|
|
cat(rawToChar(hdr))
|
|
|
|
|
|
|
|
parse_response_raw(hdr)
|
|
|
|
```
|
|
|
|
|
|
|
|
## construe Metrics
|
|
|
|
|
|
|
|
```{r cloc, echo=FALSE}
|
|
|
|
cloc::cloc_pkg_md()
|
|
|
|
```
|
|
|
|
|
|
|
|
## Code of Conduct
|
|
|
|
|
|
|
|
Please note that this project is released with a Contributor Code of Conduct.
|
|
|
|
By participating in this project you agree to abide by its terms.
|