Compare commits
273 Commits
curl-7_42_
...
http2-push
Author | SHA1 | Date | |
---|---|---|---|
![]() |
f87a3d736f | ||
![]() |
f44b803f16 | ||
![]() |
6842afbf44 | ||
![]() |
ea1eec8ea8 | ||
![]() |
570076e82c | ||
![]() |
ef0fdb83b8 | ||
![]() |
1c3811f4fd | ||
![]() |
afbee791d5 | ||
![]() |
2546134b97 | ||
![]() |
93aacc3050 | ||
![]() |
307f212379 | ||
![]() |
26ddc536b0 | ||
![]() |
0e7d76d6a8 | ||
![]() |
26583a62ab | ||
![]() |
cf6ef2dc92 | ||
![]() |
3b93f1a3ec | ||
![]() |
46d0eba2e9 | ||
![]() |
4a2398627c | ||
![]() |
b88f980a74 | ||
![]() |
85739723ba | ||
![]() |
f72b30e6fb | ||
![]() |
52d83cb0c6 | ||
![]() |
38e07886ed | ||
![]() |
bdf89d80ca | ||
![]() |
24a8359b25 | ||
![]() |
24f0b6ebf7 | ||
![]() |
50c7f17e50 | ||
![]() |
3e7ec1e849 | ||
![]() |
28f4fc5272 | ||
![]() |
45f21e0f37 | ||
![]() |
f93da27756 | ||
![]() |
f29f2cbd00 | ||
![]() |
4fd187c677 | ||
![]() |
496e96c242 | ||
![]() |
bb5b29ec14 | ||
![]() |
75ba107767 | ||
![]() |
b430cb2a58 | ||
![]() |
99eafc49bb | ||
![]() |
45bad4ac97 | ||
![]() |
f3288196ff | ||
![]() |
ff7097f72c | ||
![]() |
55fc47a401 | ||
![]() |
d186be9510 | ||
![]() |
878c5757c0 | ||
![]() |
dd39a67101 | ||
![]() |
da08a204c2 | ||
![]() |
a9ed0fd6cb | ||
![]() |
a3e5a4371b | ||
![]() |
4a7feea31a | ||
![]() |
8d0d688296 | ||
![]() |
a5fb9151ee | ||
![]() |
f348b2d3bc | ||
![]() |
1514f3506b | ||
![]() |
55f3eb588d | ||
![]() |
bf5218c85e | ||
![]() |
cbf2920d02 | ||
![]() |
0fcfe4d7ac | ||
![]() |
20ac345806 | ||
![]() |
eaeeed2e8f | ||
![]() |
56b7663f73 | ||
![]() |
025dbe46df | ||
![]() |
1a8926d12f | ||
![]() |
b8673bb9f0 | ||
![]() |
c2cc3a5e97 | ||
![]() |
aa4e3c6438 | ||
![]() |
d712e22b56 | ||
![]() |
f649411a1c | ||
![]() |
8f4791440a | ||
![]() |
6befade68f | ||
![]() |
3587da9e7c | ||
![]() |
1ce14037c0 | ||
![]() |
30bd59ba6e | ||
![]() |
ccfdd5986c | ||
![]() |
fc16d9cec8 | ||
![]() |
7c17b58eec | ||
![]() |
3013bb6b1c | ||
![]() |
001ab7d860 | ||
![]() |
59432503c0 | ||
![]() |
cb5d4b1389 | ||
![]() |
3174c940b5 | ||
![]() |
2b3860d1d6 | ||
![]() |
0a9f285140 | ||
![]() |
af3d76ccf9 | ||
![]() |
952b745c98 | ||
![]() |
21784936e1 | ||
![]() |
352fbceef3 | ||
![]() |
19d5bcd66a | ||
![]() |
f6af9aef7e | ||
![]() |
46a050e9f5 | ||
![]() |
3cac8c9049 | ||
![]() |
33ee411848 | ||
![]() |
3bbcb4b036 | ||
![]() |
e8423f9ce1 | ||
![]() |
9f5dcab83d | ||
![]() |
41db5aed7a | ||
![]() |
4bb815a32e | ||
![]() |
4e7c3c12d3 | ||
![]() |
9a0a16a61c | ||
![]() |
2f1eae0f27 | ||
![]() |
3628a90852 | ||
![]() |
a8904b39f3 | ||
![]() |
8a7c1c76b3 | ||
![]() |
f348a6b4ab | ||
![]() |
d1b1d782f5 | ||
![]() |
e57f08863a | ||
![]() |
44fe4b9029 | ||
![]() |
9972666b47 | ||
![]() |
c005790ff1 | ||
![]() |
49a6642f01 | ||
![]() |
f81d356c21 | ||
![]() |
b18a1654c1 | ||
![]() |
02dfc930b5 | ||
![]() |
96c0164b88 | ||
![]() |
4bef1c7bf4 | ||
![]() |
4a79475b13 | ||
![]() |
b6e3da5f08 | ||
![]() |
28cdc0d82c | ||
![]() |
3a973517a9 | ||
![]() |
f9f22b0d63 | ||
![]() |
ef02da3156 | ||
![]() |
e582cd16ff | ||
![]() |
1514977bcd | ||
![]() |
fda0e74c22 | ||
![]() |
03e2a9b023 | ||
![]() |
817323ed82 | ||
![]() |
42ed88e70a | ||
![]() |
84d811f6af | ||
![]() |
d04bab8873 | ||
![]() |
640f283bbb | ||
![]() |
995c6006fe | ||
![]() |
78ac944dc2 | ||
![]() |
ee04c20b74 | ||
![]() |
126e7f7253 | ||
![]() |
b0143a2a33 | ||
![]() |
6a688976f0 | ||
![]() |
c175d184a2 | ||
![]() |
d5aab55b33 | ||
![]() |
0f6f7c100a | ||
![]() |
db979fea73 | ||
![]() |
a393d64456 | ||
![]() |
265f83a9f0 | ||
![]() |
301ba7772c | ||
![]() |
00a770b3f5 | ||
![]() |
dd23c49546 | ||
![]() |
3d38a38012 | ||
![]() |
d4313b1f01 | ||
![]() |
7da064fdd2 | ||
![]() |
897a7b3a13 | ||
![]() |
155b1f5df9 | ||
![]() |
979670988a | ||
![]() |
0b26b94bdc | ||
![]() |
4883f7019d | ||
![]() |
39b9bf60d1 | ||
![]() |
d69eee0964 | ||
![]() |
7ff7e45405 | ||
![]() |
4ac6cc3ebd | ||
![]() |
077f12b0ae | ||
![]() |
d6f1c74330 | ||
![]() |
7d0df07e48 | ||
![]() |
811443754a | ||
![]() |
df3a970cb4 | ||
![]() |
193251794a | ||
![]() |
8b38fcf2f6 | ||
![]() |
5871affc7a | ||
![]() |
3e8a5d88a5 | ||
![]() |
522ca8c035 | ||
![]() |
a66ed407d2 | ||
![]() |
61a94d6f77 | ||
![]() |
56c362b1a7 | ||
![]() |
72105ebf05 | ||
![]() |
38bd6bf0bb | ||
![]() |
be4c8fd1ef | ||
![]() |
783b3c7b42 | ||
![]() |
02ec1ced9b | ||
![]() |
2ce2f03007 | ||
![]() |
d722138f29 | ||
![]() |
0dc0de0351 | ||
![]() |
d261652d42 | ||
![]() |
74a4bd5ecd | ||
![]() |
591a6933da | ||
![]() |
e91aedd840 | ||
![]() |
ee3ad233a2 | ||
![]() |
70b5b698b0 | ||
![]() |
a28734be09 | ||
![]() |
5252f13dfa | ||
![]() |
153f940198 | ||
![]() |
f4b8b39881 | ||
![]() |
01e1bdb10c | ||
![]() |
7bbac214f5 | ||
![]() |
84c6b6561f | ||
![]() |
2c238ea1fc | ||
![]() |
5fe71975e4 | ||
![]() |
77f1029ecd | ||
![]() |
7957d2eb92 | ||
![]() |
47caff7bdf | ||
![]() |
d6440d7366 | ||
![]() |
f858624052 | ||
![]() |
6e6b02f398 | ||
![]() |
5fa82ca56f | ||
![]() |
1c01cee601 | ||
![]() |
750d678c0e | ||
![]() |
a6af3df660 | ||
![]() |
2a746f6c28 | ||
![]() |
fd137786e5 | ||
![]() |
b419e7ae0c | ||
![]() |
d37e0160c2 | ||
![]() |
640296c95d | ||
![]() |
c4d6f9163a | ||
![]() |
c720cd6356 | ||
![]() |
3377e692ee | ||
![]() |
5bf472fd39 | ||
![]() |
8936a23f51 | ||
![]() |
f010f3e3ca | ||
![]() |
33058a1dc3 | ||
![]() |
9fcc297ff3 | ||
![]() |
8a35211f3e | ||
![]() |
fa08362a5f | ||
![]() |
a5e09e9eea | ||
![]() |
86bc654532 | ||
![]() |
690317aae2 | ||
![]() |
3c104448d6 | ||
![]() |
ae8387b91c | ||
![]() |
d93619ca5d | ||
![]() |
aa99a63f03 | ||
![]() |
4bb8bad964 | ||
![]() |
b6c9f5b7ae | ||
![]() |
4335b86a10 | ||
![]() |
3f88d92e92 | ||
![]() |
32606e4f0b | ||
![]() |
693422b79b | ||
![]() |
6a61285909 | ||
![]() |
4271695122 | ||
![]() |
b23fda76c1 | ||
![]() |
926cb9ff65 | ||
![]() |
55db5bdff7 | ||
![]() |
790d1a4816 | ||
![]() |
1c0f70f534 | ||
![]() |
cd39b944af | ||
![]() |
6ba2e88a64 | ||
![]() |
1f8a337e41 | ||
![]() |
b2ea1bfcd6 | ||
![]() |
0741271198 | ||
![]() |
97c272e5d1 | ||
![]() |
54c394699d | ||
![]() |
09a31fabe4 | ||
![]() |
d4f62f6c5d | ||
![]() |
1945f99d59 | ||
![]() |
b55cb2eef2 | ||
![]() |
c0700e3c7f | ||
![]() |
92e754de78 | ||
![]() |
9a91e8059b | ||
![]() |
3447c973d0 | ||
![]() |
cae43a10cb | ||
![]() |
aa8f613e98 | ||
![]() |
aff153f83a | ||
![]() |
59f3f92ba6 | ||
![]() |
6a7261359b | ||
![]() |
f1e0a0aae7 | ||
![]() |
047e6aa05c | ||
![]() |
48be87e5f0 | ||
![]() |
49726926c6 | ||
![]() |
710a2e99b5 | ||
![]() |
79478fdb68 | ||
![]() |
81e25b0e25 | ||
![]() |
0675abbc75 | ||
![]() |
26cbd7a1d9 | ||
![]() |
ba4741842e | ||
![]() |
27ace9893c | ||
![]() |
85c45d153b | ||
![]() |
fd9d3a1ef1 | ||
![]() |
d409f094a5 | ||
![]() |
b47c17d67c | ||
![]() |
1fd33e3ec8 |
@@ -16,11 +16,9 @@ Send your suggestions using one of these methods:
|
|||||||
|
|
||||||
1. in a mail to the mailing list
|
1. in a mail to the mailing list
|
||||||
|
|
||||||
2. in the [bug tracker](https://sourceforge.net/p/curl/bugs/)
|
2. as a pull request on github
|
||||||
|
|
||||||
3. as a pull request on github
|
3. as an issue on github
|
||||||
|
|
||||||
4. as an issue on github
|
|
||||||
|
|
||||||
|
|
||||||
/ The cURL team!
|
/ The cURL team!
|
||||||
|
@@ -118,7 +118,7 @@ WINBUILD_DIST = winbuild/BUILD.WINDOWS.txt winbuild/gen_resp_file.bat \
|
|||||||
winbuild/Makefile.msvc.names
|
winbuild/Makefile.msvc.names
|
||||||
|
|
||||||
EXTRA_DIST = CHANGES COPYING maketgz Makefile.dist curl-config.in \
|
EXTRA_DIST = CHANGES COPYING maketgz Makefile.dist curl-config.in \
|
||||||
RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework \
|
RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework scripts/zsh.pl \
|
||||||
$(CMAKE_DIST) $(VC_DIST) $(WINBUILD_DIST) lib/libcurl.vers.in
|
$(CMAKE_DIST) $(VC_DIST) $(WINBUILD_DIST) lib/libcurl.vers.in
|
||||||
|
|
||||||
CLEANFILES = $(VC6_LIBDSP) $(VC6_SRCDSP) $(VC7_LIBVCPROJ) $(VC7_SRCVCPROJ) \
|
CLEANFILES = $(VC6_LIBDSP) $(VC6_SRCDSP) $(VC7_LIBVCPROJ) $(VC7_SRCVCPROJ) \
|
||||||
|
4
README
4
README
@@ -38,12 +38,12 @@ GIT
|
|||||||
|
|
||||||
To download the very latest source off the GIT server do this:
|
To download the very latest source off the GIT server do this:
|
||||||
|
|
||||||
git clone git://github.com/bagder/curl.git
|
git clone https://github.com/bagder/curl.git
|
||||||
|
|
||||||
(you'll get a directory named curl created, filled with the source code)
|
(you'll get a directory named curl created, filled with the source code)
|
||||||
|
|
||||||
NOTICE
|
NOTICE
|
||||||
|
|
||||||
Curl contains pieces of source code that is Copyright (c) 1998, 1999
|
Curl contains pieces of source code that is Copyright (c) 1998, 1999
|
||||||
Kungliga Tekniska H<EFBFBD>gskolan. This notice is included here to comply with the
|
Kungliga Tekniska Högskolan. This notice is included here to comply with the
|
||||||
distribution terms.
|
distribution terms.
|
||||||
|
181
RELEASE-NOTES
181
RELEASE-NOTES
@@ -1,141 +1,19 @@
|
|||||||
Curl and libcurl 7.42.0
|
Curl and libcurl 7.44.0
|
||||||
|
|
||||||
Public curl releases: 145
|
Public curl releases: 148
|
||||||
Command line options: 173
|
Command line options: 176
|
||||||
curl_easy_setopt() options: 216
|
curl_easy_setopt() options: 219
|
||||||
Public functions in libcurl: 58
|
Public functions in libcurl: 58
|
||||||
Contributors: 1265
|
Contributors: 1291
|
||||||
|
|
||||||
This release includes the following changes:
|
This release includes the following changes:
|
||||||
|
|
||||||
o openssl: show the cipher selection to use in verbose text
|
o
|
||||||
o gtls: implement CURLOPT_CERTINFO
|
|
||||||
o add CURLOPT_SSL_FALSESTART option (darwinssl and NSS)
|
|
||||||
o curl: add --false-start option
|
|
||||||
o add CURLOPT_PATH_AS_IS
|
|
||||||
o curl: add --path-as-is option
|
|
||||||
o curl: create output file on successful download of an empty file [21]
|
|
||||||
|
|
||||||
This release includes the following bugfixes:
|
This release includes the following bugfixes:
|
||||||
|
|
||||||
o ConnectionExists: for NTLM re-use, require credentials to match [26]
|
o
|
||||||
o cookie: cookie parser out of boundary memory access [27]
|
|
||||||
o fix_hostname: zero length host name caused -1 index offset [28]
|
|
||||||
o http_done: close Negotiate connections when done [29]
|
|
||||||
o sws: timeout idle CONNECT connections
|
|
||||||
o nss: improve error handling in Curl_nss_random()
|
|
||||||
o nss: do not skip Curl_nss_seed() if data is NULL
|
|
||||||
o curl-config.in: eliminate double quotes around CURL_CA_BUNDLE
|
|
||||||
o http2: move lots of verbose output to be debug-only
|
|
||||||
o dist: add extern-scan.pl to the tarball
|
|
||||||
o http2: return recv error on unexpected EOF [1]
|
|
||||||
o build: Use default RandomizedBaseAddress directive in VC9+ project files
|
|
||||||
o build: Removed DataExecutionPrevention directive from VC9+ project files
|
|
||||||
o tool: Updated the warnf() function to use the GlobalConfig structure
|
|
||||||
o http2: Return error if stream was closed with other than NO_ERROR
|
|
||||||
o mprintf.h: remove #ifdef CURLDEBUG
|
|
||||||
o libtest: fixed linker errors on msvc [6]
|
|
||||||
o tool: use ENABLE_CURLX_PRINTF instead of _MPRINTF_REPLACE
|
|
||||||
o curl.1: fix "The the" typo
|
|
||||||
o cmake: handle build definitions CURLDEBUG/DEBUGBUILD
|
|
||||||
o openssl: remove all uses of USE_SSLEAY
|
|
||||||
o multi: fix memory-leak on timeout (regression) [4]
|
|
||||||
o curl_easy_setopt.3: added CURLOPT_SSL_VERIFYSTATUS
|
|
||||||
o metalink: add some error checks [3]
|
|
||||||
o TLS: make it possible to enable ALPN/NPN without HTTP/2
|
|
||||||
o http2: use CURL_HTTP_VERSION_* symbols instead of NPN_*
|
|
||||||
o conncontrol: only log changes to the connection bit
|
|
||||||
o multi: fix *getsock() with CONNECT [2]
|
|
||||||
o symbols.pl: handle '-' in the deprecated field [5]
|
|
||||||
o MacOSX-Framework: use @rpath instead of @executable_path [7]
|
|
||||||
o GnuTLS: add support for CURLOPT_CAPATH
|
|
||||||
o GnuTLS: print negotiated TLS version and full cipher suite name
|
|
||||||
o GnuTLS: don't print double newline after certificate dates
|
|
||||||
o memanalyze.pl: handle free(NULL)
|
|
||||||
o proxy: re-use proxy connections (regression) [8]
|
|
||||||
o mk-ca-bundle: Don't report SHA1 numbers with "-q"
|
|
||||||
o http: always send Host: header as first header [9]
|
|
||||||
o openssl: sort ciphers to use based on strength [10]
|
|
||||||
o openssl: use colons properly in the ciphers list
|
|
||||||
o http2: detect premature close without data transfered [11]
|
|
||||||
o hostip: Fix signal race in Curl_resolv_timeout
|
|
||||||
o closesocket: call multi socket cb on close even with custom close [12]
|
|
||||||
o mksymbolsmanpage.pl: use std header and generate better nroff header
|
|
||||||
o connect: Fix happy eyeballs logic for IPv4-only builds [13]
|
|
||||||
o curl_easy_perform.3: remove superfluous close brace from example
|
|
||||||
o HTTP: don't use Expect: headers when on HTTP/2 [14]
|
|
||||||
o Curl_sh_entry: remove unused 'timestamp'
|
|
||||||
o docs/libcurl: makefile portability fix
|
|
||||||
o mkhelp: Remove trailing carriage return from every line of input
|
|
||||||
o nss: explicitly tell NSS to disable NPN/ALPN when libcurl disables it
|
|
||||||
o curl_easy_setopt.3: added a few missing options
|
|
||||||
o metalink: fix resource leak in OOM
|
|
||||||
o axtls: version 1.5.2 now requires that config.h be manually included
|
|
||||||
o HTTP: don't switch to HTTP/2 from 1.1 until we get the 101
|
|
||||||
o cyassl: detect the library as renamed wolfssl
|
|
||||||
o CURLOPT_HTTPHEADER.3: add a "SECURITY CONCERNS" section
|
|
||||||
o CURLOPT_URL.3: Added "SECURITY CONCERNS
|
|
||||||
o openssl: try to avoid accessing OCSP structs when possible
|
|
||||||
o test938: added missing closing tags
|
|
||||||
o testcurl: Allow '=' in values given on command line
|
|
||||||
o tests/certs: added make target to rebuild certificates
|
|
||||||
o tests/certs: rebuild certificates with modified key usage bits
|
|
||||||
o gtls: avoid uninitialized variable
|
|
||||||
o gtls: dereferencing NULL pointer
|
|
||||||
o gtls: add check of return code
|
|
||||||
o test1513: eliminated race condition in test run
|
|
||||||
o dict: rename byte to avoid compiler shadowed declaration warning
|
|
||||||
o curl_easy_recv/send: make them work with the multi interface
|
|
||||||
o vtls: fix compile with --disable-crypto-auth but with SSL
|
|
||||||
o openssl: adapt to ASN1/X509 things gone opaque in 1.1
|
|
||||||
o openssl: verifystatus: only use the OCSP work-around <= 1.0.2a [15]
|
|
||||||
o curl_memory: make curl_memory.h the second-last header file loaded
|
|
||||||
o testcurl.pl: add the --notes option to supply more info about a build
|
|
||||||
o cyassl: If wolfSSL then identify as such in version string
|
|
||||||
o cyassl: Check for invalid length parameter in Curl_cyassl_random
|
|
||||||
o cyassl: default to highest possible TLS version
|
|
||||||
o Curl_ssl_md5sum: return CURLcode (fixes OOM)
|
|
||||||
o polarssl: remove dead code
|
|
||||||
o polarssl: called mbedTLS in 1.3.10 and later
|
|
||||||
o globbing: fix step parsing for character globbing ranges
|
|
||||||
o globbing: fix url number calculation when using range with step
|
|
||||||
o multi: on a request completion, check all CONNECT_PEND transfers [16]
|
|
||||||
o build: link curl to openssl libraries when openssl support is enabled
|
|
||||||
o url: Don't accept CURLOPT_SSLVERSION unless USE_SSL is defined
|
|
||||||
o vtls: Don't accept unknown CURLOPT_SSLVERSION values
|
|
||||||
o build: Fix libcurl.sln erroneous mixed configurations
|
|
||||||
o cyassl: remove undefined reference to CyaSSL_no_filesystem_verify
|
|
||||||
o cyassl: add SSL context callback support for CyaSSL
|
|
||||||
o tool: only set SSL options if SSL is enabled
|
|
||||||
o multi: remove_handle: move pending connections [17]
|
|
||||||
o configure: Use KRB5CONFIG for krb5-config [18]
|
|
||||||
o axtls: add timeout within Curl_axtls_connect
|
|
||||||
o CURLOPT_HTTP200ALIASES.3: Mainly SHOUTcast servers use "ICY 200"
|
|
||||||
o cyassl: Fix library initialization return value
|
|
||||||
o cookie: handle spaces after the name in Set-Cookie [19]
|
|
||||||
o http2: Fix missing nghttp2_session_send call in Curl_http2_switched [20]
|
|
||||||
o cyassl: Fix certificate load check
|
|
||||||
o build-openssl.bat: Fix mixed line endings
|
|
||||||
o checksrc.bat: Check lib\vtls source
|
|
||||||
o DNS: fix refreshing of obsolete dns cache entries
|
|
||||||
o CURLOPT_RESOLVE: actually implement removals
|
|
||||||
o checksrc.bat: quotes to support an SRC_DIR with spaces
|
|
||||||
o cyassl: Remove 'Connecting to' message from cyassl_connect_step2
|
|
||||||
o cyassl: Use CYASSL_MAX_ERROR_SZ for error buffer size
|
|
||||||
o lib/transfer.c: Remove factor of 8 from sleep time calculation
|
|
||||||
o lib/makefile.m32: add missing libs to build libcurl.dll
|
|
||||||
o build: Generate source prerequisites for Visual Studio in generate.bat
|
|
||||||
o cyassl: Include the CyaSSL build config
|
|
||||||
o firefox-db2pem: fix wildcard to find Firefox default profile
|
|
||||||
o BUGS: refer to the github issue tracker now as primary
|
|
||||||
o vtls_openssl: improve several certificate error messages
|
|
||||||
o cyassl: Add support for TLS extension SNI
|
|
||||||
o parsecfg: do not continue past a zero termination
|
|
||||||
o configure --with-nss=PATH: query pkg-config if available [22]
|
|
||||||
o configure --with-nss: drop redundant if statement
|
|
||||||
o cyassl: Fix include order [23]
|
|
||||||
o HTTP: fix PUT regression with Negotiate [24]
|
|
||||||
o curl_version_info.3: fixed the 'protocols' variable type [25]
|
|
||||||
|
|
||||||
This release includes the following known bugs:
|
This release includes the following known bugs:
|
||||||
|
|
||||||
@@ -144,49 +22,10 @@ This release includes the following known bugs:
|
|||||||
This release would not have looked like this without help, code, reports and
|
This release would not have looked like this without help, code, reports and
|
||||||
advice from friends like these:
|
advice from friends like these:
|
||||||
|
|
||||||
Alessandro Ghedini, Alexander Pepper, Ben Darnell, Brad King,
|
|
||||||
Charles Romestant, Christian Weisgerber, Dagobert Michelsen, Dan Fandrich,
|
|
||||||
Daniel Stenberg, Da-Yoon Chung, Emil Lerner, Fabian Keil, Frank Gevaerts,
|
|
||||||
Frank Meier, Hanno Böck, Isaac Boukris, Jeroen Ooms, Jiri Dvorak,
|
|
||||||
John Marshall, Jonathan Cardoso Machado, Jon Seymour, Kamil Dudka,
|
|
||||||
Kyle L. Huff, Markus Elfring, Matthew Hall, Michael Osipov,
|
|
||||||
Michael Stapelberg, Michel Promonet, Mostyn Bramley-Moore, Nick Zitzmann,
|
|
||||||
Paras Sethia, Patrick Monnerat, Paul Howarth, Peter Laser, Rainer Canavan,
|
|
||||||
Ray Satiro, Richard Moore, Sergei Nikulov, Stefan Bühler, Stefan Eissing,
|
|
||||||
Steve Havelka, Steve Holme, Tatsuhiro Tsujikawa, Thomas Ruecker,
|
|
||||||
Tobias Stoeckmann, Viktor Szakáts, Yamada Yasuharu,
|
|
||||||
(47 contributors)
|
|
||||||
|
|
||||||
Thanks! (and sorry if I forgot to mention someone)
|
Thanks! (and sorry if I forgot to mention someone)
|
||||||
|
|
||||||
References to bug reports and discussions on issues:
|
References to bug reports and discussions on issues:
|
||||||
|
|
||||||
[1] = http://curl.haxx.se/bug/view.cgi?id=1487
|
[1] =
|
||||||
[2] = http://curl.haxx.se/mail/lib-2015-01/0170.html
|
|
||||||
[3] = https://github.com/bagder/curl/issues/150
|
|
||||||
[4] = https://github.com/bagder/curl/issues/147
|
|
||||||
[5] = http://curl.haxx.se/mail/lib-2015-03/0052.html
|
|
||||||
[6] = https://github.com/bagder/curl/pull/144
|
|
||||||
[7] = https://github.com/bagder/curl/pull/157
|
|
||||||
[8] = http://curl.haxx.se/bug/view.cgi?id=1492
|
|
||||||
[9] = http://curl.haxx.se/bug/view.cgi?id=1491
|
|
||||||
[10] = http://curl.haxx.se/bug/view.cgi?id=1487
|
|
||||||
[11] = https://github.com/bagder/curl/issues/166
|
|
||||||
[12] = http://curl.haxx.se/bug/view.cgi?id=1493
|
|
||||||
[13] = https://github.com/bagder/curl/pull/168
|
|
||||||
[14] = https://github.com/bagder/curl/issues/169
|
|
||||||
[15] = http://curl.haxx.se/mail/lib-2015-03/0205.html
|
|
||||||
[16] = http://curl.haxx.se/bug/view.cgi?id=1465
|
|
||||||
[17] = http://curl.haxx.se/bug/view.cgi?id=1465
|
|
||||||
[18] = http://curl.haxx.se/bug/view.cgi?id=1486
|
|
||||||
[19] = https://github.com/bagder/curl/issues/195
|
|
||||||
[20] = https://github.com/bagder/curl/issues/192
|
|
||||||
[21] = https://github.com/bagder/curl/issues/183
|
|
||||||
[22] = https://github.com/bagder/curl/pull/171
|
|
||||||
[23] = http://curl.haxx.se/mail/lib-2015-04/0069.html
|
|
||||||
[24] = https://github.com/bagder/curl/issues/223
|
|
||||||
[25] = https://github.com/bagder/curl/issues/225
|
|
||||||
[26] = http://curl.haxx.se/docs/adv_20150422A.html
|
|
||||||
[27] = http://curl.haxx.se/docs/adv_20150422C.html
|
|
||||||
[28] = http://curl.haxx.se/docs/adv_20150422D.html
|
|
||||||
[29] = http://curl.haxx.se/docs/adv_20150422B.html
|
|
||||||
|
19
acinclude.m4
19
acinclude.m4
@@ -2452,23 +2452,6 @@ AC_DEFUN([CURL_CHECK_FUNC_SELECT], [
|
|||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
# This is only a temporary fix. This macro is here to replace the broken one
|
|
||||||
# delivered by the automake project (including the 1.9.6 release). As soon as
|
|
||||||
# they ship a working version we SHOULD remove this work-around.
|
|
||||||
|
|
||||||
AC_DEFUN([AM_MISSING_HAS_RUN],
|
|
||||||
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
|
|
||||||
test x"${MISSING+set}" = xset || MISSING="\${SHELL} \"$am_aux_dir/missing\""
|
|
||||||
# Use eval to expand $SHELL
|
|
||||||
if eval "$MISSING --run true"; then
|
|
||||||
am_missing_run="$MISSING --run "
|
|
||||||
else
|
|
||||||
am_missing_run=
|
|
||||||
AC_MSG_WARN([`missing' script is too old or missing])
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
dnl CURL_VERIFY_RUNTIMELIBS
|
dnl CURL_VERIFY_RUNTIMELIBS
|
||||||
dnl -------------------------------------------------
|
dnl -------------------------------------------------
|
||||||
dnl Verify that the shared libs found so far can be used when running
|
dnl Verify that the shared libs found so far can be used when running
|
||||||
@@ -2676,7 +2659,7 @@ AC_HELP_STRING([--without-ca-path], [Don't use a default CA path]),
|
|||||||
AC_DEFINE_UNQUOTED(CURL_CA_PATH, "$capath", [Location of default ca path])
|
AC_DEFINE_UNQUOTED(CURL_CA_PATH, "$capath", [Location of default ca path])
|
||||||
AC_MSG_RESULT([$capath (capath)])
|
AC_MSG_RESULT([$capath (capath)])
|
||||||
fi
|
fi
|
||||||
if test "x$ca" == "xno" && test "x$capath" == "xno"; then
|
if test "x$ca" = "xno" && test "x$capath" = "xno"; then
|
||||||
AC_MSG_RESULT([no])
|
AC_MSG_RESULT([no])
|
||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
|
@@ -318,6 +318,8 @@ for fname in .deps \
|
|||||||
ltsugar.m4 \
|
ltsugar.m4 \
|
||||||
ltversion.m4 \
|
ltversion.m4 \
|
||||||
lt~obsolete.m4 \
|
lt~obsolete.m4 \
|
||||||
|
missing \
|
||||||
|
install-sh \
|
||||||
stamp-h1 \
|
stamp-h1 \
|
||||||
stamp-h2 \
|
stamp-h2 \
|
||||||
stamp-h3 ; do
|
stamp-h3 ; do
|
||||||
@@ -329,7 +331,7 @@ done
|
|||||||
#
|
#
|
||||||
|
|
||||||
echo "buildconf: running libtoolize"
|
echo "buildconf: running libtoolize"
|
||||||
${libtoolize} --copy --automake --force || die "libtoolize command failed"
|
${libtoolize} --copy --force || die "libtoolize command failed"
|
||||||
|
|
||||||
# When using libtool 1.5.X (X < 26) we copy libtool.m4 to our local m4
|
# When using libtool 1.5.X (X < 26) we copy libtool.m4 to our local m4
|
||||||
# subdirectory and this local copy is patched to fix some warnings that
|
# subdirectory and this local copy is patched to fix some warnings that
|
||||||
|
@@ -1194,8 +1194,6 @@ if test x"$want_gss" = xyes; then
|
|||||||
if test -z "$GSSAPI_INCS"; then
|
if test -z "$GSSAPI_INCS"; then
|
||||||
if test -n "$host_alias" -a -f "$GSSAPI_ROOT/bin/$host_alias-krb5-config"; then
|
if test -n "$host_alias" -a -f "$GSSAPI_ROOT/bin/$host_alias-krb5-config"; then
|
||||||
GSSAPI_INCS=`$GSSAPI_ROOT/bin/$host_alias-krb5-config --cflags gssapi`
|
GSSAPI_INCS=`$GSSAPI_ROOT/bin/$host_alias-krb5-config --cflags gssapi`
|
||||||
elif test -f "$GSSAPI_ROOT/bin/krb5-config"; then
|
|
||||||
GSSAPI_INCS=`$GSSAPI_ROOT/bin/krb5-config --cflags gssapi`
|
|
||||||
elif test -f "$KRB5CONFIG"; then
|
elif test -f "$KRB5CONFIG"; then
|
||||||
GSSAPI_INCS=`$KRB5CONFIG --cflags gssapi`
|
GSSAPI_INCS=`$KRB5CONFIG --cflags gssapi`
|
||||||
elif test "$GSSAPI_ROOT" != "yes"; then
|
elif test "$GSSAPI_ROOT" != "yes"; then
|
||||||
@@ -2843,7 +2841,9 @@ if test X"$want_h2" != Xno; then
|
|||||||
CPPFLAGS="$CPPFLAGS $CPP_H2"
|
CPPFLAGS="$CPPFLAGS $CPP_H2"
|
||||||
LIBS="$LIB_H2 $LIBS"
|
LIBS="$LIB_H2 $LIBS"
|
||||||
|
|
||||||
AC_CHECK_LIB(nghttp2, nghttp2_session_callbacks_set_send_callback,
|
# use nghttp2_option_set_no_recv_client_magic to require nghttp2
|
||||||
|
# >= 1.0.0
|
||||||
|
AC_CHECK_LIB(nghttp2, nghttp2_option_set_no_recv_client_magic,
|
||||||
[
|
[
|
||||||
AC_CHECK_HEADERS(nghttp2/nghttp2.h,
|
AC_CHECK_HEADERS(nghttp2/nghttp2.h,
|
||||||
curl_h2_msg="enabled (nghttp2)"
|
curl_h2_msg="enabled (nghttp2)"
|
||||||
|
@@ -50,7 +50,7 @@ Cocoa
|
|||||||
D
|
D
|
||||||
|
|
||||||
Written by Kenneth Bogert
|
Written by Kenneth Bogert
|
||||||
http://curl.haxx.se/libcurl/d/
|
http://dlang.org/library/std/net/curl.html
|
||||||
|
|
||||||
Dylan
|
Dylan
|
||||||
|
|
||||||
@@ -60,7 +60,7 @@ Dylan
|
|||||||
Eiffel
|
Eiffel
|
||||||
|
|
||||||
Written by Eiffel Software
|
Written by Eiffel Software
|
||||||
http://curl.haxx.se/libcurl/eiffel/
|
https://room.eiffel.com/library/curl
|
||||||
|
|
||||||
Euphoria
|
Euphoria
|
||||||
|
|
||||||
@@ -78,7 +78,7 @@ Ferite
|
|||||||
|
|
||||||
Gambas
|
Gambas
|
||||||
|
|
||||||
http://gambas.sourceforge.net
|
http://gambas.sourceforge.net/
|
||||||
|
|
||||||
glib/GTK+
|
glib/GTK+
|
||||||
|
|
||||||
@@ -102,8 +102,7 @@ Haskell
|
|||||||
|
|
||||||
Java
|
Java
|
||||||
|
|
||||||
Maintained by [blank]
|
https://github.com/pjlegato/curl-java
|
||||||
http://curl.haxx.se/libcurl/java/
|
|
||||||
|
|
||||||
Julia
|
Julia
|
||||||
|
|
||||||
@@ -131,7 +130,7 @@ Mono
|
|||||||
.NET
|
.NET
|
||||||
|
|
||||||
libcurl-net by Jeffrey Phillips
|
libcurl-net by Jeffrey Phillips
|
||||||
http://sourceforge.net/projects/libcurl-net/
|
https://sourceforge.net/projects/libcurl-net/
|
||||||
|
|
||||||
node.js
|
node.js
|
||||||
|
|
||||||
@@ -146,7 +145,7 @@ Object-Pascal
|
|||||||
O'Caml
|
O'Caml
|
||||||
|
|
||||||
Written by Lars Nilsson
|
Written by Lars Nilsson
|
||||||
http://sourceforge.net/projects/ocurl/
|
https://sourceforge.net/projects/ocurl/
|
||||||
|
|
||||||
Pascal
|
Pascal
|
||||||
|
|
||||||
@@ -155,13 +154,13 @@ Pascal
|
|||||||
|
|
||||||
Perl
|
Perl
|
||||||
|
|
||||||
Maintained by Cris Bailiff
|
Maintained by Cris Bailiff and Bálint Szilakszi
|
||||||
http://curl.haxx.se/libcurl/perl/
|
https://github.com/szbalint/WWW--Curl
|
||||||
|
|
||||||
PHP
|
PHP
|
||||||
|
|
||||||
Written by Sterling Hughes
|
Written by Sterling Hughes
|
||||||
http://curl.haxx.se/libcurl/php/
|
https://php.net/curl
|
||||||
|
|
||||||
PostgreSQL
|
PostgreSQL
|
||||||
|
|
||||||
@@ -175,8 +174,7 @@ Python
|
|||||||
|
|
||||||
R
|
R
|
||||||
|
|
||||||
RCurl by Duncan Temple Lang
|
http://cran.r-project.org/package=curl
|
||||||
http://www.omegahat.org/RCurl/
|
|
||||||
|
|
||||||
Rexx
|
Rexx
|
||||||
|
|
||||||
@@ -197,10 +195,15 @@ Ruby
|
|||||||
ruby-curl-multi - written by Kristjan Petursson and Keith Rarick
|
ruby-curl-multi - written by Kristjan Petursson and Keith Rarick
|
||||||
http://curl-multi.rubyforge.org/
|
http://curl-multi.rubyforge.org/
|
||||||
|
|
||||||
|
Rust
|
||||||
|
|
||||||
|
curl-rust - by Carl Lerche
|
||||||
|
https://github.com/carllerche/curl-rust
|
||||||
|
|
||||||
Scheme
|
Scheme
|
||||||
|
|
||||||
Bigloo binding by Kirill Lisovsky
|
Bigloo binding by Kirill Lisovsky
|
||||||
http://curl.haxx.se/libcurl/scheme/
|
http://www.metapaper.net/lisovsky/web/curl/
|
||||||
|
|
||||||
S-Lang
|
S-Lang
|
||||||
|
|
||||||
@@ -230,7 +233,7 @@ Tcl
|
|||||||
Visual Basic
|
Visual Basic
|
||||||
|
|
||||||
libcurl-vb by Jeffrey Phillips
|
libcurl-vb by Jeffrey Phillips
|
||||||
http://sourceforge.net/projects/libcurl-vb/
|
https://sourceforge.net/projects/libcurl-vb/
|
||||||
|
|
||||||
Visual Foxpro
|
Visual Foxpro
|
||||||
|
|
||||||
@@ -250,3 +253,8 @@ XBLite
|
|||||||
|
|
||||||
Written by David Szafranski
|
Written by David Szafranski
|
||||||
http://perso.wanadoo.fr/xblite/libraries.html
|
http://perso.wanadoo.fr/xblite/libraries.html
|
||||||
|
|
||||||
|
Xojo
|
||||||
|
|
||||||
|
Written by Andrew Lambert
|
||||||
|
https://github.com/charonn0/RB-libcURL
|
||||||
|
@@ -203,7 +203,7 @@
|
|||||||
|
|
||||||
You need to first checkout the repository:
|
You need to first checkout the repository:
|
||||||
|
|
||||||
git clone git://github.com/bagder/curl.git
|
git clone https://github.com/bagder/curl.git
|
||||||
|
|
||||||
You then proceed and edit all the files you like and you commit them to your
|
You then proceed and edit all the files you like and you commit them to your
|
||||||
local repository:
|
local repository:
|
||||||
@@ -245,8 +245,8 @@
|
|||||||
|
|
||||||
For unix-like operating systems:
|
For unix-like operating systems:
|
||||||
|
|
||||||
http://www.gnu.org/software/patch/patch.html
|
https://savannah.gnu.org/projects/patch/
|
||||||
http://www.gnu.org/directory/diffutils.html
|
https://www.gnu.org/software/diffutils/
|
||||||
|
|
||||||
For Windows:
|
For Windows:
|
||||||
|
|
||||||
|
@@ -112,7 +112,7 @@ The Better License, Original BSD, GPL or LGPL?
|
|||||||
In Debian land, there seems to be a common opinion that LGPL is "maximally
|
In Debian land, there seems to be a common opinion that LGPL is "maximally
|
||||||
compatible" with apps while Original BSD is not. Like this:
|
compatible" with apps while Original BSD is not. Like this:
|
||||||
|
|
||||||
http://lists.debian.org/debian-devel/2005/09/msg01417.html
|
https://lists.debian.org/debian-devel/2005/09/msg01417.html
|
||||||
|
|
||||||
More SSL Libraries
|
More SSL Libraries
|
||||||
|
|
||||||
@@ -163,13 +163,13 @@ Distro Angle of this Problem
|
|||||||
Footnotes
|
Footnotes
|
||||||
|
|
||||||
[1] = http://www.xfree86.org/3.3.6/COPYRIGHT2.html#6
|
[1] = http://www.xfree86.org/3.3.6/COPYRIGHT2.html#6
|
||||||
[2] = http://www.fsf.org/licensing/essays/bsd.html
|
[2] = https://www.gnu.org/philosophy/bsd.html
|
||||||
[3] = http://www.fsf.org/licensing/licenses/gpl.html
|
[3] = https://www.gnu.org/licenses/gpl.html
|
||||||
[4] = http://curl.haxx.se/docs/copyright.html
|
[4] = http://curl.haxx.se/docs/copyright.html
|
||||||
[5] = http://www.openssl.org/source/license.html
|
[5] = https://www.openssl.org/source/license.html
|
||||||
[6] = http://www.fsf.org/licensing/licenses/gpl.html end of section 3
|
[6] = https://www.gnu.org/licenses/gpl.html end of section 3
|
||||||
[7] = http://www.fsf.org/licensing/licenses/lgpl.html
|
[7] = https://www.gnu.org/licenses/lgpl.html
|
||||||
[8] = http://en.wikipedia.org/wiki/OpenSSL_exception
|
[8] = https://en.wikipedia.org/wiki/OpenSSL_exception
|
||||||
|
|
||||||
Feedback/Updates provided by
|
Feedback/Updates provided by
|
||||||
|
|
||||||
|
26
docs/FAQ
26
docs/FAQ
@@ -21,6 +21,7 @@ FAQ
|
|||||||
1.12 I have a problem who can I chat with?
|
1.12 I have a problem who can I chat with?
|
||||||
1.13 curl's ECCN number?
|
1.13 curl's ECCN number?
|
||||||
1.14 How do I submit my patch?
|
1.14 How do I submit my patch?
|
||||||
|
1.15 How do I port libcurl to my OS?
|
||||||
|
|
||||||
2. Install Related Problems
|
2. Install Related Problems
|
||||||
2.1 configure doesn't find OpenSSL even when it is installed
|
2.1 configure doesn't find OpenSSL even when it is installed
|
||||||
@@ -351,7 +352,7 @@ FAQ
|
|||||||
cryptography. When doing so, the Export Control Classification Number (ECCN)
|
cryptography. When doing so, the Export Control Classification Number (ECCN)
|
||||||
is used to identify the level of export control etc.
|
is used to identify the level of export control etc.
|
||||||
|
|
||||||
ASF gives a good explanation at http://www.apache.org/dev/crypto.html
|
ASF gives a good explanation at https://www.apache.org/dev/crypto.html
|
||||||
|
|
||||||
We believe curl's number might be ECCN 5D002, another possibility is
|
We believe curl's number might be ECCN 5D002, another possibility is
|
||||||
5D992. It seems necessary to write them, asking to confirm.
|
5D992. It seems necessary to write them, asking to confirm.
|
||||||
@@ -380,6 +381,19 @@ FAQ
|
|||||||
|
|
||||||
Lots of more details are found in the CONTRIBUTE and INTERNALS docs.
|
Lots of more details are found in the CONTRIBUTE and INTERNALS docs.
|
||||||
|
|
||||||
|
1.15 How do I port libcurl to my OS?
|
||||||
|
|
||||||
|
Here's a rough step-by-step:
|
||||||
|
|
||||||
|
1. copy a suitable lib/config-*.h file as a start to lib/config-[youros].h
|
||||||
|
|
||||||
|
2. edit lib/config-[youros].h to match your OS and setup
|
||||||
|
|
||||||
|
3. edit lib/curl_setup.h to include config-[youros].h when your OS is
|
||||||
|
detected by the preprocessor, in the style others already exist
|
||||||
|
|
||||||
|
4. compile lib/*.c and make them into a library
|
||||||
|
|
||||||
|
|
||||||
2. Install Related Problems
|
2. Install Related Problems
|
||||||
|
|
||||||
@@ -1028,7 +1042,7 @@ FAQ
|
|||||||
timeout is set.
|
timeout is set.
|
||||||
|
|
||||||
See option TcpMaxConnectRetransmissions on this page:
|
See option TcpMaxConnectRetransmissions on this page:
|
||||||
http://support.microsoft.com/?scid=kb%3Ben-us%3B175523&x=6&y=7
|
https://support.microsoft.com/en-us/kb/175523/en-us
|
||||||
|
|
||||||
Also, even on non-Windows systems there may run a firewall or anti-virus
|
Also, even on non-Windows systems there may run a firewall or anti-virus
|
||||||
software or similar that accepts the connection but does not actually do
|
software or similar that accepts the connection but does not actually do
|
||||||
@@ -1045,7 +1059,7 @@ FAQ
|
|||||||
You'll find that even if D:\blah.txt does exist, cURL returns a 'file
|
You'll find that even if D:\blah.txt does exist, cURL returns a 'file
|
||||||
not found' error.
|
not found' error.
|
||||||
|
|
||||||
According to RFC 1738 (http://www.faqs.org/rfcs/rfc1738.html),
|
According to RFC 1738 (https://www.ietf.org/rfc/rfc1738.txt),
|
||||||
file:// URLs must contain a host component, but it is ignored by
|
file:// URLs must contain a host component, but it is ignored by
|
||||||
most implementations. In the above example, 'D:' is treated as the
|
most implementations. In the above example, 'D:' is treated as the
|
||||||
host component, and is taken away. Thus, cURL tries to open '/blah.txt'.
|
host component, and is taken away. Thus, cURL tries to open '/blah.txt'.
|
||||||
@@ -1149,13 +1163,13 @@ FAQ
|
|||||||
If you use a OpenSSL-powered libcurl in a multi-threaded environment, you
|
If you use a OpenSSL-powered libcurl in a multi-threaded environment, you
|
||||||
need to provide one or two locking functions:
|
need to provide one or two locking functions:
|
||||||
|
|
||||||
http://www.openssl.org/docs/crypto/threads.html
|
https://www.openssl.org/docs/crypto/threads.html
|
||||||
|
|
||||||
If you use a GnuTLS-powered libcurl in a multi-threaded environment, you
|
If you use a GnuTLS-powered libcurl in a multi-threaded environment, you
|
||||||
need to provide locking function(s) for libgcrypt (which is used by GnuTLS
|
need to provide locking function(s) for libgcrypt (which is used by GnuTLS
|
||||||
for the crypto functions).
|
for the crypto functions).
|
||||||
|
|
||||||
http://www.gnu.org/software/gnutls/manual/html_node/Multi_002dthreaded-applications.html
|
https://web.archive.org/web/20111103083330/http://www.gnu.org/software/gnutls/manual/html_node/Multi_002dthreaded-applications.html
|
||||||
|
|
||||||
No special locking is needed with a NSS-powered libcurl. NSS is thread-safe.
|
No special locking is needed with a NSS-powered libcurl. NSS is thread-safe.
|
||||||
|
|
||||||
@@ -1331,7 +1345,7 @@ FAQ
|
|||||||
Also note that on many networks NATs or other IP-munging techniques are used
|
Also note that on many networks NATs or other IP-munging techniques are used
|
||||||
that makes you see and use a different IP address locally than what the
|
that makes you see and use a different IP address locally than what the
|
||||||
remote server will see you coming from. You may also consider using
|
remote server will see you coming from. You may also consider using
|
||||||
http://www.torproject.org .
|
https://www.torproject.org/ .
|
||||||
|
|
||||||
5.13 How do I stop an ongoing transfer?
|
5.13 How do I stop an ongoing transfer?
|
||||||
|
|
||||||
|
@@ -36,7 +36,7 @@ HTTP Cookies
|
|||||||
For a very long time, the only spec explaining how to use cookies was the
|
For a very long time, the only spec explaining how to use cookies was the
|
||||||
original Netscape spec from 1994: http://curl.haxx.se/rfc/cookie_spec.html
|
original Netscape spec from 1994: http://curl.haxx.se/rfc/cookie_spec.html
|
||||||
|
|
||||||
In 2011, RFC6265 (http://www.ietf.org/rfc/rfc6265.txt) was finally published
|
In 2011, RFC6265 (https://www.ietf.org/rfc/rfc6265.txt) was finally published
|
||||||
and details how cookies work within HTTP.
|
and details how cookies work within HTTP.
|
||||||
|
|
||||||
1.2 Cookies saved to disk
|
1.2 Cookies saved to disk
|
||||||
|
107
docs/HTTP2.md
Normal file
107
docs/HTTP2.md
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
HTTP/2 with curl
|
||||||
|
================
|
||||||
|
|
||||||
|
[HTTP/2 Spec](https://www.rfc-editor.org/rfc/rfc7540.txt)
|
||||||
|
[http2 explained](http://daniel.haxx.se/http2/)
|
||||||
|
|
||||||
|
Build prerequisites
|
||||||
|
-------------------
|
||||||
|
- nghttp2
|
||||||
|
- OpenSSL, NSS, GnutTLS or PolarSSL with a new enough version
|
||||||
|
|
||||||
|
[nghttp2](https://nghttp2.org/)
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
libcurl uses this 3rd party library for the low level protocol handling
|
||||||
|
parts. The reason for this is that HTTP/2 is much more complex at that layer
|
||||||
|
than HTTP/1.1 (which we implement on our own) and that nghttp2 is an already
|
||||||
|
existing and well functional library.
|
||||||
|
|
||||||
|
We require at least version 1.0.0.
|
||||||
|
|
||||||
|
Over an http:// URL
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
If `CURLOPT_HTTP_VERSION` is set to `CURL_HTTP_VERSION_2_0`, libcurl will
|
||||||
|
include an upgrade header in the initial request to the host to allow
|
||||||
|
upgrading to HTTP/2.
|
||||||
|
|
||||||
|
Possibly we can later introduce an option that will cause libcurl to fail if
|
||||||
|
not possible to upgrade. Possibly we introduce an option that makes libcurl
|
||||||
|
use HTTP/2 at once over http://
|
||||||
|
|
||||||
|
Over an https:// URL
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
If `CURLOPT_HTTP_VERSION` is set to `CURL_HTTP_VERSION_2_0`, libcurl will use
|
||||||
|
ALPN (or NPN) to negotiate which protocol to continue with. Possibly introduce
|
||||||
|
an option that will cause libcurl to fail if not possible to use HTTP/2.
|
||||||
|
Consider options to explicitly disable ALPN and/or NPN.
|
||||||
|
|
||||||
|
ALPN is the TLS extension that HTTP/2 is expected to use. The NPN extension is
|
||||||
|
for a similar purpose, was made prior to ALPN and is used for SPDY so early
|
||||||
|
HTTP/2 servers are implemented using NPN before ALPN support is widespread.
|
||||||
|
|
||||||
|
SSL libs
|
||||||
|
--------
|
||||||
|
|
||||||
|
The challenge is the ALPN and NPN support and all our different SSL
|
||||||
|
backends. You may need a fairly updated SSL library version for it to
|
||||||
|
provide the necessary TLS features. Right now we support:
|
||||||
|
|
||||||
|
- OpenSSL: ALPN and NPN
|
||||||
|
- NSS: ALPN and NPN
|
||||||
|
- GnuTLS: ALPN
|
||||||
|
- PolarSSL: ALPN
|
||||||
|
|
||||||
|
Multiplexing
|
||||||
|
------------
|
||||||
|
|
||||||
|
Starting in 7.43.0, libcurl fully supports HTTP/2 multiplexing, which is the
|
||||||
|
term for doing multiple independent transfers over the same physical TCP
|
||||||
|
connection.
|
||||||
|
|
||||||
|
To take advantage of multiplexing, you need to use the multi interface and set
|
||||||
|
`CURLMOPT_PIPELINING` to `CURLPIPE_MULTIPLEX`. With that bit set, libcurl will
|
||||||
|
attempt to re-use existing HTTP/2 connections and just add a new stream over
|
||||||
|
that when doing subsequent parallel requests.
|
||||||
|
|
||||||
|
While libcurl sets up a connection to a HTTP server there is a period during
|
||||||
|
which it doesn't know if it can pipeline or do multiplexing and if you add new
|
||||||
|
transfers in that period, libcurl will default to start new connections for
|
||||||
|
those transfers. With the new option `CURLOPT_PIPEWAIT` (added in 7.43.0), you
|
||||||
|
can ask that a transfer should rather wait and see in case there's a
|
||||||
|
connection for the same host in progress that might end up being possible to
|
||||||
|
multiplex on. It favours keeping the number of connections low to the cost of
|
||||||
|
slightly longer time to first byte transferred.
|
||||||
|
|
||||||
|
Applications
|
||||||
|
------------
|
||||||
|
|
||||||
|
We hide HTTP/2's binary nature and convert received HTTP/2 traffic to headers
|
||||||
|
in HTTP 1.1 style. This allows applications to work unmodified.
|
||||||
|
|
||||||
|
curl tool
|
||||||
|
---------
|
||||||
|
|
||||||
|
curl offers the `--http2` command line option to enable use of HTTP/2
|
||||||
|
|
||||||
|
HTTP Alternative Services
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
Alt-Svc is a suggested extension with a corresponding frame (ALTSVC) in HTTP/2
|
||||||
|
that tells the client about an alternative "route" to the same content for the
|
||||||
|
same origin server that you get the response from. A browser or long-living
|
||||||
|
client can use that hint to create a new connection asynchronously. For
|
||||||
|
libcurl, we may introduce a way to bring such clues to the applicaton and/or
|
||||||
|
let a subsequent request use the alternate route
|
||||||
|
automatically. [Spec](https://tools.ietf.org/html/draft-ietf-httpbis-alt-svc-05)
|
||||||
|
|
||||||
|
TODO
|
||||||
|
----
|
||||||
|
|
||||||
|
- Provide API to set priorities / dependencies of individual streams
|
||||||
|
|
||||||
|
- Implement "prior-knowledge" HTTP/2 connecitons over clear text so that
|
||||||
|
curl can connect with HTTP/2 at once without 1.1+Upgrade.
|
||||||
|
|
53
docs/INSTALL
53
docs/INSTALL
@@ -173,13 +173,13 @@ Win32
|
|||||||
advice given above.
|
advice given above.
|
||||||
|
|
||||||
KB94248 - How To Use the C Run-Time
|
KB94248 - How To Use the C Run-Time
|
||||||
http://support.microsoft.com/kb/94248/en-us
|
https://support.microsoft.com/kb/94248/en-us
|
||||||
|
|
||||||
KB140584 - How to link with the correct C Run-Time (CRT) library
|
KB140584 - How to link with the correct C Run-Time (CRT) library
|
||||||
http://support.microsoft.com/kb/140584/en-us
|
https://support.microsoft.com/kb/140584/en-us
|
||||||
|
|
||||||
KB190799 - Potential Errors Passing CRT Objects Across DLL Boundaries
|
KB190799 - Potential Errors Passing CRT Objects Across DLL Boundaries
|
||||||
http://msdn.microsoft.com/en-us/library/ms235460
|
https://msdn.microsoft.com/en-us/library/ms235460
|
||||||
|
|
||||||
If your app is misbehaving in some strange way, or it is suffering
|
If your app is misbehaving in some strange way, or it is suffering
|
||||||
from memory corruption, before asking for further help, please try
|
from memory corruption, before asking for further help, please try
|
||||||
@@ -209,8 +209,8 @@ Win32
|
|||||||
environment variables, for example:
|
environment variables, for example:
|
||||||
|
|
||||||
set ZLIB_PATH=c:\zlib-1.2.8
|
set ZLIB_PATH=c:\zlib-1.2.8
|
||||||
set OPENSSL_PATH=c:\openssl-0.9.8zc
|
set OPENSSL_PATH=c:\openssl-1.0.2c
|
||||||
set LIBSSH2_PATH=c:\libssh2-1.4.3
|
set LIBSSH2_PATH=c:\libssh2-1.6.0
|
||||||
|
|
||||||
ATTENTION: if you want to build with libssh2 support you have to use latest
|
ATTENTION: if you want to build with libssh2 support you have to use latest
|
||||||
version 0.17 - previous versions will NOT work with 7.17.0 and later!
|
version 0.17 - previous versions will NOT work with 7.17.0 and later!
|
||||||
@@ -232,7 +232,7 @@ Win32
|
|||||||
- optional MingW32-built OpenLDAP SDK available from:
|
- optional MingW32-built OpenLDAP SDK available from:
|
||||||
http://www.gknw.net/mirror/openldap/
|
http://www.gknw.net/mirror/openldap/
|
||||||
- optional recent Novell CLDAP SDK available from:
|
- optional recent Novell CLDAP SDK available from:
|
||||||
http://developer.novell.com/ndk/cldap.htm
|
https://www.novell.com/developer/ndk/ldap_libraries_for_c.html
|
||||||
|
|
||||||
Cygwin
|
Cygwin
|
||||||
------
|
------
|
||||||
@@ -254,7 +254,7 @@ Win32
|
|||||||
If you use MSVC 6 it is required that you use the February 2003 edition of
|
If you use MSVC 6 it is required that you use the February 2003 edition of
|
||||||
the 'Platform SDK' which can be downloaded from:
|
the 'Platform SDK' which can be downloaded from:
|
||||||
|
|
||||||
http://www.microsoft.com/en-us/download/details.aspx?id=12261
|
https://www.microsoft.com/en-us/download/details.aspx?id=12261
|
||||||
|
|
||||||
Building any software with MSVC 6 without having PSDK installed is just
|
Building any software with MSVC 6 without having PSDK installed is just
|
||||||
asking for trouble down the road once you have released it, you might notice
|
asking for trouble down the road once you have released it, you might notice
|
||||||
@@ -263,7 +263,7 @@ Win32
|
|||||||
software built in such way will at some point regret having done so.
|
software built in such way will at some point regret having done so.
|
||||||
|
|
||||||
If the compiler has been updated with the installation of a service pack as
|
If the compiler has been updated with the installation of a service pack as
|
||||||
those mentioned in http://support.microsoft.com/kb/194022 the compiler can be
|
those mentioned in https://support.microsoft.com/kb/194022 the compiler can be
|
||||||
safely used to read source code, translate and make it object code.
|
safely used to read source code, translate and make it object code.
|
||||||
|
|
||||||
But, even with the service packs mentioned above installed, the resulting
|
But, even with the service packs mentioned above installed, the resulting
|
||||||
@@ -299,7 +299,7 @@ Win32
|
|||||||
Then run 'nmake vc' in curl's root directory.
|
Then run 'nmake vc' in curl's root directory.
|
||||||
|
|
||||||
If you want to compile with zlib support, you will need to build
|
If you want to compile with zlib support, you will need to build
|
||||||
zlib (http://www.gzip.org/zlib/) as well. Please read the zlib
|
zlib (http://www.zlib.net/) as well. Please read the zlib
|
||||||
documentation on how to compile zlib. Define the ZLIB_PATH environment
|
documentation on how to compile zlib. Define the ZLIB_PATH environment
|
||||||
variable to the location of zlib.h and zlib.lib, for example:
|
variable to the location of zlib.h and zlib.lib, for example:
|
||||||
|
|
||||||
@@ -471,6 +471,15 @@ Win32
|
|||||||
add '-DCURL_STATICLIB' to your CFLAGS. Otherwise the linker will look for
|
add '-DCURL_STATICLIB' to your CFLAGS. Otherwise the linker will look for
|
||||||
dynamic import symbols.
|
dynamic import symbols.
|
||||||
|
|
||||||
|
Legacy Windows and SSL
|
||||||
|
----------------------
|
||||||
|
WinSSL (Windows SSPI, more specifically Schannel), is the native SSL library
|
||||||
|
that comes with the Windows OS. WinSSL in Windows <= XP is not able to
|
||||||
|
connect to servers that no longer support the legacy handshakes and
|
||||||
|
algorithms used by those versions. If you will be using curl in one of those
|
||||||
|
earlier versions of Windows you should choose another SSL backend like
|
||||||
|
OpenSSL.
|
||||||
|
|
||||||
Apple iOS and Mac OS X
|
Apple iOS and Mac OS X
|
||||||
======================
|
======================
|
||||||
|
|
||||||
@@ -665,12 +674,10 @@ NetWare
|
|||||||
- gnu make and awk running on the platform you compile on;
|
- gnu make and awk running on the platform you compile on;
|
||||||
native Win32 versions can be downloaded from:
|
native Win32 versions can be downloaded from:
|
||||||
http://www.gknw.net/development/prgtools/
|
http://www.gknw.net/development/prgtools/
|
||||||
- recent Novell LibC SDK available from:
|
- recent Novell LibC or Novell CLib SDK available from:
|
||||||
http://developer.novell.com/ndk/libc.htm
|
https://www.novell.com/developer/ndk/
|
||||||
- or recent Novell CLib SDK available from:
|
|
||||||
http://developer.novell.com/ndk/clib.htm
|
|
||||||
- optional recent Novell CLDAP SDK available from:
|
- optional recent Novell CLDAP SDK available from:
|
||||||
http://developer.novell.com/ndk/cldap.htm
|
https://www.novell.com/developer/ndk/ldap_libraries_for_c.html
|
||||||
- optional zlib sources (static or dynamic linking with zlib.imp);
|
- optional zlib sources (static or dynamic linking with zlib.imp);
|
||||||
sources with NetWare Makefile can be obtained from:
|
sources with NetWare Makefile can be obtained from:
|
||||||
http://www.gknw.net/mirror/zlib/
|
http://www.gknw.net/mirror/zlib/
|
||||||
@@ -825,7 +832,7 @@ VxWorks
|
|||||||
|
|
||||||
To build libcurl for VxWorks you need:
|
To build libcurl for VxWorks you need:
|
||||||
|
|
||||||
- CYGWIN (free, http://cygwin.com/)
|
- CYGWIN (free, https://cygwin.com/)
|
||||||
- Wind River Workbench (commercial)
|
- Wind River Workbench (commercial)
|
||||||
|
|
||||||
If you have CYGWIN and Workbench installed on you machine
|
If you have CYGWIN and Workbench installed on you machine
|
||||||
@@ -1086,18 +1093,18 @@ Useful URLs
|
|||||||
|
|
||||||
axTLS http://axtls.sourceforge.net/
|
axTLS http://axtls.sourceforge.net/
|
||||||
c-ares http://c-ares.haxx.se/
|
c-ares http://c-ares.haxx.se/
|
||||||
GNU GSS http://www.gnu.org/software/gss/
|
GNU GSS https://www.gnu.org/software/gss/
|
||||||
GnuTLS http://www.gnu.org/software/gnutls/
|
GnuTLS https://www.gnu.org/software/gnutls/
|
||||||
Heimdal http://www.pdc.kth.se/heimdal/
|
Heimdal http://www.h5l.org/
|
||||||
libidn http://www.gnu.org/software/libidn/
|
libidn https://www.gnu.org/software/libidn/
|
||||||
libmetalink https://launchpad.net/libmetalink/
|
libmetalink https://launchpad.net/libmetalink/
|
||||||
libssh2 http://www.libssh2.org/
|
libssh2 http://www.libssh2.org/
|
||||||
MIT Kerberos http://web.mit.edu/kerberos/www/dist/
|
MIT Kerberos http://web.mit.edu/kerberos/www/dist/
|
||||||
NSS http://www.mozilla.org/projects/security/pki/nss/
|
NSS https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS
|
||||||
OpenLDAP http://www.openldap.org/
|
OpenLDAP http://www.openldap.org/
|
||||||
OpenSSL http://www.openssl.org/
|
OpenSSL https://www.openssl.org/
|
||||||
PolarSSL http://polarssl.org/
|
PolarSSL https://tls.mbed.org/
|
||||||
yassl http://www.yassl.com/
|
wolfSSL https://www.wolfssl.com/wolfSSL/
|
||||||
Zlib http://www.zlib.net/
|
Zlib http://www.zlib.net/
|
||||||
|
|
||||||
MingW http://www.mingw.org/
|
MingW http://www.mingw.org/
|
||||||
|
@@ -95,7 +95,7 @@ install instructions may produce erratic behaviour in DevCpp. For further info
|
|||||||
check the following sites
|
check the following sites
|
||||||
|
|
||||||
http://aditsu.freeunixhost.com/dev-cpp-faq.html
|
http://aditsu.freeunixhost.com/dev-cpp-faq.html
|
||||||
http://sourceforge.net/forum/message.php?msg_id=3252213
|
https://sourceforge.net/p/dev-cpp/discussion/48211/thread/2a85ea46
|
||||||
|
|
||||||
As I have mentioned before I will confine this to the SSL Library compilations
|
As I have mentioned before I will confine this to the SSL Library compilations
|
||||||
but the process is very similar for compilation of the executable - curl.exe;
|
but the process is very similar for compilation of the executable - curl.exe;
|
||||||
|
891
docs/INTERNALS
891
docs/INTERNALS
File diff suppressed because it is too large
Load Diff
@@ -97,7 +97,7 @@ may have been fixed since this was written!
|
|||||||
something beyond ascii but currently libcurl will only pass in the verbatim
|
something beyond ascii but currently libcurl will only pass in the verbatim
|
||||||
string the app provides. There are several browsers that already do this
|
string the app provides. There are several browsers that already do this
|
||||||
encoding. The key seems to be the updated draft to RFC2231:
|
encoding. The key seems to be the updated draft to RFC2231:
|
||||||
http://tools.ietf.org/html/draft-reschke-rfc2231-in-http-02
|
https://tools.ietf.org/html/draft-reschke-rfc2231-in-http-02
|
||||||
|
|
||||||
66. When using telnet, the time limitation options don't work.
|
66. When using telnet, the time limitation options don't work.
|
||||||
http://curl.haxx.se/bug/view.cgi?id=846
|
http://curl.haxx.se/bug/view.cgi?id=846
|
||||||
|
@@ -1,245 +0,0 @@
|
|||||||
_ _ ____ _
|
|
||||||
___| | | | _ \| |
|
|
||||||
/ __| | | | |_) | |
|
|
||||||
| (__| |_| | _ <| |___
|
|
||||||
\___|\___/|_| \_\_____|
|
|
||||||
|
|
||||||
Structs in libcurl
|
|
||||||
|
|
||||||
This document should cover 7.32.0 pretty accurately, but will make sense even
|
|
||||||
for older and later versions as things don't change drastically that often.
|
|
||||||
|
|
||||||
1. The main structs in libcurl
|
|
||||||
1.1 SessionHandle
|
|
||||||
1.2 connectdata
|
|
||||||
1.3 Curl_multi
|
|
||||||
1.4 Curl_handler
|
|
||||||
1.5 conncache
|
|
||||||
1.6 Curl_share
|
|
||||||
1.7 CookieInfo
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
|
|
||||||
1. The main structs in libcurl
|
|
||||||
|
|
||||||
1.1 SessionHandle
|
|
||||||
|
|
||||||
The SessionHandle handle struct is the one returned to the outside in the
|
|
||||||
external API as a "CURL *". This is usually known as an easy handle in API
|
|
||||||
documentations and examples.
|
|
||||||
|
|
||||||
Information and state that is related to the actual connection is in the
|
|
||||||
'connectdata' struct. When a transfer is about to be made, libcurl will
|
|
||||||
either create a new connection or re-use an existing one. The particular
|
|
||||||
connectdata that is used by this handle is pointed out by
|
|
||||||
SessionHandle->easy_conn.
|
|
||||||
|
|
||||||
Data and information that regard this particular single transfer is put in
|
|
||||||
the SingleRequest sub-struct.
|
|
||||||
|
|
||||||
When the SessionHandle struct is added to a multi handle, as it must be in
|
|
||||||
order to do any transfer, the ->multi member will point to the Curl_multi
|
|
||||||
struct it belongs to. The ->prev and ->next members will then be used by the
|
|
||||||
multi code to keep a linked list of SessionHandle structs that are added to
|
|
||||||
that same multi handle. libcurl always uses multi so ->multi *will* point to
|
|
||||||
a Curl_multi when a transfer is in progress.
|
|
||||||
|
|
||||||
->mstate is the multi state of this particular SessionHandle. When
|
|
||||||
multi_runsingle() is called, it will act on this handle according to which
|
|
||||||
state it is in. The mstate is also what tells which sockets to return for a
|
|
||||||
specific SessionHandle when curl_multi_fdset() is called etc.
|
|
||||||
|
|
||||||
The libcurl source code generally use the name 'data' for the variable that
|
|
||||||
points to the SessionHandle.
|
|
||||||
|
|
||||||
|
|
||||||
1.2 connectdata
|
|
||||||
|
|
||||||
A general idea in libcurl is to keep connections around in a connection
|
|
||||||
"cache" after they have been used in case they will be used again and then
|
|
||||||
re-use an existing one instead of creating a new as it creates a significant
|
|
||||||
performance boost.
|
|
||||||
|
|
||||||
Each 'connectdata' identifies a single physical connection to a server. If
|
|
||||||
the connection can't be kept alive, the connection will be closed after use
|
|
||||||
and then this struct can be removed from the cache and freed.
|
|
||||||
|
|
||||||
Thus, the same SessionHandle can be used multiple times and each time select
|
|
||||||
another connectdata struct to use for the connection. Keep this in mind, as
|
|
||||||
it is then important to consider if options or choices are based on the
|
|
||||||
connection or the SessionHandle.
|
|
||||||
|
|
||||||
Functions in libcurl will assume that connectdata->data points to the
|
|
||||||
SessionHandle that uses this connection.
|
|
||||||
|
|
||||||
As a special complexity, some protocols supported by libcurl require a
|
|
||||||
special disconnect procedure that is more than just shutting down the
|
|
||||||
socket. It can involve sending one or more commands to the server before
|
|
||||||
doing so. Since connections are kept in the connection cache after use, the
|
|
||||||
original SessionHandle may no longer be around when the time comes to shut
|
|
||||||
down a particular connection. For this purpose, libcurl holds a special
|
|
||||||
dummy 'closure_handle' SessionHandle in the Curl_multi struct to
|
|
||||||
|
|
||||||
FTP uses two TCP connections for a typical transfer but it keeps both in
|
|
||||||
this single struct and thus can be considered a single connection for most
|
|
||||||
internal concerns.
|
|
||||||
|
|
||||||
The libcurl source code generally use the name 'conn' for the variable that
|
|
||||||
points to the connectdata.
|
|
||||||
|
|
||||||
|
|
||||||
1.3 Curl_multi
|
|
||||||
|
|
||||||
Internally, the easy interface is implemented as a wrapper around multi
|
|
||||||
interface functions. This makes everything multi interface.
|
|
||||||
|
|
||||||
Curl_multi is the multi handle struct exposed as "CURLM *" in external APIs.
|
|
||||||
|
|
||||||
This struct holds a list of SessionHandle structs that have been added to
|
|
||||||
this handle with curl_multi_add_handle(). The start of the list is ->easyp
|
|
||||||
and ->num_easy is a counter of added SessionHandles.
|
|
||||||
|
|
||||||
->msglist is a linked list of messages to send back when
|
|
||||||
curl_multi_info_read() is called. Basically a node is added to that list
|
|
||||||
when an individual SessionHandle's transfer has completed.
|
|
||||||
|
|
||||||
->hostcache points to the name cache. It is a hash table for looking up name
|
|
||||||
to IP. The nodes have a limited life time in there and this cache is meant
|
|
||||||
to reduce the time for when the same name is wanted within a short period of
|
|
||||||
time.
|
|
||||||
|
|
||||||
->timetree points to a tree of SessionHandles, sorted by the remaining time
|
|
||||||
until it should be checked - normally some sort of timeout. Each
|
|
||||||
SessionHandle has one node in the tree.
|
|
||||||
|
|
||||||
->sockhash is a hash table to allow fast lookups of socket descriptor to
|
|
||||||
which SessionHandle that uses that descriptor. This is necessary for the
|
|
||||||
multi_socket API.
|
|
||||||
|
|
||||||
->conn_cache points to the connection cache. It keeps track of all
|
|
||||||
connections that are kept after use. The cache has a maximum size.
|
|
||||||
|
|
||||||
->closure_handle is described in the 'connectdata' section.
|
|
||||||
|
|
||||||
The libcurl source code generally use the name 'multi' for the variable that
|
|
||||||
points to the Curl_multi struct.
|
|
||||||
|
|
||||||
|
|
||||||
1.4 Curl_handler
|
|
||||||
|
|
||||||
Each unique protocol that is supported by libcurl needs to provide at least
|
|
||||||
one Curl_handler struct. It defines what the protocol is called and what
|
|
||||||
functions the main code should call to deal with protocol specific issues.
|
|
||||||
In general, there's a source file named [protocol].c in which there's a
|
|
||||||
"struct Curl_handler Curl_handler_[protocol]" declared. In url.c there's
|
|
||||||
then the main array with all individual Curl_handler structs pointed to from
|
|
||||||
a single array which is scanned through when a URL is given to libcurl to
|
|
||||||
work with.
|
|
||||||
|
|
||||||
->scheme is the URL scheme name, usually spelled out in uppercase. That's
|
|
||||||
"HTTP" or "FTP" etc. SSL versions of the protcol need its own Curl_handler
|
|
||||||
setup so HTTPS separate from HTTP.
|
|
||||||
|
|
||||||
->setup_connection is called to allow the protocol code to allocate protocol
|
|
||||||
specific data that then gets associated with that SessionHandle for the rest
|
|
||||||
of this transfer. It gets freed again at the end of the transfer. It will be
|
|
||||||
called before the 'connectdata' for the transfer has been selected/created.
|
|
||||||
Most protocols will allocate its private 'struct [PROTOCOL]' here and assign
|
|
||||||
SessionHandle->req.protop to point to it.
|
|
||||||
|
|
||||||
->connect_it allows a protocol to do some specific actions after the TCP
|
|
||||||
connect is done, that can still be considered part of the connection phase.
|
|
||||||
|
|
||||||
Some protocols will alter the connectdata->recv[] and connectdata->send[]
|
|
||||||
function pointers in this function.
|
|
||||||
|
|
||||||
->connecting is similarly a function that keeps getting called as long as the
|
|
||||||
protocol considers itself still in the connecting phase.
|
|
||||||
|
|
||||||
->do_it is the function called to issue the transfer request. What we call
|
|
||||||
the DO action internally. If the DO is not enough and things need to be kept
|
|
||||||
getting done for the entire DO sequence to complete, ->doing is then usually
|
|
||||||
also provided. Each protocol that needs to do multiple commands or similar
|
|
||||||
for do/doing need to implement their own state machines (see SCP, SFTP,
|
|
||||||
FTP). Some protocols (only FTP and only due to historical reasons) has a
|
|
||||||
separate piece of the DO state called DO_MORE.
|
|
||||||
|
|
||||||
->doing keeps getting called while issuing the transfer request command(s)
|
|
||||||
|
|
||||||
->done gets called when the transfer is complete and DONE. That's after the
|
|
||||||
main data has been transferred.
|
|
||||||
|
|
||||||
->do_more gets called during the DO_MORE state. The FTP protocol uses this
|
|
||||||
state when setting up the second connection.
|
|
||||||
|
|
||||||
->proto_getsock
|
|
||||||
->doing_getsock
|
|
||||||
->domore_getsock
|
|
||||||
->perform_getsock
|
|
||||||
Functions that return socket information. Which socket(s) to wait for which
|
|
||||||
action(s) during the particular multi state.
|
|
||||||
|
|
||||||
->disconnect is called immediately before the TCP connection is shutdown.
|
|
||||||
|
|
||||||
->readwrite gets called during transfer to allow the protocol to do extra
|
|
||||||
reads/writes
|
|
||||||
|
|
||||||
->defport is the default report TCP or UDP port this protocol uses
|
|
||||||
|
|
||||||
->protocol is one or more bits in the CURLPROTO_* set. The SSL versions have
|
|
||||||
their "base" protocol set and then the SSL variation. Like "HTTP|HTTPS".
|
|
||||||
|
|
||||||
->flags is a bitmask with additional information about the protocol that will
|
|
||||||
make it get treated differently by the generic engine:
|
|
||||||
|
|
||||||
PROTOPT_SSL - will make it connect and negotiate SSL
|
|
||||||
|
|
||||||
PROTOPT_DUAL - this protocol uses two connections
|
|
||||||
|
|
||||||
PROTOPT_CLOSEACTION - this protocol has actions to do before closing the
|
|
||||||
connection. This flag is no longer used by code, yet still set for a bunch
|
|
||||||
protocol handlers.
|
|
||||||
|
|
||||||
PROTOPT_DIRLOCK - "direction lock". The SSH protocols set this bit to
|
|
||||||
limit which "direction" of socket actions that the main engine will
|
|
||||||
concern itself about.
|
|
||||||
|
|
||||||
PROTOPT_NONETWORK - a protocol that doesn't use network (read file:)
|
|
||||||
|
|
||||||
PROTOPT_NEEDSPWD - this protocol needs a password and will use a default
|
|
||||||
one unless one is provided
|
|
||||||
|
|
||||||
PROTOPT_NOURLQUERY - this protocol can't handle a query part on the URL
|
|
||||||
(?foo=bar)
|
|
||||||
|
|
||||||
|
|
||||||
1.5 conncache
|
|
||||||
|
|
||||||
Is a hash table with connections for later re-use. Each SessionHandle has
|
|
||||||
a pointer to its connection cache. Each multi handle sets up a connection
|
|
||||||
cache that all added SessionHandles share by default.
|
|
||||||
|
|
||||||
|
|
||||||
1.6 Curl_share
|
|
||||||
|
|
||||||
The libcurl share API allocates a Curl_share struct, exposed to the external
|
|
||||||
API as "CURLSH *".
|
|
||||||
|
|
||||||
The idea is that the struct can have a set of own versions of caches and
|
|
||||||
pools and then by providing this struct in the CURLOPT_SHARE option, those
|
|
||||||
specific SessionHandles will use the caches/pools that this share handle
|
|
||||||
holds.
|
|
||||||
|
|
||||||
Then individual SessionHandle structs can be made to share specific things
|
|
||||||
that they otherwise wouldn't, such as cookies.
|
|
||||||
|
|
||||||
The Curl_share struct can currently hold cookies, DNS cache and the SSL
|
|
||||||
session cache.
|
|
||||||
|
|
||||||
|
|
||||||
1.7 CookieInfo
|
|
||||||
|
|
||||||
This is the main cookie struct. It holds all known cookies and related
|
|
||||||
information. Each SessionHandle has its own private CookieInfo even when
|
|
||||||
they are added to a multi handle. They can be made to share cookies by using
|
|
||||||
the share API.
|
|
@@ -23,29 +23,29 @@ libcurl http://curl.haxx.se/docs/copyright.html
|
|||||||
Uses an MIT (or Modified BSD)-style license that is as liberal as
|
Uses an MIT (or Modified BSD)-style license that is as liberal as
|
||||||
possible.
|
possible.
|
||||||
|
|
||||||
OpenSSL http://www.openssl.org/source/license.html
|
OpenSSL https://www.openssl.org/source/license.html
|
||||||
|
|
||||||
(May be used for SSL/TLS support) Uses an Original BSD-style license
|
(May be used for SSL/TLS support) Uses an Original BSD-style license
|
||||||
with an announcement clause that makes it "incompatible" with GPL. You
|
with an announcement clause that makes it "incompatible" with GPL. You
|
||||||
are not allowed to ship binaries that link with OpenSSL that includes
|
are not allowed to ship binaries that link with OpenSSL that includes
|
||||||
GPL code (unless that specific GPL code includes an exception for
|
GPL code (unless that specific GPL code includes an exception for
|
||||||
OpenSSL - a habit that is growing more and more common). If OpenSSL's
|
OpenSSL - a habit that is growing more and more common). If OpenSSL's
|
||||||
licensing is a problem for you, consider using GnuTLS or yassl
|
licensing is a problem for you, consider using another TLS library.
|
||||||
instead.
|
|
||||||
|
|
||||||
GnuTLS http://www.gnutls.org/
|
GnuTLS http://www.gnutls.org/
|
||||||
|
|
||||||
(May be used for SSL/TLS support) Uses the LGPL[3] license. If this is
|
(May be used for SSL/TLS support) Uses the LGPL[3] license. If this is
|
||||||
a problem for you, consider using OpenSSL instead. Also note that
|
a problem for you, consider using another TLS library. Also note that
|
||||||
GnuTLS itself depends on and uses other libs (libgcrypt and
|
GnuTLS itself depends on and uses other libs (libgcrypt and
|
||||||
libgpg-error) and they too are LGPL- or GPL-licensed.
|
libgpg-error) and they too are LGPL- or GPL-licensed.
|
||||||
|
|
||||||
yassl http://www.yassl.com/
|
WolfSSL https://www.wolfssl.com/
|
||||||
|
|
||||||
(May be used for SSL/TLS support) Uses the GPL[1] license. If this is
|
(May be used for SSL/TLS support) Uses the GPL[1] license or a
|
||||||
a problem for you, consider using OpenSSL or GnuTLS instead.
|
propietary license. If this is a problem for you, consider using
|
||||||
|
another TLS library.
|
||||||
|
|
||||||
NSS http://www.mozilla.org/projects/security/pki/nss/
|
NSS https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS
|
||||||
|
|
||||||
(May be used for SSL/TLS support) Is covered by the MPL[4] license,
|
(May be used for SSL/TLS support) Is covered by the MPL[4] license,
|
||||||
the GPL[1] license and the LGPL[3] license. You may choose to license
|
the GPL[1] license and the LGPL[3] license. You may choose to license
|
||||||
@@ -57,13 +57,29 @@ axTLS http://axtls.sourceforge.net/
|
|||||||
|
|
||||||
(May be used for SSL/TLS support) Uses a Modified BSD-style license.
|
(May be used for SSL/TLS support) Uses a Modified BSD-style license.
|
||||||
|
|
||||||
|
mbedTLS https://tls.mbed.org/
|
||||||
|
|
||||||
|
(May be used for SSL/TLS support) Uses the GPL[1] license or a
|
||||||
|
propietary license. If this is a problem for you, consider using
|
||||||
|
another TLS library.
|
||||||
|
|
||||||
|
BoringSSL https://boringssl.googlesource.com/
|
||||||
|
|
||||||
|
(May be used for SSL/TLS support) As an OpenSSL fork, it has the same
|
||||||
|
license as that.
|
||||||
|
|
||||||
|
libressl http://www.libressl.org/
|
||||||
|
|
||||||
|
(May be used for SSL/TLS support) As an OpenSSL fork, it has the same
|
||||||
|
license as that.
|
||||||
|
|
||||||
c-ares http://daniel.haxx.se/projects/c-ares/license.html
|
c-ares http://daniel.haxx.se/projects/c-ares/license.html
|
||||||
|
|
||||||
(Used for asynchronous name resolves) Uses an MIT license that is very
|
(Used for asynchronous name resolves) Uses an MIT license that is very
|
||||||
liberal and imposes no restrictions on any other library or part you
|
liberal and imposes no restrictions on any other library or part you
|
||||||
may link with.
|
may link with.
|
||||||
|
|
||||||
zlib http://www.gzip.org/zlib/zlib_license.html
|
zlib http://www.zlib.net/zlib_license.html
|
||||||
|
|
||||||
(Used for compressed Transfer-Encoding support) Uses an MIT-style
|
(Used for compressed Transfer-Encoding support) Uses an MIT-style
|
||||||
license that shouldn't collide with any other library.
|
license that shouldn't collide with any other library.
|
||||||
@@ -73,12 +89,12 @@ MIT Kerberos http://web.mit.edu/kerberos/www/dist/
|
|||||||
(May be used for GSS support) MIT licensed, that shouldn't collide
|
(May be used for GSS support) MIT licensed, that shouldn't collide
|
||||||
with any other parts.
|
with any other parts.
|
||||||
|
|
||||||
Heimdal http://www.pdc.kth.se/heimdal/
|
Heimdal http://www.h5l.org
|
||||||
|
|
||||||
(May be used for GSS support) Heimdal is Original BSD licensed with
|
(May be used for GSS support) Heimdal is Original BSD licensed with
|
||||||
the announcement clause.
|
the announcement clause.
|
||||||
|
|
||||||
GNU GSS http://www.gnu.org/software/gss/
|
GNU GSS https://www.gnu.org/software/gss/
|
||||||
|
|
||||||
(May be used for GSS support) GNU GSS is GPL licensed. Note that you
|
(May be used for GSS support) GNU GSS is GPL licensed. Note that you
|
||||||
may not distribute binary curl packages that uses this if you build
|
may not distribute binary curl packages that uses this if you build
|
||||||
@@ -105,10 +121,10 @@ libssh2 http://www.libssh2.org/
|
|||||||
(Used for scp and sftp support) libssh2 uses a Modified BSD-style
|
(Used for scp and sftp support) libssh2 uses a Modified BSD-style
|
||||||
license.
|
license.
|
||||||
|
|
||||||
[1] = GPL - GNU General Public License: http://www.gnu.org/licenses/gpl.html
|
[1] = GPL - GNU General Public License: https://www.gnu.org/licenses/gpl.html
|
||||||
[2] = http://www.fsf.org/licenses/gpl-faq.html#GPLIncompatibleLibs details on
|
[2] = https://www.gnu.org/licenses/gpl-faq.html#GPLIncompatibleLibs details on
|
||||||
how to write such an exception to the GPL
|
how to write such an exception to the GPL
|
||||||
[3] = LGPL - GNU Lesser General Public License:
|
[3] = LGPL - GNU Lesser General Public License:
|
||||||
http://www.gnu.org/licenses/lgpl.html
|
https://www.gnu.org/licenses/lgpl.html
|
||||||
[4] = MPL - Mozilla Public License:
|
[4] = MPL - Mozilla Public License:
|
||||||
http://www.mozilla.org/MPL/
|
https://www.mozilla.org/MPL/
|
||||||
|
@@ -230,7 +230,7 @@ MAIL ETIQUETTE
|
|||||||
Quote as little as possible. Just enough to provide the context you cannot
|
Quote as little as possible. Just enough to provide the context you cannot
|
||||||
leave out. A lengthy description can be found here:
|
leave out. A lengthy description can be found here:
|
||||||
|
|
||||||
http://www.netmeister.org/news/learn2quote.html
|
https://www.netmeister.org/news/learn2quote.html
|
||||||
|
|
||||||
2.7 Digest
|
2.7 Digest
|
||||||
|
|
||||||
|
@@ -470,8 +470,8 @@ COOKIES
|
|||||||
stored cookies which match the request as it follows the location. The
|
stored cookies which match the request as it follows the location. The
|
||||||
file "empty.txt" may be a nonexistent file.
|
file "empty.txt" may be a nonexistent file.
|
||||||
|
|
||||||
Alas, to both read and write cookies from a netscape cookie file, you can
|
To read and write cookies from a netscape cookie file, you can set both -b
|
||||||
set both -b and -c to use the same file:
|
and -c to use the same file:
|
||||||
|
|
||||||
curl -b cookies.txt -c cookies.txt www.example.com
|
curl -b cookies.txt -c cookies.txt www.example.com
|
||||||
|
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
# | (__| |_| | _ <| |___
|
# | (__| |_| | _ <| |___
|
||||||
# \___|\___/|_| \_\_____|
|
# \___|\___/|_| \_\_____|
|
||||||
#
|
#
|
||||||
# Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
# Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
#
|
#
|
||||||
# This software is licensed as described in the file COPYING, which
|
# This software is licensed as described in the file COPYING, which
|
||||||
# you should have received as part of this distribution. The terms
|
# you should have received as part of this distribution. The terms
|
||||||
@@ -37,8 +37,8 @@ EXTRA_DIST = MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS SSLCERTS \
|
|||||||
README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS VERSIONS \
|
README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS VERSIONS \
|
||||||
KNOWN_BUGS BINDINGS $(man_MANS) $(HTMLPAGES) HISTORY INSTALL \
|
KNOWN_BUGS BINDINGS $(man_MANS) $(HTMLPAGES) HISTORY INSTALL \
|
||||||
$(PDFPAGES) LICENSE-MIXING README.netware DISTRO-DILEMMA INSTALL.devcpp \
|
$(PDFPAGES) LICENSE-MIXING README.netware DISTRO-DILEMMA INSTALL.devcpp \
|
||||||
MAIL-ETIQUETTE HTTP-COOKIES LIBCURL-STRUCTS SECURITY RELEASE-PROCEDURE \
|
MAIL-ETIQUETTE HTTP-COOKIES SECURITY RELEASE-PROCEDURE \
|
||||||
SSL-PROBLEMS
|
SSL-PROBLEMS HTTP2.md ROADMAP.md
|
||||||
|
|
||||||
MAN2HTML= roffit < $< >$@
|
MAN2HTML= roffit < $< >$@
|
||||||
|
|
||||||
|
@@ -1,9 +1,3 @@
|
|||||||
_ _ ____ _
|
|
||||||
___| | | | _ \| |
|
|
||||||
/ __| | | | |_) | |
|
|
||||||
| (__| |_| | _ <| |___
|
|
||||||
\___|\___/|_| \_\_____|
|
|
||||||
|
|
||||||
curl release procedure - how to do a release
|
curl release procedure - how to do a release
|
||||||
============================================
|
============================================
|
||||||
|
|
||||||
@@ -84,12 +78,12 @@ Coming dates
|
|||||||
Based on the description above, here are some planned release dates (at the
|
Based on the description above, here are some planned release dates (at the
|
||||||
time of this writing):
|
time of this writing):
|
||||||
|
|
||||||
- February 25, 2015 (version 7.41.0)
|
- June 17, 2015 (version 7.43.0)
|
||||||
- April 22, 2015
|
|
||||||
- June 17, 2015
|
|
||||||
- August 12, 2015
|
- August 12, 2015
|
||||||
- October 7, 2015
|
- October 7, 2015
|
||||||
- December 2, 2015
|
- December 2, 2015
|
||||||
- January 27, 2016
|
- January 27, 2016
|
||||||
- March 23, 2016
|
- March 23, 2016
|
||||||
- May 18, 2016
|
- May 18, 2016
|
||||||
|
- July 13, 2016
|
||||||
|
- September 7, 2016
|
||||||
|
@@ -5,44 +5,100 @@ Roadmap of things Daniel Stenberg and Steve Holme want to work on next. It is
|
|||||||
intended to serve as a guideline for others for information, feedback and
|
intended to serve as a guideline for others for information, feedback and
|
||||||
possible participation.
|
possible participation.
|
||||||
|
|
||||||
New stuff - libcurl
|
HTTP/2
|
||||||
-------------------
|
------
|
||||||
|
|
||||||
1. HTTP/2
|
|
||||||
|
|
||||||
- test suite
|
- test suite
|
||||||
- http2 multiplexing/pipelining
|
|
||||||
|
Base this on existing nghttp2 server to start with to make functional
|
||||||
|
tests. Later on we can adopt that code or work with nghttp2 to provide ways
|
||||||
|
to have the http2 server respond with broken responses to make sure we deal
|
||||||
|
with that nicely as well.
|
||||||
|
|
||||||
|
To decide: if we need to bundle parts of the nghttp2 stuff that probably
|
||||||
|
won't be shipped by many distros.
|
||||||
|
|
||||||
|
- stream properties API
|
||||||
|
|
||||||
|
Provide options for setting priorities and dependencies among the streams
|
||||||
|
(easy handles). They are mostly information set for the stream and sent to
|
||||||
|
the server so we don't have to add much logic for this.
|
||||||
|
|
||||||
|
- server push
|
||||||
|
|
||||||
|
Not exactly clear exactly how to support this API-wise, but by adding
|
||||||
|
handles without asking for a resource it could be a way to be prepared to
|
||||||
|
receive pushes in case such are sent. We probably need it to still specify
|
||||||
|
a URL with host name, port etc but we probably need a special option to
|
||||||
|
tell libcurl it is for server push purposes.
|
||||||
|
|
||||||
- provide option for HTTP/2 "prior knowledge" over clear text
|
- provide option for HTTP/2 "prior knowledge" over clear text
|
||||||
|
|
||||||
|
As it would avoid the roundtrip-heavy Upgrade: procedures when you _know_
|
||||||
|
it speaks HTTP/2.
|
||||||
|
|
||||||
- provide option to allow curl to default to HTTP/2 only when using HTTPS
|
- provide option to allow curl to default to HTTP/2 only when using HTTPS
|
||||||
|
|
||||||
2. SRV records
|
We could switch on HTTP/2 by-default for HTTPS quite easily and it
|
||||||
|
shouldn't hurt anyone, while HTTP/2 for HTTP by default could introduce
|
||||||
|
lots of Upgrade: roundtrips that users won't like. So a separated option
|
||||||
|
alternative makes sense.
|
||||||
|
|
||||||
3. HTTPS to proxy
|
SRV records
|
||||||
|
-----------
|
||||||
|
|
||||||
4. make sure there's an easy handle passed in to `curl_formadd()`,
|
How to find services for specific domains/hosts.
|
||||||
|
|
||||||
|
HTTPS to proxy
|
||||||
|
--------------
|
||||||
|
|
||||||
|
To avoid network traffic to/from the proxy getting snooped on.
|
||||||
|
|
||||||
|
curl_formadd()
|
||||||
|
--------------
|
||||||
|
|
||||||
|
make sure there's an easy handle passed in to `curl_formadd()`,
|
||||||
`curl_formget()` and `curl_formfree()` by adding replacement functions and
|
`curl_formget()` and `curl_formfree()` by adding replacement functions and
|
||||||
deprecating the old ones to allow custom mallocs and more
|
deprecating the old ones to allow custom mallocs and more
|
||||||
|
|
||||||
5. add support for third-party SASL libraries such as Cyrus SASL - may need to
|
third-party SASL
|
||||||
|
----------------
|
||||||
|
|
||||||
|
add support for third-party SASL libraries such as Cyrus SASL - may need to
|
||||||
move existing native and SSPI based authentication into vsasl folder after
|
move existing native and SSPI based authentication into vsasl folder after
|
||||||
reworking HTTP and SASL code
|
reworking HTTP and SASL code
|
||||||
|
|
||||||
6. SASL authentication in LDAP
|
SASL authentication in LDAP
|
||||||
|
---------------------------
|
||||||
|
|
||||||
7. Simplify the SMTP email interface so that programmers don't have to
|
...
|
||||||
|
|
||||||
|
Simplify the SMTP email
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
Simplify the SMTP email interface so that programmers don't have to
|
||||||
construct the body of an email that contains all the headers, alternative
|
construct the body of an email that contains all the headers, alternative
|
||||||
content, images and attachments - maintain raw interface so that
|
content, images and attachments - maintain raw interface so that
|
||||||
programmers that want to do this can
|
programmers that want to do this can
|
||||||
|
|
||||||
8. Allow the email protocols to return the capabilities before
|
email capabilities
|
||||||
|
------------------
|
||||||
|
|
||||||
|
Allow the email protocols to return the capabilities before
|
||||||
authenticating. This will allow an application to decide on the best
|
authenticating. This will allow an application to decide on the best
|
||||||
authentication mechanism
|
authentication mechanism
|
||||||
|
|
||||||
9. Allow Windows threading model to be replaced by Win32 pthreads port
|
Win32 pthreads
|
||||||
|
--------------
|
||||||
|
|
||||||
10. Implement a dynamic buffer size to allow SFTP to use much larger buffers
|
Allow Windows threading model to be replaced by Win32 pthreads port
|
||||||
and possibly allow the size to be customizable by applications. Use less
|
|
||||||
memory when handles are not in use?
|
dynamic buffer size
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
Implement a dynamic buffer size to allow SFTP to use much larger buffers and
|
||||||
|
possibly allow the size to be customizable by applications. Use less memory
|
||||||
|
when handles are not in use?
|
||||||
|
|
||||||
New stuff - curl
|
New stuff - curl
|
||||||
----------------
|
----------------
|
||||||
|
@@ -53,7 +53,7 @@ SSL ciphers
|
|||||||
|
|
||||||
References:
|
References:
|
||||||
|
|
||||||
http://tools.ietf.org/html/draft-popov-tls-prohibiting-rc4-01
|
https://tools.ietf.org/html/draft-popov-tls-prohibiting-rc4-01
|
||||||
|
|
||||||
Allow BEAST
|
Allow BEAST
|
||||||
|
|
||||||
|
26
docs/THANKS
26
docs/THANKS
@@ -36,6 +36,8 @@ Alex Suykov
|
|||||||
Alex Vinnik
|
Alex Vinnik
|
||||||
Alex aka WindEagle
|
Alex aka WindEagle
|
||||||
Alexander Beedie
|
Alexander Beedie
|
||||||
|
Alexander Dyagilev
|
||||||
|
Alexander Elgert
|
||||||
Alexander Klauer
|
Alexander Klauer
|
||||||
Alexander Kourakos
|
Alexander Kourakos
|
||||||
Alexander Krasnostavsky
|
Alexander Krasnostavsky
|
||||||
@@ -54,6 +56,7 @@ Alona Rossen
|
|||||||
Amol Pattekar
|
Amol Pattekar
|
||||||
Amr Shahin
|
Amr Shahin
|
||||||
Anatoli Tubman
|
Anatoli Tubman
|
||||||
|
Anders Bakken
|
||||||
Anders Gustafsson
|
Anders Gustafsson
|
||||||
Anders Havn
|
Anders Havn
|
||||||
Andi Jahja
|
Andi Jahja
|
||||||
@@ -89,6 +92,7 @@ Andy Serpa
|
|||||||
Andy Tsouladze
|
Andy Tsouladze
|
||||||
Angus Mackay
|
Angus Mackay
|
||||||
Anthon Pang
|
Anthon Pang
|
||||||
|
Anthony Avina
|
||||||
Anthony Bryan
|
Anthony Bryan
|
||||||
Anthony G. Basile
|
Anthony G. Basile
|
||||||
Antoine Calando
|
Antoine Calando
|
||||||
@@ -103,6 +107,7 @@ Arnaud Ebalard
|
|||||||
Arthur Murray
|
Arthur Murray
|
||||||
Arve Knudsen
|
Arve Knudsen
|
||||||
Arvid Norberg
|
Arvid Norberg
|
||||||
|
Ashish Shukla
|
||||||
Ask Bjørn Hansen
|
Ask Bjørn Hansen
|
||||||
Askar Safin
|
Askar Safin
|
||||||
Ates Goral
|
Ates Goral
|
||||||
@@ -130,6 +135,7 @@ Benoit Neil
|
|||||||
Benoit Sigoure
|
Benoit Sigoure
|
||||||
Bernard Leak
|
Bernard Leak
|
||||||
Bernhard Reutner-Fischer
|
Bernhard Reutner-Fischer
|
||||||
|
Bert Huijben
|
||||||
Bertrand Demiddelaer
|
Bertrand Demiddelaer
|
||||||
Bill Doyle
|
Bill Doyle
|
||||||
Bill Egert
|
Bill Egert
|
||||||
@@ -156,8 +162,10 @@ Brandon Wang
|
|||||||
Brendan Jurd
|
Brendan Jurd
|
||||||
Brent Beardsley
|
Brent Beardsley
|
||||||
Brian Akins
|
Brian Akins
|
||||||
|
Brian Chrisman
|
||||||
Brian Dessent
|
Brian Dessent
|
||||||
Brian J. Murrell
|
Brian J. Murrell
|
||||||
|
Brian Prodoehl
|
||||||
Brian R Duffy
|
Brian R Duffy
|
||||||
Brian Ulm
|
Brian Ulm
|
||||||
Brock Noland
|
Brock Noland
|
||||||
@@ -181,6 +189,7 @@ Charles Romestant
|
|||||||
Chen Prog
|
Chen Prog
|
||||||
Chih-Chung Chang
|
Chih-Chung Chang
|
||||||
Chris "Bob Bob"
|
Chris "Bob Bob"
|
||||||
|
Chris Araman
|
||||||
Chris Combes
|
Chris Combes
|
||||||
Chris Conlon
|
Chris Conlon
|
||||||
Chris Deidun
|
Chris Deidun
|
||||||
@@ -244,6 +253,7 @@ Daniel Black
|
|||||||
Daniel Cater
|
Daniel Cater
|
||||||
Daniel Egger
|
Daniel Egger
|
||||||
Daniel Johnson
|
Daniel Johnson
|
||||||
|
Daniel Melani
|
||||||
Daniel Mentz
|
Daniel Mentz
|
||||||
Daniel Steinberg
|
Daniel Steinberg
|
||||||
Daniel Stenberg
|
Daniel Stenberg
|
||||||
@@ -305,6 +315,7 @@ Dirk Manske
|
|||||||
Dmitri Shubin
|
Dmitri Shubin
|
||||||
Dmitriy Sergeyev
|
Dmitriy Sergeyev
|
||||||
Dmitry Bartsevich
|
Dmitry Bartsevich
|
||||||
|
Dmitry Eremin-Solenikov
|
||||||
Dmitry Falko
|
Dmitry Falko
|
||||||
Dmitry Kurochkin
|
Dmitry Kurochkin
|
||||||
Dmitry Popov
|
Dmitry Popov
|
||||||
@@ -320,6 +331,7 @@ Douglas Kilpatrick
|
|||||||
Douglas R. Horner
|
Douglas R. Horner
|
||||||
Douglas Steinwand
|
Douglas Steinwand
|
||||||
Dov Murik
|
Dov Murik
|
||||||
|
Drake Arconis
|
||||||
Duane Cathey
|
Duane Cathey
|
||||||
Duncan Mac-Vicar Prett
|
Duncan Mac-Vicar Prett
|
||||||
Dustin Boswell
|
Dustin Boswell
|
||||||
@@ -334,6 +346,7 @@ Edward Rudd
|
|||||||
Edward Sheldrake
|
Edward Sheldrake
|
||||||
Eelco Dolstra
|
Eelco Dolstra
|
||||||
Eetu Ojanen
|
Eetu Ojanen
|
||||||
|
Egon Eckert
|
||||||
Eldar Zaitov
|
Eldar Zaitov
|
||||||
Ellis Pritchard
|
Ellis Pritchard
|
||||||
Elmira A Semenova
|
Elmira A Semenova
|
||||||
@@ -389,6 +402,7 @@ François Charlier
|
|||||||
Fred Machado
|
Fred Machado
|
||||||
Fred New
|
Fred New
|
||||||
Fred Noz
|
Fred Noz
|
||||||
|
Fred Stluka
|
||||||
Frederic Lepied
|
Frederic Lepied
|
||||||
Fredrik Thulin
|
Fredrik Thulin
|
||||||
Gabriel Kuri
|
Gabriel Kuri
|
||||||
@@ -426,6 +440,7 @@ Glenn Sheridan
|
|||||||
Gordon Marler
|
Gordon Marler
|
||||||
Gorilla Maguila
|
Gorilla Maguila
|
||||||
Grant Erickson
|
Grant Erickson
|
||||||
|
Grant Pannell
|
||||||
Greg Hewgill
|
Greg Hewgill
|
||||||
Greg Morse
|
Greg Morse
|
||||||
Greg Onufer
|
Greg Onufer
|
||||||
@@ -539,6 +554,7 @@ Jeff Lawson
|
|||||||
Jeff Phillips
|
Jeff Phillips
|
||||||
Jeff Pohlmeyer
|
Jeff Pohlmeyer
|
||||||
Jeff Weber
|
Jeff Weber
|
||||||
|
Jens Rantil
|
||||||
Jeremy Friesner
|
Jeremy Friesner
|
||||||
Jeremy Huddleston
|
Jeremy Huddleston
|
||||||
Jeremy Lin
|
Jeremy Lin
|
||||||
@@ -566,6 +582,7 @@ Joe Halpin
|
|||||||
Joe Malicki
|
Joe Malicki
|
||||||
Joe Mason
|
Joe Mason
|
||||||
Joel Chen
|
Joel Chen
|
||||||
|
Joel Depooter
|
||||||
Jofell Gallardo
|
Jofell Gallardo
|
||||||
Johan Anderson
|
Johan Anderson
|
||||||
Johan Lantz
|
Johan Lantz
|
||||||
@@ -704,6 +721,7 @@ Lindley French
|
|||||||
Ling Thio
|
Ling Thio
|
||||||
Linus Nielsen Feltzing
|
Linus Nielsen Feltzing
|
||||||
Lisa Xu
|
Lisa Xu
|
||||||
|
Liviu Chircu
|
||||||
Liza Alenchery
|
Liza Alenchery
|
||||||
Lluís Batlle i Rossell
|
Lluís Batlle i Rossell
|
||||||
Loic Dachary
|
Loic Dachary
|
||||||
@@ -885,7 +903,9 @@ Oliver Gondža
|
|||||||
Oliver Kuckertz
|
Oliver Kuckertz
|
||||||
Oliver Schindler
|
Oliver Schindler
|
||||||
Olivier Berger
|
Olivier Berger
|
||||||
|
Oren Souroujon
|
||||||
Oren Tirosh
|
Oren Tirosh
|
||||||
|
Orgad Shaneh
|
||||||
Ori Avtalion
|
Ori Avtalion
|
||||||
Oscar Koeroo
|
Oscar Koeroo
|
||||||
Oscar Norlander
|
Oscar Norlander
|
||||||
@@ -901,6 +921,7 @@ Patricia Muscalu
|
|||||||
Patrick Bihan-Faou
|
Patrick Bihan-Faou
|
||||||
Patrick McManus
|
Patrick McManus
|
||||||
Patrick Monnerat
|
Patrick Monnerat
|
||||||
|
Patrick Rapin
|
||||||
Patrick Scott
|
Patrick Scott
|
||||||
Patrick Smith
|
Patrick Smith
|
||||||
Patrick Watson
|
Patrick Watson
|
||||||
@@ -913,6 +934,7 @@ Paul Marks
|
|||||||
Paul Marquis
|
Paul Marquis
|
||||||
Paul Moore
|
Paul Moore
|
||||||
Paul Nolan
|
Paul Nolan
|
||||||
|
Paul Oliver
|
||||||
Paul Querna
|
Paul Querna
|
||||||
Paul Saab
|
Paul Saab
|
||||||
Pavel Cenek
|
Pavel Cenek
|
||||||
@@ -970,6 +992,7 @@ Quinn Slack
|
|||||||
Radu Simionescu
|
Radu Simionescu
|
||||||
Rafa Muyo
|
Rafa Muyo
|
||||||
Rafael Sagula
|
Rafael Sagula
|
||||||
|
Rafayel Mkrtchyan
|
||||||
Rafaël Carré
|
Rafaël Carré
|
||||||
Rainer Canavan
|
Rainer Canavan
|
||||||
Rainer Jung
|
Rainer Jung
|
||||||
@@ -1073,6 +1096,7 @@ Scott Barrett
|
|||||||
Scott Cantor
|
Scott Cantor
|
||||||
Scott Davis
|
Scott Davis
|
||||||
Scott McCreary
|
Scott McCreary
|
||||||
|
Sean Boudreau
|
||||||
Sebastian Rasmussen
|
Sebastian Rasmussen
|
||||||
Senthil Raja Velu
|
Senthil Raja Velu
|
||||||
Sergei Nikulov
|
Sergei Nikulov
|
||||||
@@ -1188,6 +1212,7 @@ Tomas Hoger
|
|||||||
Tomas Mlcoch
|
Tomas Mlcoch
|
||||||
Tomas Pospisek
|
Tomas Pospisek
|
||||||
Tomas Szepe
|
Tomas Szepe
|
||||||
|
Tomas Tomecek
|
||||||
Tomasz Kojm
|
Tomasz Kojm
|
||||||
Tomasz Lacki
|
Tomasz Lacki
|
||||||
Tommie Gannert
|
Tommie Gannert
|
||||||
@@ -1215,6 +1240,7 @@ Victor Snezhko
|
|||||||
Vijay Panghal
|
Vijay Panghal
|
||||||
Vikram Saxena
|
Vikram Saxena
|
||||||
Viktor Szakáts
|
Viktor Szakáts
|
||||||
|
Ville Skyttä
|
||||||
Vilmos Nebehaj
|
Vilmos Nebehaj
|
||||||
Vincent Bronner
|
Vincent Bronner
|
||||||
Vincent Le Normand
|
Vincent Le Normand
|
||||||
|
@@ -49,3 +49,4 @@ s/tetetest tetetest//
|
|||||||
s/Jiří Hruška/Jiri Hruska/
|
s/Jiří Hruška/Jiri Hruska/
|
||||||
s/Viktor Szakats/Viktor Szakáts/
|
s/Viktor Szakats/Viktor Szakáts/
|
||||||
s/Jonathan Cardoso/Jonathan Cardoso Machado/
|
s/Jonathan Cardoso/Jonathan Cardoso Machado/
|
||||||
|
s/Linus Nielsen/Linus Nielsen Feltzing/
|
||||||
|
30
docs/TODO
30
docs/TODO
@@ -25,6 +25,7 @@
|
|||||||
1.7 Detect when called from within callbacks
|
1.7 Detect when called from within callbacks
|
||||||
1.8 Allow SSL (HTTPS) to proxy
|
1.8 Allow SSL (HTTPS) to proxy
|
||||||
1.9 Cache negative name resolves
|
1.9 Cache negative name resolves
|
||||||
|
1.10 Support IDNA2008
|
||||||
|
|
||||||
2. libcurl - multi interface
|
2. libcurl - multi interface
|
||||||
2.1 More non-blocking
|
2.1 More non-blocking
|
||||||
@@ -49,6 +50,7 @@
|
|||||||
5.3 Rearrange request header order
|
5.3 Rearrange request header order
|
||||||
5.4 SPDY
|
5.4 SPDY
|
||||||
5.5 auth= in URLs
|
5.5 auth= in URLs
|
||||||
|
5.6 Refuse "downgrade" redirects
|
||||||
|
|
||||||
6. TELNET
|
6. TELNET
|
||||||
6.1 ditch stdin
|
6.1 ditch stdin
|
||||||
@@ -207,7 +209,7 @@
|
|||||||
|
|
||||||
To prevent local users from snooping on your traffic to the proxy. Supported
|
To prevent local users from snooping on your traffic to the proxy. Supported
|
||||||
by Chrome already:
|
by Chrome already:
|
||||||
http://www.chromium.org/developers/design-documents/secure-web-proxy
|
https://www.chromium.org/developers/design-documents/secure-web-proxy
|
||||||
|
|
||||||
...and by Firefox soon:
|
...and by Firefox soon:
|
||||||
https://bugzilla.mozilla.org/show_bug.cgi?id=378637
|
https://bugzilla.mozilla.org/show_bug.cgi?id=378637
|
||||||
@@ -217,6 +219,12 @@
|
|||||||
A name resolve that has failed is likely to fail when made again within a
|
A name resolve that has failed is likely to fail when made again within a
|
||||||
short period of time. Currently we only cache positive responses.
|
short period of time. Currently we only cache positive responses.
|
||||||
|
|
||||||
|
1.10 Support IDNA2008
|
||||||
|
|
||||||
|
International Domain Names are supported in libcurl since years back, powered
|
||||||
|
by libidn. libidn implements IDNA2003 which has been superseded by IDNA2008.
|
||||||
|
libidn2 is an existing library offering support for IDNA2008.
|
||||||
|
|
||||||
|
|
||||||
2. libcurl - multi interface
|
2. libcurl - multi interface
|
||||||
|
|
||||||
@@ -264,7 +272,7 @@
|
|||||||
HOST is a command for a client to tell which host name to use, to offer FTP
|
HOST is a command for a client to tell which host name to use, to offer FTP
|
||||||
servers named-based virtual hosting:
|
servers named-based virtual hosting:
|
||||||
|
|
||||||
http://tools.ietf.org/html/rfc7151
|
https://tools.ietf.org/html/rfc7151
|
||||||
|
|
||||||
4.2 Alter passive/active on failure and retry
|
4.2 Alter passive/active on failure and retry
|
||||||
|
|
||||||
@@ -348,6 +356,14 @@ This is not detailed in any FTP specification.
|
|||||||
|
|
||||||
Additionally this should be implemented for proxy base URLs as well.
|
Additionally this should be implemented for proxy base URLs as well.
|
||||||
|
|
||||||
|
5.6 Refuse "downgrade" redirects
|
||||||
|
|
||||||
|
See https://github.com/bagder/curl/issues/226
|
||||||
|
|
||||||
|
Consider a way to tell curl to refuse to "downgrade" protocol with a redirect
|
||||||
|
and/or possibly a bit that refuses redirect to change protocol completely.
|
||||||
|
|
||||||
|
|
||||||
6. TELNET
|
6. TELNET
|
||||||
|
|
||||||
6.1 ditch stdin
|
6.1 ditch stdin
|
||||||
@@ -420,7 +436,7 @@ be the same as/similar to FTP.
|
|||||||
|
|
||||||
11.2 Honor file timestamps
|
11.2 Honor file timestamps
|
||||||
|
|
||||||
The timestamp of the transfered file should reflect that of the original file.
|
The timestamp of the transferred file should reflect that of the original file.
|
||||||
|
|
||||||
11.3 Use NTLMv2
|
11.3 Use NTLMv2
|
||||||
|
|
||||||
@@ -484,7 +500,7 @@ Currently the SMB authentication uses NTLMv1.
|
|||||||
|
|
||||||
DNS-Based Authentication of Named Entities (DANE) is a way to provide SSL
|
DNS-Based Authentication of Named Entities (DANE) is a way to provide SSL
|
||||||
keys and certs over DNS using DNSSEC as an alternative to the CA model.
|
keys and certs over DNS using DNSSEC as an alternative to the CA model.
|
||||||
http://www.rfc-editor.org/rfc/rfc6698.txt
|
https://www.rfc-editor.org/rfc/rfc6698.txt
|
||||||
|
|
||||||
An initial patch was posted by Suresh Krishnaswamy on March 7th 2013
|
An initial patch was posted by Suresh Krishnaswamy on March 7th 2013
|
||||||
(http://curl.haxx.se/mail/lib-2013-03/0075.html) but it was a too simple
|
(http://curl.haxx.se/mail/lib-2013-03/0075.html) but it was a too simple
|
||||||
@@ -514,7 +530,7 @@ Currently the SMB authentication uses NTLMv1.
|
|||||||
Therefore support for the existing -E/--cert and --key options should be
|
Therefore support for the existing -E/--cert and --key options should be
|
||||||
implemented by supplying a custom certificate to the SChannel APIs, see:
|
implemented by supplying a custom certificate to the SChannel APIs, see:
|
||||||
- Getting a Certificate for Schannel
|
- Getting a Certificate for Schannel
|
||||||
http://msdn.microsoft.com/en-us/library/windows/desktop/aa375447.aspx
|
https://msdn.microsoft.com/en-us/library/windows/desktop/aa375447.aspx
|
||||||
|
|
||||||
15.2 Add support for custom server certificate validation
|
15.2 Add support for custom server certificate validation
|
||||||
|
|
||||||
@@ -525,7 +541,7 @@ Currently the SMB authentication uses NTLMv1.
|
|||||||
Therefore support for the existing --cacert or --capath options should be
|
Therefore support for the existing --cacert or --capath options should be
|
||||||
implemented by supplying a custom certificate to the SChannel APIs, see:
|
implemented by supplying a custom certificate to the SChannel APIs, see:
|
||||||
- Getting a Certificate for Schannel
|
- Getting a Certificate for Schannel
|
||||||
http://msdn.microsoft.com/en-us/library/windows/desktop/aa375447.aspx
|
https://msdn.microsoft.com/en-us/library/windows/desktop/aa375447.aspx
|
||||||
|
|
||||||
15.3 Add support for the --ciphers option
|
15.3 Add support for the --ciphers option
|
||||||
|
|
||||||
@@ -536,7 +552,7 @@ Currently the SMB authentication uses NTLMv1.
|
|||||||
Therefore support for the existing --ciphers option should be implemented
|
Therefore support for the existing --ciphers option should be implemented
|
||||||
by mapping the OpenSSL/GnuTLS cipher suites to the SChannel APIs, see
|
by mapping the OpenSSL/GnuTLS cipher suites to the SChannel APIs, see
|
||||||
- Specifying Schannel Ciphers and Cipher Strengths
|
- Specifying Schannel Ciphers and Cipher Strengths
|
||||||
http://msdn.microsoft.com/en-us/library/windows/desktop/aa380161.aspx
|
https://msdn.microsoft.com/en-us/library/windows/desktop/aa380161.aspx
|
||||||
|
|
||||||
16. SASL
|
16. SASL
|
||||||
|
|
||||||
|
@@ -1,22 +1,18 @@
|
|||||||
_ _ ____ _
|
|
||||||
___| | | | _ \| |
|
|
||||||
/ __| | | | |_) | |
|
|
||||||
| (__| |_| | _ <| |___
|
|
||||||
\___|\___/|_| \_\_____|
|
|
||||||
|
|
||||||
Version Numbers and Releases
|
Version Numbers and Releases
|
||||||
|
============================
|
||||||
|
|
||||||
Curl is not only curl. Curl is also libcurl. They're actually individually
|
Curl is not only curl. Curl is also libcurl. They're actually individually
|
||||||
versioned, but they mostly follow each other rather closely.
|
versioned, but they mostly follow each other rather closely.
|
||||||
|
|
||||||
The version numbering is always built up using the same system:
|
The version numbering is always built up using the same system:
|
||||||
|
|
||||||
X.Y[.Z]
|
X.Y.Z
|
||||||
|
|
||||||
Where
|
- X is main version number
|
||||||
X is main version number
|
- Y is release number
|
||||||
Y is release number
|
- Z is patch number
|
||||||
Z is patch number
|
|
||||||
|
## Bumping numbers
|
||||||
|
|
||||||
One of these numbers will get bumped in each new release. The numbers to the
|
One of these numbers will get bumped in each new release. The numbers to the
|
||||||
right of a bumped number will be reset to zero. If Z is zero, it may not be
|
right of a bumped number will be reset to zero. If Z is zero, it may not be
|
||||||
@@ -57,4 +53,4 @@ Version Numbers and Releases
|
|||||||
release. It makes comparisons with greater than and less than work.
|
release. It makes comparisons with greater than and less than work.
|
||||||
|
|
||||||
This number is also available as three separate defines:
|
This number is also available as three separate defines:
|
||||||
LIBCURL_VERSION_MAJOR, LIBCURL_VERSION_MINOR and LIBCURL_VERSION_PATCH.
|
`LIBCURL_VERSION_MAJOR`, `LIBCURL_VERSION_MINOR` and `LIBCURL_VERSION_PATCH`.
|
||||||
|
55
docs/curl.1
55
docs/curl.1
@@ -39,8 +39,7 @@ resume, Metalink, and more. As you will see below, the number of features will
|
|||||||
make your head spin!
|
make your head spin!
|
||||||
|
|
||||||
curl is powered by libcurl for all transfer-related features. See
|
curl is powered by libcurl for all transfer-related features. See
|
||||||
.BR libcurl (3)
|
\fIlibcurl(3)\fP for details.
|
||||||
for details.
|
|
||||||
.SH URL
|
.SH URL
|
||||||
The URL syntax is protocol-dependent. You'll find a detailed description in
|
The URL syntax is protocol-dependent. You'll find a detailed description in
|
||||||
RFC 3986.
|
RFC 3986.
|
||||||
@@ -269,11 +268,11 @@ If this option is used several times, the last one will be used.
|
|||||||
.IP "--ciphers <list of ciphers>"
|
.IP "--ciphers <list of ciphers>"
|
||||||
(SSL) Specifies which ciphers to use in the connection. The list of ciphers
|
(SSL) Specifies which ciphers to use in the connection. The list of ciphers
|
||||||
must specify valid ciphers. Read up on SSL cipher list details on this URL:
|
must specify valid ciphers. Read up on SSL cipher list details on this URL:
|
||||||
\fIhttp://www.openssl.org/docs/apps/ciphers.html\fP
|
\fIhttps://www.openssl.org/docs/apps/ciphers.html\fP
|
||||||
|
|
||||||
NSS ciphers are done differently than OpenSSL and GnuTLS. The full list of NSS
|
NSS ciphers are done differently than OpenSSL and GnuTLS. The full list of NSS
|
||||||
ciphers is in the NSSCipherSuite entry at this URL:
|
ciphers is in the NSSCipherSuite entry at this URL:
|
||||||
\fIhttp://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html#Directives\fP
|
\fIhttps://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html#Directives\fP
|
||||||
|
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "--compressed"
|
.IP "--compressed"
|
||||||
@@ -315,9 +314,10 @@ presses the submit button. This will cause curl to pass the data to the server
|
|||||||
using the content-type application/x-www-form-urlencoded. Compare to
|
using the content-type application/x-www-form-urlencoded. Compare to
|
||||||
\fI-F, --form\fP.
|
\fI-F, --form\fP.
|
||||||
|
|
||||||
\fI-d, --data\fP is the same as \fI--data-ascii\fP. To post data purely binary,
|
\fI-d, --data\fP is the same as \fI--data-ascii\fP. \fI--data-raw\fP is almost
|
||||||
you should instead use the \fI--data-binary\fP option. To URL-encode the value
|
the same but does not have a special interpretation of the @ character. To
|
||||||
of a form field you may use \fI--data-urlencode\fP.
|
post data purely binary, you should instead use the \fI--data-binary\fP option.
|
||||||
|
To URL-encode the value of a form field you may use \fI--data-urlencode\fP.
|
||||||
|
|
||||||
If any of these options is used more than once on the same command line, the
|
If any of these options is used more than once on the same command line, the
|
||||||
data pieces specified will be merged together with a separating
|
data pieces specified will be merged together with a separating
|
||||||
@@ -329,7 +329,8 @@ read the data from, or - if you want curl to read the data from
|
|||||||
stdin. Multiple files can also be specified. Posting data from a file
|
stdin. Multiple files can also be specified. Posting data from a file
|
||||||
named 'foobar' would thus be done with \fI--data\fP @foobar. When --data is
|
named 'foobar' would thus be done with \fI--data\fP @foobar. When --data is
|
||||||
told to read from a file like that, carriage returns and newlines will be
|
told to read from a file like that, carriage returns and newlines will be
|
||||||
stripped out.
|
stripped out. If you don't want the @ character to have a special
|
||||||
|
interpretation use \fI--data-raw\fP instead.
|
||||||
.IP "-D, --dump-header <file>"
|
.IP "-D, --dump-header <file>"
|
||||||
Write the protocol headers to the specified file.
|
Write the protocol headers to the specified file.
|
||||||
|
|
||||||
@@ -354,6 +355,10 @@ and carriage returns are preserved and conversions are never done.
|
|||||||
|
|
||||||
If this option is used several times, the ones following the first will append
|
If this option is used several times, the ones following the first will append
|
||||||
data as described in \fI-d, --data\fP.
|
data as described in \fI-d, --data\fP.
|
||||||
|
.IP "--data-raw <data>"
|
||||||
|
(HTTP) This posts data similarly to \fI--data\fP but without the special
|
||||||
|
interpretation of the @ character. See \fI-d, --data\fP.
|
||||||
|
(Added in 7.43.0)
|
||||||
.IP "--data-urlencode <data>"
|
.IP "--data-urlencode <data>"
|
||||||
(HTTP) This posts data, similar to the other --data options with the exception
|
(HTTP) This posts data, similar to the other --data options with the exception
|
||||||
that this performs URL-encoding. (Added in 7.18.0)
|
that this performs URL-encoding. (Added in 7.18.0)
|
||||||
@@ -548,10 +553,10 @@ indicating its identity. A public key is extracted from this certificate and
|
|||||||
if it does not exactly match the public key provided to this option, curl will
|
if it does not exactly match the public key provided to this option, curl will
|
||||||
abort the connection before sending or receiving any data.
|
abort the connection before sending or receiving any data.
|
||||||
|
|
||||||
This is currently only implemented in the OpenSSL, GnuTLS and GSKit backends.
|
Added in 7.39.0 for OpenSSL, GnuTLS and GSKit. Added in 7.43.0 for NSS and
|
||||||
|
wolfSSL/CyaSSL. Other SSL backends not supported.
|
||||||
|
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
(Added in 7.39.0)
|
|
||||||
.IP "--cert-status"
|
.IP "--cert-status"
|
||||||
(SSL) Tells curl to verify the status of the server certificate by using the
|
(SSL) Tells curl to verify the status of the server certificate by using the
|
||||||
Certificate Status Request (aka. OCSP stapling) TLS extension.
|
Certificate Status Request (aka. OCSP stapling) TLS extension.
|
||||||
@@ -661,6 +666,7 @@ curl does one CWD with the full target directory and then operates on the file
|
|||||||
\&"normally" (like in the multicwd case). This is somewhat more standards
|
\&"normally" (like in the multicwd case). This is somewhat more standards
|
||||||
compliant than 'nocwd' but without the full penalty of 'multicwd'.
|
compliant than 'nocwd' but without the full penalty of 'multicwd'.
|
||||||
.RE
|
.RE
|
||||||
|
.IP
|
||||||
(Added in 7.15.1)
|
(Added in 7.15.1)
|
||||||
.IP "--ftp-pasv"
|
.IP "--ftp-pasv"
|
||||||
(FTP) Use passive mode for the data connection. Passive is the internal default
|
(FTP) Use passive mode for the data connection. Passive is the internal default
|
||||||
@@ -1053,13 +1059,10 @@ in Metalink file, hash check will fail.
|
|||||||
Makes curl scan the \fI.netrc\fP (\fI_netrc\fP on Windows) file in the user's
|
Makes curl scan the \fI.netrc\fP (\fI_netrc\fP on Windows) file in the user's
|
||||||
home directory for login name and password. This is typically used for FTP on
|
home directory for login name and password. This is typically used for FTP on
|
||||||
Unix. If used with HTTP, curl will enable user authentication. See
|
Unix. If used with HTTP, curl will enable user authentication. See
|
||||||
.BR netrc(4)
|
\fInetrc(5)\fP \fIftp(1)\fP for details on the file format. Curl will not
|
||||||
or
|
complain if that file doesn't have the right permissions (it should not be
|
||||||
.BR ftp(1)
|
either world- or group-readable). The environment variable "HOME" is used to
|
||||||
for details on the file format. Curl will not complain if that file
|
find the home directory.
|
||||||
doesn't have the right permissions (it should not be either world- or
|
|
||||||
group-readable). The environment variable "HOME" is used to find the home
|
|
||||||
directory.
|
|
||||||
|
|
||||||
A quick and very simple example of how to setup a \fI.netrc\fP to allow curl
|
A quick and very simple example of how to setup a \fI.netrc\fP to allow curl
|
||||||
to FTP to the machine host.domain.com with user name \&'myself' and password
|
to FTP to the machine host.domain.com with user name \&'myself' and password
|
||||||
@@ -1221,7 +1224,7 @@ i.e "my.host.domain" to specify the machine
|
|||||||
make curl pick the same IP address that is already used for the control
|
make curl pick the same IP address that is already used for the control
|
||||||
connection
|
connection
|
||||||
.RE
|
.RE
|
||||||
|
.IP
|
||||||
If this option is used several times, the last one will be used. Disable the
|
If this option is used several times, the last one will be used. Disable the
|
||||||
use of PORT with \fI--ftp-pasv\fP. Disable the attempt to use the EPRT command
|
use of PORT with \fI--ftp-pasv\fP. Disable the attempt to use the EPRT command
|
||||||
instead of PORT by using \fI--disable-eprt\fP. EPRT is really PORT++.
|
instead of PORT by using \fI--disable-eprt\fP. EPRT is really PORT++.
|
||||||
@@ -1326,6 +1329,11 @@ with a remote host. (Added in 7.17.1)
|
|||||||
.IP "--proxy-ntlm"
|
.IP "--proxy-ntlm"
|
||||||
Tells curl to use HTTP NTLM authentication when communicating with the given
|
Tells curl to use HTTP NTLM authentication when communicating with the given
|
||||||
proxy. Use \fI--ntlm\fP for enabling NTLM with a remote host.
|
proxy. Use \fI--ntlm\fP for enabling NTLM with a remote host.
|
||||||
|
.IP "--proxy-service-name <servicename>"
|
||||||
|
This option allows you to change the service name for proxy negotiation.
|
||||||
|
|
||||||
|
Examples: --proxy-negotiate proxy-name \fI--proxy-service-name\fP sockd would use
|
||||||
|
sockd/proxy-name. (Added in 7.43.0).
|
||||||
.IP "--proxy1.0 <proxyhost[:port]>"
|
.IP "--proxy1.0 <proxyhost[:port]>"
|
||||||
Use the specified HTTP 1.0 proxy. If the port number is not specified, it is
|
Use the specified HTTP 1.0 proxy. If the port number is not specified, it is
|
||||||
assumed at port 1080.
|
assumed at port 1080.
|
||||||
@@ -1423,7 +1431,7 @@ specifies 300 bytes from offset 500(H)
|
|||||||
.B 100-199,500-599
|
.B 100-199,500-599
|
||||||
specifies two separate 100-byte ranges(*)(H)
|
specifies two separate 100-byte ranges(*)(H)
|
||||||
.RE
|
.RE
|
||||||
|
.IP
|
||||||
(*) = NOTE that this will cause the server to reply with a multipart
|
(*) = NOTE that this will cause the server to reply with a multipart
|
||||||
response!
|
response!
|
||||||
|
|
||||||
@@ -1507,6 +1515,11 @@ terminal/stdout unless you redirect it.
|
|||||||
.IP "--sasl-ir"
|
.IP "--sasl-ir"
|
||||||
Enable initial response in SASL authentication.
|
Enable initial response in SASL authentication.
|
||||||
(Added in 7.31.0)
|
(Added in 7.31.0)
|
||||||
|
.IP "--service-name <servicename>"
|
||||||
|
This option allows you to change the service name for SPNEGO.
|
||||||
|
|
||||||
|
Examples: --negotiate \fI--service-name\fP sockd would use
|
||||||
|
sockd/server-name. (Added in 7.43.0).
|
||||||
.IP "-S, --show-error"
|
.IP "-S, --show-error"
|
||||||
When used with \fI-s\fP it makes curl show an error message if it fails.
|
When used with \fI-s\fP it makes curl show an error message if it fails.
|
||||||
.IP "--ssl"
|
.IP "--ssl"
|
||||||
@@ -1708,7 +1721,7 @@ impossible to use a colon in the user name with this option. The password can,
|
|||||||
still.
|
still.
|
||||||
|
|
||||||
When using Kerberos V5 with a Windows based server you should include the
|
When using Kerberos V5 with a Windows based server you should include the
|
||||||
Windows domain name in the user name, in order for the server to succesfully
|
Windows domain name in the user name, in order for the server to successfully
|
||||||
obtain a Kerberos Ticket. If you don't then the initial authentication
|
obtain a Kerberos Ticket. If you don't then the initial authentication
|
||||||
handshake may fail.
|
handshake may fail.
|
||||||
|
|
||||||
@@ -1882,7 +1895,7 @@ displayed with millisecond resolution.
|
|||||||
The URL that was fetched last. This is most meaningful if you've told curl
|
The URL that was fetched last. This is most meaningful if you've told curl
|
||||||
to follow location: headers.
|
to follow location: headers.
|
||||||
.RE
|
.RE
|
||||||
|
.IP
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "-x, --proxy <[protocol://][user:password@]proxyhost[:port]>"
|
.IP "-x, --proxy <[protocol://][user:password@]proxyhost[:port]>"
|
||||||
Use the specified proxy.
|
Use the specified proxy.
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -19,9 +19,10 @@
|
|||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
/* Example application source code using the multi interface to download many
|
/* <DESC>
|
||||||
* files, but with a capped maximum amount of simultaneous transfers.
|
* Source code using the multi interface to download many
|
||||||
*
|
* files, with a capped maximum amount of simultaneous transfers.
|
||||||
|
* </DESC>
|
||||||
* Written by Michael Wallner
|
* Written by Michael Wallner
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
# | (__| |_| | _ <| |___
|
# | (__| |_| | _ <| |___
|
||||||
# \___|\___/|_| \_\_____|
|
# \___|\___/|_| \_\_____|
|
||||||
#
|
#
|
||||||
# Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
# Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
#
|
#
|
||||||
# This software is licensed as described in the file COPYING, which
|
# This software is licensed as described in the file COPYING, which
|
||||||
# you should have received as part of this distribution. The terms
|
# you should have received as part of this distribution. The terms
|
||||||
@@ -31,7 +31,8 @@ check_PROGRAMS = 10-at-a-time anyauthput cookie_interface debug fileupload \
|
|||||||
pop3-dele pop3-top pop3-stat pop3-noop pop3-ssl pop3-tls pop3-multi \
|
pop3-dele pop3-top pop3-stat pop3-noop pop3-ssl pop3-tls pop3-multi \
|
||||||
imap-list imap-lsub imap-fetch imap-store imap-append imap-examine \
|
imap-list imap-lsub imap-fetch imap-store imap-append imap-examine \
|
||||||
imap-search imap-create imap-delete imap-copy imap-noop imap-ssl \
|
imap-search imap-create imap-delete imap-copy imap-noop imap-ssl \
|
||||||
imap-tls imap-multi url2file sftpget ftpsget postinmemory
|
imap-tls imap-multi url2file sftpget ftpsget postinmemory http2-download \
|
||||||
|
http2-upload http2-serverpush
|
||||||
|
|
||||||
# These examples require external dependencies that may not be commonly
|
# These examples require external dependencies that may not be commonly
|
||||||
# available on POSIX systems, so don't bother attempting to compile them here.
|
# available on POSIX systems, so don't bother attempting to compile them here.
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
# | (__| |_| | _ <| |___
|
# | (__| |_| | _ <| |___
|
||||||
# \___|\___/|_| \_\_____|
|
# \___|\___/|_| \_\_____|
|
||||||
#
|
#
|
||||||
# Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
# Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
#
|
#
|
||||||
# This software is licensed as described in the file COPYING, which
|
# This software is licensed as described in the file COPYING, which
|
||||||
# you should have received as part of this distribution. The terms
|
# you should have received as part of this distribution. The terms
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
###########################################################################
|
###########################################################################
|
||||||
#
|
#
|
||||||
## Makefile for building curl examples with MingW (GCC-3.2 or later)
|
## Makefile for building curl examples with MingW (GCC-3.2 or later)
|
||||||
## and optionally OpenSSL (0.9.8), libssh2 (1.3), zlib (1.2.5), librtmp (2.3)
|
## and optionally OpenSSL (1.0.2a), libssh2 (1.5), zlib (1.2.8), librtmp (2.4)
|
||||||
##
|
##
|
||||||
## Usage: mingw32-make -f Makefile.m32 CFG=-feature1[-feature2][-feature3][...]
|
## Usage: mingw32-make -f Makefile.m32 CFG=-feature1[-feature2][-feature3][...]
|
||||||
## Example: mingw32-make -f Makefile.m32 CFG=-zlib-ssl-spi-winidn
|
## Example: mingw32-make -f Makefile.m32 CFG=-zlib-ssl-spi-winidn
|
||||||
@@ -38,23 +38,23 @@ ZLIB_PATH = ../../../zlib-1.2.8
|
|||||||
endif
|
endif
|
||||||
# Edit the path below to point to the base of your OpenSSL package.
|
# Edit the path below to point to the base of your OpenSSL package.
|
||||||
ifndef OPENSSL_PATH
|
ifndef OPENSSL_PATH
|
||||||
OPENSSL_PATH = ../../../openssl-0.9.8zc
|
OPENSSL_PATH = ../../../openssl-1.0.2a
|
||||||
endif
|
endif
|
||||||
# Edit the path below to point to the base of your LibSSH2 package.
|
# Edit the path below to point to the base of your LibSSH2 package.
|
||||||
ifndef LIBSSH2_PATH
|
ifndef LIBSSH2_PATH
|
||||||
LIBSSH2_PATH = ../../../libssh2-1.4.3
|
LIBSSH2_PATH = ../../../libssh2-1.5.0
|
||||||
endif
|
endif
|
||||||
# Edit the path below to point to the base of your librtmp package.
|
# Edit the path below to point to the base of your librtmp package.
|
||||||
ifndef LIBRTMP_PATH
|
ifndef LIBRTMP_PATH
|
||||||
LIBRTMP_PATH = ../../../librtmp-2.3
|
LIBRTMP_PATH = ../../../librtmp-2.4
|
||||||
endif
|
endif
|
||||||
# Edit the path below to point to the base of your libidn package.
|
# Edit the path below to point to the base of your libidn package.
|
||||||
ifndef LIBIDN_PATH
|
ifndef LIBIDN_PATH
|
||||||
LIBIDN_PATH = ../../../libidn-1.18
|
LIBIDN_PATH = ../../../libidn-1.30
|
||||||
endif
|
endif
|
||||||
# Edit the path below to point to the base of your MS IDN package.
|
# Edit the path below to point to the base of your MS IDN package.
|
||||||
# Microsoft Internationalized Domain Names (IDN) Mitigation APIs 1.1
|
# Microsoft Internationalized Domain Names (IDN) Mitigation APIs 1.1
|
||||||
# http://www.microsoft.com/downloads/en/details.aspx?FamilyID=ad6158d7-ddba-416a-9109-07607425a815
|
# https://www.microsoft.com/en-us/download/details.aspx?id=734
|
||||||
ifndef WINIDN_PATH
|
ifndef WINIDN_PATH
|
||||||
WINIDN_PATH = ../../../Microsoft IDN Mitigation APIs
|
WINIDN_PATH = ../../../Microsoft IDN Mitigation APIs
|
||||||
endif
|
endif
|
||||||
@@ -62,6 +62,10 @@ endif
|
|||||||
ifndef LDAP_SDK
|
ifndef LDAP_SDK
|
||||||
LDAP_SDK = c:/novell/ndk/cldapsdk/win32
|
LDAP_SDK = c:/novell/ndk/cldapsdk/win32
|
||||||
endif
|
endif
|
||||||
|
# Edit the path below to point to the base of your nghttp2 package.
|
||||||
|
ifndef NGHTTP2_PATH
|
||||||
|
NGHTTP2_PATH = ../../../nghttp2-1.0.0
|
||||||
|
endif
|
||||||
|
|
||||||
PROOT = ../..
|
PROOT = ../..
|
||||||
|
|
||||||
@@ -72,14 +76,24 @@ endif
|
|||||||
|
|
||||||
# Edit the var below to set to your architecture or set environment var.
|
# Edit the var below to set to your architecture or set environment var.
|
||||||
ifndef ARCH
|
ifndef ARCH
|
||||||
|
ifeq ($(findstring x86_64,$(shell $(CC) -dumpmachine)),x86_64)
|
||||||
|
ARCH = w64
|
||||||
|
else
|
||||||
ARCH = w32
|
ARCH = w32
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
CC = $(CROSSPREFIX)gcc
|
CC = $(CROSSPREFIX)gcc
|
||||||
CFLAGS = -g -O2 -Wall
|
CFLAGS = -g -O2 -Wall
|
||||||
CFLAGS += -fno-strict-aliasing
|
CFLAGS += -fno-strict-aliasing
|
||||||
ifeq ($(ARCH),w64)
|
ifeq ($(ARCH),w64)
|
||||||
CFLAGS += -D_AMD64_
|
CFLAGS += -m64 -D_AMD64_
|
||||||
|
LDFLAGS += -m64
|
||||||
|
RCFLAGS += -F pe-x86-64
|
||||||
|
else
|
||||||
|
CFLAGS += -m32
|
||||||
|
LDFLAGS += -m32
|
||||||
|
RCFLAGS += -F pe-i386
|
||||||
endif
|
endif
|
||||||
# comment LDFLAGS below to keep debug info
|
# comment LDFLAGS below to keep debug info
|
||||||
LDFLAGS = -s
|
LDFLAGS = -s
|
||||||
@@ -158,9 +172,12 @@ ifeq ($(findstring -metalink,$(CFG)),-metalink)
|
|||||||
METALINK = 1
|
METALINK = 1
|
||||||
endif
|
endif
|
||||||
ifeq ($(findstring -winssl,$(CFG)),-winssl)
|
ifeq ($(findstring -winssl,$(CFG)),-winssl)
|
||||||
SCHANNEL = 1
|
WINSSL = 1
|
||||||
SSPI = 1
|
SSPI = 1
|
||||||
endif
|
endif
|
||||||
|
ifeq ($(findstring -nghttp2,$(CFG)),-nghttp2)
|
||||||
|
NGHTTP2 = 1
|
||||||
|
endif
|
||||||
|
|
||||||
INCLUDES = -I. -I$(PROOT) -I$(PROOT)/include -I$(PROOT)/lib
|
INCLUDES = -I. -I$(PROOT) -I$(PROOT)/include -I$(PROOT)/lib
|
||||||
|
|
||||||
@@ -184,6 +201,10 @@ ifdef RTMP
|
|||||||
CFLAGS += -DUSE_LIBRTMP
|
CFLAGS += -DUSE_LIBRTMP
|
||||||
curl_LDADD += -L"$(LIBRTMP_PATH)/librtmp" -lrtmp -lwinmm
|
curl_LDADD += -L"$(LIBRTMP_PATH)/librtmp" -lrtmp -lwinmm
|
||||||
endif
|
endif
|
||||||
|
ifdef NGHTTP2
|
||||||
|
CFLAGS += -DUSE_NGHTTP2
|
||||||
|
curl_LDADD += -L"$(NGHTTP2_PATH)/lib" -lnghttp2
|
||||||
|
endif
|
||||||
ifdef SSH2
|
ifdef SSH2
|
||||||
CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H
|
CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H
|
||||||
curl_LDADD += -L"$(LIBSSH2_PATH)/win32" -lssh2
|
curl_LDADD += -L"$(LIBSSH2_PATH)/win32" -lssh2
|
||||||
@@ -204,7 +225,7 @@ ifdef SSL
|
|||||||
ifndef DYN
|
ifndef DYN
|
||||||
OPENSSL_LIBS += -lgdi32 -lcrypt32
|
OPENSSL_LIBS += -lgdi32 -lcrypt32
|
||||||
endif
|
endif
|
||||||
CFLAGS += -DUSE_SSLEAY
|
CFLAGS += -DUSE_OPENSSL
|
||||||
curl_LDADD += -L"$(OPENSSL_LIBPATH)" $(OPENSSL_LIBS)
|
curl_LDADD += -L"$(OPENSSL_LIBPATH)" $(OPENSSL_LIBS)
|
||||||
endif
|
endif
|
||||||
ifdef ZLIB
|
ifdef ZLIB
|
||||||
@@ -223,7 +244,7 @@ endif
|
|||||||
endif
|
endif
|
||||||
ifdef SSPI
|
ifdef SSPI
|
||||||
CFLAGS += -DUSE_WINDOWS_SSPI
|
CFLAGS += -DUSE_WINDOWS_SSPI
|
||||||
ifdef SCHANNEL
|
ifdef WINSSL
|
||||||
CFLAGS += -DUSE_SCHANNEL
|
CFLAGS += -DUSE_SCHANNEL
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
@@ -19,12 +19,12 @@ endif
|
|||||||
|
|
||||||
# Edit the path below to point to the base of your OpenSSL package.
|
# Edit the path below to point to the base of your OpenSSL package.
|
||||||
ifndef OPENSSL_PATH
|
ifndef OPENSSL_PATH
|
||||||
OPENSSL_PATH = ../../../openssl-0.9.8zc
|
OPENSSL_PATH = ../../../openssl-1.0.2a
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Edit the path below to point to the base of your LibSSH2 package.
|
# Edit the path below to point to the base of your LibSSH2 package.
|
||||||
ifndef LIBSSH2_PATH
|
ifndef LIBSSH2_PATH
|
||||||
LIBSSH2_PATH = ../../../libssh2-1.4.3
|
LIBSSH2_PATH = ../../../libssh2-1.5.0
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Edit the path below to point to the base of your axTLS package.
|
# Edit the path below to point to the base of your axTLS package.
|
||||||
@@ -34,12 +34,12 @@ endif
|
|||||||
|
|
||||||
# Edit the path below to point to the base of your libidn package.
|
# Edit the path below to point to the base of your libidn package.
|
||||||
ifndef LIBIDN_PATH
|
ifndef LIBIDN_PATH
|
||||||
LIBIDN_PATH = ../../../libidn-1.18
|
LIBIDN_PATH = ../../../libidn-1.30
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Edit the path below to point to the base of your librtmp package.
|
# Edit the path below to point to the base of your librtmp package.
|
||||||
ifndef LIBRTMP_PATH
|
ifndef LIBRTMP_PATH
|
||||||
LIBRTMP_PATH = ../../../librtmp-2.3
|
LIBRTMP_PATH = ../../../librtmp-2.4
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Edit the path below to point to the base of your fbopenssl package.
|
# Edit the path below to point to the base of your fbopenssl package.
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -19,6 +19,11 @@
|
|||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
/* <DESC>
|
||||||
|
* HTTP PUT upload with authentiction using "any" method. libcurl picks the
|
||||||
|
* one the server supports/wants.
|
||||||
|
* </DESC>
|
||||||
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 2012 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 2012 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -20,11 +20,11 @@
|
|||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
|
/* <DESC>
|
||||||
|
* demonstrate the use of multi socket interface with boost::asio
|
||||||
|
* </DESC>
|
||||||
|
*/
|
||||||
/*
|
/*
|
||||||
* file: asiohiper.cpp
|
|
||||||
* Example program to demonstrate the use of multi socket interface
|
|
||||||
* with boost::asio
|
|
||||||
*
|
|
||||||
* This program is in c++ and uses boost::asio instead of libevent/libev.
|
* This program is in c++ and uses boost::asio instead of libevent/libev.
|
||||||
* Requires boost::asio, boost::bind and boost::system
|
* Requires boost::asio, boost::bind and boost::system
|
||||||
*
|
*
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -19,17 +19,11 @@
|
|||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
/* Example using a "in core" PEM certificate to retrieve a https page.
|
/* <DESC>
|
||||||
* Written by Theo Borm
|
* CA cert in memory with OpenSSL to get a HTTPS page.
|
||||||
|
* </DESC>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* on a netBSD system with OPENSSL& LIBCURL installed from
|
|
||||||
* pkgsrc (using default paths) this program can be compiled using:
|
|
||||||
* gcc -I/usr/pkg/include -L/usr/pkg/lib -lcurl -Wl,-R/usr/pkg/lib -lssl
|
|
||||||
* -lcrypto -lz -o curlcacerttest curlcacerttest.c
|
|
||||||
* on other operating systems you may want to change paths to headers
|
|
||||||
* and libraries
|
|
||||||
*/
|
|
||||||
#include <openssl/ssl.h>
|
#include <openssl/ssl.h>
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -19,6 +19,10 @@
|
|||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
/* <DESC>
|
||||||
|
* Extract lots of TLS certificate info.
|
||||||
|
* </DESC>
|
||||||
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -19,6 +19,10 @@
|
|||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
/* <DESC>
|
||||||
|
* Show transfer timing info after download completes.
|
||||||
|
* </DESC>
|
||||||
|
*/
|
||||||
/* Example source code to show how the callback function can be used to
|
/* Example source code to show how the callback function can be used to
|
||||||
* download data into a chunk of memory instead of storing it in a file.
|
* download data into a chunk of memory instead of storing it in a file.
|
||||||
* After successful download we use curl_easy_getinfo() calls to get the
|
* After successful download we use curl_easy_getinfo() calls to get the
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -19,7 +19,10 @@
|
|||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
/* This example shows usage of simple cookie interface. */
|
/* <DESC>
|
||||||
|
* Import and export cookies with COOKIELIST.
|
||||||
|
* </DESC>
|
||||||
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -96,7 +99,12 @@ main(void)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* HTTP-header style cookie */
|
/* HTTP-header style cookie. If you use the Set-Cookie format and don't
|
||||||
|
specify a domain then the cookie is sent for any domain and will not be
|
||||||
|
modified, likely not what you intended. Starting in 7.43.0 any-domain
|
||||||
|
cookies will not be exported either. For more information refer to the
|
||||||
|
CURLOPT_COOKIELIST documentation.
|
||||||
|
*/
|
||||||
snprintf(nline, sizeof(nline),
|
snprintf(nline, sizeof(nline),
|
||||||
"Set-Cookie: OLD_PREF=3d141414bf4209321; "
|
"Set-Cookie: OLD_PREF=3d141414bf4209321; "
|
||||||
"expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com");
|
"expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com");
|
||||||
|
@@ -5,9 +5,12 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
|
* Copyright (c) 2000 David Odin (aka DindinX) for MandrakeSoft
|
||||||
|
*/
|
||||||
|
/* <DESC>
|
||||||
|
* use the libcurl in a gtk-threaded application
|
||||||
|
* </DESC>
|
||||||
*/
|
*/
|
||||||
/* Copyright (c) 2000 David Odin (aka DindinX) for MandrakeSoft */
|
|
||||||
/* an attempt to use the curl library in concert with a gtk-threaded application */
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
@@ -9,7 +9,10 @@
|
|||||||
certificate presented during ssl session establishment.
|
certificate presented during ssl session establishment.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
/* <DESC>
|
||||||
|
* demonstrates use of SSL context callback, requires OpenSSL
|
||||||
|
* </DESC>
|
||||||
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2003 The OpenEvidence Project. All rights reserved.
|
* Copyright (c) 2003 The OpenEvidence Project. All rights reserved.
|
||||||
@@ -490,7 +493,7 @@ int main(int argc, char **argv) {
|
|||||||
BIO_printf(p.errorbio,"the response has a correct mimetype : %s\n",
|
BIO_printf(p.errorbio,"the response has a correct mimetype : %s\n",
|
||||||
response);
|
response);
|
||||||
else
|
else
|
||||||
BIO_printf(p.errorbio,"the reponse doesn\'t has an acceptable "
|
BIO_printf(p.errorbio,"the response doesn\'t have an acceptable "
|
||||||
"mime type, it is %s instead of %s\n",
|
"mime type, it is %s instead of %s\n",
|
||||||
response,mimetypeaccept);
|
response,mimetypeaccept);
|
||||||
}
|
}
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -19,6 +19,10 @@
|
|||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
/* <DESC>
|
||||||
|
* Show how CURLOPT_DEBUGFUNCTION can be used.
|
||||||
|
* </DESC>
|
||||||
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
|
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -19,6 +19,10 @@
|
|||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
/* <DESC>
|
||||||
|
* multi socket interface together with libev
|
||||||
|
* </DESC>
|
||||||
|
*/
|
||||||
/* Example application source code using the multi socket interface to
|
/* Example application source code using the multi socket interface to
|
||||||
* download many files at once.
|
* download many files at once.
|
||||||
*
|
*
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -19,9 +19,10 @@
|
|||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
/*
|
/* <DESC>
|
||||||
* This is an example demonstrating how an application can pass in a custom
|
* An example demonstrating how an application can pass in a custom
|
||||||
* socket to libcurl to use. This example also handles the connect itself.
|
* socket to libcurl to use. This example also handles the connect itself.
|
||||||
|
* </DESC>
|
||||||
*/
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -19,6 +19,10 @@
|
|||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
/* <DESC>
|
||||||
|
* Upload to a file:// URL
|
||||||
|
* </DESC>
|
||||||
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
@@ -42,6 +42,10 @@
|
|||||||
*
|
*
|
||||||
* This example requires libcurl 7.9.7 or later.
|
* This example requires libcurl 7.9.7 or later.
|
||||||
*/
|
*/
|
||||||
|
/* <DESC>
|
||||||
|
* implements an fopen() abstraction allowing reading from URLs
|
||||||
|
* </DESC>
|
||||||
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -108,7 +112,7 @@ static size_t write_callback(char *buffer,
|
|||||||
size=rembuff;
|
size=rembuff;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* realloc suceeded increase buffer size*/
|
/* realloc succeeded increase buffer size*/
|
||||||
url->buffer_len+=size - rembuff;
|
url->buffer_len+=size - rembuff;
|
||||||
url->buffer=newbuff;
|
url->buffer=newbuff;
|
||||||
}
|
}
|
||||||
@@ -131,7 +135,7 @@ static int fill_buffer(URL_FILE *file, size_t want)
|
|||||||
CURLMcode mc; /* curl_multi_fdset() return code */
|
CURLMcode mc; /* curl_multi_fdset() return code */
|
||||||
|
|
||||||
/* only attempt to fill buffer if transactions still running and buffer
|
/* only attempt to fill buffer if transactions still running and buffer
|
||||||
* doesnt exceed required size already
|
* doesn't exceed required size already
|
||||||
*/
|
*/
|
||||||
if((!file->still_running) || (file->buffer_pos > want))
|
if((!file->still_running) || (file->buffer_pos > want))
|
||||||
return 0;
|
return 0;
|
||||||
@@ -205,7 +209,7 @@ static int fill_buffer(URL_FILE *file, size_t want)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* use to remove want bytes from the front of a files buffer */
|
/* use to remove want bytes from the front of a files buffer */
|
||||||
static int use_buffer(URL_FILE *file,int want)
|
static int use_buffer(URL_FILE *file, size_t want)
|
||||||
{
|
{
|
||||||
/* sort out buffer */
|
/* sort out buffer */
|
||||||
if((file->buffer_pos - want) <=0) {
|
if((file->buffer_pos - want) <=0) {
|
||||||
@@ -229,7 +233,7 @@ static int use_buffer(URL_FILE *file,int want)
|
|||||||
URL_FILE *url_fopen(const char *url,const char *operation)
|
URL_FILE *url_fopen(const char *url,const char *operation)
|
||||||
{
|
{
|
||||||
/* this code could check for URLs or types in the 'url' and
|
/* this code could check for URLs or types in the 'url' and
|
||||||
basicly use the real fopen() for standard files */
|
basically use the real fopen() for standard files */
|
||||||
|
|
||||||
URL_FILE *file;
|
URL_FILE *file;
|
||||||
(void)operation;
|
(void)operation;
|
||||||
@@ -375,7 +379,7 @@ char *url_fgets(char *ptr, size_t size, URL_FILE *file)
|
|||||||
|
|
||||||
switch(file->type) {
|
switch(file->type) {
|
||||||
case CFTYPE_FILE:
|
case CFTYPE_FILE:
|
||||||
ptr = fgets(ptr,size,file->handle.file);
|
ptr = fgets(ptr, (int)size, file->handle.file);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CFTYPE_CURL:
|
case CFTYPE_CURL:
|
||||||
@@ -451,7 +455,7 @@ int main(int argc, char *argv[])
|
|||||||
URL_FILE *handle;
|
URL_FILE *handle;
|
||||||
FILE *outf;
|
FILE *outf;
|
||||||
|
|
||||||
int nread;
|
size_t nread;
|
||||||
char buffer[256];
|
char buffer[256];
|
||||||
const char *url;
|
const char *url;
|
||||||
|
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -19,6 +19,10 @@
|
|||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
/* <DESC>
|
||||||
|
* FTP wildcard pattern matching
|
||||||
|
* </DESC>
|
||||||
|
*/
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -23,11 +23,9 @@
|
|||||||
|
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
|
|
||||||
/*
|
/* <DESC>
|
||||||
* This is an example showing how to get a single file from an FTP server.
|
* Get a single file from an FTP server.
|
||||||
* It delays the actual destination file creation until the first write
|
* </DESC>
|
||||||
* callback so that it won't create an empty file in case the remote file
|
|
||||||
* doesn't exist or something else fails.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct FtpFile {
|
struct FtpFile {
|
||||||
@@ -53,7 +51,7 @@ int main(void)
|
|||||||
CURL *curl;
|
CURL *curl;
|
||||||
CURLcode res;
|
CURLcode res;
|
||||||
struct FtpFile ftpfile={
|
struct FtpFile ftpfile={
|
||||||
"curl.tar.gz", /* name to store the file as if succesful */
|
"curl.tar.gz", /* name to store the file as if successful */
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -24,9 +24,9 @@
|
|||||||
|
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
|
|
||||||
/*
|
/* <DESC>
|
||||||
* This is an example showing how to check a single file's size and mtime
|
* Checks a single file's size and mtime from an FTP server.
|
||||||
* from an FTP server.
|
* </DESC>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static size_t throw_away(void *ptr, size_t size, size_t nmemb, void *data)
|
static size_t throw_away(void *ptr, size_t size, size_t nmemb, void *data)
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -23,13 +23,11 @@
|
|||||||
|
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
|
|
||||||
/*
|
/* <DESC>
|
||||||
* Similar to ftpget.c but this also stores the received response-lines
|
* Similar to ftpget.c but also stores the received response-lines
|
||||||
* in a separate file using our own callback!
|
* in a separate file using our own callback!
|
||||||
*
|
* </DESC>
|
||||||
* This functionality was introduced in libcurl 7.9.3.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static size_t
|
static size_t
|
||||||
write_response(void *ptr, size_t size, size_t nmemb, void *data)
|
write_response(void *ptr, size_t size, size_t nmemb, void *data)
|
||||||
{
|
{
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -24,11 +24,9 @@
|
|||||||
|
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
|
|
||||||
/*
|
/* <DESC>
|
||||||
* This is an example showing how to get a single file from an FTPS server.
|
* Get a single file from an FTPS server.
|
||||||
* It delays the actual destination file creation until the first write
|
* </DESC>
|
||||||
* callback so that it won't create an empty file in case the remote file
|
|
||||||
* doesn't exist or something else fails.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct FtpFile {
|
struct FtpFile {
|
||||||
@@ -55,7 +53,7 @@ int main(void)
|
|||||||
CURL *curl;
|
CURL *curl;
|
||||||
CURLcode res;
|
CURLcode res;
|
||||||
struct FtpFile ftpfile={
|
struct FtpFile ftpfile={
|
||||||
"yourfile.bin", /* name to store the file as if succesful */
|
"yourfile.bin", /* name to store the file as if successful */
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -33,11 +33,10 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/* <DESC>
|
||||||
* This example shows an FTP upload, with a rename of the file just after
|
* Performs an FTP upload and renames the file just after a successful
|
||||||
* a successful upload.
|
* transfer.
|
||||||
*
|
* </DESC>
|
||||||
* Example based on source code provided by Erick Nuwendam. Thanks!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define LOCAL_FILE "/tmp/uploadthis.txt"
|
#define LOCAL_FILE "/tmp/uploadthis.txt"
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -19,13 +19,9 @@
|
|||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
/* Upload to FTP, resuming failed transfers
|
/* <DESC>
|
||||||
*
|
* Upload to FTP, resuming failed transfers.
|
||||||
* Compile for MinGW like this:
|
* </DESC>
|
||||||
* gcc -Wall -pedantic -std=c99 ftpuploadwithresume.c -o ftpuploadresume.exe
|
|
||||||
* -lcurl -lmsvcr70
|
|
||||||
*
|
|
||||||
* Written by Philip Bock
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -19,6 +19,10 @@
|
|||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
/* <DESC>
|
||||||
|
* Use getinfo to get content-type after completed transfer.
|
||||||
|
* </DESC>
|
||||||
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
|
|
||||||
@@ -27,18 +31,14 @@ int main(void)
|
|||||||
CURL *curl;
|
CURL *curl;
|
||||||
CURLcode res;
|
CURLcode res;
|
||||||
|
|
||||||
/* http://curl.haxx.se/libcurl/c/curl_easy_init.html */
|
|
||||||
curl = curl_easy_init();
|
curl = curl_easy_init();
|
||||||
if(curl) {
|
if(curl) {
|
||||||
/* http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTURL */
|
|
||||||
curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/");
|
curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/");
|
||||||
/* http://curl.haxx.se/libcurl/c/curl_easy_perform.html */
|
|
||||||
res = curl_easy_perform(curl);
|
res = curl_easy_perform(curl);
|
||||||
|
|
||||||
if(CURLE_OK == res) {
|
if(CURLE_OK == res) {
|
||||||
char *ct;
|
char *ct;
|
||||||
/* ask for the content-type */
|
/* ask for the content-type */
|
||||||
/* http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html */
|
|
||||||
res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct);
|
res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct);
|
||||||
|
|
||||||
if((CURLE_OK == res) && ct)
|
if((CURLE_OK == res) && ct)
|
||||||
@@ -46,7 +46,6 @@ int main(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* always cleanup */
|
/* always cleanup */
|
||||||
/* http://curl.haxx.se/libcurl/c/curl_easy_cleanup.html */
|
|
||||||
curl_easy_cleanup(curl);
|
curl_easy_cleanup(curl);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -19,8 +19,10 @@
|
|||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
/* Example source code to show how the callback function can be used to
|
/* <DESC>
|
||||||
* download data into a chunk of memory instead of storing it in a file.
|
* Shows how the write callback function can be used to download data into a
|
||||||
|
* chunk of memory instead of storing it in a file.
|
||||||
|
* </DESC>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -34,7 +36,6 @@ struct MemoryStruct {
|
|||||||
size_t size;
|
size_t size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static size_t
|
static size_t
|
||||||
WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
|
WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
|
||||||
{
|
{
|
||||||
@@ -55,7 +56,6 @@ WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
|
|||||||
return realsize;
|
return realsize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
CURL *curl_handle;
|
CURL *curl_handle;
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -19,6 +19,10 @@
|
|||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
/* <DESC>
|
||||||
|
* multi socket API usage together with with glib2
|
||||||
|
* </DESC>
|
||||||
|
*/
|
||||||
/* Example application source code using the multi socket interface to
|
/* Example application source code using the multi socket interface to
|
||||||
* download many files at once.
|
* download many files at once.
|
||||||
*
|
*
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -19,6 +19,10 @@
|
|||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
/* <DESC>
|
||||||
|
* multi socket API usage with libevent 2
|
||||||
|
* </DESC>
|
||||||
|
*/
|
||||||
/* Example application source code using the multi socket interface to
|
/* Example application source code using the multi socket interface to
|
||||||
download many files at once.
|
download many files at once.
|
||||||
|
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 2012 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -20,13 +20,13 @@
|
|||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
|
/* <DESC>
|
||||||
|
* Uses the "Streaming HTML parser" to extract the href pieces in a streaming
|
||||||
|
* manner from a downloaded HTML.
|
||||||
|
* </DESC>
|
||||||
|
*/
|
||||||
/*
|
/*
|
||||||
* This example uses the "Streaming HTML parser" to extract the href pieces in
|
* The HTML parser is found at http://code.google.com/p/htmlstreamparser/
|
||||||
* a streaming manner from a downloaded HTML. Kindly donated by Michał
|
|
||||||
* Kowalczyk.
|
|
||||||
*
|
|
||||||
* The parser is found at
|
|
||||||
* http://code.google.com/p/htmlstreamparser/
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -19,13 +19,12 @@
|
|||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
/* Download a document and use libtidy to parse the HTML.
|
/* <DESC>
|
||||||
* Written by Jeff Pohlmeyer
|
* Download a document and use libtidy to parse the HTML.
|
||||||
*
|
* </DESC>
|
||||||
|
*/
|
||||||
|
/*
|
||||||
* LibTidy => http://tidy.sourceforge.net
|
* LibTidy => http://tidy.sourceforge.net
|
||||||
*
|
|
||||||
* gcc -Wall -I/usr/local/include tidycurl.c -lcurl -ltidy -o tidycurl
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
288
docs/examples/http2-download.c
Normal file
288
docs/examples/http2-download.c
Normal file
@@ -0,0 +1,288 @@
|
|||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
|
*
|
||||||
|
* This software is licensed as described in the file COPYING, which
|
||||||
|
* you should have received as part of this distribution. The terms
|
||||||
|
* are also available at http://curl.haxx.se/docs/copyright.html.
|
||||||
|
*
|
||||||
|
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||||
|
* copies of the Software, and permit persons to whom the Software is
|
||||||
|
* furnished to do so, under the terms of the COPYING file.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
|
*
|
||||||
|
***************************************************************************/
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/* somewhat unix-specific */
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
/* curl stuff */
|
||||||
|
#include <curl/curl.h>
|
||||||
|
|
||||||
|
#ifndef CURLPIPE_MULTIPLEX
|
||||||
|
/* This little trick will just make sure that we don't enable pipelining for
|
||||||
|
libcurls old enough to not have this symbol. It is _not_ defined to zero in
|
||||||
|
a recent libcurl header. */
|
||||||
|
#define CURLPIPE_MULTIPLEX 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define NUM_HANDLES 1000
|
||||||
|
|
||||||
|
void *curl_hnd[NUM_HANDLES];
|
||||||
|
int num_transfers;
|
||||||
|
|
||||||
|
/* a handle to number lookup, highly ineffective when we do many
|
||||||
|
transfers... */
|
||||||
|
static int hnd2num(CURL *hnd)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for(i=0; i< num_transfers; i++) {
|
||||||
|
if(curl_hnd[i] == hnd)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
return 0; /* weird, but just a fail-safe */
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void dump(const char *text, int num, unsigned char *ptr, size_t size,
|
||||||
|
char nohex)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
size_t c;
|
||||||
|
|
||||||
|
unsigned int width=0x10;
|
||||||
|
|
||||||
|
if(nohex)
|
||||||
|
/* without the hex output, we can fit more on screen */
|
||||||
|
width = 0x40;
|
||||||
|
|
||||||
|
fprintf(stderr, "%d %s, %ld bytes (0x%lx)\n",
|
||||||
|
num, text, (long)size, (long)size);
|
||||||
|
|
||||||
|
for(i=0; i<size; i+= width) {
|
||||||
|
|
||||||
|
fprintf(stderr, "%4.4lx: ", (long)i);
|
||||||
|
|
||||||
|
if(!nohex) {
|
||||||
|
/* hex not disabled, show it */
|
||||||
|
for(c = 0; c < width; c++)
|
||||||
|
if(i+c < size)
|
||||||
|
fprintf(stderr, "%02x ", ptr[i+c]);
|
||||||
|
else
|
||||||
|
fputs(" ", stderr);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(c = 0; (c < width) && (i+c < size); c++) {
|
||||||
|
/* check for 0D0A; if found, skip past and start a new line of output */
|
||||||
|
if (nohex && (i+c+1 < size) && ptr[i+c]==0x0D && ptr[i+c+1]==0x0A) {
|
||||||
|
i+=(c+2-width);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fprintf(stderr, "%c",
|
||||||
|
(ptr[i+c]>=0x20) && (ptr[i+c]<0x80)?ptr[i+c]:'.');
|
||||||
|
/* check again for 0D0A, to avoid an extra \n if it's at width */
|
||||||
|
if (nohex && (i+c+2 < size) && ptr[i+c+1]==0x0D && ptr[i+c+2]==0x0A) {
|
||||||
|
i+=(c+3-width);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fputc('\n', stderr); /* newline */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
int my_trace(CURL *handle, curl_infotype type,
|
||||||
|
char *data, size_t size,
|
||||||
|
void *userp)
|
||||||
|
{
|
||||||
|
const char *text;
|
||||||
|
int num = hnd2num(handle);
|
||||||
|
(void)handle; /* prevent compiler warning */
|
||||||
|
(void)userp;
|
||||||
|
switch (type) {
|
||||||
|
case CURLINFO_TEXT:
|
||||||
|
fprintf(stderr, "== %d Info: %s", num, data);
|
||||||
|
default: /* in case a new one is introduced to shock us */
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
case CURLINFO_HEADER_OUT:
|
||||||
|
text = "=> Send header";
|
||||||
|
break;
|
||||||
|
case CURLINFO_DATA_OUT:
|
||||||
|
text = "=> Send data";
|
||||||
|
break;
|
||||||
|
case CURLINFO_SSL_DATA_OUT:
|
||||||
|
text = "=> Send SSL data";
|
||||||
|
break;
|
||||||
|
case CURLINFO_HEADER_IN:
|
||||||
|
text = "<= Recv header";
|
||||||
|
break;
|
||||||
|
case CURLINFO_DATA_IN:
|
||||||
|
text = "<= Recv data";
|
||||||
|
break;
|
||||||
|
case CURLINFO_SSL_DATA_IN:
|
||||||
|
text = "<= Recv SSL data";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
dump(text, num, (unsigned char *)data, size, 1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void setup(CURL *hnd, int num)
|
||||||
|
{
|
||||||
|
FILE *out;
|
||||||
|
char filename[128];
|
||||||
|
|
||||||
|
sprintf(filename, "dl-%d", num);
|
||||||
|
|
||||||
|
out = fopen(filename, "wb");
|
||||||
|
|
||||||
|
/* write to this file */
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, out);
|
||||||
|
|
||||||
|
/* set the same URL */
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_URL, "https://localhost:8443/index.html");
|
||||||
|
|
||||||
|
/* send it verbose for max debuggaility */
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, my_trace);
|
||||||
|
|
||||||
|
/* HTTP/2 please */
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
|
||||||
|
|
||||||
|
/* we use a self-signed test server, skip verification during debugging */
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYPEER, 0L);
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYHOST, 0L);
|
||||||
|
|
||||||
|
#if (CURLPIPE_MULTIPLEX > 0)
|
||||||
|
/* wait for pipe connection to confirm */
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
curl_hnd[num] = hnd;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Simply download two files over HTTP/2, using the same physical connection!
|
||||||
|
*/
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
CURL *easy[NUM_HANDLES];
|
||||||
|
CURLM *multi_handle;
|
||||||
|
int i;
|
||||||
|
int still_running; /* keep number of running handles */
|
||||||
|
|
||||||
|
if(argc > 1)
|
||||||
|
/* if given a number, do that many transfers */
|
||||||
|
num_transfers = atoi(argv[1]);
|
||||||
|
|
||||||
|
if(!num_transfers || (num_transfers > NUM_HANDLES))
|
||||||
|
num_transfers = 3; /* a suitable low default */
|
||||||
|
|
||||||
|
/* init a multi stack */
|
||||||
|
multi_handle = curl_multi_init();
|
||||||
|
|
||||||
|
for(i=0; i<num_transfers; i++) {
|
||||||
|
easy[i] = curl_easy_init();
|
||||||
|
/* set options */
|
||||||
|
setup(easy[i], i);
|
||||||
|
|
||||||
|
/* add the individual transfer */
|
||||||
|
curl_multi_add_handle(multi_handle, easy[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
curl_multi_setopt(multi_handle, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
|
||||||
|
|
||||||
|
/* we start some action by calling perform right away */
|
||||||
|
curl_multi_perform(multi_handle, &still_running);
|
||||||
|
|
||||||
|
do {
|
||||||
|
struct timeval timeout;
|
||||||
|
int rc; /* select() return code */
|
||||||
|
CURLMcode mc; /* curl_multi_fdset() return code */
|
||||||
|
|
||||||
|
fd_set fdread;
|
||||||
|
fd_set fdwrite;
|
||||||
|
fd_set fdexcep;
|
||||||
|
int maxfd = -1;
|
||||||
|
|
||||||
|
long curl_timeo = -1;
|
||||||
|
|
||||||
|
FD_ZERO(&fdread);
|
||||||
|
FD_ZERO(&fdwrite);
|
||||||
|
FD_ZERO(&fdexcep);
|
||||||
|
|
||||||
|
/* set a suitable timeout to play around with */
|
||||||
|
timeout.tv_sec = 1;
|
||||||
|
timeout.tv_usec = 0;
|
||||||
|
|
||||||
|
curl_multi_timeout(multi_handle, &curl_timeo);
|
||||||
|
if(curl_timeo >= 0) {
|
||||||
|
timeout.tv_sec = curl_timeo / 1000;
|
||||||
|
if(timeout.tv_sec > 1)
|
||||||
|
timeout.tv_sec = 1;
|
||||||
|
else
|
||||||
|
timeout.tv_usec = (curl_timeo % 1000) * 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get file descriptors from the transfers */
|
||||||
|
mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
||||||
|
|
||||||
|
if(mc != CURLM_OK)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* On success the value of maxfd is guaranteed to be >= -1. We call
|
||||||
|
select(maxfd + 1, ...); specially in case of (maxfd == -1) there are
|
||||||
|
no fds ready yet so we call select(0, ...) --or Sleep() on Windows--
|
||||||
|
to sleep 100ms, which is the minimum suggested value in the
|
||||||
|
curl_multi_fdset() doc. */
|
||||||
|
|
||||||
|
if(maxfd == -1) {
|
||||||
|
#ifdef _WIN32
|
||||||
|
Sleep(100);
|
||||||
|
rc = 0;
|
||||||
|
#else
|
||||||
|
/* Portable sleep for platforms other than Windows. */
|
||||||
|
struct timeval wait = { 0, 100 * 1000 }; /* 100ms */
|
||||||
|
rc = select(0, NULL, NULL, NULL, &wait);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Note that on some platforms 'timeout' may be modified by select().
|
||||||
|
If you need access to the original value save a copy beforehand. */
|
||||||
|
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(rc) {
|
||||||
|
case -1:
|
||||||
|
/* select error */
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
default:
|
||||||
|
/* timeout or readable/writable sockets */
|
||||||
|
curl_multi_perform(multi_handle, &still_running);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while(still_running);
|
||||||
|
|
||||||
|
curl_multi_cleanup(multi_handle);
|
||||||
|
|
||||||
|
for(i=0; i<num_transfers; i++)
|
||||||
|
curl_easy_cleanup(easy[i]);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
313
docs/examples/http2-serverpush.c
Normal file
313
docs/examples/http2-serverpush.c
Normal file
@@ -0,0 +1,313 @@
|
|||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
|
*
|
||||||
|
* This software is licensed as described in the file COPYING, which
|
||||||
|
* you should have received as part of this distribution. The terms
|
||||||
|
* are also available at http://curl.haxx.se/docs/copyright.html.
|
||||||
|
*
|
||||||
|
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||||
|
* copies of the Software, and permit persons to whom the Software is
|
||||||
|
* furnished to do so, under the terms of the COPYING file.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
|
*
|
||||||
|
***************************************************************************/
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/* somewhat unix-specific */
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
/* curl stuff */
|
||||||
|
#include <curl/curl.h>
|
||||||
|
|
||||||
|
#ifndef CURLPIPE_MULTIPLEX
|
||||||
|
#error "too old libcurl, can't do HTTP/2 server push!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static
|
||||||
|
void dump(const char *text, unsigned char *ptr, size_t size,
|
||||||
|
char nohex)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
size_t c;
|
||||||
|
|
||||||
|
unsigned int width=0x10;
|
||||||
|
|
||||||
|
if(nohex)
|
||||||
|
/* without the hex output, we can fit more on screen */
|
||||||
|
width = 0x40;
|
||||||
|
|
||||||
|
fprintf(stderr, "%s, %ld bytes (0x%lx)\n",
|
||||||
|
text, (long)size, (long)size);
|
||||||
|
|
||||||
|
for(i=0; i<size; i+= width) {
|
||||||
|
|
||||||
|
fprintf(stderr, "%4.4lx: ", (long)i);
|
||||||
|
|
||||||
|
if(!nohex) {
|
||||||
|
/* hex not disabled, show it */
|
||||||
|
for(c = 0; c < width; c++)
|
||||||
|
if(i+c < size)
|
||||||
|
fprintf(stderr, "%02x ", ptr[i+c]);
|
||||||
|
else
|
||||||
|
fputs(" ", stderr);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(c = 0; (c < width) && (i+c < size); c++) {
|
||||||
|
/* check for 0D0A; if found, skip past and start a new line of output */
|
||||||
|
if (nohex && (i+c+1 < size) && ptr[i+c]==0x0D && ptr[i+c+1]==0x0A) {
|
||||||
|
i+=(c+2-width);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fprintf(stderr, "%c",
|
||||||
|
(ptr[i+c]>=0x20) && (ptr[i+c]<0x80)?ptr[i+c]:'.');
|
||||||
|
/* check again for 0D0A, to avoid an extra \n if it's at width */
|
||||||
|
if (nohex && (i+c+2 < size) && ptr[i+c+1]==0x0D && ptr[i+c+2]==0x0A) {
|
||||||
|
i+=(c+3-width);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fputc('\n', stderr); /* newline */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
int my_trace(CURL *handle, curl_infotype type,
|
||||||
|
char *data, size_t size,
|
||||||
|
void *userp)
|
||||||
|
{
|
||||||
|
const char *text;
|
||||||
|
(void)handle; /* prevent compiler warning */
|
||||||
|
(void)userp;
|
||||||
|
switch (type) {
|
||||||
|
case CURLINFO_TEXT:
|
||||||
|
fprintf(stderr, "== Info: %s", data);
|
||||||
|
default: /* in case a new one is introduced to shock us */
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
case CURLINFO_HEADER_OUT:
|
||||||
|
text = "=> Send header";
|
||||||
|
break;
|
||||||
|
case CURLINFO_DATA_OUT:
|
||||||
|
text = "=> Send data";
|
||||||
|
break;
|
||||||
|
case CURLINFO_SSL_DATA_OUT:
|
||||||
|
text = "=> Send SSL data";
|
||||||
|
break;
|
||||||
|
case CURLINFO_HEADER_IN:
|
||||||
|
text = "<= Recv header";
|
||||||
|
break;
|
||||||
|
case CURLINFO_DATA_IN:
|
||||||
|
text = "<= Recv data";
|
||||||
|
break;
|
||||||
|
case CURLINFO_SSL_DATA_IN:
|
||||||
|
text = "<= Recv SSL data";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
dump(text, (unsigned char *)data, size, 1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void setup(CURL *hnd)
|
||||||
|
{
|
||||||
|
FILE *out = fopen("dl", "wb");
|
||||||
|
|
||||||
|
/* write to this file */
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, out);
|
||||||
|
|
||||||
|
/* set the same URL */
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_URL, "https://localhost:8443/index.html");
|
||||||
|
|
||||||
|
/* send it verbose for max debuggaility */
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, my_trace);
|
||||||
|
|
||||||
|
/* HTTP/2 please */
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
|
||||||
|
|
||||||
|
/* we use a self-signed test server, skip verification during debugging */
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYPEER, 0L);
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYHOST, 0L);
|
||||||
|
|
||||||
|
#if (CURLPIPE_MULTIPLEX > 0)
|
||||||
|
/* wait for pipe connection to confirm */
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* called when there's an incoming push */
|
||||||
|
static int server_push_callback(CURL *parent,
|
||||||
|
CURL *easy,
|
||||||
|
size_t num_headers,
|
||||||
|
struct curl_pushheaders *headers,
|
||||||
|
void *userp)
|
||||||
|
{
|
||||||
|
char *headp;
|
||||||
|
size_t i;
|
||||||
|
int *transfers = (int *)userp;
|
||||||
|
char filename[128];
|
||||||
|
FILE *out;
|
||||||
|
static unsigned int count = 0;
|
||||||
|
|
||||||
|
(void)parent; /* we have no use for this */
|
||||||
|
|
||||||
|
sprintf(filename, "push%u", count++);
|
||||||
|
|
||||||
|
/* here's a new stream, save it in a new file for each new push */
|
||||||
|
out = fopen(filename, "wb");
|
||||||
|
|
||||||
|
/* write to this file */
|
||||||
|
curl_easy_setopt(easy, CURLOPT_WRITEDATA, out);
|
||||||
|
|
||||||
|
fprintf(stderr, "**** push callback approves stream %u, got %d headers!\n",
|
||||||
|
count, (int)num_headers);
|
||||||
|
|
||||||
|
for(i=0; i<num_headers; i++) {
|
||||||
|
headp = curl_pushheader_bynum(headers, i);
|
||||||
|
fprintf(stderr, "**** header %u: %s\n", (int)i, headp);
|
||||||
|
}
|
||||||
|
|
||||||
|
headp = curl_pushheader_byname(headers, ":path");
|
||||||
|
if(headp) {
|
||||||
|
fprintf(stderr, "**** The PATH is %s\n", headp /* skip :path + colon */ );
|
||||||
|
}
|
||||||
|
|
||||||
|
(*transfers)++; /* one more */
|
||||||
|
return CURL_PUSH_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Download a file over HTTP/2, take care of server push.
|
||||||
|
*/
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
CURL *easy;
|
||||||
|
CURLM *multi_handle;
|
||||||
|
int still_running; /* keep number of running handles */
|
||||||
|
int transfers=1; /* we start with one */
|
||||||
|
struct CURLMsg *m;
|
||||||
|
|
||||||
|
/* init a multi stack */
|
||||||
|
multi_handle = curl_multi_init();
|
||||||
|
|
||||||
|
easy = curl_easy_init();
|
||||||
|
|
||||||
|
/* set options */
|
||||||
|
setup(easy);
|
||||||
|
|
||||||
|
/* add the easy transfer */
|
||||||
|
curl_multi_add_handle(multi_handle, easy);
|
||||||
|
|
||||||
|
curl_multi_setopt(multi_handle, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
|
||||||
|
curl_multi_setopt(multi_handle, CURLMOPT_PUSHFUNCTION, server_push_callback);
|
||||||
|
curl_multi_setopt(multi_handle, CURLMOPT_PUSHDATA, &transfers);
|
||||||
|
|
||||||
|
/* we start some action by calling perform right away */
|
||||||
|
curl_multi_perform(multi_handle, &still_running);
|
||||||
|
|
||||||
|
do {
|
||||||
|
struct timeval timeout;
|
||||||
|
int rc; /* select() return code */
|
||||||
|
CURLMcode mc; /* curl_multi_fdset() return code */
|
||||||
|
|
||||||
|
fd_set fdread;
|
||||||
|
fd_set fdwrite;
|
||||||
|
fd_set fdexcep;
|
||||||
|
int maxfd = -1;
|
||||||
|
|
||||||
|
long curl_timeo = -1;
|
||||||
|
|
||||||
|
FD_ZERO(&fdread);
|
||||||
|
FD_ZERO(&fdwrite);
|
||||||
|
FD_ZERO(&fdexcep);
|
||||||
|
|
||||||
|
/* set a suitable timeout to play around with */
|
||||||
|
timeout.tv_sec = 1;
|
||||||
|
timeout.tv_usec = 0;
|
||||||
|
|
||||||
|
curl_multi_timeout(multi_handle, &curl_timeo);
|
||||||
|
if(curl_timeo >= 0) {
|
||||||
|
timeout.tv_sec = curl_timeo / 1000;
|
||||||
|
if(timeout.tv_sec > 1)
|
||||||
|
timeout.tv_sec = 1;
|
||||||
|
else
|
||||||
|
timeout.tv_usec = (curl_timeo % 1000) * 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get file descriptors from the transfers */
|
||||||
|
mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
||||||
|
|
||||||
|
if(mc != CURLM_OK) {
|
||||||
|
fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* On success the value of maxfd is guaranteed to be >= -1. We call
|
||||||
|
select(maxfd + 1, ...); specially in case of (maxfd == -1) there are
|
||||||
|
no fds ready yet so we call select(0, ...) --or Sleep() on Windows--
|
||||||
|
to sleep 100ms, which is the minimum suggested value in the
|
||||||
|
curl_multi_fdset() doc. */
|
||||||
|
|
||||||
|
if(maxfd == -1) {
|
||||||
|
#ifdef _WIN32
|
||||||
|
Sleep(100);
|
||||||
|
rc = 0;
|
||||||
|
#else
|
||||||
|
/* Portable sleep for platforms other than Windows. */
|
||||||
|
struct timeval wait = { 0, 100 * 1000 }; /* 100ms */
|
||||||
|
rc = select(0, NULL, NULL, NULL, &wait);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Note that on some platforms 'timeout' may be modified by select().
|
||||||
|
If you need access to the original value save a copy beforehand. */
|
||||||
|
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(rc) {
|
||||||
|
case -1:
|
||||||
|
/* select error */
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
default:
|
||||||
|
/* timeout or readable/writable sockets */
|
||||||
|
curl_multi_perform(multi_handle, &still_running);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A little caution when doing server push is that libcurl itself has
|
||||||
|
* created and added one or more easy handles but we need to clean them up
|
||||||
|
* when we are done.
|
||||||
|
*/
|
||||||
|
|
||||||
|
do {
|
||||||
|
int msgq = 0;;
|
||||||
|
m = curl_multi_info_read(multi_handle, &msgq);
|
||||||
|
if(m && (m->msg == CURLMSG_DONE)) {
|
||||||
|
CURL *e = m->easy_handle;
|
||||||
|
transfers--;
|
||||||
|
curl_multi_remove_handle(multi_handle, e);
|
||||||
|
curl_easy_cleanup(e);
|
||||||
|
}
|
||||||
|
} while(m);
|
||||||
|
|
||||||
|
} while(transfers); /* as long as we have transfers going */
|
||||||
|
|
||||||
|
curl_multi_cleanup(multi_handle);
|
||||||
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
352
docs/examples/http2-upload.c
Normal file
352
docs/examples/http2-upload.c
Normal file
@@ -0,0 +1,352 @@
|
|||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
|
*
|
||||||
|
* This software is licensed as described in the file COPYING, which
|
||||||
|
* you should have received as part of this distribution. The terms
|
||||||
|
* are also available at http://curl.haxx.se/docs/copyright.html.
|
||||||
|
*
|
||||||
|
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||||
|
* copies of the Software, and permit persons to whom the Software is
|
||||||
|
* furnished to do so, under the terms of the COPYING file.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
|
*
|
||||||
|
***************************************************************************/
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
/* somewhat unix-specific */
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
/* curl stuff */
|
||||||
|
#include <curl/curl.h>
|
||||||
|
|
||||||
|
#ifndef CURLPIPE_MULTIPLEX
|
||||||
|
/* This little trick will just make sure that we don't enable pipelining for
|
||||||
|
libcurls old enough to not have this symbol. It is _not_ defined to zero in
|
||||||
|
a recent libcurl header. */
|
||||||
|
#define CURLPIPE_MULTIPLEX 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define NUM_HANDLES 1000
|
||||||
|
|
||||||
|
void *curl_hnd[NUM_HANDLES];
|
||||||
|
int num_transfers;
|
||||||
|
|
||||||
|
/* a handle to number lookup, highly ineffective when we do many
|
||||||
|
transfers... */
|
||||||
|
static int hnd2num(CURL *hnd)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for(i=0; i< num_transfers; i++) {
|
||||||
|
if(curl_hnd[i] == hnd)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
return 0; /* weird, but just a fail-safe */
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void dump(const char *text, int num, unsigned char *ptr, size_t size,
|
||||||
|
char nohex)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
size_t c;
|
||||||
|
unsigned int width=0x10;
|
||||||
|
|
||||||
|
if(nohex)
|
||||||
|
/* without the hex output, we can fit more on screen */
|
||||||
|
width = 0x40;
|
||||||
|
|
||||||
|
fprintf(stderr, "%d %s, %ld bytes (0x%lx)\n",
|
||||||
|
num, text, (long)size, (long)size);
|
||||||
|
|
||||||
|
for(i=0; i<size; i+= width) {
|
||||||
|
|
||||||
|
fprintf(stderr, "%4.4lx: ", (long)i);
|
||||||
|
|
||||||
|
if(!nohex) {
|
||||||
|
/* hex not disabled, show it */
|
||||||
|
for(c = 0; c < width; c++)
|
||||||
|
if(i+c < size)
|
||||||
|
fprintf(stderr, "%02x ", ptr[i+c]);
|
||||||
|
else
|
||||||
|
fputs(" ", stderr);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(c = 0; (c < width) && (i+c < size); c++) {
|
||||||
|
/* check for 0D0A; if found, skip past and start a new line of output */
|
||||||
|
if (nohex && (i+c+1 < size) && ptr[i+c]==0x0D && ptr[i+c+1]==0x0A) {
|
||||||
|
i+=(c+2-width);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fprintf(stderr, "%c",
|
||||||
|
(ptr[i+c]>=0x20) && (ptr[i+c]<0x80)?ptr[i+c]:'.');
|
||||||
|
/* check again for 0D0A, to avoid an extra \n if it's at width */
|
||||||
|
if (nohex && (i+c+2 < size) && ptr[i+c+1]==0x0D && ptr[i+c+2]==0x0A) {
|
||||||
|
i+=(c+3-width);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fputc('\n', stderr); /* newline */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
int my_trace(CURL *handle, curl_infotype type,
|
||||||
|
char *data, size_t size,
|
||||||
|
void *userp)
|
||||||
|
{
|
||||||
|
char timebuf[20];
|
||||||
|
const char *text;
|
||||||
|
int num = hnd2num(handle);
|
||||||
|
static time_t epoch_offset;
|
||||||
|
static int known_offset;
|
||||||
|
struct timeval tv;
|
||||||
|
time_t secs;
|
||||||
|
struct tm *now;
|
||||||
|
|
||||||
|
(void)handle; /* prevent compiler warning */
|
||||||
|
(void)userp;
|
||||||
|
|
||||||
|
gettimeofday(&tv, NULL);
|
||||||
|
if(!known_offset) {
|
||||||
|
epoch_offset = time(NULL) - tv.tv_sec;
|
||||||
|
known_offset = 1;
|
||||||
|
}
|
||||||
|
secs = epoch_offset + tv.tv_sec;
|
||||||
|
now = localtime(&secs); /* not thread safe but we don't care */
|
||||||
|
snprintf(timebuf, sizeof(timebuf), "%02d:%02d:%02d.%06ld",
|
||||||
|
now->tm_hour, now->tm_min, now->tm_sec, (long)tv.tv_usec);
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case CURLINFO_TEXT:
|
||||||
|
fprintf(stderr, "%s [%d] Info: %s", timebuf, num, data);
|
||||||
|
default: /* in case a new one is introduced to shock us */
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
case CURLINFO_HEADER_OUT:
|
||||||
|
text = "=> Send header";
|
||||||
|
break;
|
||||||
|
case CURLINFO_DATA_OUT:
|
||||||
|
text = "=> Send data";
|
||||||
|
break;
|
||||||
|
case CURLINFO_SSL_DATA_OUT:
|
||||||
|
text = "=> Send SSL data";
|
||||||
|
break;
|
||||||
|
case CURLINFO_HEADER_IN:
|
||||||
|
text = "<= Recv header";
|
||||||
|
break;
|
||||||
|
case CURLINFO_DATA_IN:
|
||||||
|
text = "<= Recv data";
|
||||||
|
break;
|
||||||
|
case CURLINFO_SSL_DATA_IN:
|
||||||
|
text = "<= Recv SSL data";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
dump(text, num, (unsigned char *)data, size, 1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct input {
|
||||||
|
FILE *in;
|
||||||
|
size_t bytes_read; /* count up */
|
||||||
|
CURL *hnd;
|
||||||
|
};
|
||||||
|
|
||||||
|
static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
|
||||||
|
{
|
||||||
|
struct input *i = userp;
|
||||||
|
size_t retcode = fread(ptr, size, nmemb, i->in);
|
||||||
|
i->bytes_read += retcode;
|
||||||
|
return retcode;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct input indata[NUM_HANDLES];
|
||||||
|
|
||||||
|
static void setup(CURL *hnd, int num, const char *upload)
|
||||||
|
{
|
||||||
|
FILE *out;
|
||||||
|
char url[256];
|
||||||
|
char filename[128];
|
||||||
|
struct stat file_info;
|
||||||
|
curl_off_t uploadsize;
|
||||||
|
|
||||||
|
sprintf(filename, "dl-%d", num);
|
||||||
|
out = fopen(filename, "wb");
|
||||||
|
|
||||||
|
sprintf(url, "https://localhost:8443/upload-%d", num);
|
||||||
|
|
||||||
|
/* get the file size of the local file */
|
||||||
|
stat(upload, &file_info);
|
||||||
|
uploadsize = file_info.st_size;
|
||||||
|
|
||||||
|
indata[num].in = fopen(upload, "rb");
|
||||||
|
indata[num].hnd = hnd;
|
||||||
|
|
||||||
|
/* write to this file */
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, out);
|
||||||
|
|
||||||
|
/* we want to use our own read function */
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_READFUNCTION, read_callback);
|
||||||
|
/* read from this file */
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_READDATA, &indata[num]);
|
||||||
|
/* provide the size of the upload */
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_INFILESIZE_LARGE, uploadsize);
|
||||||
|
|
||||||
|
/* send in the URL to store the upload as */
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_URL, url);
|
||||||
|
|
||||||
|
/* upload please */
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_UPLOAD, 1L);
|
||||||
|
|
||||||
|
/* send it verbose for max debuggaility */
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, my_trace);
|
||||||
|
|
||||||
|
/* HTTP/2 please */
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
|
||||||
|
|
||||||
|
/* we use a self-signed test server, skip verification during debugging */
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYPEER, 0L);
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYHOST, 0L);
|
||||||
|
|
||||||
|
#if (CURLPIPE_MULTIPLEX > 0)
|
||||||
|
/* wait for pipe connection to confirm */
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
curl_hnd[num] = hnd;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Upload all files over HTTP/2, using the same physical connection!
|
||||||
|
*/
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
CURL *easy[NUM_HANDLES];
|
||||||
|
CURLM *multi_handle;
|
||||||
|
int i;
|
||||||
|
int still_running; /* keep number of running handles */
|
||||||
|
const char *filename = "index.html";
|
||||||
|
|
||||||
|
if(argc > 1)
|
||||||
|
/* if given a number, do that many transfers */
|
||||||
|
num_transfers = atoi(argv[1]);
|
||||||
|
|
||||||
|
if(argc > 2)
|
||||||
|
/* if given a file name, upload this! */
|
||||||
|
filename = argv[2];
|
||||||
|
|
||||||
|
if(!num_transfers || (num_transfers > NUM_HANDLES))
|
||||||
|
num_transfers = 3; /* a suitable low default */
|
||||||
|
|
||||||
|
/* init a multi stack */
|
||||||
|
multi_handle = curl_multi_init();
|
||||||
|
|
||||||
|
for(i=0; i<num_transfers; i++) {
|
||||||
|
easy[i] = curl_easy_init();
|
||||||
|
/* set options */
|
||||||
|
setup(easy[i], i, filename);
|
||||||
|
|
||||||
|
/* add the individual transfer */
|
||||||
|
curl_multi_add_handle(multi_handle, easy[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
curl_multi_setopt(multi_handle, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
|
||||||
|
|
||||||
|
/* We do HTTP/2 so let's stick to one connection per host */
|
||||||
|
curl_multi_setopt(multi_handle, CURLMOPT_MAX_HOST_CONNECTIONS, 1L);
|
||||||
|
|
||||||
|
/* we start some action by calling perform right away */
|
||||||
|
curl_multi_perform(multi_handle, &still_running);
|
||||||
|
|
||||||
|
do {
|
||||||
|
struct timeval timeout;
|
||||||
|
int rc; /* select() return code */
|
||||||
|
CURLMcode mc; /* curl_multi_fdset() return code */
|
||||||
|
|
||||||
|
fd_set fdread;
|
||||||
|
fd_set fdwrite;
|
||||||
|
fd_set fdexcep;
|
||||||
|
int maxfd = -1;
|
||||||
|
|
||||||
|
long curl_timeo = -1;
|
||||||
|
|
||||||
|
FD_ZERO(&fdread);
|
||||||
|
FD_ZERO(&fdwrite);
|
||||||
|
FD_ZERO(&fdexcep);
|
||||||
|
|
||||||
|
/* set a suitable timeout to play around with */
|
||||||
|
timeout.tv_sec = 1;
|
||||||
|
timeout.tv_usec = 0;
|
||||||
|
|
||||||
|
curl_multi_timeout(multi_handle, &curl_timeo);
|
||||||
|
if(curl_timeo >= 0) {
|
||||||
|
timeout.tv_sec = curl_timeo / 1000;
|
||||||
|
if(timeout.tv_sec > 1)
|
||||||
|
timeout.tv_sec = 1;
|
||||||
|
else
|
||||||
|
timeout.tv_usec = (curl_timeo % 1000) * 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get file descriptors from the transfers */
|
||||||
|
mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
||||||
|
|
||||||
|
if(mc != CURLM_OK)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* On success the value of maxfd is guaranteed to be >= -1. We call
|
||||||
|
select(maxfd + 1, ...); specially in case of (maxfd == -1) there are
|
||||||
|
no fds ready yet so we call select(0, ...) --or Sleep() on Windows--
|
||||||
|
to sleep 100ms, which is the minimum suggested value in the
|
||||||
|
curl_multi_fdset() doc. */
|
||||||
|
|
||||||
|
if(maxfd == -1) {
|
||||||
|
#ifdef _WIN32
|
||||||
|
Sleep(100);
|
||||||
|
rc = 0;
|
||||||
|
#else
|
||||||
|
/* Portable sleep for platforms other than Windows. */
|
||||||
|
struct timeval wait = { 0, 100 * 1000 }; /* 100ms */
|
||||||
|
rc = select(0, NULL, NULL, NULL, &wait);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Note that on some platforms 'timeout' may be modified by select().
|
||||||
|
If you need access to the original value save a copy beforehand. */
|
||||||
|
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(rc) {
|
||||||
|
case -1:
|
||||||
|
/* select error */
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
default:
|
||||||
|
/* timeout or readable/writable sockets */
|
||||||
|
curl_multi_perform(multi_handle, &still_running);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while(still_running);
|
||||||
|
|
||||||
|
curl_multi_cleanup(multi_handle);
|
||||||
|
|
||||||
|
for(i=0; i<num_transfers; i++)
|
||||||
|
curl_easy_cleanup(easy[i]);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@@ -60,7 +60,7 @@ int main(void)
|
|||||||
* they have mentioned in their server certificate's commonName (or
|
* they have mentioned in their server certificate's commonName (or
|
||||||
* subjectAltName) fields, libcurl will refuse to connect. You can skip
|
* subjectAltName) fields, libcurl will refuse to connect. You can skip
|
||||||
* this check, but this will make the connection less secure. */
|
* this check, but this will make the connection less secure. */
|
||||||
#ifdef SKIP_HOSTNAME_VERFICATION
|
#ifdef SKIP_HOSTNAME_VERIFICATION
|
||||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
|
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -64,7 +64,7 @@ int main(void)
|
|||||||
curl = curl_easy_init();
|
curl = curl_easy_init();
|
||||||
multi_handle = curl_multi_init();
|
multi_handle = curl_multi_init();
|
||||||
|
|
||||||
/* initalize custom header list (stating that Expect: 100-continue is not
|
/* initialize custom header list (stating that Expect: 100-continue is not
|
||||||
wanted */
|
wanted */
|
||||||
headerlist = curl_slist_append(headerlist, buf);
|
headerlist = curl_slist_append(headerlist, buf);
|
||||||
if(curl && multi_handle) {
|
if(curl && multi_handle) {
|
||||||
|
@@ -81,7 +81,7 @@ int main(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 'numfds' being zero means either a timeout or no file descriptors to
|
/* 'numfds' being zero means either a timeout or no file descriptors to
|
||||||
wait for. Try timeout on first occurance, then assume no file
|
wait for. Try timeout on first occurrence, then assume no file
|
||||||
descriptors and no file descriptors to wait for means wait for 100
|
descriptors and no file descriptors to wait for means wait for 100
|
||||||
milliseconds. */
|
milliseconds. */
|
||||||
|
|
||||||
|
@@ -69,7 +69,7 @@ int main(void)
|
|||||||
curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
|
curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
|
||||||
curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
|
curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
|
||||||
|
|
||||||
/* This will retreive message 1 from the user's mailbox */
|
/* This will retrieve message 1 from the user's mailbox */
|
||||||
curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com/1");
|
curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com/1");
|
||||||
|
|
||||||
/* Tell the multi stack about our easy handle */
|
/* Tell the multi stack about our easy handle */
|
||||||
|
@@ -39,7 +39,7 @@ int main(void)
|
|||||||
curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
|
curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
|
||||||
curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
|
curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
|
||||||
|
|
||||||
/* This will retreive message 1 from the user's mailbox */
|
/* This will retrieve message 1 from the user's mailbox */
|
||||||
curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com/1");
|
curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com/1");
|
||||||
|
|
||||||
/* Perform the retr */
|
/* Perform the retr */
|
||||||
|
@@ -40,7 +40,7 @@ int main(void)
|
|||||||
curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
|
curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
|
||||||
curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
|
curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
|
||||||
|
|
||||||
/* This will retreive message 1 from the user's mailbox. Note the use of
|
/* This will retrieve message 1 from the user's mailbox. Note the use of
|
||||||
* pop3s:// rather than pop3:// to request a SSL based connection. */
|
* pop3s:// rather than pop3:// to request a SSL based connection. */
|
||||||
curl_easy_setopt(curl, CURLOPT_URL, "pop3s://pop.example.com/1");
|
curl_easy_setopt(curl, CURLOPT_URL, "pop3s://pop.example.com/1");
|
||||||
|
|
||||||
@@ -60,7 +60,7 @@ int main(void)
|
|||||||
* they have mentioned in their server certificate's commonName (or
|
* they have mentioned in their server certificate's commonName (or
|
||||||
* subjectAltName) fields, libcurl will refuse to connect. You can skip
|
* subjectAltName) fields, libcurl will refuse to connect. You can skip
|
||||||
* this check, but this will make the connection less secure. */
|
* this check, but this will make the connection less secure. */
|
||||||
#ifdef SKIP_HOSTNAME_VERFICATION
|
#ifdef SKIP_HOSTNAME_VERIFICATION
|
||||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
|
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -40,7 +40,7 @@ int main(void)
|
|||||||
curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
|
curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
|
||||||
curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
|
curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
|
||||||
|
|
||||||
/* This will retreive message 1 from the user's mailbox */
|
/* This will retrieve message 1 from the user's mailbox */
|
||||||
curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com/1");
|
curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com/1");
|
||||||
|
|
||||||
/* In this example, we'll start with a plain text connection, and upgrade
|
/* In this example, we'll start with a plain text connection, and upgrade
|
||||||
|
@@ -73,7 +73,7 @@ int main(int argc, char *argv[])
|
|||||||
CURLFORM_END);
|
CURLFORM_END);
|
||||||
|
|
||||||
curl = curl_easy_init();
|
curl = curl_easy_init();
|
||||||
/* initalize custom header list (stating that Expect: 100-continue is not
|
/* initialize custom header list (stating that Expect: 100-continue is not
|
||||||
wanted */
|
wanted */
|
||||||
headerlist = curl_slist_append(headerlist, buf);
|
headerlist = curl_slist_append(headerlist, buf);
|
||||||
if(curl) {
|
if(curl) {
|
||||||
|
@@ -58,7 +58,7 @@ int main(void)
|
|||||||
CURL *curl;
|
CURL *curl;
|
||||||
CURLcode res;
|
CURLcode res;
|
||||||
struct FtpFile ftpfile={
|
struct FtpFile ftpfile={
|
||||||
"yourfile.bin", /* name to store the file as if succesful */
|
"yourfile.bin", /* name to store the file as if successful */
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -24,7 +24,7 @@
|
|||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
|
|
||||||
/* This is a simple example showing how to send mail using libcurl's SMTP
|
/* This is a simple example showing how to send mail using libcurl's SMTP
|
||||||
* capabilities. For an exmaple of using the multi interface please see
|
* capabilities. For an example of using the multi interface please see
|
||||||
* smtp-multi.c.
|
* smtp-multi.c.
|
||||||
*
|
*
|
||||||
* Note that this example requires libcurl 7.20.0 or above.
|
* Note that this example requires libcurl 7.20.0 or above.
|
||||||
|
@@ -111,7 +111,7 @@ int main(void)
|
|||||||
* they have mentioned in their server certificate's commonName (or
|
* they have mentioned in their server certificate's commonName (or
|
||||||
* subjectAltName) fields, libcurl will refuse to connect. You can skip
|
* subjectAltName) fields, libcurl will refuse to connect. You can skip
|
||||||
* this check, but this will make the connection less secure. */
|
* this check, but this will make the connection less secure. */
|
||||||
#ifdef SKIP_HOSTNAME_VERFICATION
|
#ifdef SKIP_HOSTNAME_VERIFICATION
|
||||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
|
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -120,7 +120,7 @@ int main(void)
|
|||||||
XML_SetElementHandler(parser, startElement, endElement);
|
XML_SetElementHandler(parser, startElement, endElement);
|
||||||
XML_SetCharacterDataHandler(parser, characterDataHandler);
|
XML_SetCharacterDataHandler(parser, characterDataHandler);
|
||||||
|
|
||||||
/* Initalize a libcurl handle. */
|
/* Initialize a libcurl handle. */
|
||||||
curl_global_init(CURL_GLOBAL_ALL ^ CURL_GLOBAL_SSL);
|
curl_global_init(CURL_GLOBAL_ALL ^ CURL_GLOBAL_SSL);
|
||||||
curl_handle = curl_easy_init();
|
curl_handle = curl_easy_init();
|
||||||
curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.w3schools.com/xml/simple.xml");
|
curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.w3schools.com/xml/simple.xml");
|
||||||
|
1
docs/libcurl/.gitignore
vendored
1
docs/libcurl/.gitignore
vendored
@@ -1,2 +1,3 @@
|
|||||||
*.html
|
*.html
|
||||||
*.pdf
|
*.pdf
|
||||||
|
libcurl-symbols.3
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
.\" * | (__| |_| | _ <| |___
|
.\" * | (__| |_| | _ <| |___
|
||||||
.\" * \___|\___/|_| \_\_____|
|
.\" * \___|\___/|_| \_\_____|
|
||||||
.\" *
|
.\" *
|
||||||
.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
.\" *
|
.\" *
|
||||||
.\" * This software is licensed as described in the file COPYING, which
|
.\" * This software is licensed as described in the file COPYING, which
|
||||||
.\" * you should have received as part of this distribution. The terms
|
.\" * you should have received as part of this distribution. The terms
|
||||||
@@ -63,5 +63,6 @@ if(curl) {
|
|||||||
}
|
}
|
||||||
.fi
|
.fi
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
.BR curl_easy_init "(3), "
|
.BR curl_easy_init "(3), " curl_easy_duphandle "(3), "
|
||||||
|
.BR curl_easy_reset "(3), "
|
||||||
|
.BR curl_multi_cleanup "(3), " curl_multi_remove_handle "(3) "
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
.\" * | (__| |_| | _ <| |___
|
.\" * | (__| |_| | _ <| |___
|
||||||
.\" * \___|\___/|_| \_\_____|
|
.\" * \___|\___/|_| \_\_____|
|
||||||
.\" *
|
.\" *
|
||||||
.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
.\" *
|
.\" *
|
||||||
.\" * This software is licensed as described in the file COPYING, which
|
.\" * This software is licensed as described in the file COPYING, which
|
||||||
.\" * you should have received as part of this distribution. The terms
|
.\" * you should have received as part of this distribution. The terms
|
||||||
@@ -47,4 +47,6 @@ in a synchronous way, the input handle may not be in use when cloned.
|
|||||||
If this function returns NULL, something went wrong and no valid handle was
|
If this function returns NULL, something went wrong and no valid handle was
|
||||||
returned.
|
returned.
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
.BR curl_easy_init "(3)," curl_easy_cleanup "(3)," curl_global_init "(3)"
|
.BR curl_easy_init "(3)," curl_easy_cleanup "(3)," curl_easy_reset "(3),"
|
||||||
|
.BR curl_global_init "(3)"
|
||||||
|
|
||||||
|
@@ -29,13 +29,13 @@ curl_easy_escape - URL encodes the given string
|
|||||||
.BI "char *curl_easy_escape( CURL *" curl ", char *" string ", int "length " );"
|
.BI "char *curl_easy_escape( CURL *" curl ", char *" string ", int "length " );"
|
||||||
.ad
|
.ad
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
This function converts the given input \fBstring\fP to an URL encoded string
|
This function converts the given input \fIstring\fP to a URL encoded string
|
||||||
and returns that as a new allocated string. All input characters that are not
|
and returns that as a new allocated string. All input characters that are not
|
||||||
a-z, A-Z, 0-9, '-', '.', '_' or '~' are converted to their "URL escaped"
|
a-z, A-Z, 0-9, '-', '.', '_' or '~' are converted to their "URL escaped"
|
||||||
version (%NN where NN is a two-digit hexadecimal number).
|
version (%NN where NN is a two-digit hexadecimal number).
|
||||||
|
|
||||||
If the \fBlength\fP argument is set to 0 (zero), \fIcurl_easy_escape(3)\fP
|
If \fIlength\fP is set to 0 (zero), \fIcurl_easy_escape(3)\fP uses strlen() on
|
||||||
uses strlen() on the input \fBurl\fP to find out the size.
|
the input \fIstring\fP to find out the size.
|
||||||
|
|
||||||
You must \fIcurl_free(3)\fP the returned string when you're done with it.
|
You must \fIcurl_free(3)\fP the returned string when you're done with it.
|
||||||
.SH AVAILABILITY
|
.SH AVAILABILITY
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
.\" * | (__| |_| | _ <| |___
|
.\" * | (__| |_| | _ <| |___
|
||||||
.\" * \___|\___/|_| \_\_____|
|
.\" * \___|\___/|_| \_\_____|
|
||||||
.\" *
|
.\" *
|
||||||
.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
.\" *
|
.\" *
|
||||||
.\" * This software is licensed as described in the file COPYING, which
|
.\" * This software is licensed as described in the file COPYING, which
|
||||||
.\" * you should have received as part of this distribution. The terms
|
.\" * you should have received as part of this distribution. The terms
|
||||||
@@ -236,6 +236,26 @@ option may not be available for all SSL backends; unsupported SSL backends
|
|||||||
will return 'CURLSSLBACKEND_NONE' to indicate that they are not supported;
|
will return 'CURLSSLBACKEND_NONE' to indicate that they are not supported;
|
||||||
this does not mean that no SSL backend was used. (Added in 7.34.0)
|
this does not mean that no SSL backend was used. (Added in 7.34.0)
|
||||||
|
|
||||||
|
.nf
|
||||||
|
struct curl_tlssessioninfo {
|
||||||
|
curl_sslbackend backend;
|
||||||
|
void *internals;
|
||||||
|
};
|
||||||
|
.fi
|
||||||
|
|
||||||
|
The \fIinternals\fP struct member will point to a TLS library specific pointer
|
||||||
|
with the following underlying types:
|
||||||
|
.RS
|
||||||
|
.IP OpenSSL
|
||||||
|
SSL_CTX *
|
||||||
|
.IP GnuTLS
|
||||||
|
gnutls_session_t
|
||||||
|
.IP NSS
|
||||||
|
PRFileDesc *
|
||||||
|
.IP gskit
|
||||||
|
gsk_handle
|
||||||
|
.RE
|
||||||
|
|
||||||
.IP CURLINFO_CONDITION_UNMET
|
.IP CURLINFO_CONDITION_UNMET
|
||||||
Pass a pointer to a long to receive the number 1 if the condition provided in
|
Pass a pointer to a long to receive the number 1 if the condition provided in
|
||||||
the previous request didn't match (see \fICURLOPT_TIMECONDITION(3)\fP). Alas,
|
the previous request didn't match (see \fICURLOPT_TIMECONDITION(3)\fP). Alas,
|
||||||
|
@@ -50,6 +50,8 @@ really \fICURLOPT_POSTFIELDS(3)\fP, but the alternative that copies the string
|
|||||||
\fICURLOPT_COPYPOSTFIELDS(3)\fP has some usage characteristics you need to
|
\fICURLOPT_COPYPOSTFIELDS(3)\fP has some usage characteristics you need to
|
||||||
read up on.
|
read up on.
|
||||||
|
|
||||||
|
The order in which the options are set does not matter.
|
||||||
|
|
||||||
Before version 7.17.0, strings were not copied. Instead the user was forced
|
Before version 7.17.0, strings were not copied. Instead the user was forced
|
||||||
keep them available until libcurl no longer needed them.
|
keep them available until libcurl no longer needed them.
|
||||||
|
|
||||||
@@ -165,6 +167,10 @@ Tunnel through the HTTP proxy. \fICURLOPT_HTTPPROXYTUNNEL(3)\fP
|
|||||||
Socks5 GSSAPI service name. \fICURLOPT_SOCKS5_GSSAPI_SERVICE(3)\fP
|
Socks5 GSSAPI service name. \fICURLOPT_SOCKS5_GSSAPI_SERVICE(3)\fP
|
||||||
.IP CURLOPT_SOCKS5_GSSAPI_NEC
|
.IP CURLOPT_SOCKS5_GSSAPI_NEC
|
||||||
Socks5 GSSAPI NEC mode. See \fICURLOPT_SOCKS5_GSSAPI_NEC(3)\fP
|
Socks5 GSSAPI NEC mode. See \fICURLOPT_SOCKS5_GSSAPI_NEC(3)\fP
|
||||||
|
.IP CURLOPT_PROXY_SERVICE_NAME
|
||||||
|
Proxy service name. \fICURLOPT_PROXY_SERVICE_NAME(3)\fP
|
||||||
|
.IP CURLOPT_SERVICE_NAME
|
||||||
|
SPNEGO service name. \fICURLOPT_SERVICE_NAME(3)\fP
|
||||||
.IP CURLOPT_INTERFACE
|
.IP CURLOPT_INTERFACE
|
||||||
Bind connection locally to this. See \fICURLOPT_INTERFACE(3)\fP
|
Bind connection locally to this. See \fICURLOPT_INTERFACE(3)\fP
|
||||||
.IP CURLOPT_LOCALPORT
|
.IP CURLOPT_LOCALPORT
|
||||||
@@ -287,6 +293,8 @@ Disable Content decoding. See \fICURLOPT_HTTP_CONTENT_DECODING(3)\fP
|
|||||||
Disable Transfer decoding. See \fICURLOPT_HTTP_TRANSFER_DECODING(3)\fP
|
Disable Transfer decoding. See \fICURLOPT_HTTP_TRANSFER_DECODING(3)\fP
|
||||||
.IP CURLOPT_EXPECT_100_TIMEOUT_MS
|
.IP CURLOPT_EXPECT_100_TIMEOUT_MS
|
||||||
100-continue timeout. See \fICURLOPT_EXPECT_100_TIMEOUT_MS(3)\fP
|
100-continue timeout. See \fICURLOPT_EXPECT_100_TIMEOUT_MS(3)\fP
|
||||||
|
.IP CURLOPT_PIPEWAIT
|
||||||
|
Wait on connection to pipeline on it. See \fICURLOPT_PIPEWAIT(3)\fP
|
||||||
.SH SMTP OPTIONS
|
.SH SMTP OPTIONS
|
||||||
.IP CURLOPT_MAIL_FROM
|
.IP CURLOPT_MAIL_FROM
|
||||||
Address of the sender. See \fICURLOPT_MAIL_FROM(3)\fP
|
Address of the sender. See \fICURLOPT_MAIL_FROM(3)\fP
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
.\" * | (__| |_| | _ <| |___
|
.\" * | (__| |_| | _ <| |___
|
||||||
.\" * \___|\___/|_| \_\_____|
|
.\" * \___|\___/|_| \_\_____|
|
||||||
.\" *
|
.\" *
|
||||||
.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
.\" *
|
.\" *
|
||||||
.\" * This software is licensed as described in the file COPYING, which
|
.\" * This software is licensed as described in the file COPYING, which
|
||||||
.\" * you should have received as part of this distribution. The terms
|
.\" * you should have received as part of this distribution. The terms
|
||||||
@@ -48,4 +48,4 @@ Added in 7.15.4 and replaces the old \fIcurl_unescape(3)\fP function.
|
|||||||
.SH RETURN VALUE
|
.SH RETURN VALUE
|
||||||
A pointer to a zero terminated string or NULL if it failed.
|
A pointer to a zero terminated string or NULL if it failed.
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
.BR curl_easy_escape "(3), " curl_free "(3)," RFC 2396
|
.BR curl_easy_escape "(3), " curl_free "(3)," RFC 3986
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
.\" * | (__| |_| | _ <| |___
|
.\" * | (__| |_| | _ <| |___
|
||||||
.\" * \___|\___/|_| \_\_____|
|
.\" * \___|\___/|_| \_\_____|
|
||||||
.\" *
|
.\" *
|
||||||
.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
.\" *
|
.\" *
|
||||||
.\" * This software is licensed as described in the file COPYING, which
|
.\" * This software is licensed as described in the file COPYING, which
|
||||||
.\" * you should have received as part of this distribution. The terms
|
.\" * you should have received as part of this distribution. The terms
|
||||||
@@ -91,7 +91,7 @@ Sat, 11 Sep 2004 21:32:11 +0200
|
|||||||
This parser was written to handle date formats specified in RFC 822 (including
|
This parser was written to handle date formats specified in RFC 822 (including
|
||||||
the update in RFC 1123) using time zone name or time zone delta and RFC 850
|
the update in RFC 1123) using time zone name or time zone delta and RFC 850
|
||||||
(obsoleted by RFC 1036) and ANSI C's asctime() format. These formats are the
|
(obsoleted by RFC 1036) and ANSI C's asctime() format. These formats are the
|
||||||
only ones RFC2616 says HTTP applications may use.
|
only ones RFC 7231 says HTTP applications may use.
|
||||||
.SH RETURN VALUE
|
.SH RETURN VALUE
|
||||||
This function returns -1 when it fails to parse the date string. Otherwise it
|
This function returns -1 when it fails to parse the date string. Otherwise it
|
||||||
returns the number of seconds as described.
|
returns the number of seconds as described.
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
.\" * | (__| |_| | _ <| |___
|
.\" * | (__| |_| | _ <| |___
|
||||||
.\" * \___|\___/|_| \_\_____|
|
.\" * \___|\___/|_| \_\_____|
|
||||||
.\" *
|
.\" *
|
||||||
.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
.\" *
|
.\" *
|
||||||
.\" * This software is licensed as described in the file COPYING, which
|
.\" * This software is licensed as described in the file COPYING, which
|
||||||
.\" * you should have received as part of this distribution. The terms
|
.\" * you should have received as part of this distribution. The terms
|
||||||
@@ -49,8 +49,8 @@ calling \fIcurl_multi_cleanup(3)\fP, \fIcurl_multi_remove_handle(3)\fP or
|
|||||||
\fIcurl_easy_cleanup(3)\fP.
|
\fIcurl_easy_cleanup(3)\fP.
|
||||||
|
|
||||||
The 'CURLMsg' struct is very simple and only contains very basic information.
|
The 'CURLMsg' struct is very simple and only contains very basic information.
|
||||||
If more involved information is wanted, the particular "easy handle" in
|
If more involved information is wanted, the particular "easy handle" is
|
||||||
present in that struct and can thus be used in subsequent regular
|
present in that struct and can be used in subsequent regular
|
||||||
\fIcurl_easy_getinfo(3)\fP calls (or similar):
|
\fIcurl_easy_getinfo(3)\fP calls (or similar):
|
||||||
|
|
||||||
.nf
|
.nf
|
||||||
@@ -68,6 +68,24 @@ is done, and then \fBresult\fP contains the return code for the easy handle
|
|||||||
that just completed.
|
that just completed.
|
||||||
|
|
||||||
At this point, there are no other \fBmsg\fP types defined.
|
At this point, there are no other \fBmsg\fP types defined.
|
||||||
|
.SH EXAMPLE
|
||||||
|
.nf
|
||||||
|
struct CURLMsg *m;
|
||||||
|
|
||||||
|
/* call curl_multi_perform or curl_multi_socket_action first, then loop
|
||||||
|
through and check if there are any transfers that have completed */
|
||||||
|
|
||||||
|
do {
|
||||||
|
int msgq = 0;
|
||||||
|
m = curl_multi_info_read(multi_handle, &msgq);
|
||||||
|
if(m && (m->msg == CURLMSG_DONE)) {
|
||||||
|
CURL *e = m->easy_handle;
|
||||||
|
transfers--;
|
||||||
|
curl_multi_remove_handle(multi_handle, e);
|
||||||
|
curl_easy_cleanup(e);
|
||||||
|
}
|
||||||
|
} while(m);
|
||||||
|
.fi
|
||||||
.SH "RETURN VALUE"
|
.SH "RETURN VALUE"
|
||||||
A pointer to a filled-in struct, or NULL if it failed or ran out of
|
A pointer to a filled-in struct, or NULL if it failed or ran out of
|
||||||
structs. It also writes the number of messages left in the queue (after this
|
structs. It also writes the number of messages left in the queue (after this
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
.\" * | (__| |_| | _ <| |___
|
.\" * | (__| |_| | _ <| |___
|
||||||
.\" * \___|\___/|_| \_\_____|
|
.\" * \___|\___/|_| \_\_____|
|
||||||
.\" *
|
.\" *
|
||||||
.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
.\" *
|
.\" *
|
||||||
.\" * This software is licensed as described in the file COPYING, which
|
.\" * This software is licensed as described in the file COPYING, which
|
||||||
.\" * you should have received as part of this distribution. The terms
|
.\" * you should have received as part of this distribution. The terms
|
||||||
@@ -49,6 +49,55 @@ added handle fails very quickly, it may never be counted as a running_handle.
|
|||||||
|
|
||||||
When \fIrunning_handles\fP is set to zero (0) on the return of this function,
|
When \fIrunning_handles\fP is set to zero (0) on the return of this function,
|
||||||
there is no longer any transfers in progress.
|
there is no longer any transfers in progress.
|
||||||
|
.SH EXAMPLE
|
||||||
|
.nf
|
||||||
|
#ifdef _WIN32
|
||||||
|
#define SHORT_SLEEP Sleep(100)
|
||||||
|
#else
|
||||||
|
#define SHORT_SLEEP usleep(100000)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
fd_set fdread;
|
||||||
|
fd_set fdwrite;
|
||||||
|
fd_set fdexcep;
|
||||||
|
int maxfd = -1;
|
||||||
|
|
||||||
|
long curl_timeo;
|
||||||
|
|
||||||
|
curl_multi_timeout(multi_handle, &curl_timeo);
|
||||||
|
if(curl_timeo < 0)
|
||||||
|
curl_timeo = 1000;
|
||||||
|
|
||||||
|
timeout.tv_sec = curl_timeo / 1000;
|
||||||
|
timeout.tv_usec = (curl_timeo % 1000) * 1000;
|
||||||
|
|
||||||
|
FD_ZERO(&fdread);
|
||||||
|
FD_ZERO(&fdwrite);
|
||||||
|
FD_ZERO(&fdexcep);
|
||||||
|
|
||||||
|
/* get file descriptors from the transfers */
|
||||||
|
mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
||||||
|
|
||||||
|
if(maxfd == -1) {
|
||||||
|
SHORT_SLEEP;
|
||||||
|
rc = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
||||||
|
|
||||||
|
switch(rc) {
|
||||||
|
case -1:
|
||||||
|
/* select error */
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
default:
|
||||||
|
/* timeout or readable/writable sockets */
|
||||||
|
curl_multi_perform(multi_handle, &still_running);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if there are still transfers, loop! */
|
||||||
|
.fi
|
||||||
.SH "RETURN VALUE"
|
.SH "RETURN VALUE"
|
||||||
CURLMcode type, general libcurl multi interface error code.
|
CURLMcode type, general libcurl multi interface error code.
|
||||||
|
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
.\" * | (__| |_| | _ <| |___
|
.\" * | (__| |_| | _ <| |___
|
||||||
.\" * \___|\___/|_| \_\_____|
|
.\" * \___|\___/|_| \_\_____|
|
||||||
.\" *
|
.\" *
|
||||||
.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
.\" *
|
.\" *
|
||||||
.\" * This software is licensed as described in the file COPYING, which
|
.\" * This software is licensed as described in the file COPYING, which
|
||||||
.\" * you should have received as part of this distribution. The terms
|
.\" * you should have received as part of this distribution. The terms
|
||||||
@@ -49,6 +49,22 @@ SHOULD instead use \fIcurl_multi_setopt(3)\fP and its
|
|||||||
Note: if libcurl returns a -1 timeout here, it just means that libcurl
|
Note: if libcurl returns a -1 timeout here, it just means that libcurl
|
||||||
currently has no stored timeout value. You must not wait too long (more than a
|
currently has no stored timeout value. You must not wait too long (more than a
|
||||||
few seconds perhaps) before you call curl_multi_perform() again.
|
few seconds perhaps) before you call curl_multi_perform() again.
|
||||||
|
.SH EXAMPLE
|
||||||
|
.nf
|
||||||
|
struct timeval timeout;
|
||||||
|
long timeo;
|
||||||
|
|
||||||
|
curl_multi_timeout(multi_handle, &timeo);
|
||||||
|
if(timeo < 0)
|
||||||
|
/* no set timeout, use a default */
|
||||||
|
timeo = 980;
|
||||||
|
|
||||||
|
timeout.tv_sec = timeo / 1000;
|
||||||
|
timeout.tv_usec = (timeo % 1000) * 1000;
|
||||||
|
|
||||||
|
/* wait for activities no longer than the set timeout */
|
||||||
|
select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
||||||
|
.fi
|
||||||
.SH "RETURN VALUE"
|
.SH "RETURN VALUE"
|
||||||
The standard CURLMcode for multi interface error codes.
|
The standard CURLMcode for multi interface error codes.
|
||||||
.SH "TYPICAL USAGE"
|
.SH "TYPICAL USAGE"
|
||||||
|
@@ -44,7 +44,7 @@ The calling application may pass additional curl_waitfd structures which are
|
|||||||
similar to \fIpoll(2)\fP's pollfd structure to be waited on in the same call.
|
similar to \fIpoll(2)\fP's pollfd structure to be waited on in the same call.
|
||||||
|
|
||||||
On completion, if \fInumfds\fP is non-NULL, it will be populated with the
|
On completion, if \fInumfds\fP is non-NULL, it will be populated with the
|
||||||
total number of file descriptors on which interesting events occured. This
|
total number of file descriptors on which interesting events occurred. This
|
||||||
number can include both libcurl internal descriptors as well as descriptors
|
number can include both libcurl internal descriptors as well as descriptors
|
||||||
provided in \fIextra_fds\fP.
|
provided in \fIextra_fds\fP.
|
||||||
|
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
.\" * | (__| |_| | _ <| |___
|
.\" * | (__| |_| | _ <| |___
|
||||||
.\" * \___|\___/|_| \_\_____|
|
.\" * \___|\___/|_| \_\_____|
|
||||||
.\" *
|
.\" *
|
||||||
.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
.\" *
|
.\" *
|
||||||
.\" * This software is licensed as described in the file COPYING, which
|
.\" * This software is licensed as described in the file COPYING, which
|
||||||
.\" * you should have received as part of this distribution. The terms
|
.\" * you should have received as part of this distribution. The terms
|
||||||
@@ -74,7 +74,7 @@ After having sent the FTP password to the server, libcurl expects a proper
|
|||||||
reply. This error code indicates that an unexpected code was returned.
|
reply. This error code indicates that an unexpected code was returned.
|
||||||
.IP "CURLE_FTP_ACCEPT_TIMEOUT (12)"
|
.IP "CURLE_FTP_ACCEPT_TIMEOUT (12)"
|
||||||
During an active FTP session while waiting for the server to connect, the
|
During an active FTP session while waiting for the server to connect, the
|
||||||
\fICURLOPT_ACCEPTTIMOUT_MS(3)\fP (or the internal default) timeout expired.
|
\fICURLOPT_ACCEPTTIMEOUT_MS(3)\fP (or the internal default) timeout expired.
|
||||||
.IP "CURLE_FTP_WEIRD_PASV_REPLY (13)"
|
.IP "CURLE_FTP_WEIRD_PASV_REPLY (13)"
|
||||||
libcurl failed to get a sensible result back from the server as a response to
|
libcurl failed to get a sensible result back from the server as a response to
|
||||||
either a PASV or a EPSV command. The server is flawed.
|
either a PASV or a EPSV command. The server is flawed.
|
||||||
|
@@ -136,7 +136,7 @@ normal multi interface. Then you also set two callbacks with the
|
|||||||
CURLMOPT_SOCKETFUNCTION and CURLMOPT_TIMERFUNCTION options to
|
CURLMOPT_SOCKETFUNCTION and CURLMOPT_TIMERFUNCTION options to
|
||||||
\fIcurl_multi_setopt(3)\fP. They are two callback functions that libcurl will
|
\fIcurl_multi_setopt(3)\fP. They are two callback functions that libcurl will
|
||||||
call with information about what sockets to wait for, and for what activity,
|
call with information about what sockets to wait for, and for what activity,
|
||||||
and what the curret timeout time is - if that expires libcurl should be
|
and what the current timeout time is - if that expires libcurl should be
|
||||||
notified.
|
notified.
|
||||||
|
|
||||||
The multi_socket API is designed to inform your application about which
|
The multi_socket API is designed to inform your application about which
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
.\" * | (__| |_| | _ <| |___
|
.\" * | (__| |_| | _ <| |___
|
||||||
.\" * \___|\___/|_| \_\_____|
|
.\" * \___|\___/|_| \_\_____|
|
||||||
.\" *
|
.\" *
|
||||||
.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
.\" *
|
.\" *
|
||||||
.\" * This software is licensed as described in the file COPYING, which
|
.\" * This software is licensed as described in the file COPYING, which
|
||||||
.\" * you should have received as part of this distribution. The terms
|
.\" * you should have received as part of this distribution. The terms
|
||||||
@@ -29,8 +29,9 @@ CURLMOPT_MAX_HOST_CONNECTIONS \- set max number of connections to a single host
|
|||||||
CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAX_HOST_CONNECTIONS, long max);
|
CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAX_HOST_CONNECTIONS, long max);
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
Pass a long to indicate \fBmax\fP. The set number will be used as the maximum
|
Pass a long to indicate \fBmax\fP. The set number will be used as the maximum
|
||||||
amount of simultaneously open connections to a single host. For each new
|
amount of simultaneously open connections to a single host (a host being the
|
||||||
session to a host, libcurl will open a new connection up to the limit set by
|
same as a host name + port number pair). For each new session to a host,
|
||||||
|
libcurl will open a new connection up to the limit set by
|
||||||
\fICURLMOPT_MAX_HOST_CONNECTIONS(3)\fP. When the limit is reached, the
|
\fICURLMOPT_MAX_HOST_CONNECTIONS(3)\fP. When the limit is reached, the
|
||||||
sessions will be pending until a connection becomes available. If
|
sessions will be pending until a connection becomes available. If
|
||||||
\fICURLMOPT_PIPELINING(3)\fP is enabled, libcurl will try to pipeline if the
|
\fICURLMOPT_PIPELINING(3)\fP is enabled, libcurl will try to pipeline if the
|
||||||
@@ -40,6 +41,9 @@ The default \fBmax\fP value is 0, unlimited. However, for backwards
|
|||||||
compatibility, setting it to 0 when \fICURLMOPT_PIPELINING(3)\fP is 1 will not
|
compatibility, setting it to 0 when \fICURLMOPT_PIPELINING(3)\fP is 1 will not
|
||||||
be treated as unlimited. Instead it will open only 1 connection and try to
|
be treated as unlimited. Instead it will open only 1 connection and try to
|
||||||
pipeline on it.
|
pipeline on it.
|
||||||
|
|
||||||
|
This set limit is also used for proxy connections, and then the proxy is
|
||||||
|
considered to be the host for which this limit counts.
|
||||||
.SH DEFAULT
|
.SH DEFAULT
|
||||||
0
|
0
|
||||||
.SH PROTOCOLS
|
.SH PROTOCOLS
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
.\" * | (__| |_| | _ <| |___
|
.\" * | (__| |_| | _ <| |___
|
||||||
.\" * \___|\___/|_| \_\_____|
|
.\" * \___|\___/|_| \_\_____|
|
||||||
.\" *
|
.\" *
|
||||||
.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
.\" *
|
.\" *
|
||||||
.\" * This software is licensed as described in the file COPYING, which
|
.\" * This software is licensed as described in the file COPYING, which
|
||||||
.\" * you should have received as part of this distribution. The terms
|
.\" * you should have received as part of this distribution. The terms
|
||||||
@@ -26,17 +26,28 @@ CURLMOPT_PIPELINING \- enable/disable HTTP pipelining
|
|||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
|
|
||||||
CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PIPELINING, bool onoff);
|
CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PIPELINING, long bits);
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
Set the \fBonoff\fP parameter to 1 to make libcurl use HTTP pipelining for
|
Set the \fBbits\fP parameter to 1 to make libcurl use HTTP pipelining for
|
||||||
HTTP transfers done using this multi handle, as far as possible. This means
|
HTTP/1.1 transfers done using this multi handle, as far as possible. This
|
||||||
that if you add a second request that can use an already existing connection,
|
means that if you add a second request that can use an already existing
|
||||||
the second request will be \&"piped" on the same connection rather than being
|
connection, the second request will be \&"piped" on the same connection rather
|
||||||
executed in parallel.
|
than being executed in parallel.
|
||||||
|
|
||||||
When using pipelining, there are also several other related options that are
|
When using pipelining, there are also several other related options that are
|
||||||
interesting to tweak and adjust to alter how libcurl spreads out requests on
|
interesting to tweak and adjust to alter how libcurl spreads out requests on
|
||||||
different connections or not etc.
|
different connections or not etc.
|
||||||
|
|
||||||
|
Starting in 7.43.0, the \fBbits\fP parameter's bit 1 also has a meaning and
|
||||||
|
libcurl is now offering symbol names for the bits:
|
||||||
|
.IP CURLPIPE_NOTHING (0)
|
||||||
|
Default, which means doing no attempts at pipelining or multiplexing.
|
||||||
|
.IP CURLPIPE_HTTP1 (1)
|
||||||
|
If this bit is set, libcurl will try to pipeline HTTP/1.1 requests on
|
||||||
|
connections that are already established and in use to hosts.
|
||||||
|
.IP CURLPIPE_MULTIPLEX (2)
|
||||||
|
If this bit is set, libcurl will try to multiplex the new transfer over an
|
||||||
|
existing connection if possible. This requires HTTP/2.
|
||||||
.SH DEFAULT
|
.SH DEFAULT
|
||||||
0 (off)
|
0 (off)
|
||||||
.SH PROTOCOLS
|
.SH PROTOCOLS
|
||||||
@@ -44,7 +55,7 @@ HTTP(S)
|
|||||||
.SH EXAMPLE
|
.SH EXAMPLE
|
||||||
TODO
|
TODO
|
||||||
.SH AVAILABILITY
|
.SH AVAILABILITY
|
||||||
Added in 7.16.0
|
Added in 7.16.0. Multiplex support bit added in 7.43.0.
|
||||||
.SH RETURN VALUE
|
.SH RETURN VALUE
|
||||||
Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.
|
Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
|
49
docs/libcurl/opts/CURLMOPT_PUSHDATA.3
Normal file
49
docs/libcurl/opts/CURLMOPT_PUSHDATA.3
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
.\" **************************************************************************
|
||||||
|
.\" * _ _ ____ _
|
||||||
|
.\" * Project ___| | | | _ \| |
|
||||||
|
.\" * / __| | | | |_) | |
|
||||||
|
.\" * | (__| |_| | _ <| |___
|
||||||
|
.\" * \___|\___/|_| \_\_____|
|
||||||
|
.\" *
|
||||||
|
.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
|
.\" *
|
||||||
|
.\" * This software is licensed as described in the file COPYING, which
|
||||||
|
.\" * you should have received as part of this distribution. The terms
|
||||||
|
.\" * are also available at http://curl.haxx.se/docs/copyright.html.
|
||||||
|
.\" *
|
||||||
|
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||||
|
.\" * copies of the Software, and permit persons to whom the Software is
|
||||||
|
.\" * furnished to do so, under the terms of the COPYING file.
|
||||||
|
.\" *
|
||||||
|
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
.\" * KIND, either express or implied.
|
||||||
|
.\" *
|
||||||
|
.\" **************************************************************************
|
||||||
|
.\"
|
||||||
|
.TH CURLMOPT_PUSHDATA 3 "1 Jun 2015" "libcurl 7.44.0" "curl_multi_setopt options"
|
||||||
|
.SH NAME
|
||||||
|
CURLMOPT_PUSHDATA \- pointer to pass to push callback
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.nf
|
||||||
|
#include <curl/curl.h>
|
||||||
|
|
||||||
|
CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PUSHDATA, void *pointer);
|
||||||
|
.fi
|
||||||
|
.SH DESCRIPTION
|
||||||
|
Set \fIpointer\fP to pass as the last argument to the
|
||||||
|
\fICURLMOPT_PUSHFUNCTION(3)\fP callback. The pointer will not be touched or
|
||||||
|
used by libcurl itself, only passed on to the callback function.
|
||||||
|
.SH DEFAULT
|
||||||
|
NULL
|
||||||
|
.SH PROTOCOLS
|
||||||
|
HTTP(S)
|
||||||
|
.SH EXAMPLE
|
||||||
|
TODO
|
||||||
|
.SH AVAILABILITY
|
||||||
|
Added in 7.44.0
|
||||||
|
.SH RETURN VALUE
|
||||||
|
Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
.BR CURLMOPT_PUSHFUNCTION "(3), " CURLMOPT_PIPELINING "(3), "
|
||||||
|
.BR CURLOPT_PIPEWAIT "(3), "
|
||||||
|
.BR RFC 7540
|
132
docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3
Normal file
132
docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
.\" **************************************************************************
|
||||||
|
.\" * _ _ ____ _
|
||||||
|
.\" * Project ___| | | | _ \| |
|
||||||
|
.\" * / __| | | | |_) | |
|
||||||
|
.\" * | (__| |_| | _ <| |___
|
||||||
|
.\" * \___|\___/|_| \_\_____|
|
||||||
|
.\" *
|
||||||
|
.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
|
.\" *
|
||||||
|
.\" * This software is licensed as described in the file COPYING, which
|
||||||
|
.\" * you should have received as part of this distribution. The terms
|
||||||
|
.\" * are also available at http://curl.haxx.se/docs/copyright.html.
|
||||||
|
.\" *
|
||||||
|
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||||
|
.\" * copies of the Software, and permit persons to whom the Software is
|
||||||
|
.\" * furnished to do so, under the terms of the COPYING file.
|
||||||
|
.\" *
|
||||||
|
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
.\" * KIND, either express or implied.
|
||||||
|
.\" *
|
||||||
|
.\" **************************************************************************
|
||||||
|
.\"
|
||||||
|
.TH CURLMOPT_PUSHFUNCTION 3 "1 Jun 2015" "libcurl 7.44.0" "curl_multi_setopt options"
|
||||||
|
.SH NAME
|
||||||
|
CURLMOPT_PUSHFUNCTION \- callback that approves or denies server pushes
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.nf
|
||||||
|
#include <curl/curl.h>
|
||||||
|
|
||||||
|
char *curl_pushheader_bynum(push_headers, int num);
|
||||||
|
char *curl_pushheader_byname(push_headers, const char *name);
|
||||||
|
|
||||||
|
int curl_push_callback(CURL *parent,
|
||||||
|
CURL *easy,
|
||||||
|
size_t num_headers,
|
||||||
|
struct curl_pushheaders *headers,
|
||||||
|
void *userp);
|
||||||
|
|
||||||
|
CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PUSHFUNCTION,
|
||||||
|
curl_push_callback func);
|
||||||
|
.fi
|
||||||
|
.SH DESCRIPTION
|
||||||
|
This callback gets called when a new HTTP/2 stream is being pushed by the
|
||||||
|
server (using the PUSH_PROMISE frame). If no push callback is set, all offered
|
||||||
|
pushes will be denied automatically.
|
||||||
|
.SH CALLBACK DESCRIPTION
|
||||||
|
The callback gets its arguments like this:
|
||||||
|
|
||||||
|
\fIparent\fP is the handle of the stream on which this push arrives. The new
|
||||||
|
handle has been duphandle()d from the parent, meaning that it has gotten all
|
||||||
|
its options inherited. It is then up to the application to alter any options
|
||||||
|
if desired.
|
||||||
|
|
||||||
|
\fIeasy\fP is a newly created handle that represents this upcoming transfer.
|
||||||
|
|
||||||
|
\fInum_headers\fP is the number of name+value pairs that was received and can
|
||||||
|
be accessed
|
||||||
|
|
||||||
|
\fIheaders\fP is a handle used to access push headers using the accessor
|
||||||
|
functions described below. This only accesses and provides the PUSH_PROMISE
|
||||||
|
headers, the normal response headers will be provided in the header callback
|
||||||
|
as usual.
|
||||||
|
|
||||||
|
\fIuserp\fP is the pointer set with \fICURLMOPT_PUSHDATA(3)\fP
|
||||||
|
|
||||||
|
If the callback returns CURL_PUSH_OK, the 'easy' handle will be added to the
|
||||||
|
multi handle, the callback must not do that by itself.
|
||||||
|
|
||||||
|
The callback can access PUSH_PROMISE headers with two accessor
|
||||||
|
functions. These functions can only be used from within this callback and they
|
||||||
|
can only access the PUSH_PROMISE headers. The normal response headers will be
|
||||||
|
pased to the header callback for pushed streams just as for normal streams.
|
||||||
|
.IP curl_pushheader_bynum
|
||||||
|
Returns the header at index 'num' (or NULL). The returned pointer points to a
|
||||||
|
"name:value" string that will be freed when this callback returns.
|
||||||
|
.IP curl_pushheader_byname
|
||||||
|
Returns the value for the given header name (or NULL). This is a shortcut so
|
||||||
|
that the application doesn't have to loop through all headers to find the one
|
||||||
|
it is interested in. The data pointed will be freed when this callback
|
||||||
|
returns.
|
||||||
|
.SH CALLBACK RETURN VALUE
|
||||||
|
.IP "CURL_PUSH_OK (0)"
|
||||||
|
The application has accepted the stream and it can now start receiving data,
|
||||||
|
the ownership of the CURL handle has been taken over by the application.
|
||||||
|
.IP "CURL_PUSH_DENY (1)"
|
||||||
|
The callback denies the stream and no data for this will reach the
|
||||||
|
application, the easy handle will be destroyed by libcurl.
|
||||||
|
.IP *
|
||||||
|
All other return codes are reserved for future use.
|
||||||
|
.SH DEFAULT
|
||||||
|
NULL, no callback
|
||||||
|
.SH PROTOCOLS
|
||||||
|
HTTP(S) (HTTP/2 only)
|
||||||
|
.SH EXAMPLE
|
||||||
|
.nf
|
||||||
|
/* only allow pushes for file names starting with "push-" */
|
||||||
|
int push_callback(CURL *parent,
|
||||||
|
CURL *easy,
|
||||||
|
size_t num_headers,
|
||||||
|
struct curl_pushheaders *headers,
|
||||||
|
void *userp)
|
||||||
|
{
|
||||||
|
char *headp;
|
||||||
|
int *transfers = (int *)userp;
|
||||||
|
FILE *out;
|
||||||
|
headp = curl_pushheader_byname(headers, ":path");
|
||||||
|
if(headp && !strncmp(headp, "/push-", 6)) {
|
||||||
|
fprintf(stderr, "The PATH is %s\n", headp);
|
||||||
|
|
||||||
|
/* save the push here */
|
||||||
|
out = fopen("pushed-stream", "wb");
|
||||||
|
|
||||||
|
/* write to this file */
|
||||||
|
curl_easy_setopt(easy, CURLOPT_WRITEDATA, out);
|
||||||
|
|
||||||
|
(*transfers)++; /* one more */
|
||||||
|
|
||||||
|
return CURL_PUSH_OK;
|
||||||
|
}
|
||||||
|
return CURL_PUSH_DENY;
|
||||||
|
}
|
||||||
|
|
||||||
|
curl_multi_setopt(multi, CURLMOPT_PUSHFUNCTION, push_callback);
|
||||||
|
curl_multi_setopt(multi, CURLMOPT_PUSHDATA, &counter);
|
||||||
|
.fi
|
||||||
|
.SH AVAILABILITY
|
||||||
|
Added in 7.44.0
|
||||||
|
.SH RETURN VALUE
|
||||||
|
Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
.BR CURLMOPT_PUSHDATA "(3), " CURLMOPT_PIPELINING "(3), " CURLOPT_PIPEWAIT "(3), "
|
||||||
|
.BR RFC 7540
|
@@ -29,8 +29,8 @@ CURLOPT_CHUNK_DATA \- custom pointer to the FTP chunk callbacks
|
|||||||
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CHUNK_DATA, void *pointer);
|
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CHUNK_DATA, void *pointer);
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
Pass a \fIpointer\fP that will be untouched by libcurl and passed as the ptr
|
Pass a \fIpointer\fP that will be untouched by libcurl and passed as the ptr
|
||||||
argument to the \fICURL_CHUNK_BGN_FUNTION(3)\fP and
|
argument to the \fICURL_CHUNK_BGN_FUNCTION(3)\fP and
|
||||||
\fICURL_CHUNK_END_FUNTION(3)\fP.
|
\fICURL_CHUNK_END_FUNCTION(3)\fP.
|
||||||
.SH DEFAULT
|
.SH DEFAULT
|
||||||
NULL
|
NULL
|
||||||
.SH PROTOCOLS
|
.SH PROTOCOLS
|
||||||
|
@@ -40,6 +40,15 @@ This option sets the cookie header explicitly in the outgoing request(s). If
|
|||||||
multiple requests are done due to authentication, followed redirections or
|
multiple requests are done due to authentication, followed redirections or
|
||||||
similar, they will all get this cookie passed on.
|
similar, they will all get this cookie passed on.
|
||||||
|
|
||||||
|
The cookies set by this option are separate from the internal cookie storage
|
||||||
|
held by the cookie engine and will not be modified by it. If you enable the
|
||||||
|
cookie engine and either you've imported a cookie of the same name (e.g. 'foo')
|
||||||
|
or the server has set one, it will have no effect on the cookies you set here.
|
||||||
|
A request to the server will send both the 'foo' held by the cookie engine and
|
||||||
|
the 'foo' held by this option. To set a cookie that is instead held by the
|
||||||
|
cookie engine and can be modified by the server use
|
||||||
|
\fICURLOPT_COOKIELIST(3)\fP.
|
||||||
|
|
||||||
Using this option multiple times will only make the latest string override the
|
Using this option multiple times will only make the latest string override the
|
||||||
previous ones.
|
previous ones.
|
||||||
|
|
||||||
|
@@ -36,6 +36,16 @@ Such a cookie can be either a single line in Netscape / Mozilla format or just
|
|||||||
regular HTTP-style header (Set-Cookie: ...) format. This will also enable the
|
regular HTTP-style header (Set-Cookie: ...) format. This will also enable the
|
||||||
cookie engine. This adds that single cookie to the internal cookie store.
|
cookie engine. This adds that single cookie to the internal cookie store.
|
||||||
|
|
||||||
|
If you use the Set-Cookie format and don't specify a domain then the cookie
|
||||||
|
is sent for any domain and will not be modified. If a server sets a cookie of
|
||||||
|
the same name (or maybe you've imported one) then both will be sent on a future
|
||||||
|
transfer to that server, likely not what you intended. Either set a domain in
|
||||||
|
Set-Cookie (doing that will include sub domains) or use the Netscape format as
|
||||||
|
shown in EXAMPLE.
|
||||||
|
|
||||||
|
Starting in 7.43.0 the aforementioned any-domain cookies will not appear in the
|
||||||
|
lists exported by \fICURLINFO_COOKIELIST(3)\fP and \fICURLOPT_COOKIEJAR(3)\fP.
|
||||||
|
|
||||||
Additionally, there are commands available that perform actions if you pass in
|
Additionally, there are commands available that perform actions if you pass in
|
||||||
these exact strings:
|
these exact strings:
|
||||||
.IP ALL
|
.IP ALL
|
||||||
@@ -55,7 +65,46 @@ NULL
|
|||||||
.SH PROTOCOLS
|
.SH PROTOCOLS
|
||||||
HTTP
|
HTTP
|
||||||
.SH EXAMPLE
|
.SH EXAMPLE
|
||||||
TODO
|
.nf
|
||||||
|
/* This example shows an inline import of a cookie in Netscape format.
|
||||||
|
You can set the cookie as HttpOnly to prevent XSS attacks by prepending
|
||||||
|
#HttpOnly_ to the hostname. That may be useful if the cookie will later
|
||||||
|
be imported by a browser.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define SEP "\\t" /* Tab separates the fields */
|
||||||
|
|
||||||
|
char *my_cookie =
|
||||||
|
"example.com" /* Hostname */
|
||||||
|
SEP "FALSE" /* Include subdomains */
|
||||||
|
SEP "/" /* Path */
|
||||||
|
SEP "FALSE" /* Secure */
|
||||||
|
SEP "0" /* Expiry in epoch time format. 0 == Session */
|
||||||
|
SEP "foo" /* Name */
|
||||||
|
SEP "bar"; /* Value */
|
||||||
|
|
||||||
|
/* my_cookie is imported immediately via CURLOPT_COOKIELIST.
|
||||||
|
*/
|
||||||
|
curl_easy_setopt(curl, CURLOPT_COOKIELIST, my_cookie);
|
||||||
|
|
||||||
|
/* The list of cookies in cookies.txt will not be imported until right
|
||||||
|
before a transfer is performed. Cookies in the list that have the same
|
||||||
|
hostname, path and name as in my_cookie are skipped. That is because
|
||||||
|
libcurl has already imported my_cookie and it's considered a "live"
|
||||||
|
cookie. A live cookie won't be replaced by one read from a file.
|
||||||
|
*/
|
||||||
|
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookies.txt"); /* import */
|
||||||
|
|
||||||
|
/* Cookies are exported after curl_easy_cleanup is called. The server
|
||||||
|
may have added, deleted or modified cookies by then. The cookies that
|
||||||
|
were skipped on import are not exported.
|
||||||
|
*/
|
||||||
|
curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookies.txt"); /* export */
|
||||||
|
|
||||||
|
res = curl_easy_perform(curl); /* cookies imported from cookies.txt */
|
||||||
|
|
||||||
|
curl_easy_cleanup(curl); /* cookies exported to cookies.txt */
|
||||||
|
.fi
|
||||||
.SH AVAILABILITY
|
.SH AVAILABILITY
|
||||||
ALL was added in 7.14.1
|
ALL was added in 7.14.1
|
||||||
|
|
||||||
|
@@ -51,15 +51,33 @@ All
|
|||||||
.nf
|
.nf
|
||||||
curl = curl_easy_init();
|
curl = curl_easy_init();
|
||||||
if(curl) {
|
if(curl) {
|
||||||
char error[CURL_ERROR_SIZE]
|
CURLcode res;
|
||||||
|
char errbuf[CURL_ERROR_SIZE];
|
||||||
|
|
||||||
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
|
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
|
||||||
|
|
||||||
/* provide a buffer to store errors in */
|
/* provide a buffer to store errors in */
|
||||||
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error);
|
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf);
|
||||||
|
|
||||||
/* Perform the request */
|
/* set the error buffer as empty before performing a request */
|
||||||
curl_easy_perform(curl);
|
errbuf[0] = 0;
|
||||||
|
|
||||||
|
/* perform the request */
|
||||||
|
res = curl_easy_perform(curl);
|
||||||
|
|
||||||
|
/* if the request did not complete correctly, show the error
|
||||||
|
information. if no detailed error information was written to errbuf
|
||||||
|
show the more generic information from curl_easy_strerror instead.
|
||||||
|
*/
|
||||||
|
if(res != CURLE_OK) {
|
||||||
|
size_t len = strlen(errbuf);
|
||||||
|
fprintf(stderr, "\\nlibcurl: (%d) ", res);
|
||||||
|
if(len)
|
||||||
|
fprintf(stderr, "%s%s", errbuf,
|
||||||
|
((errbuf[len - 1] != '\\n') ? "\\n" : ""));
|
||||||
|
else
|
||||||
|
fprintf(stderr, "%s\\n", curl_easy_strerror(res));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.fi
|
.fi
|
||||||
.SH AVAILABILITY
|
.SH AVAILABILITY
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
.\" * | (__| |_| | _ <| |___
|
.\" * | (__| |_| | _ <| |___
|
||||||
.\" * \___|\___/|_| \_\_____|
|
.\" * \___|\___/|_| \_\_____|
|
||||||
.\" *
|
.\" *
|
||||||
.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
.\" *
|
.\" *
|
||||||
.\" * This software is licensed as described in the file COPYING, which
|
.\" * This software is licensed as described in the file COPYING, which
|
||||||
.\" * you should have received as part of this distribution. The terms
|
.\" * you should have received as part of this distribution. The terms
|
||||||
@@ -31,10 +31,10 @@ CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HEADEROPT, long bitmask);
|
|||||||
Pass a long that is a bitmask of options of how to deal with headers. The two
|
Pass a long that is a bitmask of options of how to deal with headers. The two
|
||||||
mutually exclusive options are:
|
mutually exclusive options are:
|
||||||
|
|
||||||
\fBCURLHEADER_UNIFIED\fP - keep working as before. This means
|
\fBCURLHEADER_UNIFIED\fP - the headers specified in
|
||||||
\fICURLOPT_HTTPHEADER(3)\fP headers will be used in requests both to servers
|
\fICURLOPT_HTTPHEADER(3)\fP will be used in requests both to servers and
|
||||||
and proxies. With this option enabled, \fICURLOPT_PROXYHEADER(3)\fP will not
|
proxies. With this option enabled, \fICURLOPT_PROXYHEADER(3)\fP will not have
|
||||||
have any effect.
|
any effect.
|
||||||
|
|
||||||
\fBCURLHEADER_SEPARATE\fP - makes \fICURLOPT_HTTPHEADER(3)\fP headers only get
|
\fBCURLHEADER_SEPARATE\fP - makes \fICURLOPT_HTTPHEADER(3)\fP headers only get
|
||||||
sent to a server and not to a proxy. Proxy headers must be set with
|
sent to a server and not to a proxy. Proxy headers must be set with
|
||||||
@@ -44,7 +44,7 @@ headers. When doing CONNECT, libcurl will send \fICURLOPT_PROXYHEADER(3)\fP
|
|||||||
headers only to the proxy and then \fICURLOPT_HTTPHEADER(3)\fP headers only to
|
headers only to the proxy and then \fICURLOPT_HTTPHEADER(3)\fP headers only to
|
||||||
the server.
|
the server.
|
||||||
.SH DEFAULT
|
.SH DEFAULT
|
||||||
CURLHEADER_UNIFIED
|
CURLHEADER_SEPARATE (changed in 7.42.1, ased CURLHEADER_UNIFIED before then)
|
||||||
.SH PROTOCOLS
|
.SH PROTOCOLS
|
||||||
HTTP
|
HTTP
|
||||||
.SH EXAMPLE
|
.SH EXAMPLE
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
.\" * | (__| |_| | _ <| |___
|
.\" * | (__| |_| | _ <| |___
|
||||||
.\" * \___|\___/|_| \_\_____|
|
.\" * \___|\___/|_| \_\_____|
|
||||||
.\" *
|
.\" *
|
||||||
.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
.\" *
|
.\" *
|
||||||
.\" * This software is licensed as described in the file COPYING, which
|
.\" * This software is licensed as described in the file COPYING, which
|
||||||
.\" * you should have received as part of this distribution. The terms
|
.\" * you should have received as part of this distribution. The terms
|
||||||
@@ -37,6 +37,9 @@ Tunneling essentially means that a CONNECT is sent to the proxy, asking it to
|
|||||||
connect to a remote host on a specific port number and then the traffic is
|
connect to a remote host on a specific port number and then the traffic is
|
||||||
just passed through the proxy. Proxies tend to whitelist specific port numbers
|
just passed through the proxy. Proxies tend to whitelist specific port numbers
|
||||||
it allows CONNECT requests to and often only port 80 and 443 are allowed.
|
it allows CONNECT requests to and often only port 80 and 443 are allowed.
|
||||||
|
|
||||||
|
When using this, it only makes sense to use \fICURLOPT_PROXYTYPE(3)\fP set to
|
||||||
|
a HTTP proxy.
|
||||||
.SH DEFAULT
|
.SH DEFAULT
|
||||||
0
|
0
|
||||||
.SH PROTOCOLS
|
.SH PROTOCOLS
|
||||||
@@ -48,4 +51,4 @@ Always
|
|||||||
.SH RETURN VALUE
|
.SH RETURN VALUE
|
||||||
Returns CURLE_OK
|
Returns CURLE_OK
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
.BR CURLOPT_PROXY "(3), "
|
.BR CURLOPT_PROXY "(3), " CURLOPT_PROXYTYPE "(3), " CURLOPT_PROXYPORT "(3), "
|
||||||
|
@@ -50,11 +50,22 @@ if(curl) {
|
|||||||
curl_easy_perform(curl);
|
curl_easy_perform(curl);
|
||||||
}
|
}
|
||||||
.fi
|
.fi
|
||||||
|
.SH PUBLIC KEY EXTRACTION
|
||||||
|
If you do not have the server's public key file you can extract it from the
|
||||||
|
server's certificate.
|
||||||
|
.nf
|
||||||
|
openssl x509 -in www.test.com.pem -pubkey -noout > www.test.com.pubkey.pem
|
||||||
|
.fi
|
||||||
|
The public key is output in PEM format and contains a header, base64 data and a
|
||||||
|
footer:
|
||||||
|
.nf
|
||||||
|
-----BEGIN PUBLIC KEY-----
|
||||||
|
[BASE 64 DATA]
|
||||||
|
-----END PUBLIC KEY-----
|
||||||
|
.fi
|
||||||
.SH AVAILABILITY
|
.SH AVAILABILITY
|
||||||
If built TLS enabled. This is currently only implemented in the OpenSSL,
|
Added in 7.39.0 for OpenSSL, GnuTLS and GSKit. Added in 7.43.0 for
|
||||||
GnuTLS and GSKit backends.
|
NSS and wolfSSL/CyaSSL. Other SSL backends not supported.
|
||||||
|
|
||||||
Added in libcurl 7.39.0
|
|
||||||
.SH RETURN VALUE
|
.SH RETURN VALUE
|
||||||
Returns CURLE_OK if TLS enabled, CURLE_UNKNOWN_OPTION if not, or
|
Returns CURLE_OK if TLS enabled, CURLE_UNKNOWN_OPTION if not, or
|
||||||
CURLE_OUT_OF_MEMORY if there was insufficient heap space.
|
CURLE_OUT_OF_MEMORY if there was insufficient heap space.
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user