HTTP Request, Response and URL Parser https://cinc.rud.is/web/packages/construe/
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.

186 lines
3.7 KiB

---
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}
4 years ago
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")
```
4 years ago
### 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)
4 years ago
parse_request(req)
parse_request_raw(req_raw)
4 years ago
microbenchmark::microbenchmark(
parse_request = parse_request(req),
parse_request_raw = parse_request_raw(req_raw)
4 years ago
)
```
### 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)
4 years ago
parse_response(resp)
parse_response_raw(resp_raw)
4 years ago
microbenchmark::microbenchmark(
parse_response = parse_response(resp),
parse_response_raw = parse_response_raw(resp_raw)
4 years ago
)
```
### 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)
4 years ago
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)
4 years ago
res <- curl::curl_fetch_memory("https://httpbin.org/")
str(construe::parse_response_raw(res$headers), 2)
```
4 years ago
### URLs
```{r ex03}
c(
"git+ssh://example.com/path/file",
"https://example.com/path/file",
"http://www.example.com/dir/subdir?param=1&param=2;param%20=%20#fragment",
"http://www.example.com",
"http://username@www.example.com/dir/subdir?param=1&param=2;param%20=%20#fragment",
"http://username:passwd@www.example.com/dir/subdir?param=1&param=2;param%20=%20#fragment",
"http://www.example.com:8080/dir/subdir?param=1&param=2;param%20=%20#fragment",
"http://username:passwd@www.example.com:8080/dir/subdir?param=1&param=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.