Compare commits
	
		
			13 Commits
		
	
	
		
			http2-push
			...
			curl-7_42_
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 4feb6e6d03 | ||
|   | 69a2e8d7ec | ||
|   | c71cc72433 | ||
|   | a6e0270e9b | ||
|   | 14f36574be | ||
|   | 23c85ba15e | ||
|   | cc628cd68a | ||
|   | a005d2f7de | ||
|   | 097460adb2 | ||
|   | c75c4d7706 | ||
|   | 13329f9d4d | ||
|   | 0ef434f5b6 | ||
|   | 994ea368a7 | 
| @@ -16,9 +16,11 @@ 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. as a pull request on github |  2. in the [bug tracker](https://sourceforge.net/p/curl/bugs/) | ||||||
|  |  | ||||||
|  3. as an issue on github |  3. as a pull request 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 scripts/zsh.pl	\ |  RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework	\ | ||||||
|  $(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 https://github.com/bagder/curl.git |     git clone git://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ögskolan. This notice is included here to comply with the |   Kungliga Tekniska H<EFBFBD>gskolan. This notice is included here to comply with the | ||||||
|   distribution terms. |   distribution terms. | ||||||
|   | |||||||
| @@ -1,19 +1,22 @@ | |||||||
| Curl and libcurl 7.44.0 | Curl and libcurl 7.42.1 | ||||||
|  |  | ||||||
|  Public curl releases:         148 |  Public curl releases:         146 | ||||||
|  Command line options:         176 |  Command line options:         173 | ||||||
|  curl_easy_setopt() options:   219 |  curl_easy_setopt() options:   216 | ||||||
|  Public functions in libcurl:  58 |  Public functions in libcurl:  58 | ||||||
|  Contributors:                 1291 |  Contributors:                 1265 | ||||||
|  |  | ||||||
| This release includes the following changes: |  | ||||||
|  |  | ||||||
|  o |  | ||||||
|  |  | ||||||
|  |  | ||||||
| This release includes the following bugfixes: | This release includes the following bugfixes: | ||||||
|  |  | ||||||
|  o |  o CURLOPT_HEADEROPT: default to separate [5] | ||||||
|  |  o dist: include {src,lib}/checksrc.whitelist [1] | ||||||
|  |  o connectionexists: fix build without NTLM [2] | ||||||
|  |  o docs: distribute the CURLOPT_PINNEDPUBLICKEY(3) man page, too | ||||||
|  |  o curl -z: do not write empty file on unmet condition [3] | ||||||
|  |  o openssl: fix serial number output [4] | ||||||
|  |  o curl_easy_getinfo.3: document 'internals' in CURLINFO_TLS_SESSION | ||||||
|  |  o sws: init http2 state properly | ||||||
|  |  o curl.1: fix typo | ||||||
|  |  | ||||||
| This release includes the following known bugs: | This release includes the following known bugs: | ||||||
|  |  | ||||||
| @@ -22,10 +25,17 @@ 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 Elgert, Daniel Stenberg, Kamil Dudka, | ||||||
|  |   Oren Souroujon, Patrick Rapin, Viktor Szakáts, Yehezkel Horowitz, | ||||||
|  |   (8 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] = |  [1] = http://curl.haxx.se/mail/archive-2015-04/0046.html | ||||||
|  |  [2] = http://curl.haxx.se/bug/?i=231 | ||||||
|  |  [3] = https://github.com/bagder/curl/issues/237 | ||||||
|  |  [4] = https://github.com/bagder/curl/issues/235 | ||||||
|  |  [5] = http://curl.haxx.se/docs/adv_20150429.html | ||||||
|  |   | ||||||
							
								
								
									
										19
									
								
								acinclude.m4
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								acinclude.m4
									
									
									
									
									
								
							| @@ -2452,6 +2452,23 @@ 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 | ||||||
| @@ -2659,7 +2676,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,8 +318,6 @@ 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 | ||||||
| @@ -331,7 +329,7 @@ done | |||||||
| # | # | ||||||
|  |  | ||||||
| echo "buildconf: running libtoolize" | echo "buildconf: running libtoolize" | ||||||
| ${libtoolize} --copy --force || die "libtoolize command failed" | ${libtoolize} --copy --automake --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,6 +1194,8 @@ 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 | ||||||
| @@ -2841,9 +2843,7 @@ if test X"$want_h2" != Xno; then | |||||||
|     CPPFLAGS="$CPPFLAGS $CPP_H2" |     CPPFLAGS="$CPPFLAGS $CPP_H2" | ||||||
|     LIBS="$LIB_H2 $LIBS" |     LIBS="$LIB_H2 $LIBS" | ||||||
|  |  | ||||||
|     # use nghttp2_option_set_no_recv_client_magic to require nghttp2 |     AC_CHECK_LIB(nghttp2, nghttp2_session_callbacks_set_send_callback, | ||||||
|     # >= 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://dlang.org/library/std/net/curl.html |   http://curl.haxx.se/libcurl/d/ | ||||||
|  |  | ||||||
| Dylan | Dylan | ||||||
|  |  | ||||||
| @@ -60,7 +60,7 @@ Dylan | |||||||
| Eiffel | Eiffel | ||||||
|  |  | ||||||
|   Written by Eiffel Software |   Written by Eiffel Software | ||||||
|   https://room.eiffel.com/library/curl |   http://curl.haxx.se/libcurl/eiffel/ | ||||||
|  |  | ||||||
| Euphoria | Euphoria | ||||||
|  |  | ||||||
| @@ -78,7 +78,7 @@ Ferite | |||||||
|  |  | ||||||
| Gambas | Gambas | ||||||
|  |  | ||||||
|   http://gambas.sourceforge.net/ |   http://gambas.sourceforge.net | ||||||
|  |  | ||||||
| glib/GTK+ | glib/GTK+ | ||||||
|  |  | ||||||
| @@ -102,7 +102,8 @@ Haskell | |||||||
|  |  | ||||||
| Java | Java | ||||||
|  |  | ||||||
|   https://github.com/pjlegato/curl-java |   Maintained by [blank] | ||||||
|  |   http://curl.haxx.se/libcurl/java/ | ||||||
|  |  | ||||||
| Julia | Julia | ||||||
|  |  | ||||||
| @@ -130,7 +131,7 @@ Mono | |||||||
| .NET | .NET | ||||||
|  |  | ||||||
|   libcurl-net by Jeffrey Phillips |   libcurl-net by Jeffrey Phillips | ||||||
|   https://sourceforge.net/projects/libcurl-net/ |   http://sourceforge.net/projects/libcurl-net/ | ||||||
|  |  | ||||||
| node.js | node.js | ||||||
|  |  | ||||||
| @@ -145,7 +146,7 @@ Object-Pascal | |||||||
| O'Caml | O'Caml | ||||||
|  |  | ||||||
|   Written by Lars Nilsson |   Written by Lars Nilsson | ||||||
|   https://sourceforge.net/projects/ocurl/ |   http://sourceforge.net/projects/ocurl/ | ||||||
|  |  | ||||||
| Pascal | Pascal | ||||||
|  |  | ||||||
| @@ -154,13 +155,13 @@ Pascal | |||||||
|  |  | ||||||
| Perl | Perl | ||||||
|  |  | ||||||
|   Maintained by Cris Bailiff and Bálint Szilakszi |   Maintained by Cris Bailiff | ||||||
|   https://github.com/szbalint/WWW--Curl |   http://curl.haxx.se/libcurl/perl/ | ||||||
|  |  | ||||||
| PHP | PHP | ||||||
|  |  | ||||||
|   Written by Sterling Hughes |   Written by Sterling Hughes | ||||||
|   https://php.net/curl |   http://curl.haxx.se/libcurl/php/ | ||||||
|  |  | ||||||
| PostgreSQL | PostgreSQL | ||||||
|  |  | ||||||
| @@ -174,7 +175,8 @@ Python | |||||||
|  |  | ||||||
| R | R | ||||||
|  |  | ||||||
|   http://cran.r-project.org/package=curl |   RCurl by Duncan Temple Lang | ||||||
|  |   http://www.omegahat.org/RCurl/ | ||||||
|  |  | ||||||
| Rexx | Rexx | ||||||
|  |  | ||||||
| @@ -195,15 +197,10 @@ 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://www.metapaper.net/lisovsky/web/curl/ |   http://curl.haxx.se/libcurl/scheme/ | ||||||
|  |  | ||||||
| S-Lang | S-Lang | ||||||
|  |  | ||||||
| @@ -233,7 +230,7 @@ Tcl | |||||||
| Visual Basic | Visual Basic | ||||||
|  |  | ||||||
|   libcurl-vb by Jeffrey Phillips |   libcurl-vb by Jeffrey Phillips | ||||||
|   https://sourceforge.net/projects/libcurl-vb/ |   http://sourceforge.net/projects/libcurl-vb/ | ||||||
|  |  | ||||||
| Visual Foxpro | Visual Foxpro | ||||||
|  |  | ||||||
| @@ -253,8 +250,3 @@ 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 https://github.com/bagder/curl.git |      git clone git://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: | ||||||
|  |  | ||||||
|      https://savannah.gnu.org/projects/patch/ |      http://www.gnu.org/software/patch/patch.html | ||||||
|      https://www.gnu.org/software/diffutils/ |      http://www.gnu.org/directory/diffutils.html | ||||||
|  |  | ||||||
|  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: | ||||||
|  |  | ||||||
|         https://lists.debian.org/debian-devel/2005/09/msg01417.html |         http://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] = https://www.gnu.org/philosophy/bsd.html |  [2] = http://www.fsf.org/licensing/essays/bsd.html | ||||||
|  [3] = https://www.gnu.org/licenses/gpl.html |  [3] = http://www.fsf.org/licensing/licenses/gpl.html | ||||||
|  [4] = http://curl.haxx.se/docs/copyright.html |  [4] = http://curl.haxx.se/docs/copyright.html | ||||||
|  [5] = https://www.openssl.org/source/license.html |  [5] = http://www.openssl.org/source/license.html | ||||||
|  [6] = https://www.gnu.org/licenses/gpl.html end of section 3 |  [6] = http://www.fsf.org/licensing/licenses/gpl.html end of section 3 | ||||||
|  [7] = https://www.gnu.org/licenses/lgpl.html |  [7] = http://www.fsf.org/licensing/licenses/lgpl.html | ||||||
|  [8] = https://en.wikipedia.org/wiki/OpenSSL_exception |  [8] = http://en.wikipedia.org/wiki/OpenSSL_exception | ||||||
|  |  | ||||||
| Feedback/Updates provided by | Feedback/Updates provided by | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										26
									
								
								docs/FAQ
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								docs/FAQ
									
									
									
									
									
								
							| @@ -21,7 +21,6 @@ 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 | ||||||
| @@ -352,7 +351,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 https://www.apache.org/dev/crypto.html |   ASF gives a good explanation at http://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. | ||||||
| @@ -381,19 +380,6 @@ 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 | ||||||
|  |  | ||||||
| @@ -1042,7 +1028,7 @@ FAQ | |||||||
|   timeout is set. |   timeout is set. | ||||||
|  |  | ||||||
|   See option TcpMaxConnectRetransmissions on this page: |   See option TcpMaxConnectRetransmissions on this page: | ||||||
|   https://support.microsoft.com/en-us/kb/175523/en-us |   http://support.microsoft.com/?scid=kb%3Ben-us%3B175523&x=6&y=7 | ||||||
|  |  | ||||||
|   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 | ||||||
| @@ -1059,7 +1045,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 (https://www.ietf.org/rfc/rfc1738.txt), |   According to RFC 1738 (http://www.faqs.org/rfcs/rfc1738.html), | ||||||
|   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'. | ||||||
| @@ -1163,13 +1149,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: | ||||||
|  |  | ||||||
|     https://www.openssl.org/docs/crypto/threads.html |     http://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). | ||||||
|  |  | ||||||
|     https://web.archive.org/web/20111103083330/http://www.gnu.org/software/gnutls/manual/html_node/Multi_002dthreaded-applications.html |     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. | ||||||
|  |  | ||||||
| @@ -1345,7 +1331,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 | ||||||
|   https://www.torproject.org/ . |   http://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 (https://www.ietf.org/rfc/rfc6265.txt) was finally published |   In 2011, RFC6265 (http://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
									
									
									
									
									
								
							
							
						
						
									
										107
									
								
								docs/HTTP2.md
									
									
									
									
									
								
							| @@ -1,107 +0,0 @@ | |||||||
| 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 | ||||||
|               https://support.microsoft.com/kb/94248/en-us |               http://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 | ||||||
|               https://support.microsoft.com/kb/140584/en-us |               http://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 | ||||||
|               https://msdn.microsoft.com/en-us/library/ms235460 |               http://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-1.0.2c |      set OPENSSL_PATH=c:\openssl-0.9.8zc | ||||||
|      set LIBSSH2_PATH=c:\libssh2-1.6.0 |      set LIBSSH2_PATH=c:\libssh2-1.4.3 | ||||||
|  |  | ||||||
|    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: | ||||||
|      https://www.novell.com/developer/ndk/ldap_libraries_for_c.html |      http://developer.novell.com/ndk/cldap.htm | ||||||
|  |  | ||||||
|    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: | ||||||
|  |  | ||||||
|    https://www.microsoft.com/en-us/download/details.aspx?id=12261 |    http://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 https://support.microsoft.com/kb/194022 the compiler can be |    those mentioned in http://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.zlib.net/) as well. Please read the zlib |    zlib (http://www.gzip.org/zlib/) 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,15 +471,6 @@ 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 | ||||||
| ====================== | ====================== | ||||||
|  |  | ||||||
| @@ -674,10 +665,12 @@ 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 or Novell CLib SDK available from: |    - recent Novell LibC SDK available from: | ||||||
|      https://www.novell.com/developer/ndk/ |      http://developer.novell.com/ndk/libc.htm | ||||||
|  |    - 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: | ||||||
|      https://www.novell.com/developer/ndk/ldap_libraries_for_c.html |      http://developer.novell.com/ndk/cldap.htm | ||||||
|    - 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/ | ||||||
| @@ -832,7 +825,7 @@ VxWorks | |||||||
|  |  | ||||||
|    To build libcurl for VxWorks you need: |    To build libcurl for VxWorks you need: | ||||||
|  |  | ||||||
|       - CYGWIN (free, https://cygwin.com/) |       - CYGWIN (free, http://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 | ||||||
| @@ -1093,18 +1086,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      https://www.gnu.org/software/gss/ | GNU GSS      http://www.gnu.org/software/gss/ | ||||||
| GnuTLS       https://www.gnu.org/software/gnutls/ | GnuTLS       http://www.gnu.org/software/gnutls/ | ||||||
| Heimdal      http://www.h5l.org/ | Heimdal      http://www.pdc.kth.se/heimdal/ | ||||||
| libidn       https://www.gnu.org/software/libidn/ | libidn       http://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          https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS | NSS          http://www.mozilla.org/projects/security/pki/nss/ | ||||||
| OpenLDAP     http://www.openldap.org/ | OpenLDAP     http://www.openldap.org/ | ||||||
| OpenSSL      https://www.openssl.org/ | OpenSSL      http://www.openssl.org/ | ||||||
| PolarSSL     https://tls.mbed.org/ | PolarSSL     http://polarssl.org/ | ||||||
| wolfSSL      https://www.wolfssl.com/wolfSSL/ | yassl        http://www.yassl.com/ | ||||||
| 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 | ||||||
| https://sourceforge.net/p/dev-cpp/discussion/48211/thread/2a85ea46 | http://sourceforge.net/forum/message.php?msg_id=3252213 | ||||||
|  |  | ||||||
| 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; | ||||||
|   | |||||||
							
								
								
									
										907
									
								
								docs/INTERNALS
									
									
									
									
									
								
							
							
						
						
									
										907
									
								
								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: | ||||||
|   https://tools.ietf.org/html/draft-reschke-rfc2231-in-http-02 |   http://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 | ||||||
|   | |||||||
							
								
								
									
										245
									
								
								docs/LIBCURL-STRUCTS
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										245
									
								
								docs/LIBCURL-STRUCTS
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,245 @@ | |||||||
|  |                                   _   _ ____  _ | ||||||
|  |                               ___| | | |  _ \| | | ||||||
|  |                              / __| | | | |_) | | | ||||||
|  |                             | (__| |_| |  _ <| |___ | ||||||
|  |                              \___|\___/|_| \_\_____| | ||||||
|  |  | ||||||
|  | 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 https://www.openssl.org/source/license.html | OpenSSL http://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 another TLS library. |         licensing is a problem for you, consider using GnuTLS or yassl | ||||||
|  |         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 another TLS library. Also note that |         a problem for you, consider using OpenSSL instead. 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. | ||||||
|  |  | ||||||
| WolfSSL   https://www.wolfssl.com/ | yassl   http://www.yassl.com/ | ||||||
|  |  | ||||||
|         (May be used for SSL/TLS support) Uses the GPL[1] license or a |         (May be used for SSL/TLS support) Uses the GPL[1] license. If this is | ||||||
|         propietary license. If this is a problem for you, consider using |         a problem for you, consider using OpenSSL or GnuTLS instead. | ||||||
|         another TLS library. |  | ||||||
|  |  | ||||||
| NSS     https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS | NSS     http://www.mozilla.org/projects/security/pki/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,29 +57,13 @@ 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.zlib.net/zlib_license.html | zlib    http://www.gzip.org/zlib/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. | ||||||
| @@ -89,12 +73,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.h5l.org | Heimdal http://www.pdc.kth.se/heimdal/ | ||||||
|  |  | ||||||
|         (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 https://www.gnu.org/software/gss/ | GNU GSS http://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 | ||||||
| @@ -121,10 +105,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: https://www.gnu.org/licenses/gpl.html | [1] = GPL - GNU General Public License: http://www.gnu.org/licenses/gpl.html | ||||||
| [2] = https://www.gnu.org/licenses/gpl-faq.html#GPLIncompatibleLibs details on | [2] = http://www.fsf.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: | ||||||
|       https://www.gnu.org/licenses/lgpl.html |       http://www.gnu.org/licenses/lgpl.html | ||||||
| [4] = MPL - Mozilla Public License: | [4] = MPL - Mozilla Public License: | ||||||
|       https://www.mozilla.org/MPL/ |       http://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: | ||||||
|  |  | ||||||
|       https://www.netmeister.org/news/learn2quote.html |       http://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. | ||||||
|  |  | ||||||
|   To read and write cookies from a netscape cookie file, you can set both -b |   Alas, to both read and write cookies from a netscape cookie file, you can | ||||||
|   and -c to use the same file: |   set both -b 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. | # Copyright (C) 1998 - 2014, 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 SECURITY RELEASE-PROCEDURE  \ |  MAIL-ETIQUETTE HTTP-COOKIES LIBCURL-STRUCTS SECURITY RELEASE-PROCEDURE  \ | ||||||
|  SSL-PROBLEMS HTTP2.md ROADMAP.md |  SSL-PROBLEMS | ||||||
|  |  | ||||||
| MAN2HTML= roffit < $< >$@ | MAN2HTML= roffit < $< >$@ | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,3 +1,9 @@ | |||||||
|  |                                   _   _ ____  _ | ||||||
|  |                               ___| | | |  _ \| | | ||||||
|  |                              / __| | | | |_) | | | ||||||
|  |                             | (__| |_| |  _ <| |___ | ||||||
|  |                              \___|\___/|_| \_\_____| | ||||||
|  |  | ||||||
| curl release procedure - how to do a release | curl release procedure - how to do a release | ||||||
| ============================================ | ============================================ | ||||||
|  |  | ||||||
| @@ -78,12 +84,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): | ||||||
|  |  | ||||||
| - June 17, 2015 (version 7.43.0) | - February 25, 2015 (version 7.41.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 |  | ||||||
|   | |||||||
							
								
								
									
										128
									
								
								docs/ROADMAP.md
									
									
									
									
									
								
							
							
						
						
									
										128
									
								
								docs/ROADMAP.md
									
									
									
									
									
								
							| @@ -5,100 +5,44 @@ 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. | ||||||
|  |  | ||||||
| HTTP/2 | New stuff - libcurl | ||||||
| ------ |  | ||||||
|  |  | ||||||
| - test suite |  | ||||||
|  |  | ||||||
|    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 |  | ||||||
|  |  | ||||||
|    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 |  | ||||||
|  |  | ||||||
|    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. |  | ||||||
|  |  | ||||||
| SRV records |  | ||||||
| ----------- |  | ||||||
|  |  | ||||||
| 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 |  | ||||||
| deprecating the old ones to allow custom mallocs and more |  | ||||||
|  |  | ||||||
| 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 |  | ||||||
| reworking HTTP and SASL code |  | ||||||
|  |  | ||||||
| SASL authentication in LDAP |  | ||||||
| --------------------------- |  | ||||||
|  |  | ||||||
| ... |  | ||||||
|  |  | ||||||
| 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 |  | ||||||
| content, images and attachments - maintain raw interface so that |  | ||||||
| programmers that want to do this can |  | ||||||
|  |  | ||||||
| email capabilities |  | ||||||
| ------------------ |  | ||||||
|  |  | ||||||
| Allow the email protocols to return the capabilities before |  | ||||||
| authenticating. This will allow an application to decide on the best |  | ||||||
| authentication mechanism |  | ||||||
|  |  | ||||||
| Win32 pthreads |  | ||||||
| -------------- |  | ||||||
|  |  | ||||||
| Allow Windows threading model to be replaced by Win32 pthreads port |  | ||||||
|  |  | ||||||
| dynamic buffer size |  | ||||||
| ------------------- | ------------------- | ||||||
|  |  | ||||||
| Implement a dynamic buffer size to allow SFTP to use much larger buffers and | 1. HTTP/2 | ||||||
| possibly allow the size to be customizable by applications. Use less memory |  | ||||||
| when handles are not in use? |  - test suite | ||||||
|  |  - http2 multiplexing/pipelining | ||||||
|  |  - provide option for HTTP/2 "prior knowledge" over clear text | ||||||
|  |  - provide option to allow curl to default to HTTP/2 only when using HTTPS | ||||||
|  |  | ||||||
|  | 2. SRV records | ||||||
|  |  | ||||||
|  | 3. HTTPS to proxy | ||||||
|  |  | ||||||
|  | 4. make sure there's an easy handle passed in to `curl_formadd()`, | ||||||
|  |    `curl_formget()` and `curl_formfree()` by adding replacement functions and | ||||||
|  |    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 | ||||||
|  |    move existing native and SSPI based authentication into vsasl folder after | ||||||
|  |    reworking HTTP and SASL code | ||||||
|  |  | ||||||
|  | 6. SASL authentication in LDAP | ||||||
|  |  | ||||||
|  | 7. Simplify the SMTP email interface so that programmers don't have to | ||||||
|  |    construct the body of an email that contains all the headers, alternative | ||||||
|  |    content, images and attachments - maintain raw interface so that | ||||||
|  |    programmers that want to do this can | ||||||
|  |  | ||||||
|  | 8. Allow the email protocols to return the capabilities before | ||||||
|  |     authenticating. This will allow an application to decide on the best | ||||||
|  |     authentication mechanism | ||||||
|  |  | ||||||
|  | 9. Allow Windows threading model to be replaced by Win32 pthreads port | ||||||
|  |  | ||||||
|  | 10. 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: | ||||||
|  |  | ||||||
|   https://tools.ietf.org/html/draft-popov-tls-prohibiting-rc4-01 |   http://tools.ietf.org/html/draft-popov-tls-prohibiting-rc4-01 | ||||||
|    |    | ||||||
| Allow BEAST | Allow BEAST | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										23
									
								
								docs/THANKS
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								docs/THANKS
									
									
									
									
									
								
							| @@ -36,7 +36,6 @@ Alex Suykov | |||||||
| Alex Vinnik | Alex Vinnik | ||||||
| Alex aka WindEagle | Alex aka WindEagle | ||||||
| Alexander Beedie | Alexander Beedie | ||||||
| Alexander Dyagilev |  | ||||||
| Alexander Elgert | Alexander Elgert | ||||||
| Alexander Klauer | Alexander Klauer | ||||||
| Alexander Kourakos | Alexander Kourakos | ||||||
| @@ -56,7 +55,6 @@ 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 | ||||||
| @@ -92,7 +90,6 @@ 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 | ||||||
| @@ -107,7 +104,6 @@ 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 | ||||||
| @@ -135,7 +131,6 @@ 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 | ||||||
| @@ -162,10 +157,8 @@ 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 | ||||||
| @@ -189,7 +182,6 @@ 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 | ||||||
| @@ -253,7 +245,6 @@ 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 | ||||||
| @@ -315,7 +306,6 @@ 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 | ||||||
| @@ -331,7 +321,6 @@ 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 | ||||||
| @@ -346,7 +335,6 @@ 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 | ||||||
| @@ -402,7 +390,6 @@ 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 | ||||||
| @@ -440,7 +427,6 @@ 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 | ||||||
| @@ -554,7 +540,6 @@ 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 | ||||||
| @@ -582,7 +567,6 @@ 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 | ||||||
| @@ -721,7 +705,6 @@ 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 | ||||||
| @@ -905,7 +888,6 @@ Oliver Schindler | |||||||
| Olivier Berger | Olivier Berger | ||||||
| Oren Souroujon | Oren Souroujon | ||||||
| Oren Tirosh | Oren Tirosh | ||||||
| Orgad Shaneh |  | ||||||
| Ori Avtalion | Ori Avtalion | ||||||
| Oscar Koeroo | Oscar Koeroo | ||||||
| Oscar Norlander | Oscar Norlander | ||||||
| @@ -934,7 +916,6 @@ 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 | ||||||
| @@ -992,7 +973,6 @@ 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 | ||||||
| @@ -1096,7 +1076,6 @@ 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 | ||||||
| @@ -1212,7 +1191,6 @@ 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 | ||||||
| @@ -1240,7 +1218,6 @@ 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,4 +49,3 @@ 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,7 +25,6 @@ | |||||||
|  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 | ||||||
| @@ -50,7 +49,6 @@ | |||||||
|  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 | ||||||
| @@ -209,7 +207,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: | ||||||
|  https://www.chromium.org/developers/design-documents/secure-web-proxy |  http://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 | ||||||
| @@ -219,12 +217,6 @@ | |||||||
|  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 | ||||||
|  |  | ||||||
| @@ -272,7 +264,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: | ||||||
|  |  | ||||||
|  https://tools.ietf.org/html/rfc7151 |  http://tools.ietf.org/html/rfc7151 | ||||||
|  |  | ||||||
| 4.2 Alter passive/active on failure and retry | 4.2 Alter passive/active on failure and retry | ||||||
|  |  | ||||||
| @@ -356,14 +348,6 @@ 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 | ||||||
| @@ -436,7 +420,7 @@ be the same as/similar to FTP. | |||||||
|  |  | ||||||
| 11.2 Honor file timestamps | 11.2 Honor file timestamps | ||||||
|  |  | ||||||
| The timestamp of the transferred file should reflect that of the original file. | The timestamp of the transfered file should reflect that of the original file. | ||||||
|  |  | ||||||
| 11.3 Use NTLMv2 | 11.3 Use NTLMv2 | ||||||
|  |  | ||||||
| @@ -500,7 +484,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. | ||||||
|  https://www.rfc-editor.org/rfc/rfc6698.txt |  http://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 | ||||||
| @@ -530,7 +514,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 | ||||||
|    https://msdn.microsoft.com/en-us/library/windows/desktop/aa375447.aspx |    http://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 | ||||||
|  |  | ||||||
| @@ -541,7 +525,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 | ||||||
|    https://msdn.microsoft.com/en-us/library/windows/desktop/aa375447.aspx |    http://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 | ||||||
|  |  | ||||||
| @@ -552,7 +536,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 | ||||||
|    https://msdn.microsoft.com/en-us/library/windows/desktop/aa380161.aspx |    http://msdn.microsoft.com/en-us/library/windows/desktop/aa380161.aspx | ||||||
|  |  | ||||||
| 16. SASL | 16. SASL | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,18 +1,22 @@ | |||||||
|  |                                   _   _ ____  _ | ||||||
|  |                               ___| | | |  _ \| | | ||||||
|  |                              / __| | | | |_) | | | ||||||
|  |                             | (__| |_| |  _ <| |___ | ||||||
|  |                              \___|\___/|_| \_\_____| | ||||||
|  |  | ||||||
| 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] | ||||||
|  |  | ||||||
|   - X is main version number |  Where | ||||||
|   - Y is release number |    X is main version number | ||||||
|   - Z is patch number |    Y is release 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 | ||||||
| @@ -53,4 +57,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. | ||||||
|   | |||||||
							
								
								
									
										53
									
								
								docs/curl.1
									
									
									
									
									
								
							
							
						
						
									
										53
									
								
								docs/curl.1
									
									
									
									
									
								
							| @@ -39,7 +39,8 @@ 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 | ||||||
| \fIlibcurl(3)\fP for details. | .BR libcurl (3) | ||||||
|  | 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. | ||||||
| @@ -268,11 +269,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: | ||||||
| \fIhttps://www.openssl.org/docs/apps/ciphers.html\fP | \fIhttp://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: | ||||||
| \fIhttps://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html#Directives\fP | \fIhttp://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" | ||||||
| @@ -314,10 +315,9 @@ 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. \fI--data-raw\fP is almost | \fI-d, --data\fP is the same as \fI--data-ascii\fP. To post data purely binary, | ||||||
| the same but does not have a special interpretation of the @ character. To | you should instead use the \fI--data-binary\fP option. To URL-encode the value | ||||||
| post data purely binary, you should instead use the \fI--data-binary\fP option. | of a form field you may use \fI--data-urlencode\fP. | ||||||
| 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,8 +329,7 @@ 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. If you don't want the @ character to have a special | stripped out. | ||||||
| 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. | ||||||
|  |  | ||||||
| @@ -355,10 +354,6 @@ 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) | ||||||
| @@ -553,10 +548,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. | ||||||
|  |  | ||||||
| Added in 7.39.0 for OpenSSL, GnuTLS and GSKit. Added in 7.43.0 for NSS and | This is currently only implemented in the OpenSSL, GnuTLS and GSKit backends. | ||||||
| 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. | ||||||
| @@ -666,7 +661,6 @@ 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 | ||||||
| @@ -1059,10 +1053,13 @@ 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 | ||||||
| \fInetrc(5)\fP \fIftp(1)\fP for details on the file format. Curl will not | .BR netrc(4) | ||||||
| complain if that file doesn't have the right permissions (it should not be | or | ||||||
| either world- or group-readable). The environment variable "HOME" is used to | .BR ftp(1) | ||||||
| find the home directory. | for details on the file format. Curl will not complain if that file | ||||||
|  | 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 | ||||||
| @@ -1224,7 +1221,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++. | ||||||
| @@ -1329,11 +1326,6 @@ 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. | ||||||
| @@ -1431,7 +1423,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! | ||||||
|  |  | ||||||
| @@ -1515,11 +1507,6 @@ 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" | ||||||
| @@ -1895,7 +1882,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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 1998 - 2011, 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,10 +19,9 @@ | |||||||
|  * KIND, either express or implied. |  * KIND, either express or implied. | ||||||
|  * |  * | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
| /* <DESC> | /* Example application source code using the multi interface to download many | ||||||
|  * Source code using the multi interface to download many |  * files, but with a capped maximum amount of simultaneous transfers. | ||||||
|  * 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. | # Copyright (C) 1998 - 2014, 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,8 +31,7 @@ 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 http2-download \ |   imap-tls imap-multi url2file sftpget ftpsget postinmemory | ||||||
|   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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. | # Copyright (C) 1998 - 2011, 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 (1.0.2a), libssh2 (1.5), zlib (1.2.8), librtmp (2.4) | ## and optionally OpenSSL (0.9.8), libssh2 (1.3), zlib (1.2.5), librtmp (2.3) | ||||||
| ## | ## | ||||||
| ## 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-1.0.2a | OPENSSL_PATH = ../../../openssl-0.9.8zc | ||||||
| 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.5.0 | LIBSSH2_PATH = ../../../libssh2-1.4.3 | ||||||
| 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.4 | LIBRTMP_PATH = ../../../librtmp-2.3 | ||||||
| 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.30 | LIBIDN_PATH = ../../../libidn-1.18 | ||||||
| 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 | ||||||
| # https://www.microsoft.com/en-us/download/details.aspx?id=734 | # http://www.microsoft.com/downloads/en/details.aspx?FamilyID=ad6158d7-ddba-416a-9109-07607425a815 | ||||||
| ifndef WINIDN_PATH | ifndef WINIDN_PATH | ||||||
| WINIDN_PATH = ../../../Microsoft IDN Mitigation APIs | WINIDN_PATH = ../../../Microsoft IDN Mitigation APIs | ||||||
| endif | endif | ||||||
| @@ -62,10 +62,6 @@ 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 = ../.. | ||||||
|  |  | ||||||
| @@ -76,24 +72,14 @@ 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	+= -m64 -D_AMD64_ | CFLAGS	+= -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 | ||||||
| @@ -172,12 +158,9 @@ ifeq ($(findstring -metalink,$(CFG)),-metalink) | |||||||
| METALINK = 1 | METALINK = 1 | ||||||
| endif | endif | ||||||
| ifeq ($(findstring -winssl,$(CFG)),-winssl) | ifeq ($(findstring -winssl,$(CFG)),-winssl) | ||||||
| WINSSL = 1 | SCHANNEL = 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 | ||||||
|  |  | ||||||
| @@ -201,10 +184,6 @@ 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 | ||||||
| @@ -225,7 +204,7 @@ ifdef SSL | |||||||
|   ifndef DYN |   ifndef DYN | ||||||
|     OPENSSL_LIBS += -lgdi32 -lcrypt32 |     OPENSSL_LIBS += -lgdi32 -lcrypt32 | ||||||
|   endif |   endif | ||||||
|   CFLAGS += -DUSE_OPENSSL |   CFLAGS += -DUSE_SSLEAY | ||||||
|   curl_LDADD += -L"$(OPENSSL_LIBPATH)" $(OPENSSL_LIBS) |   curl_LDADD += -L"$(OPENSSL_LIBPATH)" $(OPENSSL_LIBS) | ||||||
| endif | endif | ||||||
| ifdef ZLIB | ifdef ZLIB | ||||||
| @@ -244,7 +223,7 @@ endif | |||||||
| endif | endif | ||||||
| ifdef SSPI | ifdef SSPI | ||||||
|   CFLAGS += -DUSE_WINDOWS_SSPI |   CFLAGS += -DUSE_WINDOWS_SSPI | ||||||
|   ifdef WINSSL |   ifdef SCHANNEL | ||||||
|     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-1.0.2a | OPENSSL_PATH = ../../../openssl-0.9.8zc | ||||||
| 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.5.0 | LIBSSH2_PATH = ../../../libssh2-1.4.3 | ||||||
| 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.30 | LIBIDN_PATH = ../../../libidn-1.18 | ||||||
| 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.4 | LIBRTMP_PATH = ../../../librtmp-2.3 | ||||||
| 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 1998 - 2012, 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,11 +19,6 @@ | |||||||
|  * 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 2012 - 2014, 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 1998 - 2014, 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,11 +19,17 @@ | |||||||
|  * KIND, either express or implied. |  * KIND, either express or implied. | ||||||
|  * |  * | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
| /* <DESC> | /* Example using a "in core" PEM certificate to retrieve a https page. | ||||||
|  * CA cert in memory with OpenSSL to get a HTTPS page. |  * Written by Theo Borm | ||||||
|  * </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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 1998 - 2011, 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,10 +19,6 @@ | |||||||
|  * 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 1998 - 2011, 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,10 +19,6 @@ | |||||||
|  * 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 1998 - 2012, 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,10 +19,7 @@ | |||||||
|  * KIND, either express or implied. |  * KIND, either express or implied. | ||||||
|  * |  * | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
| /* <DESC> | /* This example shows usage of simple cookie interface. */ | ||||||
|  * Import and export cookies with COOKIELIST. |  | ||||||
|  * </DESC> |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
| @@ -99,12 +96,7 @@ main(void) | |||||||
|       return 1; |       return 1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* HTTP-header style cookie. If you use the Set-Cookie format and don't |     /* HTTP-header style cookie */ | ||||||
|     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,12 +5,9 @@ | |||||||
|  *                            | (__| |_| |  _ <| |___ |  *                            | (__| |_| |  _ <| |___ | ||||||
|  *                             \___|\___/|_| \_\_____| |  *                             \___|\___/|_| \_\_____| | ||||||
|  * |  * | ||||||
|  *  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,10 +9,7 @@ | |||||||
|   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. | ||||||
| @@ -493,7 +490,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 response doesn\'t have an acceptable " |         BIO_printf(p.errorbio,"the reponse doesn\'t has 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 1998 - 2013, 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,10 +19,6 @@ | |||||||
|  * 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 1998 - 2014, 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,10 +19,6 @@ | |||||||
|  * 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 1998 - 2014, 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,10 +19,9 @@ | |||||||
|  * KIND, either express or implied. |  * KIND, either express or implied. | ||||||
|  * |  * | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
| /* <DESC> | /* | ||||||
|  * An example demonstrating how an application can pass in a custom |  * This is 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 1998 - 2011, 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,10 +19,6 @@ | |||||||
|  * 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,10 +42,6 @@ | |||||||
|  * |  * | ||||||
|  * 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> | ||||||
| @@ -112,7 +108,7 @@ static size_t write_callback(char *buffer, | |||||||
|       size=rembuff; |       size=rembuff; | ||||||
|     } |     } | ||||||
|     else { |     else { | ||||||
|       /* realloc succeeded increase buffer size*/ |       /* realloc suceeded increase buffer size*/ | ||||||
|       url->buffer_len+=size - rembuff; |       url->buffer_len+=size - rembuff; | ||||||
|       url->buffer=newbuff; |       url->buffer=newbuff; | ||||||
|     } |     } | ||||||
| @@ -135,7 +131,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 | ||||||
|    * doesn't exceed required size already |    * doesnt exceed required size already | ||||||
|    */ |    */ | ||||||
|   if((!file->still_running) || (file->buffer_pos > want)) |   if((!file->still_running) || (file->buffer_pos > want)) | ||||||
|     return 0; |     return 0; | ||||||
| @@ -209,7 +205,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, size_t want) | static int use_buffer(URL_FILE *file,int want) | ||||||
| { | { | ||||||
|   /* sort out buffer */ |   /* sort out buffer */ | ||||||
|   if((file->buffer_pos - want) <=0) { |   if((file->buffer_pos - want) <=0) { | ||||||
| @@ -233,7 +229,7 @@ static int use_buffer(URL_FILE *file, size_t 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 | ||||||
|      basically use the real fopen() for standard files */ |      basicly use the real fopen() for standard files */ | ||||||
|  |  | ||||||
|   URL_FILE *file; |   URL_FILE *file; | ||||||
|   (void)operation; |   (void)operation; | ||||||
| @@ -379,7 +375,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, (int)size, file->handle.file); |     ptr = fgets(ptr,size,file->handle.file); | ||||||
|     break; |     break; | ||||||
|  |  | ||||||
|   case CFTYPE_CURL: |   case CFTYPE_CURL: | ||||||
| @@ -455,7 +451,7 @@ int main(int argc, char *argv[]) | |||||||
|   URL_FILE *handle; |   URL_FILE *handle; | ||||||
|   FILE *outf; |   FILE *outf; | ||||||
|  |  | ||||||
|   size_t nread; |   int nread; | ||||||
|   char buffer[256]; |   char buffer[256]; | ||||||
|   const char *url; |   const char *url; | ||||||
|  |  | ||||||
| @@ -503,7 +499,7 @@ int main(int argc, char *argv[]) | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   do { |   do { | ||||||
|     nread = url_fread(buffer, 1, sizeof(buffer), handle); |     nread = url_fread(buffer, 1,sizeof(buffer), handle); | ||||||
|     fwrite(buffer,1,nread,outf); |     fwrite(buffer,1,nread,outf); | ||||||
|   } while(nread); |   } while(nread); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ | |||||||
|  *                            | (__| |_| |  _ <| |___ |  *                            | (__| |_| |  _ <| |___ | ||||||
|  *                             \___|\___/|_| \_\_____| |  *                             \___|\___/|_| \_\_____| | ||||||
|  * |  * | ||||||
|  * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 1998 - 2014, 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,10 +19,6 @@ | |||||||
|  * 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 1998 - 2011, 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,9 +23,11 @@ | |||||||
|  |  | ||||||
| #include <curl/curl.h> | #include <curl/curl.h> | ||||||
|  |  | ||||||
| /* <DESC> | /* | ||||||
|  * Get a single file from an FTP server. |  * This is an example showing how to get a single file from an FTP server. | ||||||
|  * </DESC> |  * It delays the actual destination file creation until the first write | ||||||
|  |  * 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 { | ||||||
| @@ -51,7 +53,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 successful */ |     "curl.tar.gz", /* name to store the file as if succesful */ | ||||||
|     NULL |     NULL | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ | |||||||
|  *                            | (__| |_| |  _ <| |___ |  *                            | (__| |_| |  _ <| |___ | ||||||
|  *                             \___|\___/|_| \_\_____| |  *                             \___|\___/|_| \_\_____| | ||||||
|  * |  * | ||||||
|  * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 1998 - 2012, 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> | /* | ||||||
|  * Checks a single file's size and mtime from an FTP server. |  * This is an example showing how to check a single file's size and mtime | ||||||
|  * </DESC> |  * from an FTP server. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 1998 - 2011, 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,13 @@ | |||||||
|  |  | ||||||
| #include <curl/curl.h> | #include <curl/curl.h> | ||||||
|  |  | ||||||
| /* <DESC> | /* | ||||||
|  * Similar to ftpget.c but also stores the received response-lines |  * Similar to ftpget.c but this 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 1998 - 2012, 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,11 @@ | |||||||
|  |  | ||||||
| #include <curl/curl.h> | #include <curl/curl.h> | ||||||
|  |  | ||||||
| /* <DESC> | /* | ||||||
|  * Get a single file from an FTPS server. |  * This is an example showing how to get a single file from an FTPS server. | ||||||
|  * </DESC> |  * It delays the actual destination file creation until the first write | ||||||
|  |  * 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 +55,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 successful */ |     "yourfile.bin", /* name to store the file as if succesful */ | ||||||
|     NULL |     NULL | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ | |||||||
|  *                            | (__| |_| |  _ <| |___ |  *                            | (__| |_| |  _ <| |___ | ||||||
|  *                             \___|\___/|_| \_\_____| |  *                             \___|\___/|_| \_\_____| | ||||||
|  * |  * | ||||||
|  * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 1998 - 2012, 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,10 +33,11 @@ | |||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /* <DESC> | /* | ||||||
|  * Performs an FTP upload and renames the file just after a successful |  * This example shows an FTP upload, with a rename of the file just after | ||||||
|  * transfer. |  * a successful upload. | ||||||
|  * </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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 1998 - 2011, 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,13 @@ | |||||||
|  * KIND, either express or implied. |  * KIND, either express or implied. | ||||||
|  * |  * | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
| /* <DESC> | /* Upload to FTP, resuming failed transfers | ||||||
|  * Upload to FTP, resuming failed transfers. |  * | ||||||
|  * </DESC> |  * Compile for MinGW like this: | ||||||
|  |  *  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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 1998 - 2011, 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,10 +19,6 @@ | |||||||
|  * 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> | ||||||
|  |  | ||||||
| @@ -31,14 +27,18 @@ 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,6 +46,7 @@ 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 1998 - 2013, 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,10 +19,8 @@ | |||||||
|  * KIND, either express or implied. |  * KIND, either express or implied. | ||||||
|  * |  * | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
| /* <DESC> | /* Example source code to show how the callback function can be used to | ||||||
|  * Shows how the write callback function can be used to download data into a |  * download data into a chunk of memory instead of storing it in a file. | ||||||
|  * chunk of memory instead of storing it in a file. |  | ||||||
|  * </DESC> |  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| @@ -36,6 +34,7 @@ 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) | ||||||
| { | { | ||||||
| @@ -56,6 +55,7 @@ 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 1998 - 2014, 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,10 +19,6 @@ | |||||||
|  * 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 1998 - 2014, 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,10 +19,6 @@ | |||||||
|  * 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 2012, 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> |  | ||||||
|  */ |  | ||||||
| /* | /* | ||||||
|  * The HTML parser is found at http://code.google.com/p/htmlstreamparser/ |  * This example uses the "Streaming HTML parser" to extract the href pieces in | ||||||
|  |  * 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 1998 - 2011, 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,12 +19,13 @@ | |||||||
|  * KIND, either express or implied. |  * KIND, either express or implied. | ||||||
|  * |  * | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
| /* <DESC> | /* Download a document and use libtidy to parse the HTML. | ||||||
|  * Download a document and use libtidy to parse the HTML. |  * Written by Jeff Pohlmeyer | ||||||
|  * </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> | ||||||
|   | |||||||
| @@ -1,288 +0,0 @@ | |||||||
| /*************************************************************************** |  | ||||||
|  *                                  _   _ ____  _ |  | ||||||
|  *  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; |  | ||||||
| } |  | ||||||
| @@ -1,313 +0,0 @@ | |||||||
| /*************************************************************************** |  | ||||||
|  *                                  _   _ ____  _ |  | ||||||
|  *  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; |  | ||||||
| } |  | ||||||
| @@ -1,352 +0,0 @@ | |||||||
| /*************************************************************************** |  | ||||||
|  *                                  _   _ ____  _ |  | ||||||
|  *  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_VERIFICATION | #ifdef SKIP_HOSTNAME_VERFICATION | ||||||
|     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(); | ||||||
|  |  | ||||||
|   /* initialize custom header list (stating that Expect: 100-continue is not |   /* initalize 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 occurrence, then assume no file |        wait for. Try timeout on first occurance, 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 retrieve message 1 from the user's mailbox */ |   /* This will retreive 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 retrieve message 1 from the user's mailbox */ |     /* This will retreive 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 retrieve message 1 from the user's mailbox. Note the use of |     /* This will retreive 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_VERIFICATION | #ifdef SKIP_HOSTNAME_VERFICATION | ||||||
|     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 retrieve message 1 from the user's mailbox */ |     /* This will retreive 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(); | ||||||
|   /* initialize custom header list (stating that Expect: 100-continue is not |   /* initalize 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 successful */ |     "yourfile.bin", /* name to store the file as if succesful */ | ||||||
|     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 example of using the multi interface please see |  * capabilities. For an exmaple 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_VERIFICATION | #ifdef SKIP_HOSTNAME_VERFICATION | ||||||
|     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); | ||||||
|  |  | ||||||
|   /* Initialize a libcurl handle. */ |   /* Initalize 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,3 +1,2 @@ | |||||||
| *.html | *.html | ||||||
| *.pdf | *.pdf | ||||||
| libcurl-symbols.3 |  | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ | |||||||
| .\" *                            | (__| |_| |  _ <| |___ | .\" *                            | (__| |_| |  _ <| |___ | ||||||
| .\" *                             \___|\___/|_| \_\_____| | .\" *                             \___|\___/|_| \_\_____| | ||||||
| .\" * | .\" * | ||||||
| .\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. | .\" * Copyright (C) 1998 - 2014, 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,6 +63,5 @@ if(curl) { | |||||||
| } | } | ||||||
| .fi | .fi | ||||||
| .SH "SEE ALSO" | .SH "SEE ALSO" | ||||||
| .BR curl_easy_init "(3), " curl_easy_duphandle "(3), " | .BR curl_easy_init "(3), " | ||||||
| .BR curl_easy_reset "(3), " |  | ||||||
| .BR curl_multi_cleanup "(3), " curl_multi_remove_handle "(3) " |  | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ | |||||||
| .\" *                            | (__| |_| |  _ <| |___ | .\" *                            | (__| |_| |  _ <| |___ | ||||||
| .\" *                             \___|\___/|_| \_\_____| | .\" *                             \___|\___/|_| \_\_____| | ||||||
| .\" * | .\" * | ||||||
| .\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. | .\" * Copyright (C) 1998 - 2014, 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,6 +47,4 @@ 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_easy_reset "(3)," | .BR curl_easy_init "(3)," curl_easy_cleanup "(3)," curl_global_init "(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 \fIstring\fP to a URL encoded string | This function converts the given input \fBstring\fP to an 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 \fIlength\fP is set to 0 (zero), \fIcurl_easy_escape(3)\fP uses strlen() on | If the \fBlength\fP argument is set to 0 (zero), \fIcurl_easy_escape(3)\fP | ||||||
| the input \fIstring\fP to find out the size. | uses strlen() on the input \fBurl\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 | ||||||
|   | |||||||
| @@ -50,8 +50,6 @@ 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. | ||||||
|  |  | ||||||
| @@ -167,10 +165,6 @@ 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 | ||||||
| @@ -293,8 +287,6 @@ 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. | .\" * Copyright (C) 1998 - 2014, 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 3986 | .BR curl_easy_escape "(3), " curl_free "(3)," RFC 2396 | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ | |||||||
| .\" *                            | (__| |_| |  _ <| |___ | .\" *                            | (__| |_| |  _ <| |___ | ||||||
| .\" *                             \___|\___/|_| \_\_____| | .\" *                             \___|\___/|_| \_\_____| | ||||||
| .\" * | .\" * | ||||||
| .\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. | .\" * Copyright (C) 1998 - 2014, 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 RFC 7231 says HTTP applications may use. | only ones RFC2616 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. | .\" * Copyright (C) 1998 - 2011, 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" is | If more involved information is wanted, the particular "easy handle" in | ||||||
| present in that struct and can be used in subsequent regular | present in that struct and can thus be used in subsequent regular | ||||||
| \fIcurl_easy_getinfo(3)\fP calls (or similar): | \fIcurl_easy_getinfo(3)\fP calls (or similar): | ||||||
|  |  | ||||||
| .nf | .nf | ||||||
| @@ -68,24 +68,6 @@ 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. | .\" * Copyright (C) 1998 - 2014, 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,55 +49,6 @@ 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. | .\" * Copyright (C) 1998 - 2011, 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,22 +49,6 @@ 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 occurred. This | total number of file descriptors on which interesting events occured. 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. | .\" * Copyright (C) 1998 - 2014, 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_ACCEPTTIMEOUT_MS(3)\fP (or the internal default) timeout expired. | \fICURLOPT_ACCEPTTIMOUT_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 current timeout time is - if that expires libcurl should be | and what the curret 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. | .\" * Copyright (C) 1998 - 2014, 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,9 +29,8 @@ 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 (a host being the | amount of simultaneously open connections to a single host. For each new | ||||||
| same as a host name + port number pair). For each new session to a host, | session to a host, libcurl will open a new connection up to the limit set by | ||||||
| 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 | ||||||
| @@ -41,9 +40,6 @@ 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. | .\" * Copyright (C) 1998 - 2014, 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,28 +26,17 @@ 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, long bits); | CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PIPELINING, bool onoff); | ||||||
| .SH DESCRIPTION | .SH DESCRIPTION | ||||||
| Set the \fBbits\fP parameter to 1 to make libcurl use HTTP pipelining for | Set the \fBonoff\fP parameter to 1 to make libcurl use HTTP pipelining for | ||||||
| HTTP/1.1 transfers done using this multi handle, as far as possible. This | HTTP transfers done using this multi handle, as far as possible. This means | ||||||
| means that if you add a second request that can use an already existing | that if you add a second request that can use an already existing connection, | ||||||
| connection, the second request will be \&"piped" on the same connection rather | the second request will be \&"piped" on the same connection rather than being | ||||||
| than being executed in parallel. | 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 | ||||||
| @@ -55,7 +44,7 @@ HTTP(S) | |||||||
| .SH EXAMPLE | .SH EXAMPLE | ||||||
| TODO | TODO | ||||||
| .SH AVAILABILITY | .SH AVAILABILITY | ||||||
| Added in 7.16.0. Multiplex support bit added in 7.43.0. | Added in 7.16.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" | ||||||
|   | |||||||
| @@ -1,49 +0,0 @@ | |||||||
| .\" ************************************************************************** |  | ||||||
| .\" *                                  _   _ ____  _ |  | ||||||
| .\" *  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 |  | ||||||
| @@ -1,132 +0,0 @@ | |||||||
| .\" ************************************************************************** |  | ||||||
| .\" *                                  _   _ ____  _ |  | ||||||
| .\" *  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_FUNCTION(3)\fP and | argument to the \fICURL_CHUNK_BGN_FUNTION(3)\fP and | ||||||
| \fICURL_CHUNK_END_FUNCTION(3)\fP. | \fICURL_CHUNK_END_FUNTION(3)\fP. | ||||||
| .SH DEFAULT | .SH DEFAULT | ||||||
| NULL | NULL | ||||||
| .SH PROTOCOLS | .SH PROTOCOLS | ||||||
|   | |||||||
| @@ -40,15 +40,6 @@ 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,16 +36,6 @@ 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 | ||||||
| @@ -65,46 +55,7 @@ NULL | |||||||
| .SH PROTOCOLS | .SH PROTOCOLS | ||||||
| HTTP | HTTP | ||||||
| .SH EXAMPLE | .SH EXAMPLE | ||||||
| .nf | TODO | ||||||
| /* 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,33 +51,15 @@ All | |||||||
| .nf | .nf | ||||||
| curl = curl_easy_init(); | curl = curl_easy_init(); | ||||||
| if(curl) { | if(curl) { | ||||||
|   CURLcode res; |   char error[CURL_ERROR_SIZE] | ||||||
|   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, errbuf); |   curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error); | ||||||
|  |  | ||||||
|   /* set the error buffer as empty before performing a request */ |   /* Perform the request */ | ||||||
|   errbuf[0] = 0; |   curl_easy_perform(curl); | ||||||
|  |  | ||||||
|   /* 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 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. | .\" * Copyright (C) 1998 - 2014, 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,9 +37,6 @@ 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 | ||||||
| @@ -51,4 +48,4 @@ Always | |||||||
| .SH RETURN VALUE | .SH RETURN VALUE | ||||||
| Returns CURLE_OK | Returns CURLE_OK | ||||||
| .SH "SEE ALSO" | .SH "SEE ALSO" | ||||||
| .BR CURLOPT_PROXY "(3), " CURLOPT_PROXYTYPE "(3), " CURLOPT_PROXYPORT "(3), " | .BR CURLOPT_PROXY "(3), " | ||||||
|   | |||||||
| @@ -50,22 +50,11 @@ 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 | ||||||
| Added in 7.39.0 for OpenSSL, GnuTLS and GSKit. Added in 7.43.0 for | If built TLS enabled. This is currently only implemented in the OpenSSL, | ||||||
| NSS and wolfSSL/CyaSSL. Other SSL backends not supported. | GnuTLS and GSKit backends. | ||||||
|  |  | ||||||
|  | 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