├── .Rbuildignore ├── .codecov.yml ├── .gitignore ├── .gitlab-ci.yml ├── .travis.yml ├── DESCRIPTION ├── LICENSE ├── NAMESPACE ├── NEWS.md ├── R ├── RcppExports.R ├── Z-domain.R ├── curlparse-package.R ├── is-valid-url.R └── utils-pipe.R ├── README.Rmd ├── README.md ├── README_cache └── gfm │ ├── __packages │ ├── unnamed-chunk-2_5090db04e31e59a3df3b03229995ed1d.RData │ ├── unnamed-chunk-2_5090db04e31e59a3df3b03229995ed1d.rdb │ ├── unnamed-chunk-2_5090db04e31e59a3df3b03229995ed1d.rdx │ ├── unnamed-chunk-5_b30bb7f1dbf8b0ffd72ec16ab8ab30b4.RData │ ├── unnamed-chunk-5_b30bb7f1dbf8b0ffd72ec16ab8ab30b4.rdb │ └── unnamed-chunk-5_b30bb7f1dbf8b0ffd72ec16ab8ab30b4.rdx ├── README_files └── figure-gfm │ ├── unnamed-chunk-7-1.png │ └── unnamed-chunk-8-1.png ├── appveyor.yml ├── cleanup ├── configure ├── configure.win ├── curlparse.Rproj ├── inst ├── COPYRIGHTS └── tinytest │ └── test_curlparse.R ├── man ├── curlparse.Rd ├── figures │ ├── README-unnamed-chunk-4-1.png │ └── README-unnamed-chunk-5-1.png ├── is_valid_url.Rd ├── parse_curl.Rd ├── pipe.Rd ├── scheme.Rd └── url_parse.Rd ├── src ├── .gitignore ├── Makevars.in ├── Makevars.win ├── RcppExports.cpp ├── curlparse-main.cpp ├── winhttp32.def.in └── winhttp64.def.in ├── tests └── tinytest.R └── tools ├── option_table.txt ├── symbols-in-versions ├── symbols.R └── winlibs.R /.Rbuildignore: -------------------------------------------------------------------------------- 1 | ^\.DS_Store$ 2 | ^\.travis.yml$ 3 | ^\.git$ 4 | ^\.gitignore$ 5 | ^\.Rhistory$ 6 | ^.*\.Rproj$ 7 | ^\.Rproj\.user$ 8 | ^windows$ 9 | ^README.md$ 10 | ^src/option_table.h$ 11 | ^src/Makevars$ 12 | ^tools/option_table.txt$ 13 | ^src/*.def$ 14 | ^appveyor\.yml$ 15 | ^revdep$ 16 | ^docker$ 17 | ^httpbin.md$ 18 | ^examples$ 19 | ^release.R$ 20 | bugs 21 | ^tmp$ 22 | ^.*\.Rproj$ 23 | ^\.Rproj\.user$ 24 | ^\.travis\.yml$ 25 | ^README\.*Rmd$ 26 | ^README\.*html$ 27 | ^NOTES\.*Rmd$ 28 | ^NOTES\.*html$ 29 | ^\.codecov\.yml$ 30 | ^README_files$ 31 | ^doc$ 32 | ^tmp$ 33 | ^notes$ 34 | ^\.gitlab-ci\.yml$ 35 | ^README_cache$ 36 | -------------------------------------------------------------------------------- /.codecov.yml: -------------------------------------------------------------------------------- 1 | comment: false 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .Rproj.user 3 | .Rhistory 4 | .RData 5 | src/*.o 6 | src/*.so 7 | src/*.dll 8 | src/*.a 9 | src/*.def 10 | src/Makevars 11 | tools/option_table.txt 12 | inst/doc 13 | windows 14 | -------------------------------------------------------------------------------- /.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | image: rocker/tidyverse 2 | test: 3 | script: 4 | - R -e 'install.packages(c("testthat", "covr", "Rcpp", "stringi", "knitr", "rmarkdown"))' 5 | - R CMD build . --no-build-vignettes --no-manual 6 | - PKG_FILE_NAME=$(ls -1t *.tar.gz | head -n 1) 7 | - R CMD check "${PKG_FILE_NAME}" --no-build-vignettes --no-manual 8 | - R -e 'devtools::test()' 9 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: r 2 | cache: packages 3 | latex: false 4 | fortran: false 5 | 6 | matrix: 7 | include: 8 | - dist: precise 9 | r: 3.5.3 10 | - dist: trusty 11 | - dist: xenial 12 | env: R_CODECOV=true 13 | r_packages: covr 14 | - dist: bionic 15 | - os: osx 16 | osx_image: xcode10.2 17 | - os: osx 18 | osx_image: xcode9.4 19 | - os: osx 20 | brew_packages: curl 21 | env: PKG_CONFIG_PATH="/usr/local/opt/curl/lib/pkgconfig" 22 | - os: osx 23 | brew_packages: curl-openssl 24 | env: 25 | - PKG_CONFIG_PATH="/usr/local/opt/curl-openssl/lib/pkgconfig" 26 | - HTTPBIN_TEST_SERVER="https://nghttp2.org/httpbin" 27 | - os: osx 28 | before_install: brew install curl --HEAD 29 | env: PKG_CONFIG_PATH="/usr/local/opt/curl/lib/pkgconfig" 30 | - os: osx 31 | osx_image: xcode7.3 32 | disable_homebrew: true 33 | before_install: sed -i.bak 's/-isysroot /-I/g' $(R RHOME)/etc/Makeconf 34 | 35 | addons: 36 | apt: 37 | packages: 38 | - libcurl4-openssl-dev 39 | 40 | after_success: 41 | - if [[ "${R_CODECOV}" ]]; then R -e 'covr::codecov()'; fi 42 | -------------------------------------------------------------------------------- /DESCRIPTION: -------------------------------------------------------------------------------- 1 | Package: curlparse 2 | Type: Package 3 | Title: Parse URLs Using 'libcurl' 4 | Version: 0.2.0 5 | Authors@R: c( person("Bob", "Rudis", email = "bob@rud.is", role = 6 | c("aut", "cre"), comment = c(ORCID = "0000-0001-5670-2640")), 7 | person("Jeroen", "Ooms", role = c("aut"), email = 8 | "jeroen@berkeley.edu", comment = c(ORCID = 9 | "0000-0002-4035-0289")) ) 10 | Description: Tools are provided to parse URLs using the modern 11 | 'libcurl' built-in parser. 12 | License: Z 13 | SystemRequirements: libcurl: libcurl-devel (rpm) or 14 | libcurl4-openssl-dev (deb). 15 | URL: https://gitlab.com/hrbrmstr/curlparse 16 | BugReports: https://gitlab.com/hrbrmstr/curlparse/issues 17 | Copyrights: file inst/COPYRIGHTS 18 | Suggests: 19 | jsonlite, 20 | tinytest, 21 | knitr 22 | Depends: R (>= 3.2.0) 23 | LazyData: true 24 | RoxygenNote: 6.1.1 25 | Encoding: UTF-8 26 | Language: en-US 27 | LinkingTo: Rcpp 28 | Imports: 29 | Rcpp, 30 | stringi, 31 | magrittr 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | YEAR: 2019 2 | COPYRIGHT HOLDER: Bob Rudis 3 | -------------------------------------------------------------------------------- /NAMESPACE: -------------------------------------------------------------------------------- 1 | # Generated by roxygen2: do not edit by hand 2 | 3 | export("%>%") 4 | export(domain) 5 | export(fragment) 6 | export(host) 7 | export(is_valid_url) 8 | export(parse_curl) 9 | export(password) 10 | export(path) 11 | export(port) 12 | export(query) 13 | export(scheme) 14 | export(url_options) 15 | export(url_parse) 16 | export(user) 17 | importFrom(Rcpp,sourceCpp) 18 | importFrom(magrittr,"%>%") 19 | importFrom(stringi,stri_detect_regex) 20 | importFrom(stringi,stri_opts_regex) 21 | useDynLib(curlparse, .registration = TRUE) 22 | -------------------------------------------------------------------------------- /NEWS.md: -------------------------------------------------------------------------------- 1 | 0.1.0 2 | * Initial release 3 | -------------------------------------------------------------------------------- /R/RcppExports.R: -------------------------------------------------------------------------------- 1 | # Generated by using Rcpp::compileAttributes() -> do not edit by hand 2 | # Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 3 | 4 | #' Parse a character vector of URLs into component parts 5 | #' 6 | #' @md 7 | #' @param urls character vector of URLs 8 | #' @return data frame (tibble) 9 | #' @export 10 | parse_curl <- function(urls) { 11 | .Call(`_curlparse_parse_curl`, urls) 12 | } 13 | 14 | #' Parse a character vector of URLs into component parts (`urltools` compatibility function) 15 | #' 16 | #' @md 17 | #' @param urls character vector of URLs 18 | #' @return data frame (not a tibble) 19 | #' @export 20 | url_parse <- function(urls) { 21 | .Call(`_curlparse_url_parse`, urls) 22 | } 23 | 24 | #' Extract member components from a URL string 25 | #' 26 | #' @md 27 | #' @param urls character vector of URLs 28 | #' @return character vector of the extracted URL component 29 | #' @export 30 | scheme <- function(urls) { 31 | .Call(`_curlparse_scheme`, urls) 32 | } 33 | 34 | #' @rdname scheme 35 | #' @export 36 | user <- function(urls) { 37 | .Call(`_curlparse_user`, urls) 38 | } 39 | 40 | #' @rdname scheme 41 | #' @export 42 | password <- function(urls) { 43 | .Call(`_curlparse_password`, urls) 44 | } 45 | 46 | #' @rdname scheme 47 | #' @export 48 | host <- function(urls) { 49 | .Call(`_curlparse_host`, urls) 50 | } 51 | 52 | #' @rdname scheme 53 | #' @export 54 | port <- function(urls) { 55 | .Call(`_curlparse_port`, urls) 56 | } 57 | 58 | #' @rdname scheme 59 | #' @export 60 | path <- function(urls) { 61 | .Call(`_curlparse_path`, urls) 62 | } 63 | 64 | #' @rdname scheme 65 | #' @export 66 | url_options <- function(urls) { 67 | .Call(`_curlparse_url_options`, urls) 68 | } 69 | 70 | #' @rdname scheme 71 | #' @export 72 | query <- function(urls) { 73 | .Call(`_curlparse_query`, urls) 74 | } 75 | 76 | #' @rdname scheme 77 | #' @export 78 | fragment <- function(urls) { 79 | .Call(`_curlparse_fragment`, urls) 80 | } 81 | 82 | -------------------------------------------------------------------------------- /R/Z-domain.R: -------------------------------------------------------------------------------- 1 | #' @rdname scheme 2 | #' @export 3 | domain <- host 4 | -------------------------------------------------------------------------------- /R/curlparse-package.R: -------------------------------------------------------------------------------- 1 | #' Parse 'URLs' with 'libcurl' 2 | #' 3 | #' As of version 7.62.0 'libcurl' has exposed its 'URL' parser. Tools are 4 | #' provided to parse 'URLs' using this new parser feature. 5 | #' 6 | #' @md 7 | #' @name curlparse 8 | #' @docType package 9 | #' @author Bob Rudis (bob@@rud.is) 10 | #' @importFrom stringi stri_detect_regex stri_opts_regex 11 | #' @importFrom Rcpp sourceCpp 12 | #' @useDynLib curlparse, .registration = TRUE 13 | "_PACKAGE" 14 | -------------------------------------------------------------------------------- /R/is-valid-url.R: -------------------------------------------------------------------------------- 1 | #' Test if a URL is a valid URL 2 | #' 3 | #' @md 4 | #' @param urls character vector of URLs 5 | #' @return logical vector of test results 6 | #' @note Uses Diego Perini's "perfect" URL regex: 7 | #' @export 8 | is_valid_url <- function(urls) { 9 | stri_detect_regex( 10 | str = urls, 11 | pattern = "^(?:(?:https?|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?!10(?:\\.\\d{1,3}){3})(?!127(?:\\.\\d{1,3}){3})(?!169\\.254(?:\\.\\d{1,3}){2})(?!192\\.168(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\x{00a1}-\\x{ffff}0-9]+-?)*[a-z\\x{00a1}-\\x{ffff}0-9]+)(?:\\.(?:[a-z\\x{00a1}-\\x{ffff}0-9]+-?)*[a-z\\x{00a1}-\\x{ffff}0-9]+)*(?:\\.(?:[a-z\\x{00a1}-\\x{ffff}]{2,})))(?::\\d{2,5})?(?:/[^\\s]*)?$", 12 | opts_regex = stri_opts_regex(case_insensitive = TRUE) 13 | ) 14 | } 15 | -------------------------------------------------------------------------------- /R/utils-pipe.R: -------------------------------------------------------------------------------- 1 | #' Pipe operator 2 | #' 3 | #' See \code{magrittr::\link[magrittr:pipe]{\%>\%}} for details. 4 | #' 5 | #' @name %>% 6 | #' @rdname pipe 7 | #' @keywords internal 8 | #' @export 9 | #' @importFrom magrittr %>% 10 | #' @usage lhs \%>\% rhs 11 | NULL 12 | -------------------------------------------------------------------------------- /README.Rmd: -------------------------------------------------------------------------------- 1 | --- 2 | output: rmarkdown::github_document 3 | editor_options: 4 | chunk_output_type: console 5 | --- 6 | ```{r pkg-knitr-opts, include=FALSE} 7 | hrbrpkghelpr::global_opts() 8 | ``` 9 | 10 | ```{r badges, results='asis', echo=FALSE, cache=FALSE} 11 | hrbrpkghelpr::stinking_badges() 12 | ``` 13 | # curlparse 14 | 15 | Parse 'URLs' with 'libcurl' 16 | 17 | ## Description 18 | 19 | Tools are provided to parse URLs using the modern 'libcurl' built-in parser. 20 | 21 | ## NOTE 22 | 23 | You _need_ to have `libcurl` >= 7.62.0 for this to work since that's when it began to expose the URL parsing API. 24 | 25 | macOS users can do: 26 | 27 | ``` 28 | $ brew install curl 29 | ``` 30 | 31 | (provided you're using [Homebrew](https://brew.sh/)). 32 | 33 | Windows users are able to just install this pacakge since it uses the same, clever "anticonf" that Jeroen uses in the [{curl} pacakge](https://github.com/jeroen/curl). 34 | 35 | The state of the availability of `libcurl` v7.62.0 across Linux distributions is sketch at best (as an example, Ubuntu bionic and comic are not even remotely at the current version). If your distribution does not have >= 7.62.0 available you will need to [compile and install it manually](https://curl.haxx.se/download.html) ensuring the library and headers are available to R to build the package. 36 | 37 | ## What's Inside The Tin 38 | 39 | The following functions are implemented: 40 | 41 | ```{r ingredients, results='asis', echo=FALSE, cache=FALSE} 42 | hrbrpkghelpr::describe_ingredients() 43 | ``` 44 | 45 | ## Installation 46 | 47 | ```{r install-ex, results='asis', echo = FALSE} 48 | hrbrpkghelpr::install_block() 49 | ``` 50 | 51 | ## Usage 52 | 53 | ```{r message=FALSE, warning=FALSE, error=FALSE} 54 | library(curlparse) 55 | 56 | # current verison 57 | packageVersion("curlparse") 58 | 59 | ``` 60 | 61 | ### Process Some URLs 62 | 63 | ```{r libs} 64 | library(urltools) 65 | library(rvest) 66 | library(curlparse) 67 | library(tidyverse) 68 | 69 | ``` 70 | ```{r cache=TRUE} 71 | read_html("https://www.r-bloggers.com/blogs-list/") %>% 72 | html_nodes(xpath=".//li[contains(., 'Contributing Blogs')]/ul/li/a[contains(@href, 'http')]") %>% 73 | html_attr("href") -> blog_urls 74 | 75 | ``` 76 | ```{r} 77 | (parsed <- parse_curl(blog_urls)) 78 | 79 | count(parsed, scheme, sort=TRUE) 80 | 81 | filter(parsed, !is.na(query)) 82 | ``` 83 | 84 | ### Benchmark 85 | 86 | `curlparse` includes a `url_parse()` function to make it easier to use this package for current users of `urltools::url_parse()` since it provides the same API and same results back (including it being a regular data frame and not a `tbl`). 87 | 88 | Spoiler alert: `urltools::url_parse()` is faster by ~100µs (per-100 URLs) for "good" URLs (if there's a mix of gnarly/bad URLs and valid ones they get closer to being on-par). The aim was not to try to beat it, though. 89 | 90 | >Per the [blog post introducing this new set of API calls](https://daniel.haxx.se/blog/2018/09/09/libcurl-gets-a-url-api/): 91 | > 92 | >Applications that pass in URLs to libcurl would of course still very often need to parse URLs, create URLs or otherwise handle them, but libcurl has not been helping with that. 93 | > 94 | >At the same time, the under-specification of URLs has led to a situation where there's really no stable document anywhere describing how URLs are supposed to work and basically every implementer is left to handle the WHATWG URL spec, RFC 3986 and the world in between all by themselves. Understanding how their URL parsing libraries, libcurl, other tools and their favorite browsers differ is complicated. 95 | > 96 | >By offering applications access to libcurl's own URL parser, we hope to tighten a problematic vulnerable area for applications where the URL parser library would believe one thing and libcurl another. This could and has sometimes lead to security problems. (See for example Exploiting URL Parser in Trending Programming Languages! by Orange Tsai) 97 | 98 | So, using this library adds consistency with how `libcurl` sees and handles URLs. 99 | 100 | ```{r} 101 | library(microbenchmark) 102 | 103 | set.seed(0) 104 | test_urls <- sample(blog_urls, 100) # pick 100 URLs at random 105 | 106 | microbenchmark( 107 | curlparse = curlparse::url_parse(test_urls), 108 | urltools = urltools::url_parse(test_urls), # we loaded urltools before curlparse at the top so namespace loading wasn't a factor for the benchmarks 109 | times = 500 110 | ) -> mb 111 | 112 | mb 113 | 114 | autoplot(mb) 115 | ``` 116 | 117 | The individual handlers are a bit more on-par but mostly still slower (except for `fragment()`). Note that `urltools` has no equivalent function to just extract query strings so that's not in the test. 118 | 119 | ```{r fig.width=6, fig.height=6} 120 | bind_rows( 121 | microbenchmark(curlparse = curlparse::scheme(blog_urls), urltools = urltools::scheme(blog_urls)) %>% 122 | mutate(test = "scheme"), 123 | microbenchmark(curlparse = curlparse::domain(blog_urls), urltools = urltools::domain(blog_urls)) %>% 124 | mutate(test = "domain"), 125 | microbenchmark(curlparse = curlparse::port(blog_urls), urltools = urltools::port(blog_urls)) %>% 126 | mutate(test = "port"), 127 | microbenchmark(curlparse = curlparse::path(blog_urls), urltools = urltools::path(blog_urls)) %>% 128 | mutate(test = "path"), 129 | microbenchmark(curlparse = curlparse::fragment(blog_urls), urltools = urltools::fragment(blog_urls)) %>% 130 | mutate(test = "fragment") 131 | ) %>% 132 | mutate(test = factor(test, levels=c("scheme", "domain", "port", "path", "fragment"))) %>% 133 | mutate(time = time / 1000000) %>% 134 | ggplot(aes(expr, time)) + 135 | geom_violin(aes(fill=expr), show.legend = FALSE) + 136 | scale_y_continuous(name = "milliseconds", expand = c(0,0), limits=c(0, NA)) + 137 | hrbrthemes::scale_fill_ft() + 138 | facet_wrap(~test, ncol = 1) + 139 | coord_flip() + 140 | labs(x=NULL) + 141 | hrbrthemes::theme_ft_rc(grid="XY", strip_text_face = "bold") + 142 | theme(panel.spacing.y=unit(0, "lines")) 143 | ``` 144 | 145 | ```{r echo=FALSE} 146 | unloadNamespace("urltools") 147 | ``` 148 | 149 | ### Stress Test 150 | 151 | ```{r} 152 | c( 153 | "", "foo", "foo;params?query#fragment", "http://foo.com/path", "http://foo.com", 154 | "//foo.com/path", "//user:pass@foo.com/", "http://user:pass@foo.com/", 155 | "file:///tmp/junk.txt", "imap://mail.python.org/mbox1", 156 | "mms://wms.sys.hinet.net/cts/Drama/09006251100.asf", "nfs://server/path/to/file.txt", 157 | "svn+ssh://svn.zope.org/repos/main/ZConfig/trunk/", 158 | "git+ssh://git@github.com/user/project.git", "HTTP://WWW.PYTHON.ORG/doc/#frag", 159 | "http://www.python.org:080/", "http://www.python.org:/", "javascript:console.log('hello')", 160 | "javascript:console.log('hello');console.log('world')", "http://example.com/?", 161 | "http://example.com/;", "tel:0108202201", "unknown:0108202201", 162 | "http://user@example.com:8080/path;param?query#fragment", 163 | "http://www.python.org:65536/", "http://www.python.org:-20/", 164 | "http://www.python.org:8589934592/", "http://www.python.org:80hello/", 165 | "http://:::cnn.com/", "http://./", "http://foo..com/", "http://foo../" 166 | ) -> ugly_urls 167 | 168 | (u_parsed <- parse_curl(ugly_urls)) 169 | 170 | filter(u_parsed, !is.na(scheme)) 171 | 172 | filter(u_parsed, !is.na(user)) 173 | 174 | filter(u_parsed, !is.na(password)) 175 | 176 | filter(u_parsed, !is.na(host)) 177 | 178 | filter(u_parsed, !is.na(path)) 179 | 180 | filter(u_parsed, !is.na(query)) 181 | 182 | filter(u_parsed, !is.na(fragment)) 183 | ``` 184 | 185 | Make sure the vector extractors work the same as the data frame converter: 186 | 187 | ```{r} 188 | all( 189 | c( 190 | identical(u_parsed$scheme, scheme(ugly_urls)), 191 | identical(u_parsed$user, user(ugly_urls)), 192 | identical(u_parsed$password, password(ugly_urls)), 193 | identical(u_parsed$host, host(ugly_urls)), 194 | identical(u_parsed$path, path(ugly_urls)), 195 | identical(u_parsed$query, query(ugly_urls)), 196 | identical(u_parsed$fragment, fragment(ugly_urls)) 197 | ) 198 | ) 199 | ``` 200 | 201 | ## curlparse Metrics 202 | 203 | ```{r cloc, echo=FALSE} 204 | cloc::cloc_pkg_md() 205 | ``` 206 | 207 | ## Code of Conduct 208 | 209 | Please note that this project is released with a Contributor Code of Conduct. 210 | By participating in this project you agree to abide by its terms. 211 | 212 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | NOTE: Just use the `{curl}` package since it supports this natively. Glad to deprecate this 5-year old pkg. 2 | -------------------------------------------------------------------------------- /README_cache/gfm/__packages: -------------------------------------------------------------------------------- 1 | base 2 | methods 3 | bit 4 | utils 5 | stats 6 | bit64 7 | datasets 8 | grDevices 9 | graphics 10 | curlparse 11 | urltools 12 | xml2 13 | rvest 14 | tidyverse 15 | ggplot2 16 | tibble 17 | tidyr 18 | readr 19 | purrr 20 | dplyr 21 | stringr 22 | forcats 23 | -------------------------------------------------------------------------------- /README_cache/gfm/unnamed-chunk-2_5090db04e31e59a3df3b03229995ed1d.RData: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hrbrmstr/curlparse/54a56f84cbbc78febc9a77eabfb4c22359ac66ab/README_cache/gfm/unnamed-chunk-2_5090db04e31e59a3df3b03229995ed1d.RData -------------------------------------------------------------------------------- /README_cache/gfm/unnamed-chunk-2_5090db04e31e59a3df3b03229995ed1d.rdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hrbrmstr/curlparse/54a56f84cbbc78febc9a77eabfb4c22359ac66ab/README_cache/gfm/unnamed-chunk-2_5090db04e31e59a3df3b03229995ed1d.rdb -------------------------------------------------------------------------------- /README_cache/gfm/unnamed-chunk-2_5090db04e31e59a3df3b03229995ed1d.rdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hrbrmstr/curlparse/54a56f84cbbc78febc9a77eabfb4c22359ac66ab/README_cache/gfm/unnamed-chunk-2_5090db04e31e59a3df3b03229995ed1d.rdx -------------------------------------------------------------------------------- /README_cache/gfm/unnamed-chunk-5_b30bb7f1dbf8b0ffd72ec16ab8ab30b4.RData: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hrbrmstr/curlparse/54a56f84cbbc78febc9a77eabfb4c22359ac66ab/README_cache/gfm/unnamed-chunk-5_b30bb7f1dbf8b0ffd72ec16ab8ab30b4.RData -------------------------------------------------------------------------------- /README_cache/gfm/unnamed-chunk-5_b30bb7f1dbf8b0ffd72ec16ab8ab30b4.rdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hrbrmstr/curlparse/54a56f84cbbc78febc9a77eabfb4c22359ac66ab/README_cache/gfm/unnamed-chunk-5_b30bb7f1dbf8b0ffd72ec16ab8ab30b4.rdb -------------------------------------------------------------------------------- /README_cache/gfm/unnamed-chunk-5_b30bb7f1dbf8b0ffd72ec16ab8ab30b4.rdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hrbrmstr/curlparse/54a56f84cbbc78febc9a77eabfb4c22359ac66ab/README_cache/gfm/unnamed-chunk-5_b30bb7f1dbf8b0ffd72ec16ab8ab30b4.rdx -------------------------------------------------------------------------------- /README_files/figure-gfm/unnamed-chunk-7-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hrbrmstr/curlparse/54a56f84cbbc78febc9a77eabfb4c22359ac66ab/README_files/figure-gfm/unnamed-chunk-7-1.png -------------------------------------------------------------------------------- /README_files/figure-gfm/unnamed-chunk-8-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hrbrmstr/curlparse/54a56f84cbbc78febc9a77eabfb4c22359ac66ab/README_files/figure-gfm/unnamed-chunk-8-1.png -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | # DO NOT CHANGE the "init" and "install" sections below 2 | 3 | # Download script file from GitHub 4 | init: 5 | ps: | 6 | $ErrorActionPreference = "Stop" 7 | Invoke-WebRequest http://raw.github.com/krlmlr/r-appveyor/master/scripts/appveyor-tool.ps1 -OutFile "..\appveyor-tool.ps1" 8 | Import-Module '..\appveyor-tool.ps1' 9 | 10 | install: 11 | ps: Bootstrap 12 | 13 | # Adapt as necessary starting from here 14 | 15 | environment: 16 | matrix: 17 | - R_VERSION: stable 18 | R_ARCH: x64 19 | - R_VERSION: devel 20 | R_ARCH: x64 21 | 22 | build_script: 23 | - travis-tool.sh install_deps 24 | 25 | test_script: 26 | - travis-tool.sh run_tests 27 | 28 | on_failure: 29 | - 7z a failure.zip *.Rcheck\* 30 | - appveyor PushArtifact failure.zip 31 | 32 | artifacts: 33 | - path: '*.Rcheck\**\*.log' 34 | name: Logs 35 | 36 | - path: '*.Rcheck\**\*.out' 37 | name: Logs 38 | 39 | - path: '*.Rcheck\**\*.fail' 40 | name: Logs 41 | 42 | - path: '*.Rcheck\**\*.Rout' 43 | name: Logs 44 | 45 | - path: '\*_*.tar.gz' 46 | name: Bits 47 | 48 | - path: '\*_*.zip' 49 | name: Bits 50 | -------------------------------------------------------------------------------- /cleanup: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | rm -f src/Makevars 3 | -------------------------------------------------------------------------------- /configure: -------------------------------------------------------------------------------- 1 | # Anticonf (tm) script by Jeroen Ooms (2019) 2 | # This script will query 'pkg-config' for the required cflags and ldflags. 3 | # If pkg-config is unavailable or does not find the library, try setting 4 | # INCLUDE_DIR and LIB_DIR manually via e.g: 5 | # R CMD INSTALL --configure-vars='INCLUDE_DIR=/.../include LIB_DIR=/.../lib' 6 | 7 | # Library settings 8 | PKG_CONFIG_NAME="libcurl" 9 | PKG_DEB_NAME="libcurl4-openssl-dev" 10 | PKG_RPM_NAME="libcurl-devel" 11 | PKG_CSW_NAME="libcurl_dev" 12 | PKG_TEST_HEADER="" 13 | PKG_LIBS="-lcurl" 14 | PKG_CFLAGS="" 15 | 16 | # Use pkg-config if available 17 | pkg-config --version >/dev/null 2>&1 18 | if [ $? -eq 0 ]; then 19 | PKGCONFIG_CFLAGS=`pkg-config --cflags ${PKG_CONFIG_NAME}` 20 | case "$PKGCONFIG_CFLAGS" in 21 | *CURL_STATICLIB*) PKGCONFIG_LIBS=`pkg-config --libs --static ${PKG_CONFIG_NAME}`;; 22 | *) PKGCONFIG_LIBS=`pkg-config --libs ${PKG_CONFIG_NAME}`;; 23 | esac 24 | fi 25 | 26 | # Note that cflags may be empty in case of success 27 | if [ "$INCLUDE_DIR" ] || [ "$LIB_DIR" ]; then 28 | echo "Found INCLUDE_DIR and/or LIB_DIR!" 29 | PKG_CFLAGS="-I$INCLUDE_DIR $PKG_CFLAGS" 30 | PKG_LIBS="-L$LIB_DIR $PKG_LIBS" 31 | elif [ "$PKGCONFIG_CFLAGS" ] || [ "$PKGCONFIG_LIBS" ]; then 32 | echo "Found pkg-config cflags and libs!" 33 | PKG_CFLAGS=${PKGCONFIG_CFLAGS} 34 | PKG_LIBS=${PKGCONFIG_LIBS} 35 | fi 36 | 37 | # Find compiler 38 | CC=`${R_HOME}/bin/R CMD config CC` 39 | CFLAGS=`${R_HOME}/bin/R CMD config CFLAGS` 40 | CPPFLAGS=`${R_HOME}/bin/R CMD config CPPFLAGS` 41 | 42 | # For debugging 43 | echo "Using PKG_CFLAGS=$PKG_CFLAGS" 44 | echo "Using PKG_LIBS=$PKG_LIBS" 45 | 46 | # Test configuration 47 | echo "#include $PKG_TEST_HEADER" | ${CC} ${CPPFLAGS} ${PKG_CFLAGS} ${CFLAGS} -E -xc - >/dev/null 2>&1 || R_CONFIG_ERROR=1; 48 | 49 | # Customize the error 50 | if [ $R_CONFIG_ERROR ]; then 51 | echo "------------------------- ANTICONF ERROR ---------------------------" 52 | echo "Configuration failed because $PKG_CONFIG_NAME was not found. Try installing:" 53 | echo " * deb: $PKG_DEB_NAME (Debian, Ubuntu, etc)" 54 | echo " * rpm: $PKG_RPM_NAME (Fedora, CentOS, RHEL)" 55 | echo " * csw: $PKG_CSW_NAME (Solaris)" 56 | echo "If $PKG_CONFIG_NAME is already installed, check that 'pkg-config' is in your" 57 | echo "PATH and PKG_CONFIG_PATH contains a $PKG_CONFIG_NAME.pc file. If pkg-config" 58 | echo "is unavailable you can set INCLUDE_DIR and LIB_DIR manually via:" 59 | echo "R CMD INSTALL --configure-vars='INCLUDE_DIR=... LIB_DIR=...'" 60 | echo "--------------------------------------------------------------------" 61 | exit 1; 62 | fi 63 | 64 | # Write to Makevars 65 | sed -e "s|@cflags@|$PKG_CFLAGS|" -e "s|@libs@|$PKG_LIBS|" src/Makevars.in > src/Makevars 66 | 67 | # Extract curlopt symbols 68 | echo '#include ' | ${CC} ${CPPFLAGS} ${PKG_CFLAGS} ${CFLAGS} -E -xc - | grep "^[ \t]*CURLOPT_.*," | sed s/,// > tools/option_table.txt 69 | 70 | # Success 71 | exit 0 72 | -------------------------------------------------------------------------------- /configure.win: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hrbrmstr/curlparse/54a56f84cbbc78febc9a77eabfb4c22359ac66ab/configure.win -------------------------------------------------------------------------------- /curlparse.Rproj: -------------------------------------------------------------------------------- 1 | Version: 1.0 2 | 3 | RestoreWorkspace: Default 4 | SaveWorkspace: Default 5 | AlwaysSaveHistory: Default 6 | 7 | EnableCodeIndexing: Yes 8 | UseSpacesForTab: Yes 9 | NumSpacesForTab: 2 10 | Encoding: UTF-8 11 | 12 | RnwWeave: Sweave 13 | LaTeX: pdfLaTeX 14 | 15 | AutoAppendNewline: Yes 16 | StripTrailingWhitespace: Yes 17 | 18 | BuildType: Package 19 | PackageUseDevtools: Yes 20 | PackageInstallArgs: --no-multiarch --with-keep.source --install-tests 21 | PackageRoxygenize: rd,collate,namespace 22 | -------------------------------------------------------------------------------- /inst/COPYRIGHTS: -------------------------------------------------------------------------------- 1 | All R and C[++] code is MIT licensed as noted in the DESCRIPTION 2 | 3 | This package uses the "anticonf" configuration script from 4 | Jeroen Ooms' {curl} package 5 | (https://github.com/jeroen/curl/blob/master/DESCRIPTION) 6 | which is also MIT licensed with the following COPYRIGHT: 7 | 8 | YEAR: 2019 9 | COPYRIGHT HOLDER: Jeroen Ooms; RStudio 10 | -------------------------------------------------------------------------------- /inst/tinytest/test_curlparse.R: -------------------------------------------------------------------------------- 1 | library(curlparse) 2 | 3 | c( 4 | "", "foo", "foo;params?query#fragment", "http://foo.com/path", "http://foo.com", 5 | "//foo.com/path", "//user:pass@foo.com/", "http://user:pass@foo.com/", 6 | "file:///tmp/junk.txt", "imap://mail.python.org/mbox1", 7 | "mms://wms.sys.hinet.net/cts/Drama/09006251100.asf", "nfs://server/path/to/file.txt", 8 | "svn+ssh://svn.zope.org/repos/main/ZConfig/trunk/", 9 | "git+ssh://git@github.com/user/project.git", "HTTP://WWW.PYTHON.ORG/doc/#frag", 10 | "http://www.python.org:080/", "http://www.python.org:/", "javascript:console.log('hello')", 11 | "javascript:console.log('hello');console.log('world')", "http://example.com/?", 12 | "http://example.com/;", "tel:0108202201", "unknown:0108202201", 13 | "http://user@example.com:8080/path;param?query#fragment", 14 | "http://www.python.org:65536/", "http://www.python.org:-20/", 15 | "http://www.python.org:8589934592/", "http://www.python.org:80hello/", 16 | "http://:::cnn.com/", "http://./", "http://foo..com/", "http://foo../" 17 | ) -> ugly_urls 18 | 19 | structure(list(scheme = c(NA, NA, NA, "http", "http", NA, NA, 20 | "http", "file", "imap", NA, NA, NA, NA, "http", "http", "http", 21 | NA, NA, "http", "http", NA, NA, "http", NA, NA, NA, NA, NA, "http", 22 | "http", "http"), user = c(NA, NA, NA, NA, NA, NA, NA, "user", 23 | NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "user", 24 | NA, NA, NA, NA, NA, NA, NA, NA), password = c(NA, NA, NA, NA, 25 | NA, NA, NA, "pass", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 26 | NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), host = c(NA, 27 | NA, NA, "foo.com", "foo.com", NA, NA, "foo.com", NA, "mail.python.org", 28 | NA, NA, NA, NA, "WWW.PYTHON.ORG", "www.python.org", "www.python.org", 29 | NA, NA, "example.com", "example.com", NA, NA, "example.com", 30 | NA, NA, NA, NA, NA, ".", "foo..com", "foo.."), port = c(NA, NA, 31 | NA, "80", "80", NA, NA, "80", "0", "143", NA, NA, NA, NA, "80", 32 | "80", "80", NA, NA, "80", "80", NA, NA, "8080", NA, NA, NA, NA, 33 | NA, "80", "80", "80"), path = c(NA, NA, NA, "/path", "/", NA, 34 | NA, "/", "/tmp/junk.txt", "/mbox1", NA, NA, NA, NA, "/doc/", 35 | "/", "/", NA, NA, "/", "/;", NA, NA, "/path;param", NA, NA, NA, 36 | NA, NA, "/", "/", "/"), options = c(NA_character_, NA_character_, 37 | NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 38 | NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 39 | NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 40 | NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 41 | NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 42 | NA_character_, NA_character_, NA_character_, NA_character_, NA_character_ 43 | ), query = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 44 | NA, NA, NA, NA, NA, NA, NA, "", NA, NA, NA, "query", NA, NA, 45 | NA, NA, NA, NA, NA, NA), fragment = c(NA, NA, NA, NA, NA, NA, 46 | NA, NA, NA, NA, NA, NA, NA, NA, "frag", NA, NA, NA, NA, NA, NA, 47 | NA, NA, "fragment", NA, NA, NA, NA, NA, NA, NA, NA)), class = c("tbl_df", 48 | "tbl", "data.frame"), row.names = c(NA, -32L)) -> shld_equal 49 | 50 | u_parsed <- parse_curl(ugly_urls) 51 | 52 | expect_identical(u_parsed, shld_equal) 53 | 54 | expect_true( 55 | all( 56 | c( 57 | expect_true(identical(u_parsed$scheme, scheme(ugly_urls))), 58 | expect_true(identical(u_parsed$user, user(ugly_urls))), 59 | expect_true(identical(u_parsed$password, password(ugly_urls))), 60 | expect_true(identical(u_parsed$host, host(ugly_urls))), 61 | expect_true(identical(u_parsed$path, path(ugly_urls))), 62 | expect_true(identical(u_parsed$query, query(ugly_urls))), 63 | expect_true(identical(u_parsed$fragment, fragment(ugly_urls)) 64 | ) 65 | ) 66 | ) 67 | ) 68 | -------------------------------------------------------------------------------- /man/curlparse.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/curlparse-package.R 3 | \docType{package} 4 | \name{curlparse} 5 | \alias{curlparse} 6 | \alias{curlparse-package} 7 | \title{Parse 'URLs' with 'libcurl'} 8 | \description{ 9 | As of version 7.62.0 'libcurl' has exposed its 'URL' parser. Tools are 10 | provided to parse 'URLs' using this new parser feature. 11 | } 12 | \seealso{ 13 | Useful links: 14 | \itemize{ 15 | \item \url{https://gitlab.com/hrbrmstr/curlparse} 16 | \item Report bugs at \url{https://gitlab.com/hrbrmstr/curlparse/issues} 17 | } 18 | 19 | } 20 | \author{ 21 | Bob Rudis (bob@rud.is) 22 | } 23 | -------------------------------------------------------------------------------- /man/figures/README-unnamed-chunk-4-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hrbrmstr/curlparse/54a56f84cbbc78febc9a77eabfb4c22359ac66ab/man/figures/README-unnamed-chunk-4-1.png -------------------------------------------------------------------------------- /man/figures/README-unnamed-chunk-5-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hrbrmstr/curlparse/54a56f84cbbc78febc9a77eabfb4c22359ac66ab/man/figures/README-unnamed-chunk-5-1.png -------------------------------------------------------------------------------- /man/is_valid_url.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/is-valid-url.R 3 | \name{is_valid_url} 4 | \alias{is_valid_url} 5 | \title{Test if a URL is a valid URL} 6 | \usage{ 7 | is_valid_url(urls) 8 | } 9 | \arguments{ 10 | \item{urls}{character vector of URLs} 11 | } 12 | \value{ 13 | logical vector of test results 14 | } 15 | \description{ 16 | Test if a URL is a valid URL 17 | } 18 | \note{ 19 | Uses Diego Perini's "perfect" URL regex: \url{https://mathiasbynens.be/demo/url-regex} 20 | } 21 | -------------------------------------------------------------------------------- /man/parse_curl.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/RcppExports.R 3 | \name{parse_curl} 4 | \alias{parse_curl} 5 | \title{Parse a character vector of URLs into component parts} 6 | \usage{ 7 | parse_curl(urls) 8 | } 9 | \arguments{ 10 | \item{urls}{character vector of URLs} 11 | } 12 | \value{ 13 | data frame (tibble) 14 | } 15 | \description{ 16 | Parse a character vector of URLs into component parts 17 | } 18 | -------------------------------------------------------------------------------- /man/pipe.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/utils-pipe.R 3 | \name{\%>\%} 4 | \alias{\%>\%} 5 | \title{Pipe operator} 6 | \usage{ 7 | lhs \%>\% rhs 8 | } 9 | \description{ 10 | See \code{magrittr::\link[magrittr:pipe]{\%>\%}} for details. 11 | } 12 | \keyword{internal} 13 | -------------------------------------------------------------------------------- /man/scheme.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/RcppExports.R, R/Z-domain.R 3 | \name{scheme} 4 | \alias{scheme} 5 | \alias{user} 6 | \alias{password} 7 | \alias{host} 8 | \alias{port} 9 | \alias{path} 10 | \alias{url_options} 11 | \alias{query} 12 | \alias{fragment} 13 | \alias{domain} 14 | \title{Extract member components from a URL string} 15 | \usage{ 16 | scheme(urls) 17 | 18 | user(urls) 19 | 20 | password(urls) 21 | 22 | host(urls) 23 | 24 | port(urls) 25 | 26 | path(urls) 27 | 28 | url_options(urls) 29 | 30 | query(urls) 31 | 32 | fragment(urls) 33 | 34 | domain(urls) 35 | } 36 | \arguments{ 37 | \item{urls}{character vector of URLs} 38 | } 39 | \value{ 40 | character vector of the extracted URL component 41 | } 42 | \description{ 43 | Extract member components from a URL string 44 | } 45 | -------------------------------------------------------------------------------- /man/url_parse.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/RcppExports.R 3 | \name{url_parse} 4 | \alias{url_parse} 5 | \title{Parse a character vector of URLs into component parts (\code{urltools} compatibility function)} 6 | \usage{ 7 | url_parse(urls) 8 | } 9 | \arguments{ 10 | \item{urls}{character vector of URLs} 11 | } 12 | \value{ 13 | data frame (not a tibble) 14 | } 15 | \description{ 16 | Parse a character vector of URLs into component parts (\code{urltools} compatibility function) 17 | } 18 | -------------------------------------------------------------------------------- /src/.gitignore: -------------------------------------------------------------------------------- 1 | *.o 2 | *.so 3 | *.dll 4 | -------------------------------------------------------------------------------- /src/Makevars.in: -------------------------------------------------------------------------------- 1 | PKG_CFLAGS=$(C_VISIBILITY) 2 | PKG_CPPFLAGS=@cflags@ -DSTRICT_R_HEADERS 3 | PKG_LIBS=@libs@ 4 | 5 | all: clean 6 | 7 | clean: 8 | rm -f $(SHLIB) $(OBJECTS) 9 | -------------------------------------------------------------------------------- /src/Makevars.win: -------------------------------------------------------------------------------- 1 | VERSION=7.64.1 2 | PKG_LIBS= -L../windows/libcurl-$(VERSION)/lib${R_ARCH} \ 3 | -L. -lwinhttp -lcurl -lssh2 -lz -lssl -lcrypto -lgdi32 -lws2_32 -lcrypt32 -lwldap32 4 | 5 | PKG_CPPFLAGS= \ 6 | -I../windows/libcurl-$(VERSION)/include -DCURL_STATICLIB -DSTRICT_R_HEADERS 7 | 8 | all: clean winlibs libwinhttp.dll.a 9 | 10 | clean: 11 | rm -f $(SHLIB) $(OBJECTS) libwinhttp.dll.a winhttp.def 12 | 13 | winlibs: clean 14 | "${R_HOME}/bin${R_ARCH_BIN}/Rscript.exe" --vanilla "../tools/winlibs.R" $(VERSION) 15 | echo '#include ' | $(CPP) $(PKG_CPPFLAGS) -std=gnu99 -xc - | grep "^[ \t]*CURLOPT_.*," | sed s/,// > ../tools/option_table.txt 16 | 17 | winhttp.def: 18 | cp winhttp$(WIN).def.in winhttp.def 19 | 20 | .PHONY: all winlibs clean 21 | -------------------------------------------------------------------------------- /src/RcppExports.cpp: -------------------------------------------------------------------------------- 1 | // Generated by using Rcpp::compileAttributes() -> do not edit by hand 2 | // Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 3 | 4 | #include 5 | 6 | using namespace Rcpp; 7 | 8 | // parse_curl 9 | DataFrame parse_curl(StringVector urls); 10 | RcppExport SEXP _curlparse_parse_curl(SEXP urlsSEXP) { 11 | BEGIN_RCPP 12 | Rcpp::RObject rcpp_result_gen; 13 | Rcpp::RNGScope rcpp_rngScope_gen; 14 | Rcpp::traits::input_parameter< StringVector >::type urls(urlsSEXP); 15 | rcpp_result_gen = Rcpp::wrap(parse_curl(urls)); 16 | return rcpp_result_gen; 17 | END_RCPP 18 | } 19 | // url_parse 20 | DataFrame url_parse(StringVector urls); 21 | RcppExport SEXP _curlparse_url_parse(SEXP urlsSEXP) { 22 | BEGIN_RCPP 23 | Rcpp::RObject rcpp_result_gen; 24 | Rcpp::RNGScope rcpp_rngScope_gen; 25 | Rcpp::traits::input_parameter< StringVector >::type urls(urlsSEXP); 26 | rcpp_result_gen = Rcpp::wrap(url_parse(urls)); 27 | return rcpp_result_gen; 28 | END_RCPP 29 | } 30 | // scheme 31 | StringVector scheme(StringVector urls); 32 | RcppExport SEXP _curlparse_scheme(SEXP urlsSEXP) { 33 | BEGIN_RCPP 34 | Rcpp::RObject rcpp_result_gen; 35 | Rcpp::RNGScope rcpp_rngScope_gen; 36 | Rcpp::traits::input_parameter< StringVector >::type urls(urlsSEXP); 37 | rcpp_result_gen = Rcpp::wrap(scheme(urls)); 38 | return rcpp_result_gen; 39 | END_RCPP 40 | } 41 | // user 42 | StringVector user(StringVector urls); 43 | RcppExport SEXP _curlparse_user(SEXP urlsSEXP) { 44 | BEGIN_RCPP 45 | Rcpp::RObject rcpp_result_gen; 46 | Rcpp::RNGScope rcpp_rngScope_gen; 47 | Rcpp::traits::input_parameter< StringVector >::type urls(urlsSEXP); 48 | rcpp_result_gen = Rcpp::wrap(user(urls)); 49 | return rcpp_result_gen; 50 | END_RCPP 51 | } 52 | // password 53 | StringVector password(StringVector urls); 54 | RcppExport SEXP _curlparse_password(SEXP urlsSEXP) { 55 | BEGIN_RCPP 56 | Rcpp::RObject rcpp_result_gen; 57 | Rcpp::RNGScope rcpp_rngScope_gen; 58 | Rcpp::traits::input_parameter< StringVector >::type urls(urlsSEXP); 59 | rcpp_result_gen = Rcpp::wrap(password(urls)); 60 | return rcpp_result_gen; 61 | END_RCPP 62 | } 63 | // host 64 | StringVector host(StringVector urls); 65 | RcppExport SEXP _curlparse_host(SEXP urlsSEXP) { 66 | BEGIN_RCPP 67 | Rcpp::RObject rcpp_result_gen; 68 | Rcpp::RNGScope rcpp_rngScope_gen; 69 | Rcpp::traits::input_parameter< StringVector >::type urls(urlsSEXP); 70 | rcpp_result_gen = Rcpp::wrap(host(urls)); 71 | return rcpp_result_gen; 72 | END_RCPP 73 | } 74 | // port 75 | StringVector port(StringVector urls); 76 | RcppExport SEXP _curlparse_port(SEXP urlsSEXP) { 77 | BEGIN_RCPP 78 | Rcpp::RObject rcpp_result_gen; 79 | Rcpp::RNGScope rcpp_rngScope_gen; 80 | Rcpp::traits::input_parameter< StringVector >::type urls(urlsSEXP); 81 | rcpp_result_gen = Rcpp::wrap(port(urls)); 82 | return rcpp_result_gen; 83 | END_RCPP 84 | } 85 | // path 86 | StringVector path(StringVector urls); 87 | RcppExport SEXP _curlparse_path(SEXP urlsSEXP) { 88 | BEGIN_RCPP 89 | Rcpp::RObject rcpp_result_gen; 90 | Rcpp::RNGScope rcpp_rngScope_gen; 91 | Rcpp::traits::input_parameter< StringVector >::type urls(urlsSEXP); 92 | rcpp_result_gen = Rcpp::wrap(path(urls)); 93 | return rcpp_result_gen; 94 | END_RCPP 95 | } 96 | // url_options 97 | StringVector url_options(StringVector urls); 98 | RcppExport SEXP _curlparse_url_options(SEXP urlsSEXP) { 99 | BEGIN_RCPP 100 | Rcpp::RObject rcpp_result_gen; 101 | Rcpp::RNGScope rcpp_rngScope_gen; 102 | Rcpp::traits::input_parameter< StringVector >::type urls(urlsSEXP); 103 | rcpp_result_gen = Rcpp::wrap(url_options(urls)); 104 | return rcpp_result_gen; 105 | END_RCPP 106 | } 107 | // query 108 | StringVector query(StringVector urls); 109 | RcppExport SEXP _curlparse_query(SEXP urlsSEXP) { 110 | BEGIN_RCPP 111 | Rcpp::RObject rcpp_result_gen; 112 | Rcpp::RNGScope rcpp_rngScope_gen; 113 | Rcpp::traits::input_parameter< StringVector >::type urls(urlsSEXP); 114 | rcpp_result_gen = Rcpp::wrap(query(urls)); 115 | return rcpp_result_gen; 116 | END_RCPP 117 | } 118 | // fragment 119 | StringVector fragment(StringVector urls); 120 | RcppExport SEXP _curlparse_fragment(SEXP urlsSEXP) { 121 | BEGIN_RCPP 122 | Rcpp::RObject rcpp_result_gen; 123 | Rcpp::RNGScope rcpp_rngScope_gen; 124 | Rcpp::traits::input_parameter< StringVector >::type urls(urlsSEXP); 125 | rcpp_result_gen = Rcpp::wrap(fragment(urls)); 126 | return rcpp_result_gen; 127 | END_RCPP 128 | } 129 | 130 | static const R_CallMethodDef CallEntries[] = { 131 | {"_curlparse_parse_curl", (DL_FUNC) &_curlparse_parse_curl, 1}, 132 | {"_curlparse_url_parse", (DL_FUNC) &_curlparse_url_parse, 1}, 133 | {"_curlparse_scheme", (DL_FUNC) &_curlparse_scheme, 1}, 134 | {"_curlparse_user", (DL_FUNC) &_curlparse_user, 1}, 135 | {"_curlparse_password", (DL_FUNC) &_curlparse_password, 1}, 136 | {"_curlparse_host", (DL_FUNC) &_curlparse_host, 1}, 137 | {"_curlparse_port", (DL_FUNC) &_curlparse_port, 1}, 138 | {"_curlparse_path", (DL_FUNC) &_curlparse_path, 1}, 139 | {"_curlparse_url_options", (DL_FUNC) &_curlparse_url_options, 1}, 140 | {"_curlparse_query", (DL_FUNC) &_curlparse_query, 1}, 141 | {"_curlparse_fragment", (DL_FUNC) &_curlparse_fragment, 1}, 142 | {NULL, NULL, 0} 143 | }; 144 | 145 | RcppExport void R_init_curlparse(DllInfo *dll) { 146 | R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); 147 | R_useDynamicSymbols(dll, FALSE); 148 | } 149 | -------------------------------------------------------------------------------- /src/curlparse-main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include 4 | #include 5 | 6 | using namespace Rcpp; 7 | 8 | static inline String lc_url_get(CURLU *url, CURLUPart what, unsigned int flags = 0) { 9 | 10 | char *thing; 11 | CURLUcode rc = curl_url_get(url, what, &thing, flags); 12 | 13 | if (!rc) { 14 | String out(thing); 15 | curl_free(thing); 16 | return(out); 17 | } else { 18 | return(NA_STRING); 19 | } 20 | 21 | } 22 | 23 | //' Parse a character vector of URLs into component parts 24 | //' 25 | //' @md 26 | //' @param urls character vector of URLs 27 | //' @return data frame (tibble) 28 | //' @export 29 | // [[Rcpp::export]] 30 | DataFrame parse_curl(StringVector urls) { 31 | 32 | R_xlen_t input_size = urls.size(); 33 | 34 | StringVector scheme_vec(input_size); 35 | StringVector user_vec(input_size); 36 | StringVector password_vec(input_size); 37 | StringVector host_vec(input_size); 38 | StringVector port_vec(input_size); 39 | StringVector path_vec(input_size); 40 | StringVector options_vec(input_size); 41 | StringVector query_vec(input_size); 42 | StringVector fragment_vec(input_size); 43 | 44 | CURLUcode rc; 45 | CURLU *url; 46 | 47 | for (R_xlen_t i = 0; i < input_size; i++) { 48 | 49 | url = curl_url(); 50 | rc = curl_url_set(url, CURLUPART_URL, urls[i], 0); 51 | 52 | if (!rc) { 53 | 54 | scheme_vec[i] = lc_url_get(url, CURLUPART_SCHEME, CURLU_DEFAULT_SCHEME); 55 | user_vec[i] = lc_url_get(url, CURLUPART_USER); 56 | password_vec[i] = lc_url_get(url, CURLUPART_PASSWORD); 57 | host_vec[i] = lc_url_get(url, CURLUPART_HOST); 58 | port_vec[i] = lc_url_get(url, CURLUPART_PORT, CURLU_DEFAULT_PORT); 59 | path_vec[i] = lc_url_get(url, CURLUPART_PATH, CURLU_URLDECODE); 60 | options_vec[i] = lc_url_get(url, CURLUPART_OPTIONS); 61 | query_vec[i] = lc_url_get(url, CURLUPART_QUERY, CURLU_URLDECODE); 62 | fragment_vec[i] = lc_url_get(url, CURLUPART_FRAGMENT); 63 | 64 | } else { 65 | 66 | scheme_vec[i] = NA_STRING; 67 | user_vec[i] = NA_STRING; 68 | password_vec[i] = NA_STRING; 69 | host_vec[i] = NA_STRING; 70 | port_vec[i] = NA_STRING; 71 | path_vec[i] = NA_STRING; 72 | options_vec[i] = NA_STRING; 73 | query_vec[i] = NA_STRING; 74 | fragment_vec[i] = NA_STRING; 75 | 76 | } 77 | 78 | curl_url_cleanup(url); 79 | 80 | } 81 | 82 | DataFrame out = DataFrame::create( 83 | _["scheme"] = scheme_vec, 84 | _["user"] = user_vec, 85 | _["password"] = password_vec, 86 | _["host"] = host_vec, 87 | _["port"] = port_vec, 88 | _["path"] = path_vec, 89 | _["options"] = options_vec, 90 | _["query"] = query_vec, 91 | _["fragment"] = fragment_vec, 92 | _["stringsAsFactors"] = false 93 | ); 94 | 95 | out.attr("class") = StringVector::create("tbl_df", "tbl", "data.frame"); 96 | 97 | return(out); 98 | 99 | } 100 | 101 | 102 | //' Parse a character vector of URLs into component parts (`urltools` compatibility function) 103 | //' 104 | //' @md 105 | //' @param urls character vector of URLs 106 | //' @return data frame (not a tibble) 107 | //' @export 108 | // [[Rcpp::export]] 109 | DataFrame url_parse(StringVector urls) { 110 | 111 | R_xlen_t input_size = urls.size(); 112 | 113 | StringVector scheme_vec(input_size); 114 | StringVector host_vec(input_size); 115 | StringVector port_vec(input_size); 116 | StringVector path_vec(input_size); 117 | StringVector query_vec(input_size); 118 | StringVector fragment_vec(input_size); 119 | 120 | CURLUcode rc; 121 | CURLU *url; 122 | 123 | for (R_xlen_t i = 0; i < input_size; i++) { 124 | 125 | url = curl_url(); 126 | rc = curl_url_set(url, CURLUPART_URL, urls[i], 0); 127 | 128 | if (!rc) { 129 | 130 | scheme_vec[i] = lc_url_get(url, CURLUPART_SCHEME, CURLU_DEFAULT_SCHEME); 131 | host_vec[i] = lc_url_get(url, CURLUPART_HOST); 132 | port_vec[i] = lc_url_get(url, CURLUPART_PORT, CURLU_DEFAULT_PORT); 133 | path_vec[i] = lc_url_get(url, CURLUPART_PATH, CURLU_URLDECODE); 134 | query_vec[i] = lc_url_get(url, CURLUPART_QUERY, CURLU_URLDECODE); 135 | fragment_vec[i] = lc_url_get(url, CURLUPART_FRAGMENT); 136 | 137 | } else { 138 | 139 | scheme_vec[i] = NA_STRING; 140 | host_vec[i] = NA_STRING; 141 | port_vec[i] = NA_STRING; 142 | path_vec[i] = NA_STRING; 143 | query_vec[i] = NA_STRING; 144 | fragment_vec[i] = NA_STRING; 145 | 146 | } 147 | 148 | curl_url_cleanup(url); 149 | 150 | } 151 | 152 | DataFrame out = DataFrame::create( 153 | _["scheme"] = scheme_vec, 154 | _["domain"] = host_vec, 155 | _["port"] = port_vec, 156 | _["path"] = path_vec, 157 | _["query"] = query_vec, 158 | _["fragment"] = fragment_vec, 159 | _["stringsAsFactors"] = false 160 | ); 161 | 162 | return(out); 163 | 164 | } 165 | 166 | 167 | StringVector lc_part(StringVector urls, CURLUPart what, unsigned int flags = 0) { 168 | 169 | R_xlen_t input_size = urls.size(); 170 | StringVector output(input_size); 171 | 172 | CURLUcode rc; 173 | CURLU *url; 174 | 175 | for (R_xlen_t i = 0; i < input_size; i++) { 176 | 177 | url = curl_url(); 178 | rc = curl_url_set(url, CURLUPART_URL, urls[i], 0); 179 | 180 | output[i] = (!rc) ? lc_url_get(url, what, flags) : NA_STRING; 181 | 182 | curl_url_cleanup(url); 183 | 184 | } 185 | 186 | return(output); 187 | 188 | } 189 | 190 | //' Extract member components from a URL string 191 | //' 192 | //' @md 193 | //' @param urls character vector of URLs 194 | //' @return character vector of the extracted URL component 195 | //' @export 196 | // [[Rcpp::export]] 197 | StringVector scheme(StringVector urls) { 198 | return(lc_part(urls, CURLUPART_SCHEME, CURLU_DEFAULT_SCHEME)); 199 | } 200 | 201 | //' @rdname scheme 202 | //' @export 203 | // [[Rcpp::export]] 204 | StringVector user(StringVector urls) { 205 | return(lc_part(urls, CURLUPART_USER)); 206 | } 207 | 208 | //' @rdname scheme 209 | //' @export 210 | // [[Rcpp::export]] 211 | StringVector password(StringVector urls) { 212 | return(lc_part(urls, CURLUPART_PASSWORD)); 213 | } 214 | 215 | //' @rdname scheme 216 | //' @export 217 | // [[Rcpp::export]] 218 | StringVector host(StringVector urls) { 219 | return(lc_part(urls, CURLUPART_HOST)); 220 | } 221 | 222 | //' @rdname scheme 223 | //' @export 224 | // [[Rcpp::export]] 225 | StringVector port(StringVector urls) { 226 | return(lc_part(urls, CURLUPART_PORT, CURLU_DEFAULT_PORT)); 227 | } 228 | 229 | //' @rdname scheme 230 | //' @export 231 | // [[Rcpp::export]] 232 | StringVector path(StringVector urls) { 233 | return(lc_part(urls, CURLUPART_PATH, CURLU_URLDECODE)); 234 | } 235 | 236 | //' @rdname scheme 237 | //' @export 238 | // [[Rcpp::export]] 239 | StringVector url_options(StringVector urls) { 240 | return(lc_part(urls, CURLUPART_OPTIONS)); 241 | } 242 | 243 | //' @rdname scheme 244 | //' @export 245 | // [[Rcpp::export]] 246 | StringVector query(StringVector urls) { 247 | return(lc_part(urls, CURLUPART_QUERY, CURLU_URLENCODE)); 248 | } 249 | 250 | //' @rdname scheme 251 | //' @export 252 | // [[Rcpp::export]] 253 | StringVector fragment(StringVector urls) { 254 | return(lc_part(urls, CURLUPART_FRAGMENT)); 255 | } 256 | -------------------------------------------------------------------------------- /src/winhttp32.def.in: -------------------------------------------------------------------------------- 1 | ; 2 | ; Definition file of WINHTTP.dll 3 | ; Automatic generated by gendef 4 | ; written by Kai Tietz 2008 5 | ; 6 | LIBRARY "WINHTTP.dll" 7 | EXPORTS 8 | Private1@20 9 | SvchostPushServiceGlobals@4 10 | WinHttpAddRequestHeaders@16 11 | WinHttpAutoProxySvcMain@8 12 | WinHttpCheckPlatform@0 13 | WinHttpCloseHandle@4 14 | WinHttpConnect@16 15 | WinHttpCrackUrl@16 16 | WinHttpCreateUrl@16 17 | WinHttpDetectAutoProxyConfigUrl@8 18 | WinHttpGetDefaultProxyConfiguration@4 19 | WinHttpGetIEProxyConfigForCurrentUser@4 20 | WinHttpGetProxyForUrl@16 21 | WinHttpOpen@20 22 | WinHttpOpenRequest@28 23 | WinHttpQueryAuthSchemes@16 24 | WinHttpQueryDataAvailable@8 25 | WinHttpQueryHeaders@24 26 | WinHttpQueryOption@16 27 | WinHttpReadData@16 28 | WinHttpReceiveResponse@8 29 | WinHttpSendRequest@28 30 | WinHttpSetCredentials@24 31 | WinHttpSetDefaultProxyConfiguration@4 32 | WinHttpSetOption@16 33 | WinHttpSetStatusCallback@16 34 | WinHttpSetTimeouts@20 35 | WinHttpTimeFromSystemTime@8 36 | WinHttpTimeToSystemTime@8 37 | WinHttpWriteData@16 38 | -------------------------------------------------------------------------------- /src/winhttp64.def.in: -------------------------------------------------------------------------------- 1 | ; 2 | ; Definition file of WINHTTP.dll 3 | ; Automatic generated by gendef 4 | ; written by Kai Tietz 2008 5 | ; 6 | LIBRARY "WINHTTP.dll" 7 | EXPORTS 8 | Private1 9 | SvchostPushServiceGlobals 10 | WinHttpAddRequestHeaders 11 | WinHttpAutoProxySvcMain 12 | WinHttpCheckPlatform 13 | WinHttpCloseHandle 14 | WinHttpConnect 15 | WinHttpCrackUrl 16 | WinHttpCreateUrl 17 | WinHttpDetectAutoProxyConfigUrl 18 | WinHttpGetDefaultProxyConfiguration 19 | WinHttpGetIEProxyConfigForCurrentUser 20 | WinHttpGetProxyForUrl 21 | WinHttpOpen 22 | WinHttpOpenRequest 23 | WinHttpQueryAuthSchemes 24 | WinHttpQueryDataAvailable 25 | WinHttpQueryHeaders 26 | WinHttpQueryOption 27 | WinHttpReadData 28 | WinHttpReceiveResponse 29 | WinHttpSendRequest 30 | WinHttpSetCredentials 31 | WinHttpSetDefaultProxyConfiguration 32 | WinHttpSetOption 33 | WinHttpSetStatusCallback 34 | WinHttpSetTimeouts 35 | WinHttpTimeFromSystemTime 36 | WinHttpTimeToSystemTime 37 | WinHttpWriteData 38 | -------------------------------------------------------------------------------- /tests/tinytest.R: -------------------------------------------------------------------------------- 1 | 2 | if ( requireNamespace("tinytest", quietly=TRUE) ){ 3 | tinytest::test_package("curlparse") 4 | } 5 | 6 | -------------------------------------------------------------------------------- /tools/option_table.txt: -------------------------------------------------------------------------------- 1 | CURLOPT_WRITEDATA = 10000 + 1 2 | CURLOPT_URL = 10000 + 2 3 | CURLOPT_PORT = 0 + 3 4 | CURLOPT_PROXY = 10000 + 4 5 | CURLOPT_USERPWD = 10000 + 5 6 | CURLOPT_PROXYUSERPWD = 10000 + 6 7 | CURLOPT_RANGE = 10000 + 7 8 | CURLOPT_READDATA = 10000 + 9 9 | CURLOPT_ERRORBUFFER = 10000 + 10 10 | CURLOPT_WRITEFUNCTION = 20000 + 11 11 | CURLOPT_READFUNCTION = 20000 + 12 12 | CURLOPT_TIMEOUT = 0 + 13 13 | CURLOPT_INFILESIZE = 0 + 14 14 | CURLOPT_POSTFIELDS = 10000 + 15 15 | CURLOPT_REFERER = 10000 + 16 16 | CURLOPT_FTPPORT = 10000 + 17 17 | CURLOPT_USERAGENT = 10000 + 18 18 | CURLOPT_LOW_SPEED_LIMIT = 0 + 19 19 | CURLOPT_LOW_SPEED_TIME = 0 + 20 20 | CURLOPT_RESUME_FROM = 0 + 21 21 | CURLOPT_COOKIE = 10000 + 22 22 | CURLOPT_HTTPHEADER = 10000 + 23 23 | CURLOPT_HTTPPOST = 10000 + 24 24 | CURLOPT_SSLCERT = 10000 + 25 25 | CURLOPT_KEYPASSWD = 10000 + 26 26 | CURLOPT_CRLF = 0 + 27 27 | CURLOPT_QUOTE = 10000 + 28 28 | CURLOPT_HEADERDATA = 10000 + 29 29 | CURLOPT_COOKIEFILE = 10000 + 31 30 | CURLOPT_SSLVERSION = 0 + 32 31 | CURLOPT_TIMECONDITION = 0 + 33 32 | CURLOPT_TIMEVALUE = 0 + 34 33 | CURLOPT_CUSTOMREQUEST = 10000 + 36 34 | CURLOPT_STDERR = 10000 + 37 35 | CURLOPT_POSTQUOTE = 10000 + 39 36 | CURLOPT_OBSOLETE40 = 10000 + 40 37 | CURLOPT_VERBOSE = 0 + 41 38 | CURLOPT_HEADER = 0 + 42 39 | CURLOPT_NOPROGRESS = 0 + 43 40 | CURLOPT_NOBODY = 0 + 44 41 | CURLOPT_FAILONERROR = 0 + 45 42 | CURLOPT_UPLOAD = 0 + 46 43 | CURLOPT_POST = 0 + 47 44 | CURLOPT_DIRLISTONLY = 0 + 48 45 | CURLOPT_APPEND = 0 + 50 46 | CURLOPT_NETRC = 0 + 51 47 | CURLOPT_FOLLOWLOCATION = 0 + 52 48 | CURLOPT_TRANSFERTEXT = 0 + 53 49 | CURLOPT_PUT = 0 + 54 50 | CURLOPT_PROGRESSFUNCTION = 20000 + 56 51 | CURLOPT_PROGRESSDATA = 10000 + 57 52 | CURLOPT_AUTOREFERER = 0 + 58 53 | CURLOPT_PROXYPORT = 0 + 59 54 | CURLOPT_POSTFIELDSIZE = 0 + 60 55 | CURLOPT_HTTPPROXYTUNNEL = 0 + 61 56 | CURLOPT_INTERFACE = 10000 + 62 57 | CURLOPT_KRBLEVEL = 10000 + 63 58 | CURLOPT_SSL_VERIFYPEER = 0 + 64 59 | CURLOPT_CAINFO = 10000 + 65 60 | CURLOPT_MAXREDIRS = 0 + 68 61 | CURLOPT_FILETIME = 0 + 69 62 | CURLOPT_TELNETOPTIONS = 10000 + 70 63 | CURLOPT_MAXCONNECTS = 0 + 71 64 | CURLOPT_OBSOLETE72 = 0 + 72 65 | CURLOPT_FRESH_CONNECT = 0 + 74 66 | CURLOPT_FORBID_REUSE = 0 + 75 67 | CURLOPT_RANDOM_FILE = 10000 + 76 68 | CURLOPT_EGDSOCKET = 10000 + 77 69 | CURLOPT_CONNECTTIMEOUT = 0 + 78 70 | CURLOPT_HEADERFUNCTION = 20000 + 79 71 | CURLOPT_HTTPGET = 0 + 80 72 | CURLOPT_SSL_VERIFYHOST = 0 + 81 73 | CURLOPT_COOKIEJAR = 10000 + 82 74 | CURLOPT_SSL_CIPHER_LIST = 10000 + 83 75 | CURLOPT_HTTP_VERSION = 0 + 84 76 | CURLOPT_FTP_USE_EPSV = 0 + 85 77 | CURLOPT_SSLCERTTYPE = 10000 + 86 78 | CURLOPT_SSLKEY = 10000 + 87 79 | CURLOPT_SSLKEYTYPE = 10000 + 88 80 | CURLOPT_SSLENGINE = 10000 + 89 81 | CURLOPT_SSLENGINE_DEFAULT = 0 + 90 82 | CURLOPT_DNS_USE_GLOBAL_CACHE = 0 + 91 83 | CURLOPT_DNS_CACHE_TIMEOUT = 0 + 92 84 | CURLOPT_PREQUOTE = 10000 + 93 85 | CURLOPT_DEBUGFUNCTION = 20000 + 94 86 | CURLOPT_DEBUGDATA = 10000 + 95 87 | CURLOPT_COOKIESESSION = 0 + 96 88 | CURLOPT_CAPATH = 10000 + 97 89 | CURLOPT_BUFFERSIZE = 0 + 98 90 | CURLOPT_NOSIGNAL = 0 + 99 91 | CURLOPT_SHARE = 10000 + 100 92 | CURLOPT_PROXYTYPE = 0 + 101 93 | CURLOPT_ACCEPT_ENCODING = 10000 + 102 94 | CURLOPT_PRIVATE = 10000 + 103 95 | CURLOPT_HTTP200ALIASES = 10000 + 104 96 | CURLOPT_UNRESTRICTED_AUTH = 0 + 105 97 | CURLOPT_FTP_USE_EPRT = 0 + 106 98 | CURLOPT_HTTPAUTH = 0 + 107 99 | CURLOPT_SSL_CTX_FUNCTION = 20000 + 108 100 | CURLOPT_SSL_CTX_DATA = 10000 + 109 101 | CURLOPT_FTP_CREATE_MISSING_DIRS = 0 + 110 102 | CURLOPT_PROXYAUTH = 0 + 111 103 | CURLOPT_FTP_RESPONSE_TIMEOUT = 0 + 112 104 | CURLOPT_IPRESOLVE = 0 + 113 105 | CURLOPT_MAXFILESIZE = 0 + 114 106 | CURLOPT_INFILESIZE_LARGE = 30000 + 115 107 | CURLOPT_RESUME_FROM_LARGE = 30000 + 116 108 | CURLOPT_MAXFILESIZE_LARGE = 30000 + 117 109 | CURLOPT_NETRC_FILE = 10000 + 118 110 | CURLOPT_USE_SSL = 0 + 119 111 | CURLOPT_POSTFIELDSIZE_LARGE = 30000 + 120 112 | CURLOPT_TCP_NODELAY = 0 + 121 113 | CURLOPT_FTPSSLAUTH = 0 + 129 114 | CURLOPT_IOCTLFUNCTION = 20000 + 130 115 | CURLOPT_IOCTLDATA = 10000 + 131 116 | CURLOPT_FTP_ACCOUNT = 10000 + 134 117 | CURLOPT_COOKIELIST = 10000 + 135 118 | CURLOPT_IGNORE_CONTENT_LENGTH = 0 + 136 119 | CURLOPT_FTP_SKIP_PASV_IP = 0 + 137 120 | CURLOPT_FTP_FILEMETHOD = 0 + 138 121 | CURLOPT_LOCALPORT = 0 + 139 122 | CURLOPT_LOCALPORTRANGE = 0 + 140 123 | CURLOPT_CONNECT_ONLY = 0 + 141 124 | CURLOPT_CONV_FROM_NETWORK_FUNCTION = 20000 + 142 125 | CURLOPT_CONV_TO_NETWORK_FUNCTION = 20000 + 143 126 | CURLOPT_CONV_FROM_UTF8_FUNCTION = 20000 + 144 127 | CURLOPT_MAX_SEND_SPEED_LARGE = 30000 + 145 128 | CURLOPT_MAX_RECV_SPEED_LARGE = 30000 + 146 129 | CURLOPT_FTP_ALTERNATIVE_TO_USER = 10000 + 147 130 | CURLOPT_SOCKOPTFUNCTION = 20000 + 148 131 | CURLOPT_SOCKOPTDATA = 10000 + 149 132 | CURLOPT_SSL_SESSIONID_CACHE = 0 + 150 133 | CURLOPT_SSH_AUTH_TYPES = 0 + 151 134 | CURLOPT_SSH_PUBLIC_KEYFILE = 10000 + 152 135 | CURLOPT_SSH_PRIVATE_KEYFILE = 10000 + 153 136 | CURLOPT_FTP_SSL_CCC = 0 + 154 137 | CURLOPT_TIMEOUT_MS = 0 + 155 138 | CURLOPT_CONNECTTIMEOUT_MS = 0 + 156 139 | CURLOPT_HTTP_TRANSFER_DECODING = 0 + 157 140 | CURLOPT_HTTP_CONTENT_DECODING = 0 + 158 141 | CURLOPT_NEW_FILE_PERMS = 0 + 159 142 | CURLOPT_NEW_DIRECTORY_PERMS = 0 + 160 143 | CURLOPT_POSTREDIR = 0 + 161 144 | CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 = 10000 + 162 145 | CURLOPT_OPENSOCKETFUNCTION = 20000 + 163 146 | CURLOPT_OPENSOCKETDATA = 10000 + 164 147 | CURLOPT_COPYPOSTFIELDS = 10000 + 165 148 | CURLOPT_PROXY_TRANSFER_MODE = 0 + 166 149 | CURLOPT_SEEKFUNCTION = 20000 + 167 150 | CURLOPT_SEEKDATA = 10000 + 168 151 | CURLOPT_CRLFILE = 10000 + 169 152 | CURLOPT_ISSUERCERT = 10000 + 170 153 | CURLOPT_ADDRESS_SCOPE = 0 + 171 154 | CURLOPT_CERTINFO = 0 + 172 155 | CURLOPT_USERNAME = 10000 + 173 156 | CURLOPT_PASSWORD = 10000 + 174 157 | CURLOPT_PROXYUSERNAME = 10000 + 175 158 | CURLOPT_PROXYPASSWORD = 10000 + 176 159 | CURLOPT_NOPROXY = 10000 + 177 160 | CURLOPT_TFTP_BLKSIZE = 0 + 178 161 | CURLOPT_SOCKS5_GSSAPI_SERVICE = 10000 + 179 162 | CURLOPT_SOCKS5_GSSAPI_NEC = 0 + 180 163 | CURLOPT_PROTOCOLS = 0 + 181 164 | CURLOPT_REDIR_PROTOCOLS = 0 + 182 165 | CURLOPT_SSH_KNOWNHOSTS = 10000 + 183 166 | CURLOPT_SSH_KEYFUNCTION = 20000 + 184 167 | CURLOPT_SSH_KEYDATA = 10000 + 185 168 | CURLOPT_MAIL_FROM = 10000 + 186 169 | CURLOPT_MAIL_RCPT = 10000 + 187 170 | CURLOPT_FTP_USE_PRET = 0 + 188 171 | CURLOPT_RTSP_REQUEST = 0 + 189 172 | CURLOPT_RTSP_SESSION_ID = 10000 + 190 173 | CURLOPT_RTSP_STREAM_URI = 10000 + 191 174 | CURLOPT_RTSP_TRANSPORT = 10000 + 192 175 | CURLOPT_RTSP_CLIENT_CSEQ = 0 + 193 176 | CURLOPT_RTSP_SERVER_CSEQ = 0 + 194 177 | CURLOPT_INTERLEAVEDATA = 10000 + 195 178 | CURLOPT_INTERLEAVEFUNCTION = 20000 + 196 179 | CURLOPT_WILDCARDMATCH = 0 + 197 180 | CURLOPT_CHUNK_BGN_FUNCTION = 20000 + 198 181 | CURLOPT_CHUNK_END_FUNCTION = 20000 + 199 182 | CURLOPT_FNMATCH_FUNCTION = 20000 + 200 183 | CURLOPT_CHUNK_DATA = 10000 + 201 184 | CURLOPT_FNMATCH_DATA = 10000 + 202 185 | CURLOPT_RESOLVE = 10000 + 203 186 | CURLOPT_TLSAUTH_USERNAME = 10000 + 204 187 | CURLOPT_TLSAUTH_PASSWORD = 10000 + 205 188 | CURLOPT_TLSAUTH_TYPE = 10000 + 206 189 | CURLOPT_TRANSFER_ENCODING = 0 + 207 190 | CURLOPT_CLOSESOCKETFUNCTION = 20000 + 208 191 | CURLOPT_CLOSESOCKETDATA = 10000 + 209 192 | CURLOPT_GSSAPI_DELEGATION = 0 + 210 193 | CURLOPT_DNS_SERVERS = 10000 + 211 194 | CURLOPT_ACCEPTTIMEOUT_MS = 0 + 212 195 | CURLOPT_TCP_KEEPALIVE = 0 + 213 196 | CURLOPT_TCP_KEEPIDLE = 0 + 214 197 | CURLOPT_TCP_KEEPINTVL = 0 + 215 198 | CURLOPT_SSL_OPTIONS = 0 + 216 199 | CURLOPT_MAIL_AUTH = 10000 + 217 200 | CURLOPT_SASL_IR = 0 + 218 201 | CURLOPT_XFERINFOFUNCTION = 20000 + 219 202 | CURLOPT_XOAUTH2_BEARER = 10000 + 220 203 | CURLOPT_DNS_INTERFACE = 10000 + 221 204 | CURLOPT_DNS_LOCAL_IP4 = 10000 + 222 205 | CURLOPT_DNS_LOCAL_IP6 = 10000 + 223 206 | CURLOPT_LOGIN_OPTIONS = 10000 + 224 207 | CURLOPT_SSL_ENABLE_NPN = 0 + 225 208 | CURLOPT_SSL_ENABLE_ALPN = 0 + 226 209 | CURLOPT_EXPECT_100_TIMEOUT_MS = 0 + 227 210 | CURLOPT_PROXYHEADER = 10000 + 228 211 | CURLOPT_HEADEROPT = 0 + 229 212 | CURLOPT_PINNEDPUBLICKEY = 10000 + 230 213 | CURLOPT_UNIX_SOCKET_PATH = 10000 + 231 214 | CURLOPT_SSL_VERIFYSTATUS = 0 + 232 215 | CURLOPT_SSL_FALSESTART = 0 + 233 216 | CURLOPT_PATH_AS_IS = 0 + 234 217 | CURLOPT_PROXY_SERVICE_NAME = 10000 + 235 218 | CURLOPT_SERVICE_NAME = 10000 + 236 219 | CURLOPT_PIPEWAIT = 0 + 237 220 | CURLOPT_DEFAULT_PROTOCOL = 10000 + 238 221 | CURLOPT_STREAM_WEIGHT = 0 + 239 222 | CURLOPT_STREAM_DEPENDS = 10000 + 240 223 | CURLOPT_STREAM_DEPENDS_E = 10000 + 241 224 | CURLOPT_TFTP_NO_OPTIONS = 0 + 242 225 | CURLOPT_CONNECT_TO = 10000 + 243 226 | CURLOPT_TCP_FASTOPEN = 0 + 244 227 | CURLOPT_KEEP_SENDING_ON_ERROR = 0 + 245 228 | CURLOPT_PROXY_CAINFO = 10000 + 246 229 | CURLOPT_PROXY_CAPATH = 10000 + 247 230 | CURLOPT_PROXY_SSL_VERIFYPEER = 0 + 248 231 | CURLOPT_PROXY_SSL_VERIFYHOST = 0 + 249 232 | CURLOPT_PROXY_SSLVERSION = 0 + 250 233 | CURLOPT_PROXY_TLSAUTH_USERNAME = 10000 + 251 234 | CURLOPT_PROXY_TLSAUTH_PASSWORD = 10000 + 252 235 | CURLOPT_PROXY_TLSAUTH_TYPE = 10000 + 253 236 | CURLOPT_PROXY_SSLCERT = 10000 + 254 237 | CURLOPT_PROXY_SSLCERTTYPE = 10000 + 255 238 | CURLOPT_PROXY_SSLKEY = 10000 + 256 239 | CURLOPT_PROXY_SSLKEYTYPE = 10000 + 257 240 | CURLOPT_PROXY_KEYPASSWD = 10000 + 258 241 | CURLOPT_PROXY_SSL_CIPHER_LIST = 10000 + 259 242 | CURLOPT_PROXY_CRLFILE = 10000 + 260 243 | CURLOPT_PROXY_SSL_OPTIONS = 0 + 261 244 | CURLOPT_PRE_PROXY = 10000 + 262 245 | CURLOPT_PROXY_PINNEDPUBLICKEY = 10000 + 263 246 | CURLOPT_ABSTRACT_UNIX_SOCKET = 10000 + 264 247 | CURLOPT_SUPPRESS_CONNECT_HEADERS = 0 + 265 248 | CURLOPT_REQUEST_TARGET = 10000 + 266 249 | CURLOPT_SOCKS5_AUTH = 0 + 267 250 | CURLOPT_SSH_COMPRESSION = 0 + 268 251 | CURLOPT_MIMEPOST = 10000 + 269 252 | CURLOPT_TIMEVALUE_LARGE = 30000 + 270 253 | CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS = 0 + 271 254 | CURLOPT_RESOLVER_START_FUNCTION = 20000 + 272 255 | CURLOPT_RESOLVER_START_DATA = 10000 + 273 256 | CURLOPT_HAPROXYPROTOCOL = 0 + 274 257 | CURLOPT_DNS_SHUFFLE_ADDRESSES = 0 + 275 258 | CURLOPT_TLS13_CIPHERS = 10000 + 276 259 | CURLOPT_PROXY_TLS13_CIPHERS = 10000 + 277 260 | CURLOPT_DISALLOW_USERNAME_IN_URL = 0 + 278 261 | CURLOPT_DOH_URL = 10000 + 279 262 | CURLOPT_UPLOAD_BUFFERSIZE = 0 + 280 263 | CURLOPT_UPKEEP_INTERVAL_MS = 0 + 281 264 | -------------------------------------------------------------------------------- /tools/symbols-in-versions: -------------------------------------------------------------------------------- 1 | _ _ ____ _ 2 | ___| | | | _ \| | 3 | / __| | | | |_) | | 4 | | (__| |_| | _ <| |___ 5 | \___|\___/|_| \_\_____| 6 | 7 | This document lists defines and other symbols present in libcurl, together 8 | with exact information about the first libcurl version that provides the 9 | symbol, the first version in which the symbol was marked as deprecated and 10 | for a few symbols the last version that featured it. The names appear in 11 | alphabetical order. 12 | 13 | Name Introduced Deprecated Removed 14 | 15 | CURLALTSVC_ALTUSED 7.64.1 16 | CURLALTSVC_H1 7.64.1 17 | CURLALTSVC_H2 7.64.1 18 | CURLALTSVC_H3 7.64.1 19 | CURLALTSVC_IMMEDIATELY 7.64.1 20 | CURLALTSVC_READONLYFILE 7.64.1 21 | CURLAUTH_ANY 7.10.6 22 | CURLAUTH_ANYSAFE 7.10.6 23 | CURLAUTH_BASIC 7.10.6 24 | CURLAUTH_BEARER 7.61.0 25 | CURLAUTH_DIGEST 7.10.6 26 | CURLAUTH_DIGEST_IE 7.19.3 27 | CURLAUTH_GSSAPI 7.55.0 28 | CURLAUTH_GSSNEGOTIATE 7.10.6 7.38.0 29 | CURLAUTH_NEGOTIATE 7.38.0 30 | CURLAUTH_NONE 7.10.6 31 | CURLAUTH_NTLM 7.10.6 32 | CURLAUTH_NTLM_WB 7.22.0 33 | CURLAUTH_ONLY 7.21.3 34 | CURLCLOSEPOLICY_CALLBACK 7.7 35 | CURLCLOSEPOLICY_LEAST_RECENTLY_USED 7.7 36 | CURLCLOSEPOLICY_LEAST_TRAFFIC 7.7 37 | CURLCLOSEPOLICY_NONE 7.7 38 | CURLCLOSEPOLICY_OLDEST 7.7 39 | CURLCLOSEPOLICY_SLOWEST 7.7 40 | CURLE_ABORTED_BY_CALLBACK 7.1 41 | CURLE_AGAIN 7.18.2 42 | CURLE_ALREADY_COMPLETE 7.7.2 43 | CURLE_BAD_CALLING_ORDER 7.1 7.17.0 44 | CURLE_BAD_CONTENT_ENCODING 7.10 45 | CURLE_BAD_DOWNLOAD_RESUME 7.10 46 | CURLE_BAD_FUNCTION_ARGUMENT 7.1 47 | CURLE_BAD_PASSWORD_ENTERED 7.4.2 7.17.0 48 | CURLE_CHUNK_FAILED 7.21.0 49 | CURLE_CONV_FAILED 7.15.4 50 | CURLE_CONV_REQD 7.15.4 51 | CURLE_COULDNT_CONNECT 7.1 52 | CURLE_COULDNT_RESOLVE_HOST 7.1 53 | CURLE_COULDNT_RESOLVE_PROXY 7.1 54 | CURLE_FAILED_INIT 7.1 55 | CURLE_FILESIZE_EXCEEDED 7.10.8 56 | CURLE_FILE_COULDNT_READ_FILE 7.1 57 | CURLE_FTP_ACCEPT_FAILED 7.24.0 58 | CURLE_FTP_ACCEPT_TIMEOUT 7.24.0 59 | CURLE_FTP_ACCESS_DENIED 7.1 60 | CURLE_FTP_BAD_DOWNLOAD_RESUME 7.1 7.1 61 | CURLE_FTP_BAD_FILE_LIST 7.21.0 62 | CURLE_FTP_CANT_GET_HOST 7.1 63 | CURLE_FTP_CANT_RECONNECT 7.1 7.17.0 64 | CURLE_FTP_COULDNT_GET_SIZE 7.1 7.17.0 65 | CURLE_FTP_COULDNT_RETR_FILE 7.1 66 | CURLE_FTP_COULDNT_SET_ASCII 7.1 7.17.0 67 | CURLE_FTP_COULDNT_SET_BINARY 7.1 7.17.0 68 | CURLE_FTP_COULDNT_SET_TYPE 7.17.0 69 | CURLE_FTP_COULDNT_STOR_FILE 7.1 70 | CURLE_FTP_COULDNT_USE_REST 7.1 71 | CURLE_FTP_PARTIAL_FILE 7.1 7.1 72 | CURLE_FTP_PORT_FAILED 7.1 73 | CURLE_FTP_PRET_FAILED 7.20.0 74 | CURLE_FTP_QUOTE_ERROR 7.1 7.17.0 75 | CURLE_FTP_SSL_FAILED 7.11.0 7.17.0 76 | CURLE_FTP_USER_PASSWORD_INCORRECT 7.1 7.17.0 77 | CURLE_FTP_WEIRD_227_FORMAT 7.1 78 | CURLE_FTP_WEIRD_PASS_REPLY 7.1 79 | CURLE_FTP_WEIRD_PASV_REPLY 7.1 80 | CURLE_FTP_WEIRD_SERVER_REPLY 7.1 81 | CURLE_FTP_WEIRD_USER_REPLY 7.1 7.17.0 82 | CURLE_FTP_WRITE_ERROR 7.1 7.17.0 83 | CURLE_FUNCTION_NOT_FOUND 7.1 84 | CURLE_GOT_NOTHING 7.9.1 85 | CURLE_HTTP2 7.38.0 86 | CURLE_HTTP2_STREAM 7.49.0 87 | CURLE_HTTP_NOT_FOUND 7.1 88 | CURLE_HTTP_PORT_FAILED 7.3 7.12.0 89 | CURLE_HTTP_POST_ERROR 7.1 90 | CURLE_HTTP_RANGE_ERROR 7.1 7.17.0 91 | CURLE_HTTP_RETURNED_ERROR 7.10.3 92 | CURLE_INTERFACE_FAILED 7.12.0 93 | CURLE_LDAP_CANNOT_BIND 7.1 94 | CURLE_LDAP_INVALID_URL 7.10.8 95 | CURLE_LDAP_SEARCH_FAILED 7.1 96 | CURLE_LIBRARY_NOT_FOUND 7.1 7.17.0 97 | CURLE_LOGIN_DENIED 7.13.1 98 | CURLE_MALFORMAT_USER 7.1 7.17.0 99 | CURLE_NOT_BUILT_IN 7.21.5 100 | CURLE_NO_CONNECTION_AVAILABLE 7.30.0 101 | CURLE_OK 7.1 102 | CURLE_OPERATION_TIMEDOUT 7.10.2 103 | CURLE_OPERATION_TIMEOUTED 7.1 7.17.0 104 | CURLE_OUT_OF_MEMORY 7.1 105 | CURLE_PARTIAL_FILE 7.1 106 | CURLE_PEER_FAILED_VERIFICATION 7.17.1 107 | CURLE_QUOTE_ERROR 7.17.0 108 | CURLE_RANGE_ERROR 7.17.0 109 | CURLE_READ_ERROR 7.1 110 | CURLE_RECURSIVE_API_CALL 7.59.0 111 | CURLE_RECV_ERROR 7.10 112 | CURLE_REMOTE_ACCESS_DENIED 7.17.0 113 | CURLE_REMOTE_DISK_FULL 7.17.0 114 | CURLE_REMOTE_FILE_EXISTS 7.17.0 115 | CURLE_REMOTE_FILE_NOT_FOUND 7.16.1 116 | CURLE_RTSP_CSEQ_ERROR 7.20.0 117 | CURLE_RTSP_SESSION_ERROR 7.20.0 118 | CURLE_SEND_ERROR 7.10 119 | CURLE_SEND_FAIL_REWIND 7.12.3 120 | CURLE_SHARE_IN_USE 7.9.6 7.17.0 121 | CURLE_SSH 7.16.1 122 | CURLE_SSL_CACERT 7.10 7.62.0 123 | CURLE_SSL_CACERT_BADFILE 7.16.0 124 | CURLE_SSL_CERTPROBLEM 7.10 125 | CURLE_SSL_CIPHER 7.10 126 | CURLE_SSL_CONNECT_ERROR 7.1 127 | CURLE_SSL_CRL_BADFILE 7.19.0 128 | CURLE_SSL_ENGINE_INITFAILED 7.12.3 129 | CURLE_SSL_ENGINE_NOTFOUND 7.9.3 130 | CURLE_SSL_ENGINE_SETFAILED 7.9.3 131 | CURLE_SSL_INVALIDCERTSTATUS 7.41.0 132 | CURLE_SSL_ISSUER_ERROR 7.19.0 133 | CURLE_SSL_PEER_CERTIFICATE 7.8 7.17.1 134 | CURLE_SSL_PINNEDPUBKEYNOTMATCH 7.39.0 135 | CURLE_SSL_SHUTDOWN_FAILED 7.16.1 136 | CURLE_TELNET_OPTION_SYNTAX 7.7 137 | CURLE_TFTP_DISKFULL 7.15.0 7.17.0 138 | CURLE_TFTP_EXISTS 7.15.0 7.17.0 139 | CURLE_TFTP_ILLEGAL 7.15.0 140 | CURLE_TFTP_NOSUCHUSER 7.15.0 141 | CURLE_TFTP_NOTFOUND 7.15.0 142 | CURLE_TFTP_PERM 7.15.0 143 | CURLE_TFTP_UNKNOWNID 7.15.0 144 | CURLE_TOO_MANY_REDIRECTS 7.5 145 | CURLE_UNKNOWN_OPTION 7.21.5 146 | CURLE_UNKNOWN_TELNET_OPTION 7.7 147 | CURLE_UNSUPPORTED_PROTOCOL 7.1 148 | CURLE_UPLOAD_FAILED 7.16.3 149 | CURLE_URL_MALFORMAT 7.1 150 | CURLE_URL_MALFORMAT_USER 7.1 7.17.0 151 | CURLE_USE_SSL_FAILED 7.17.0 152 | CURLE_WEIRD_SERVER_REPLY 7.51.0 153 | CURLE_WRITE_ERROR 7.1 154 | CURLFILETYPE_DEVICE_BLOCK 7.21.0 155 | CURLFILETYPE_DEVICE_CHAR 7.21.0 156 | CURLFILETYPE_DIRECTORY 7.21.0 157 | CURLFILETYPE_DOOR 7.21.0 158 | CURLFILETYPE_FILE 7.21.0 159 | CURLFILETYPE_NAMEDPIPE 7.21.0 160 | CURLFILETYPE_SOCKET 7.21.0 161 | CURLFILETYPE_SYMLINK 7.21.0 162 | CURLFILETYPE_UNKNOWN 7.21.0 163 | CURLFINFOFLAG_KNOWN_FILENAME 7.21.0 164 | CURLFINFOFLAG_KNOWN_FILETYPE 7.21.0 165 | CURLFINFOFLAG_KNOWN_GID 7.21.0 166 | CURLFINFOFLAG_KNOWN_HLINKCOUNT 7.21.0 167 | CURLFINFOFLAG_KNOWN_PERM 7.21.0 168 | CURLFINFOFLAG_KNOWN_SIZE 7.21.0 169 | CURLFINFOFLAG_KNOWN_TIME 7.21.0 170 | CURLFINFOFLAG_KNOWN_UID 7.21.0 171 | CURLFORM_ARRAY 7.9.1 7.56.0 172 | CURLFORM_ARRAY_END 7.9.1 7.9.5 7.9.6 173 | CURLFORM_ARRAY_START 7.9.1 7.9.5 7.9.6 174 | CURLFORM_BUFFER 7.9.8 7.56.0 175 | CURLFORM_BUFFERLENGTH 7.9.8 7.56.0 176 | CURLFORM_BUFFERPTR 7.9.8 7.56.0 177 | CURLFORM_CONTENTHEADER 7.9.3 7.56.0 178 | CURLFORM_CONTENTLEN 7.46.0 7.56.0 179 | CURLFORM_CONTENTSLENGTH 7.9 7.56.0 180 | CURLFORM_CONTENTTYPE 7.9 7.56.0 181 | CURLFORM_COPYCONTENTS 7.9 7.56.0 182 | CURLFORM_COPYNAME 7.9 7.56.0 183 | CURLFORM_END 7.9 7.56.0 184 | CURLFORM_FILE 7.9 7.56.0 185 | CURLFORM_FILECONTENT 7.9.1 7.56.0 186 | CURLFORM_FILENAME 7.9.6 7.56.0 187 | CURLFORM_NAMELENGTH 7.9 7.56.0 188 | CURLFORM_NOTHING 7.9 7.56.0 189 | CURLFORM_PTRCONTENTS 7.9 7.56.0 190 | CURLFORM_PTRNAME 7.9 7.56.0 191 | CURLFORM_STREAM 7.18.2 7.56.0 192 | CURLFTPAUTH_DEFAULT 7.12.2 193 | CURLFTPAUTH_SSL 7.12.2 194 | CURLFTPAUTH_TLS 7.12.2 195 | CURLFTPMETHOD_DEFAULT 7.15.3 196 | CURLFTPMETHOD_MULTICWD 7.15.3 197 | CURLFTPMETHOD_NOCWD 7.15.3 198 | CURLFTPMETHOD_SINGLECWD 7.15.3 199 | CURLFTPSSL_ALL 7.11.0 7.17.0 200 | CURLFTPSSL_CCC_ACTIVE 7.16.2 201 | CURLFTPSSL_CCC_NONE 7.16.2 202 | CURLFTPSSL_CCC_PASSIVE 7.16.1 203 | CURLFTPSSL_CONTROL 7.11.0 7.17.0 204 | CURLFTPSSL_NONE 7.11.0 7.17.0 205 | CURLFTPSSL_TRY 7.11.0 7.17.0 206 | CURLFTP_CREATE_DIR 7.19.4 207 | CURLFTP_CREATE_DIR_NONE 7.19.4 208 | CURLFTP_CREATE_DIR_RETRY 7.19.4 209 | CURLGSSAPI_DELEGATION_FLAG 7.22.0 210 | CURLGSSAPI_DELEGATION_NONE 7.22.0 211 | CURLGSSAPI_DELEGATION_POLICY_FLAG 7.22.0 212 | CURLHEADER_SEPARATE 7.37.0 213 | CURLHEADER_UNIFIED 7.37.0 214 | CURLINFO_ACTIVESOCKET 7.45.0 215 | CURLINFO_APPCONNECT_TIME 7.19.0 216 | CURLINFO_APPCONNECT_TIME_T 7.61.0 217 | CURLINFO_CERTINFO 7.19.1 218 | CURLINFO_CONDITION_UNMET 7.19.4 219 | CURLINFO_CONNECT_TIME 7.4.1 220 | CURLINFO_CONNECT_TIME_T 7.61.0 221 | CURLINFO_CONTENT_LENGTH_DOWNLOAD 7.6.1 222 | CURLINFO_CONTENT_LENGTH_DOWNLOAD_T 7.55.0 223 | CURLINFO_CONTENT_LENGTH_UPLOAD 7.6.1 224 | CURLINFO_CONTENT_LENGTH_UPLOAD_T 7.55.0 225 | CURLINFO_CONTENT_TYPE 7.9.4 226 | CURLINFO_COOKIELIST 7.14.1 227 | CURLINFO_DATA_IN 7.9.6 228 | CURLINFO_DATA_OUT 7.9.6 229 | CURLINFO_DOUBLE 7.4.1 230 | CURLINFO_EFFECTIVE_URL 7.4 231 | CURLINFO_END 7.9.6 232 | CURLINFO_FILETIME 7.5 233 | CURLINFO_FILETIME_T 7.59.0 234 | CURLINFO_FTP_ENTRY_PATH 7.15.4 235 | CURLINFO_HEADER_IN 7.9.6 236 | CURLINFO_HEADER_OUT 7.9.6 237 | CURLINFO_HEADER_SIZE 7.4.1 238 | CURLINFO_HTTPAUTH_AVAIL 7.10.8 239 | CURLINFO_HTTP_CODE 7.4.1 7.10.8 240 | CURLINFO_HTTP_CONNECTCODE 7.10.7 241 | CURLINFO_HTTP_VERSION 7.50.0 242 | CURLINFO_LASTONE 7.4.1 243 | CURLINFO_LASTSOCKET 7.15.2 244 | CURLINFO_LOCAL_IP 7.21.0 245 | CURLINFO_LOCAL_PORT 7.21.0 246 | CURLINFO_LONG 7.4.1 247 | CURLINFO_MASK 7.4.1 248 | CURLINFO_NAMELOOKUP_TIME 7.4.1 249 | CURLINFO_NAMELOOKUP_TIME_T 7.61.0 250 | CURLINFO_NONE 7.4.1 251 | CURLINFO_NUM_CONNECTS 7.12.3 252 | CURLINFO_OFF_T 7.55.0 253 | CURLINFO_OS_ERRNO 7.12.2 254 | CURLINFO_PRETRANSFER_TIME 7.4.1 255 | CURLINFO_PRETRANSFER_TIME_T 7.61.0 256 | CURLINFO_PRIMARY_IP 7.19.0 257 | CURLINFO_PRIMARY_PORT 7.21.0 258 | CURLINFO_PRIVATE 7.10.3 259 | CURLINFO_PROTOCOL 7.52.0 260 | CURLINFO_PROXYAUTH_AVAIL 7.10.8 261 | CURLINFO_PROXY_SSL_VERIFYRESULT 7.52.0 262 | CURLINFO_PTR 7.54.1 263 | CURLINFO_REDIRECT_COUNT 7.9.7 264 | CURLINFO_REDIRECT_TIME 7.9.7 265 | CURLINFO_REDIRECT_TIME_T 7.61.0 266 | CURLINFO_REDIRECT_URL 7.18.2 267 | CURLINFO_REQUEST_SIZE 7.4.1 268 | CURLINFO_RESPONSE_CODE 7.10.8 269 | CURLINFO_RTSP_CLIENT_CSEQ 7.20.0 270 | CURLINFO_RTSP_CSEQ_RECV 7.20.0 271 | CURLINFO_RTSP_SERVER_CSEQ 7.20.0 272 | CURLINFO_RTSP_SESSION_ID 7.20.0 273 | CURLINFO_SCHEME 7.52.0 274 | CURLINFO_SIZE_DOWNLOAD 7.4.1 275 | CURLINFO_SIZE_DOWNLOAD_T 7.55.0 276 | CURLINFO_SIZE_UPLOAD 7.4.1 277 | CURLINFO_SIZE_UPLOAD_T 7.55.0 278 | CURLINFO_SLIST 7.12.3 279 | CURLINFO_SOCKET 7.45.0 280 | CURLINFO_SPEED_DOWNLOAD 7.4.1 281 | CURLINFO_SPEED_DOWNLOAD_T 7.55.0 282 | CURLINFO_SPEED_UPLOAD 7.4.1 283 | CURLINFO_SPEED_UPLOAD_T 7.55.0 284 | CURLINFO_SSL_DATA_IN 7.12.1 285 | CURLINFO_SSL_DATA_OUT 7.12.1 286 | CURLINFO_SSL_ENGINES 7.12.3 287 | CURLINFO_SSL_VERIFYRESULT 7.5 288 | CURLINFO_STARTTRANSFER_TIME 7.9.2 289 | CURLINFO_STARTTRANSFER_TIME_T 7.61.0 290 | CURLINFO_STRING 7.4.1 291 | CURLINFO_TEXT 7.9.6 292 | CURLINFO_TLS_SESSION 7.34.0 7.48.0 293 | CURLINFO_TLS_SSL_PTR 7.48.0 294 | CURLINFO_TOTAL_TIME 7.4.1 295 | CURLINFO_TOTAL_TIME_T 7.61.0 296 | CURLINFO_TYPEMASK 7.4.1 297 | CURLIOCMD_NOP 7.12.3 298 | CURLIOCMD_RESTARTREAD 7.12.3 299 | CURLIOE_FAILRESTART 7.12.3 300 | CURLIOE_OK 7.12.3 301 | CURLIOE_UNKNOWNCMD 7.12.3 302 | CURLKHMATCH_MISMATCH 7.19.6 303 | CURLKHMATCH_MISSING 7.19.6 304 | CURLKHMATCH_OK 7.19.6 305 | CURLKHSTAT_DEFER 7.19.6 306 | CURLKHSTAT_FINE 7.19.6 307 | CURLKHSTAT_FINE_ADD_TO_FILE 7.19.6 308 | CURLKHSTAT_REJECT 7.19.6 309 | CURLKHTYPE_DSS 7.19.6 310 | CURLKHTYPE_ECDSA 7.58.0 311 | CURLKHTYPE_ED25519 7.58.0 312 | CURLKHTYPE_RSA 7.19.6 313 | CURLKHTYPE_RSA1 7.19.6 314 | CURLKHTYPE_UNKNOWN 7.19.6 315 | CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE 7.30.0 316 | CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE 7.30.0 317 | CURLMOPT_MAXCONNECTS 7.16.3 318 | CURLMOPT_MAX_HOST_CONNECTIONS 7.30.0 319 | CURLMOPT_MAX_PIPELINE_LENGTH 7.30.0 320 | CURLMOPT_MAX_TOTAL_CONNECTIONS 7.30.0 321 | CURLMOPT_PIPELINING 7.16.0 322 | CURLMOPT_PIPELINING_SERVER_BL 7.30.0 323 | CURLMOPT_PIPELINING_SITE_BL 7.30.0 324 | CURLMOPT_PUSHDATA 7.44.0 325 | CURLMOPT_PUSHFUNCTION 7.44.0 326 | CURLMOPT_SOCKETDATA 7.15.4 327 | CURLMOPT_SOCKETFUNCTION 7.15.4 328 | CURLMOPT_TIMERDATA 7.16.0 329 | CURLMOPT_TIMERFUNCTION 7.16.0 330 | CURLMSG_DONE 7.9.6 331 | CURLMSG_NONE 7.9.6 332 | CURLM_ADDED_ALREADY 7.32.1 333 | CURLM_BAD_EASY_HANDLE 7.9.6 334 | CURLM_BAD_HANDLE 7.9.6 335 | CURLM_BAD_SOCKET 7.15.4 336 | CURLM_CALL_MULTI_PERFORM 7.9.6 337 | CURLM_CALL_MULTI_SOCKET 7.15.5 338 | CURLM_INTERNAL_ERROR 7.9.6 339 | CURLM_OK 7.9.6 340 | CURLM_OUT_OF_MEMORY 7.9.6 341 | CURLM_RECURSIVE_API_CALL 7.59.0 342 | CURLM_UNKNOWN_OPTION 7.15.4 343 | CURLOPTTYPE_FUNCTIONPOINT 7.1 344 | CURLOPTTYPE_LONG 7.1 345 | CURLOPTTYPE_OBJECTPOINT 7.1 346 | CURLOPTTYPE_OFF_T 7.11.0 347 | CURLOPTTYPE_STRINGPOINT 7.46.0 348 | CURLOPT_ABSTRACT_UNIX_SOCKET 7.53.0 349 | CURLOPT_ACCEPTTIMEOUT_MS 7.24.0 350 | CURLOPT_ACCEPT_ENCODING 7.21.6 351 | CURLOPT_ADDRESS_SCOPE 7.19.0 352 | CURLOPT_ALTSVC 7.64.1 353 | CURLOPT_ALTSVC_CTRL 7.64.1 354 | CURLOPT_APPEND 7.17.0 355 | CURLOPT_AUTOREFERER 7.1 356 | CURLOPT_BUFFERSIZE 7.10 357 | CURLOPT_CAINFO 7.4.2 358 | CURLOPT_CAPATH 7.9.8 359 | CURLOPT_CERTINFO 7.19.1 360 | CURLOPT_CHUNK_BGN_FUNCTION 7.21.0 361 | CURLOPT_CHUNK_DATA 7.21.0 362 | CURLOPT_CHUNK_END_FUNCTION 7.21.0 363 | CURLOPT_CLOSEFUNCTION 7.7 7.11.1 7.15.5 364 | CURLOPT_CLOSEPOLICY 7.7 7.16.1 365 | CURLOPT_CLOSESOCKETDATA 7.21.7 366 | CURLOPT_CLOSESOCKETFUNCTION 7.21.7 367 | CURLOPT_CONNECTTIMEOUT 7.7 368 | CURLOPT_CONNECTTIMEOUT_MS 7.16.2 369 | CURLOPT_CONNECT_ONLY 7.15.2 370 | CURLOPT_CONNECT_TO 7.49.0 371 | CURLOPT_CONV_FROM_NETWORK_FUNCTION 7.15.4 372 | CURLOPT_CONV_FROM_UTF8_FUNCTION 7.15.4 373 | CURLOPT_CONV_TO_NETWORK_FUNCTION 7.15.4 374 | CURLOPT_COOKIE 7.1 375 | CURLOPT_COOKIEFILE 7.1 376 | CURLOPT_COOKIEJAR 7.9 377 | CURLOPT_COOKIELIST 7.14.1 378 | CURLOPT_COOKIESESSION 7.9.7 379 | CURLOPT_COPYPOSTFIELDS 7.17.1 380 | CURLOPT_CRLF 7.1 381 | CURLOPT_CRLFILE 7.19.0 382 | CURLOPT_CURLU 7.63.0 383 | CURLOPT_CUSTOMREQUEST 7.1 384 | CURLOPT_DEBUGDATA 7.9.6 385 | CURLOPT_DEBUGFUNCTION 7.9.6 386 | CURLOPT_DEFAULT_PROTOCOL 7.45.0 387 | CURLOPT_DIRLISTONLY 7.17.0 388 | CURLOPT_DISALLOW_USERNAME_IN_URL 7.61.0 389 | CURLOPT_DNS_CACHE_TIMEOUT 7.9.3 390 | CURLOPT_DNS_INTERFACE 7.33.0 391 | CURLOPT_DNS_LOCAL_IP4 7.33.0 392 | CURLOPT_DNS_LOCAL_IP6 7.33.0 393 | CURLOPT_DNS_SERVERS 7.24.0 394 | CURLOPT_DNS_SHUFFLE_ADDRESSES 7.60.0 395 | CURLOPT_DNS_USE_GLOBAL_CACHE 7.9.3 7.11.1 396 | CURLOPT_DOH_URL 7.62.0 397 | CURLOPT_EGDSOCKET 7.7 398 | CURLOPT_ENCODING 7.10 399 | CURLOPT_ERRORBUFFER 7.1 400 | CURLOPT_EXPECT_100_TIMEOUT_MS 7.36.0 401 | CURLOPT_FAILONERROR 7.1 402 | CURLOPT_FILE 7.1 7.9.7 403 | CURLOPT_FILETIME 7.5 404 | CURLOPT_FNMATCH_DATA 7.21.0 405 | CURLOPT_FNMATCH_FUNCTION 7.21.0 406 | CURLOPT_FOLLOWLOCATION 7.1 407 | CURLOPT_FORBID_REUSE 7.7 408 | CURLOPT_FRESH_CONNECT 7.7 409 | CURLOPT_FTPAPPEND 7.1 7.16.4 410 | CURLOPT_FTPASCII 7.1 7.11.1 7.15.5 411 | CURLOPT_FTPLISTONLY 7.1 7.16.4 412 | CURLOPT_FTPPORT 7.1 413 | CURLOPT_FTPSSLAUTH 7.12.2 414 | CURLOPT_FTP_ACCOUNT 7.13.0 415 | CURLOPT_FTP_ALTERNATIVE_TO_USER 7.15.5 416 | CURLOPT_FTP_CREATE_MISSING_DIRS 7.10.7 417 | CURLOPT_FTP_FILEMETHOD 7.15.1 418 | CURLOPT_FTP_RESPONSE_TIMEOUT 7.10.8 419 | CURLOPT_FTP_SKIP_PASV_IP 7.15.0 420 | CURLOPT_FTP_SSL 7.11.0 7.16.4 421 | CURLOPT_FTP_SSL_CCC 7.16.1 422 | CURLOPT_FTP_USE_EPRT 7.10.5 423 | CURLOPT_FTP_USE_EPSV 7.9.2 424 | CURLOPT_FTP_USE_PRET 7.20.0 425 | CURLOPT_GSSAPI_DELEGATION 7.22.0 426 | CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS 7.59.0 427 | CURLOPT_HAPROXYPROTOCOL 7.60.0 428 | CURLOPT_HEADER 7.1 429 | CURLOPT_HEADERDATA 7.10 430 | CURLOPT_HEADERFUNCTION 7.7.2 431 | CURLOPT_HEADEROPT 7.37.0 432 | CURLOPT_HTTP09_ALLOWED 7.64.0 433 | CURLOPT_HTTP200ALIASES 7.10.3 434 | CURLOPT_HTTPAUTH 7.10.6 435 | CURLOPT_HTTPGET 7.8.1 436 | CURLOPT_HTTPHEADER 7.1 437 | CURLOPT_HTTPPOST 7.1 7.56.0 438 | CURLOPT_HTTPPROXYTUNNEL 7.3 439 | CURLOPT_HTTPREQUEST 7.1 - 7.15.5 440 | CURLOPT_HTTP_CONTENT_DECODING 7.16.2 441 | CURLOPT_HTTP_TRANSFER_DECODING 7.16.2 442 | CURLOPT_HTTP_VERSION 7.9.1 443 | CURLOPT_IGNORE_CONTENT_LENGTH 7.14.1 444 | CURLOPT_INFILE 7.1 7.9.7 445 | CURLOPT_INFILESIZE 7.1 446 | CURLOPT_INFILESIZE_LARGE 7.11.0 447 | CURLOPT_INTERFACE 7.3 448 | CURLOPT_INTERLEAVEDATA 7.20.0 449 | CURLOPT_INTERLEAVEFUNCTION 7.20.0 450 | CURLOPT_IOCTLDATA 7.12.3 451 | CURLOPT_IOCTLFUNCTION 7.12.3 452 | CURLOPT_IPRESOLVE 7.10.8 453 | CURLOPT_ISSUERCERT 7.19.0 454 | CURLOPT_KEEP_SENDING_ON_ERROR 7.51.0 455 | CURLOPT_KEYPASSWD 7.17.0 456 | CURLOPT_KRB4LEVEL 7.3 7.17.0 457 | CURLOPT_KRBLEVEL 7.16.4 458 | CURLOPT_LOCALPORT 7.15.2 459 | CURLOPT_LOCALPORTRANGE 7.15.2 460 | CURLOPT_LOGIN_OPTIONS 7.34.0 461 | CURLOPT_LOW_SPEED_LIMIT 7.1 462 | CURLOPT_LOW_SPEED_TIME 7.1 463 | CURLOPT_MAIL_AUTH 7.25.0 464 | CURLOPT_MAIL_FROM 7.20.0 465 | CURLOPT_MAIL_RCPT 7.20.0 466 | CURLOPT_MAXAGE_CONN 7.65.0 467 | CURLOPT_MAXCONNECTS 7.7 468 | CURLOPT_MAXFILESIZE 7.10.8 469 | CURLOPT_MAXFILESIZE_LARGE 7.11.0 470 | CURLOPT_MAXREDIRS 7.5 471 | CURLOPT_MAX_RECV_SPEED_LARGE 7.15.5 472 | CURLOPT_MAX_SEND_SPEED_LARGE 7.15.5 473 | CURLOPT_MIMEPOST 7.56.0 474 | CURLOPT_MUTE 7.1 7.8 7.15.5 475 | CURLOPT_NETRC 7.1 476 | CURLOPT_NETRC_FILE 7.11.0 477 | CURLOPT_NEW_DIRECTORY_PERMS 7.16.4 478 | CURLOPT_NEW_FILE_PERMS 7.16.4 479 | CURLOPT_NOBODY 7.1 480 | CURLOPT_NOPROGRESS 7.1 481 | CURLOPT_NOPROXY 7.19.4 482 | CURLOPT_NOSIGNAL 7.10 483 | CURLOPT_NOTHING 7.1.1 7.11.1 7.11.0 484 | CURLOPT_OPENSOCKETDATA 7.17.1 485 | CURLOPT_OPENSOCKETFUNCTION 7.17.1 486 | CURLOPT_PASSWDDATA 7.4.2 7.11.1 7.15.5 487 | CURLOPT_PASSWDFUNCTION 7.4.2 7.11.1 7.15.5 488 | CURLOPT_PASSWORD 7.19.1 489 | CURLOPT_PASV_HOST 7.12.1 7.16.0 7.15.5 490 | CURLOPT_PATH_AS_IS 7.42.0 491 | CURLOPT_PINNEDPUBLICKEY 7.39.0 492 | CURLOPT_PIPEWAIT 7.43.0 493 | CURLOPT_PORT 7.1 494 | CURLOPT_POST 7.1 495 | CURLOPT_POST301 7.17.1 7.19.1 496 | CURLOPT_POSTFIELDS 7.1 497 | CURLOPT_POSTFIELDSIZE 7.2 498 | CURLOPT_POSTFIELDSIZE_LARGE 7.11.1 499 | CURLOPT_POSTQUOTE 7.1 500 | CURLOPT_POSTREDIR 7.19.1 501 | CURLOPT_PREQUOTE 7.9.5 502 | CURLOPT_PRE_PROXY 7.52.0 503 | CURLOPT_PRIVATE 7.10.3 504 | CURLOPT_PROGRESSDATA 7.1 505 | CURLOPT_PROGRESSFUNCTION 7.1 7.32.0 506 | CURLOPT_PROTOCOLS 7.19.4 507 | CURLOPT_PROXY 7.1 508 | CURLOPT_PROXYAUTH 7.10.7 509 | CURLOPT_PROXYHEADER 7.37.0 510 | CURLOPT_PROXYPASSWORD 7.19.1 511 | CURLOPT_PROXYPORT 7.1 512 | CURLOPT_PROXYTYPE 7.10 513 | CURLOPT_PROXYUSERNAME 7.19.1 514 | CURLOPT_PROXYUSERPWD 7.1 515 | CURLOPT_PROXY_CAINFO 7.52.0 516 | CURLOPT_PROXY_CAPATH 7.52.0 517 | CURLOPT_PROXY_CRLFILE 7.52.0 518 | CURLOPT_PROXY_KEYPASSWD 7.52.0 519 | CURLOPT_PROXY_PINNEDPUBLICKEY 7.52.0 520 | CURLOPT_PROXY_SERVICE_NAME 7.43.0 521 | CURLOPT_PROXY_SSLCERT 7.52.0 522 | CURLOPT_PROXY_SSLCERTTYPE 7.52.0 523 | CURLOPT_PROXY_SSLKEY 7.52.0 524 | CURLOPT_PROXY_SSLKEYTYPE 7.52.0 525 | CURLOPT_PROXY_SSLVERSION 7.52.0 526 | CURLOPT_PROXY_SSL_CIPHER_LIST 7.52.0 527 | CURLOPT_PROXY_SSL_OPTIONS 7.52.0 528 | CURLOPT_PROXY_SSL_VERIFYHOST 7.52.0 529 | CURLOPT_PROXY_SSL_VERIFYPEER 7.52.0 530 | CURLOPT_PROXY_TLS13_CIPHERS 7.61.0 531 | CURLOPT_PROXY_TLSAUTH_PASSWORD 7.52.0 532 | CURLOPT_PROXY_TLSAUTH_TYPE 7.52.0 533 | CURLOPT_PROXY_TLSAUTH_USERNAME 7.52.0 534 | CURLOPT_PROXY_TRANSFER_MODE 7.18.0 535 | CURLOPT_PUT 7.1 536 | CURLOPT_QUOTE 7.1 537 | CURLOPT_RANDOM_FILE 7.7 538 | CURLOPT_RANGE 7.1 539 | CURLOPT_READDATA 7.9.7 540 | CURLOPT_READFUNCTION 7.1 541 | CURLOPT_REDIR_PROTOCOLS 7.19.4 542 | CURLOPT_REFERER 7.1 543 | CURLOPT_REQUEST_TARGET 7.55.0 544 | CURLOPT_RESOLVE 7.21.3 545 | CURLOPT_RESOLVER_START_DATA 7.59.0 546 | CURLOPT_RESOLVER_START_FUNCTION 7.59.0 547 | CURLOPT_RESUME_FROM 7.1 548 | CURLOPT_RESUME_FROM_LARGE 7.11.0 549 | CURLOPT_RTSPHEADER 7.20.0 550 | CURLOPT_RTSP_CLIENT_CSEQ 7.20.0 551 | CURLOPT_RTSP_REQUEST 7.20.0 552 | CURLOPT_RTSP_SERVER_CSEQ 7.20.0 553 | CURLOPT_RTSP_SESSION_ID 7.20.0 554 | CURLOPT_RTSP_STREAM_URI 7.20.0 555 | CURLOPT_RTSP_TRANSPORT 7.20.0 556 | CURLOPT_SASL_IR 7.31.0 557 | CURLOPT_SEEKDATA 7.18.0 558 | CURLOPT_SEEKFUNCTION 7.18.0 559 | CURLOPT_SERVER_RESPONSE_TIMEOUT 7.20.0 560 | CURLOPT_SERVICE_NAME 7.43.0 561 | CURLOPT_SHARE 7.10 562 | CURLOPT_SOCKOPTDATA 7.16.0 563 | CURLOPT_SOCKOPTFUNCTION 7.16.0 564 | CURLOPT_SOCKS5_AUTH 7.55.0 565 | CURLOPT_SOCKS5_GSSAPI_NEC 7.19.4 566 | CURLOPT_SOCKS5_GSSAPI_SERVICE 7.19.4 7.49.0 567 | CURLOPT_SOURCE_HOST 7.12.1 - 7.15.5 568 | CURLOPT_SOURCE_PATH 7.12.1 - 7.15.5 569 | CURLOPT_SOURCE_PORT 7.12.1 - 7.15.5 570 | CURLOPT_SOURCE_POSTQUOTE 7.12.1 - 7.15.5 571 | CURLOPT_SOURCE_PREQUOTE 7.12.1 - 7.15.5 572 | CURLOPT_SOURCE_QUOTE 7.13.0 - 7.15.5 573 | CURLOPT_SOURCE_URL 7.13.0 - 7.15.5 574 | CURLOPT_SOURCE_USERPWD 7.12.1 - 7.15.5 575 | CURLOPT_SSH_AUTH_TYPES 7.16.1 576 | CURLOPT_SSH_COMPRESSION 7.56.0 577 | CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 7.17.1 578 | CURLOPT_SSH_KEYDATA 7.19.6 579 | CURLOPT_SSH_KEYFUNCTION 7.19.6 580 | CURLOPT_SSH_KNOWNHOSTS 7.19.6 581 | CURLOPT_SSH_PRIVATE_KEYFILE 7.16.1 582 | CURLOPT_SSH_PUBLIC_KEYFILE 7.16.1 583 | CURLOPT_SSLCERT 7.1 584 | CURLOPT_SSLCERTPASSWD 7.1.1 7.17.0 585 | CURLOPT_SSLCERTTYPE 7.9.3 586 | CURLOPT_SSLENGINE 7.9.3 587 | CURLOPT_SSLENGINE_DEFAULT 7.9.3 588 | CURLOPT_SSLKEY 7.9.3 589 | CURLOPT_SSLKEYPASSWD 7.9.3 7.17.0 590 | CURLOPT_SSLKEYTYPE 7.9.3 591 | CURLOPT_SSLVERSION 7.1 592 | CURLOPT_SSL_CIPHER_LIST 7.9 593 | CURLOPT_SSL_CTX_DATA 7.10.6 594 | CURLOPT_SSL_CTX_FUNCTION 7.10.6 595 | CURLOPT_SSL_ENABLE_ALPN 7.36.0 596 | CURLOPT_SSL_ENABLE_NPN 7.36.0 597 | CURLOPT_SSL_FALSESTART 7.42.0 598 | CURLOPT_SSL_OPTIONS 7.25.0 599 | CURLOPT_SSL_SESSIONID_CACHE 7.16.0 600 | CURLOPT_SSL_VERIFYHOST 7.8.1 601 | CURLOPT_SSL_VERIFYPEER 7.4.2 602 | CURLOPT_SSL_VERIFYSTATUS 7.41.0 603 | CURLOPT_STDERR 7.1 604 | CURLOPT_STREAM_DEPENDS 7.46.0 605 | CURLOPT_STREAM_DEPENDS_E 7.46.0 606 | CURLOPT_STREAM_WEIGHT 7.46.0 607 | CURLOPT_SUPPRESS_CONNECT_HEADERS 7.54.0 608 | CURLOPT_TCP_FASTOPEN 7.49.0 609 | CURLOPT_TCP_KEEPALIVE 7.25.0 610 | CURLOPT_TCP_KEEPIDLE 7.25.0 611 | CURLOPT_TCP_KEEPINTVL 7.25.0 612 | CURLOPT_TCP_NODELAY 7.11.2 613 | CURLOPT_TELNETOPTIONS 7.7 614 | CURLOPT_TFTP_BLKSIZE 7.19.4 615 | CURLOPT_TFTP_NO_OPTIONS 7.48.0 616 | CURLOPT_TIMECONDITION 7.1 617 | CURLOPT_TIMEOUT 7.1 618 | CURLOPT_TIMEOUT_MS 7.16.2 619 | CURLOPT_TIMEVALUE 7.1 620 | CURLOPT_TIMEVALUE_LARGE 7.59.0 621 | CURLOPT_TLS13_CIPHERS 7.61.0 622 | CURLOPT_TLSAUTH_PASSWORD 7.21.4 623 | CURLOPT_TLSAUTH_TYPE 7.21.4 624 | CURLOPT_TLSAUTH_USERNAME 7.21.4 625 | CURLOPT_TRAILERDATA 7.64.0 626 | CURLOPT_TRAILERFUNCTION 7.64.0 627 | CURLOPT_TRANSFERTEXT 7.1.1 628 | CURLOPT_TRANSFER_ENCODING 7.21.6 629 | CURLOPT_UNIX_SOCKET_PATH 7.40.0 630 | CURLOPT_UNRESTRICTED_AUTH 7.10.4 631 | CURLOPT_UPKEEP_INTERVAL_MS 7.62.0 632 | CURLOPT_UPLOAD 7.1 633 | CURLOPT_UPLOAD_BUFFERSIZE 7.62.0 634 | CURLOPT_URL 7.1 635 | CURLOPT_USERAGENT 7.1 636 | CURLOPT_USERNAME 7.19.1 637 | CURLOPT_USERPWD 7.1 638 | CURLOPT_USE_SSL 7.17.0 639 | CURLOPT_VERBOSE 7.1 640 | CURLOPT_WILDCARDMATCH 7.21.0 641 | CURLOPT_WRITEDATA 7.9.7 642 | CURLOPT_WRITEFUNCTION 7.1 643 | CURLOPT_WRITEHEADER 7.1 644 | CURLOPT_WRITEINFO 7.1 645 | CURLOPT_XFERINFODATA 7.32.0 646 | CURLOPT_XFERINFOFUNCTION 7.32.0 647 | CURLOPT_XOAUTH2_BEARER 7.33.0 648 | CURLPAUSE_ALL 7.18.0 649 | CURLPAUSE_CONT 7.18.0 650 | CURLPAUSE_RECV 7.18.0 651 | CURLPAUSE_RECV_CONT 7.18.0 652 | CURLPAUSE_SEND 7.18.0 653 | CURLPAUSE_SEND_CONT 7.18.0 654 | CURLPIPE_HTTP1 7.43.0 655 | CURLPIPE_MULTIPLEX 7.43.0 656 | CURLPIPE_NOTHING 7.43.0 657 | CURLPROTO_ALL 7.19.4 658 | CURLPROTO_DICT 7.19.4 659 | CURLPROTO_FILE 7.19.4 660 | CURLPROTO_FTP 7.19.4 661 | CURLPROTO_FTPS 7.19.4 662 | CURLPROTO_GOPHER 7.21.2 663 | CURLPROTO_HTTP 7.19.4 664 | CURLPROTO_HTTPS 7.19.4 665 | CURLPROTO_IMAP 7.20.0 666 | CURLPROTO_IMAPS 7.20.0 667 | CURLPROTO_LDAP 7.19.4 668 | CURLPROTO_LDAPS 7.19.4 669 | CURLPROTO_POP3 7.20.0 670 | CURLPROTO_POP3S 7.20.0 671 | CURLPROTO_RTMP 7.21.0 672 | CURLPROTO_RTMPE 7.21.0 673 | CURLPROTO_RTMPS 7.21.0 674 | CURLPROTO_RTMPT 7.21.0 675 | CURLPROTO_RTMPTE 7.21.0 676 | CURLPROTO_RTMPTS 7.21.0 677 | CURLPROTO_RTSP 7.20.0 678 | CURLPROTO_SCP 7.19.4 679 | CURLPROTO_SFTP 7.19.4 680 | CURLPROTO_SMB 7.40.0 681 | CURLPROTO_SMBS 7.40.0 682 | CURLPROTO_SMTP 7.20.0 683 | CURLPROTO_SMTPS 7.20.0 684 | CURLPROTO_TELNET 7.19.4 685 | CURLPROTO_TFTP 7.19.4 686 | CURLPROXY_HTTP 7.10 687 | CURLPROXY_HTTPS 7.52.0 688 | CURLPROXY_HTTP_1_0 7.19.4 689 | CURLPROXY_SOCKS4 7.10 690 | CURLPROXY_SOCKS4A 7.18.0 691 | CURLPROXY_SOCKS5 7.10 692 | CURLPROXY_SOCKS5_HOSTNAME 7.18.0 693 | CURLSHE_BAD_OPTION 7.10.3 694 | CURLSHE_INVALID 7.10.3 695 | CURLSHE_IN_USE 7.10.3 696 | CURLSHE_NOMEM 7.12.0 697 | CURLSHE_NOT_BUILT_IN 7.23.0 698 | CURLSHE_OK 7.10.3 699 | CURLSHOPT_LOCKFUNC 7.10.3 700 | CURLSHOPT_NONE 7.10.3 701 | CURLSHOPT_SHARE 7.10.3 702 | CURLSHOPT_UNLOCKFUNC 7.10.3 703 | CURLSHOPT_UNSHARE 7.10.3 704 | CURLSHOPT_USERDATA 7.10.3 705 | CURLSOCKTYPE_ACCEPT 7.28.0 706 | CURLSOCKTYPE_IPCXN 7.16.0 707 | CURLSSH_AUTH_AGENT 7.28.0 708 | CURLSSH_AUTH_ANY 7.16.1 709 | CURLSSH_AUTH_DEFAULT 7.16.1 710 | CURLSSH_AUTH_GSSAPI 7.58.0 711 | CURLSSH_AUTH_HOST 7.16.1 712 | CURLSSH_AUTH_KEYBOARD 7.16.1 713 | CURLSSH_AUTH_NONE 7.16.1 714 | CURLSSH_AUTH_PASSWORD 7.16.1 715 | CURLSSH_AUTH_PUBLICKEY 7.16.1 716 | CURLSSLBACKEND_AXTLS 7.38.0 7.61.0 717 | CURLSSLBACKEND_BORINGSSL 7.49.0 718 | CURLSSLBACKEND_CYASSL 7.34.0 719 | CURLSSLBACKEND_DARWINSSL 7.34.0 7.64.1 720 | CURLSSLBACKEND_GNUTLS 7.34.0 721 | CURLSSLBACKEND_GSKIT 7.34.0 722 | CURLSSLBACKEND_LIBRESSL 7.49.0 723 | CURLSSLBACKEND_MBEDTLS 7.46.0 724 | CURLSSLBACKEND_MESALINK 7.62.0 725 | CURLSSLBACKEND_NONE 7.34.0 726 | CURLSSLBACKEND_NSS 7.34.0 727 | CURLSSLBACKEND_OPENSSL 7.34.0 728 | CURLSSLBACKEND_POLARSSL 7.34.0 729 | CURLSSLBACKEND_QSOSSL 7.34.0 - 7.38.1 730 | CURLSSLBACKEND_SCHANNEL 7.34.0 731 | CURLSSLBACKEND_SECURETRANSPORT 7.64.1 732 | CURLSSLBACKEND_WOLFSSL 7.49.0 733 | CURLSSLOPT_ALLOW_BEAST 7.25.0 734 | CURLSSLOPT_NO_REVOKE 7.44.0 735 | CURLSSLSET_NO_BACKENDS 7.56.0 736 | CURLSSLSET_OK 7.56.0 737 | CURLSSLSET_TOO_LATE 7.56.0 738 | CURLSSLSET_UNKNOWN_BACKEND 7.56.0 739 | CURLUE_BAD_HANDLE 7.62.0 740 | CURLUE_BAD_PARTPOINTER 7.62.0 741 | CURLUE_BAD_PORT_NUMBER 7.62.0 742 | CURLUE_MALFORMED_INPUT 7.62.0 743 | CURLUE_NO_FRAGMENT 7.62.0 744 | CURLUE_NO_HOST 7.62.0 745 | CURLUE_NO_OPTIONS 7.62.0 746 | CURLUE_NO_PASSWORD 7.62.0 747 | CURLUE_NO_PORT 7.62.0 748 | CURLUE_NO_QUERY 7.62.0 749 | CURLUE_NO_SCHEME 7.62.0 750 | CURLUE_NO_USER 7.62.0 751 | CURLUE_OK 7.62.0 752 | CURLUE_OUT_OF_MEMORY 7.62.0 753 | CURLUE_UNKNOWN_PART 7.62.0 754 | CURLUE_UNSUPPORTED_SCHEME 7.62.0 755 | CURLUE_URLDECODE 7.62.0 756 | CURLUE_USER_NOT_ALLOWED 7.62.0 757 | CURLUPART_FRAGMENT 7.62.0 758 | CURLUPART_HOST 7.62.0 759 | CURLUPART_OPTIONS 7.62.0 760 | CURLUPART_PASSWORD 7.62.0 761 | CURLUPART_PATH 7.62.0 762 | CURLUPART_PORT 7.62.0 763 | CURLUPART_QUERY 7.62.0 764 | CURLUPART_SCHEME 7.62.0 765 | CURLUPART_URL 7.62.0 766 | CURLUPART_USER 7.62.0 767 | CURLUPART_ZONEID 7.65.0 768 | CURLUSESSL_ALL 7.17.0 769 | CURLUSESSL_CONTROL 7.17.0 770 | CURLUSESSL_NONE 7.17.0 771 | CURLUSESSL_TRY 7.17.0 772 | CURLU_APPENDQUERY 7.62.0 773 | CURLU_DEFAULT_PORT 7.62.0 774 | CURLU_DEFAULT_SCHEME 7.62.0 775 | CURLU_DISALLOW_USER 7.62.0 776 | CURLU_GUESS_SCHEME 7.62.0 777 | CURLU_NON_SUPPORT_SCHEME 7.62.0 778 | CURLU_NO_DEFAULT_PORT 7.62.0 779 | CURLU_PATH_AS_IS 7.62.0 780 | CURLU_URLDECODE 7.62.0 781 | CURLU_URLENCODE 7.62.0 782 | CURLVERSION_FIFTH 7.57.0 783 | CURLVERSION_FIRST 7.10 784 | CURLVERSION_FOURTH 7.16.1 785 | CURLVERSION_NOW 7.10 786 | CURLVERSION_SECOND 7.11.1 787 | CURLVERSION_THIRD 7.12.0 788 | CURL_CHUNK_BGN_FUNC_FAIL 7.21.0 789 | CURL_CHUNK_BGN_FUNC_OK 7.21.0 790 | CURL_CHUNK_BGN_FUNC_SKIP 7.21.0 791 | CURL_CHUNK_END_FUNC_FAIL 7.21.0 792 | CURL_CHUNK_END_FUNC_OK 7.21.0 793 | CURL_CSELECT_ERR 7.16.3 794 | CURL_CSELECT_IN 7.16.3 795 | CURL_CSELECT_OUT 7.16.3 796 | CURL_DID_MEMORY_FUNC_TYPEDEFS 7.49.0 797 | CURL_EASY_NONE 7.14.0 - 7.15.4 798 | CURL_EASY_TIMEOUT 7.14.0 - 7.15.4 799 | CURL_ERROR_SIZE 7.1 800 | CURL_FNMATCHFUNC_FAIL 7.21.0 801 | CURL_FNMATCHFUNC_MATCH 7.21.0 802 | CURL_FNMATCHFUNC_NOMATCH 7.21.0 803 | CURL_FORMADD_DISABLED 7.12.1 7.56.0 804 | CURL_FORMADD_ILLEGAL_ARRAY 7.9.8 7.56.0 805 | CURL_FORMADD_INCOMPLETE 7.9.8 7.56.0 806 | CURL_FORMADD_MEMORY 7.9.8 7.56.0 807 | CURL_FORMADD_NULL 7.9.8 7.56.0 808 | CURL_FORMADD_OK 7.9.8 7.56.0 809 | CURL_FORMADD_OPTION_TWICE 7.9.8 7.56.0 810 | CURL_FORMADD_UNKNOWN_OPTION 7.9.8 7.56.0 811 | CURL_GLOBAL_ACK_EINTR 7.30.0 812 | CURL_GLOBAL_ALL 7.8 813 | CURL_GLOBAL_DEFAULT 7.8 814 | CURL_GLOBAL_NOTHING 7.8 815 | CURL_GLOBAL_SSL 7.8 816 | CURL_GLOBAL_WIN32 7.8.1 817 | CURL_HET_DEFAULT 7.59.0 818 | CURL_HTTPPOST_BUFFER 7.46.0 819 | CURL_HTTPPOST_CALLBACK 7.46.0 820 | CURL_HTTPPOST_FILENAME 7.46.0 821 | CURL_HTTPPOST_LARGE 7.46.0 822 | CURL_HTTPPOST_PTRBUFFER 7.46.0 823 | CURL_HTTPPOST_PTRCONTENTS 7.46.0 824 | CURL_HTTPPOST_PTRNAME 7.46.0 825 | CURL_HTTPPOST_READFILE 7.46.0 826 | CURL_HTTP_VERSION_1_0 7.9.1 827 | CURL_HTTP_VERSION_1_1 7.9.1 828 | CURL_HTTP_VERSION_2 7.43.0 829 | CURL_HTTP_VERSION_2TLS 7.47.0 830 | CURL_HTTP_VERSION_2_0 7.33.0 831 | CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE 7.49.0 832 | CURL_HTTP_VERSION_NONE 7.9.1 833 | CURL_IPRESOLVE_V4 7.10.8 834 | CURL_IPRESOLVE_V6 7.10.8 835 | CURL_IPRESOLVE_WHATEVER 7.10.8 836 | CURL_LOCK_ACCESS_NONE 7.10.3 837 | CURL_LOCK_ACCESS_SHARED 7.10.3 838 | CURL_LOCK_ACCESS_SINGLE 7.10.3 839 | CURL_LOCK_DATA_CONNECT 7.10.3 840 | CURL_LOCK_DATA_COOKIE 7.10.3 841 | CURL_LOCK_DATA_DNS 7.10.3 842 | CURL_LOCK_DATA_NONE 7.10.3 843 | CURL_LOCK_DATA_PSL 7.61.0 844 | CURL_LOCK_DATA_SHARE 7.10.4 845 | CURL_LOCK_DATA_SSL_SESSION 7.10.3 846 | CURL_LOCK_TYPE_CONNECT 7.10 - 7.10.2 847 | CURL_LOCK_TYPE_COOKIE 7.10 - 7.10.2 848 | CURL_LOCK_TYPE_DNS 7.10 - 7.10.2 849 | CURL_LOCK_TYPE_NONE 7.10 - 7.10.2 850 | CURL_LOCK_TYPE_SSL_SESSION 7.10 - 7.10.2 851 | CURL_MAX_HTTP_HEADER 7.19.7 852 | CURL_MAX_READ_SIZE 7.53.0 853 | CURL_MAX_WRITE_SIZE 7.9.7 854 | CURL_NETRC_IGNORED 7.9.8 855 | CURL_NETRC_OPTIONAL 7.9.8 856 | CURL_NETRC_REQUIRED 7.9.8 857 | CURL_POLL_IN 7.14.0 858 | CURL_POLL_INOUT 7.14.0 859 | CURL_POLL_NONE 7.14.0 860 | CURL_POLL_OUT 7.14.0 861 | CURL_POLL_REMOVE 7.14.0 862 | CURL_PROGRESS_BAR 7.1.1 - 7.4.1 863 | CURL_PROGRESS_STATS 7.1.1 - 7.4.1 864 | CURL_PUSH_DENY 7.44.0 865 | CURL_PUSH_OK 7.44.0 866 | CURL_READFUNC_ABORT 7.12.1 867 | CURL_READFUNC_PAUSE 7.18.0 868 | CURL_REDIR_GET_ALL 7.19.1 869 | CURL_REDIR_POST_301 7.19.1 870 | CURL_REDIR_POST_302 7.19.1 871 | CURL_REDIR_POST_303 7.25.1 872 | CURL_REDIR_POST_ALL 7.19.1 873 | CURL_RTSPREQ_ANNOUNCE 7.20.0 874 | CURL_RTSPREQ_DESCRIBE 7.20.0 875 | CURL_RTSPREQ_GET_PARAMETER 7.20.0 876 | CURL_RTSPREQ_NONE 7.20.0 877 | CURL_RTSPREQ_OPTIONS 7.20.0 878 | CURL_RTSPREQ_PAUSE 7.20.0 879 | CURL_RTSPREQ_PLAY 7.20.0 880 | CURL_RTSPREQ_RECEIVE 7.20.0 881 | CURL_RTSPREQ_RECORD 7.20.0 882 | CURL_RTSPREQ_SETUP 7.20.0 883 | CURL_RTSPREQ_SET_PARAMETER 7.20.0 884 | CURL_RTSPREQ_TEARDOWN 7.20.0 885 | CURL_SEEKFUNC_CANTSEEK 7.19.5 886 | CURL_SEEKFUNC_FAIL 7.19.5 887 | CURL_SEEKFUNC_OK 7.19.5 888 | CURL_SOCKET_BAD 7.14.0 889 | CURL_SOCKET_TIMEOUT 7.14.0 890 | CURL_SOCKOPT_ALREADY_CONNECTED 7.21.5 891 | CURL_SOCKOPT_ERROR 7.21.5 892 | CURL_SOCKOPT_OK 7.21.5 893 | CURL_SSLVERSION_DEFAULT 7.9.2 894 | CURL_SSLVERSION_MAX_DEFAULT 7.54.0 895 | CURL_SSLVERSION_MAX_NONE 7.54.0 896 | CURL_SSLVERSION_MAX_TLSv1_0 7.54.0 897 | CURL_SSLVERSION_MAX_TLSv1_1 7.54.0 898 | CURL_SSLVERSION_MAX_TLSv1_2 7.54.0 899 | CURL_SSLVERSION_MAX_TLSv1_3 7.54.0 900 | CURL_SSLVERSION_SSLv2 7.9.2 901 | CURL_SSLVERSION_SSLv3 7.9.2 902 | CURL_SSLVERSION_TLSv1 7.9.2 903 | CURL_SSLVERSION_TLSv1_0 7.34.0 904 | CURL_SSLVERSION_TLSv1_1 7.34.0 905 | CURL_SSLVERSION_TLSv1_2 7.34.0 906 | CURL_SSLVERSION_TLSv1_3 7.52.0 907 | CURL_STRICTER 7.50.2 908 | CURL_TIMECOND_IFMODSINCE 7.9.7 909 | CURL_TIMECOND_IFUNMODSINCE 7.9.7 910 | CURL_TIMECOND_LASTMOD 7.9.7 911 | CURL_TIMECOND_NONE 7.9.7 912 | CURL_TLSAUTH_NONE 7.21.4 913 | CURL_TLSAUTH_SRP 7.21.4 914 | CURL_TRAILERFUNC_ABORT 7.64.0 915 | CURL_TRAILERFUNC_OK 7.64.0 916 | CURL_UPKEEP_INTERVAL_DEFAULT 7.62.0 917 | CURL_VERSION_ALTSVC 7.64.1 918 | CURL_VERSION_ASYNCHDNS 7.10.7 919 | CURL_VERSION_BROTLI 7.57.0 920 | CURL_VERSION_CONV 7.15.4 921 | CURL_VERSION_CURLDEBUG 7.19.6 922 | CURL_VERSION_DEBUG 7.10.6 923 | CURL_VERSION_GSSAPI 7.38.0 924 | CURL_VERSION_GSSNEGOTIATE 7.10.6 7.38.0 925 | CURL_VERSION_HTTP2 7.33.0 926 | CURL_VERSION_HTTPS_PROXY 7.52.0 927 | CURL_VERSION_IDN 7.12.0 928 | CURL_VERSION_IPV6 7.10 929 | CURL_VERSION_KERBEROS4 7.10 7.33.0 930 | CURL_VERSION_KERBEROS5 7.40.0 931 | CURL_VERSION_LARGEFILE 7.11.1 932 | CURL_VERSION_LIBZ 7.10 933 | CURL_VERSION_MULTI_SSL 7.56.0 934 | CURL_VERSION_NTLM 7.10.6 935 | CURL_VERSION_NTLM_WB 7.22.0 936 | CURL_VERSION_PSL 7.47.0 937 | CURL_VERSION_SPNEGO 7.10.8 938 | CURL_VERSION_SSL 7.10 939 | CURL_VERSION_SSPI 7.13.2 940 | CURL_VERSION_TLSAUTH_SRP 7.21.4 941 | CURL_VERSION_UNIX_SOCKETS 7.40.0 942 | CURL_WAIT_POLLIN 7.28.0 943 | CURL_WAIT_POLLOUT 7.28.0 944 | CURL_WAIT_POLLPRI 7.28.0 945 | CURL_WRITEFUNC_PAUSE 7.18.0 946 | CURL_ZERO_TERMINATED 7.56.0 947 | -------------------------------------------------------------------------------- /tools/symbols.R: -------------------------------------------------------------------------------- 1 | # Note: we can only lookup symbols that are available in the installed version of libcurl 2 | # Therefore you should only update the symbol table using the latest version of libcurl. 3 | # On Mac: 'brew install curl' will install to /usr/local/opt/curl 4 | 5 | blacklist <- c("CURL_DID_MEMORY_FUNC_TYPEDEFS", "CURL_STRICTER") 6 | 7 | # Function to read a symbol 8 | library(inline) 9 | getsymbol <- function(name){ 10 | if(name %in% blacklist) return(NA_integer_) 11 | fun = cfunction( 12 | cppargs="-I/usr/local/opt/curl/include", 13 | includes = '#include ', 14 | body = paste("return ScalarInteger((int)", name, ");") 15 | ) 16 | val = fun() 17 | rm(fun); gc(); 18 | cat("Found:", name, "=", val, "\n") 19 | return(val) 20 | } 21 | 22 | # The symbols-in-versions file is included with libcurl 23 | txt <- scan("tools/symbols-in-versions", character(), sep = "\n", skip = 13) 24 | lines <- strsplit(txt, "[ ]+") 25 | symbols <- as.data.frame(t(vapply(lines, `[`, character(4), 1:4)), stringsAsFactors = FALSE) 26 | names(symbols) <- c("name", "introduced", "deprecated", "removed") 27 | 28 | # Get current version 29 | avail <- is.na(symbols$removed) 30 | 31 | # Lookup all symbol values from curl.h (takes a while) 32 | symbols$value <- NA_integer_; 33 | available_symbols <- symbols$name[avail] 34 | symbols$value[avail] <- vapply(available_symbols, getsymbol, integer(1)) 35 | 36 | # Compute type for options 37 | type_name <- c("integer", "string", "function", "number") 38 | type <- cut(symbols$value, c(-Inf, 0, 10000, 20000, 30000, 40000, Inf), 39 | labels = FALSE, right = FALSE) 40 | type[is.na(type)] <- 1 41 | 42 | symbols$type <- c("unknown", "integer", "string", "function", "number", "unknown")[type] 43 | 44 | option <- grepl("CURLOPT", symbols$name) 45 | symbols$type[!option] <- NA 46 | 47 | # Save as lazy data 48 | curl_symbol_data <- symbols[order(symbols$name), ] 49 | row.names(curl_symbol_data) = NULL 50 | save(curl_symbol_data = curl_symbol_data, file = 'R/sysdata.rda', version = 2) 51 | #usethis::use_data(curl_symbol_data, overwrite = TRUE) 52 | -------------------------------------------------------------------------------- /tools/winlibs.R: -------------------------------------------------------------------------------- 1 | # Build against static libraries from rwinlib 2 | VERSION <- commandArgs(TRUE) 3 | if(!file.exists(sprintf("../windows/libcurl-%s/include/curl/curl.h", VERSION))){ 4 | if(getRversion() < "3.3.0") setInternet2() 5 | download.file(sprintf("https://github.com/rwinlib/libcurl/archive/v%s.zip", VERSION), "lib.zip", quiet = TRUE) 6 | dir.create("../windows", showWarnings = FALSE) 7 | unzip("lib.zip", exdir = "../windows") 8 | unlink("lib.zip") 9 | } 10 | --------------------------------------------------------------------------------