Windows build script changes
This commit is contained in:
2
bin/curl/BUILD-HOMEPAGE.url
Normal file
2
bin/curl/BUILD-HOMEPAGE.url
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
[InternetShortcut]
|
||||||
|
URL=https://github.com/curl/curl-for-win
|
||||||
3
bin/curl/BUILD-README.txt
Normal file
3
bin/curl/BUILD-README.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
Visit the project page for details about these builds and the list of changes:
|
||||||
|
|
||||||
|
https://github.com/curl/curl-for-win
|
||||||
7904
bin/curl/CHANGES.txt
Normal file
7904
bin/curl/CHANGES.txt
Normal file
File diff suppressed because it is too large
Load Diff
19
bin/curl/COPYING-brotli.txt
Normal file
19
bin/curl/COPYING-brotli.txt
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
42
bin/curl/COPYING-libssh2.txt
Normal file
42
bin/curl/COPYING-libssh2.txt
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
/* Copyright (c) 2004-2007 Sara Golemon <sarag@libssh2.org>
|
||||||
|
* Copyright (c) 2005,2006 Mikhail Gusarov <dottedmag@dottedmag.net>
|
||||||
|
* Copyright (c) 2006-2007 The Written Word, Inc.
|
||||||
|
* Copyright (c) 2007 Eli Fant <elifantu@mail.ru>
|
||||||
|
* Copyright (c) 2009-2014 Daniel Stenberg
|
||||||
|
* Copyright (C) 2008, 2009 Simon Josefsson
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms,
|
||||||
|
* with or without modification, are permitted provided
|
||||||
|
* that the following conditions are met:
|
||||||
|
*
|
||||||
|
* Redistributions of source code must retain the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following
|
||||||
|
* disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* Neither the name of the copyright holder nor the names
|
||||||
|
* of any other contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without
|
||||||
|
* specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||||
|
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||||
|
* OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
23
bin/curl/COPYING-nghttp2.txt
Normal file
23
bin/curl/COPYING-nghttp2.txt
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
The MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2012, 2014, 2015, 2016 Tatsuhiro Tsujikawa
|
||||||
|
Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
115
bin/curl/COPYING-zlib.txt
Normal file
115
bin/curl/COPYING-zlib.txt
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
ZLIB DATA COMPRESSION LIBRARY
|
||||||
|
|
||||||
|
zlib 1.2.11 is a general purpose data compression library. All the code is
|
||||||
|
thread safe. The data format used by the zlib library is described by RFCs
|
||||||
|
(Request for Comments) 1950 to 1952 in the files
|
||||||
|
http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and
|
||||||
|
rfc1952 (gzip format).
|
||||||
|
|
||||||
|
All functions of the compression library are documented in the file zlib.h
|
||||||
|
(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example
|
||||||
|
of the library is given in the file test/example.c which also tests that
|
||||||
|
the library is working correctly. Another example is given in the file
|
||||||
|
test/minigzip.c. The compression library itself is composed of all source
|
||||||
|
files in the root directory.
|
||||||
|
|
||||||
|
To compile all files and run the test program, follow the instructions given at
|
||||||
|
the top of Makefile.in. In short "./configure; make test", and if that goes
|
||||||
|
well, "make install" should work for most flavors of Unix. For Windows, use
|
||||||
|
one of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use
|
||||||
|
make_vms.com.
|
||||||
|
|
||||||
|
Questions about zlib should be sent to <zlib@gzip.org>, or to Gilles Vollant
|
||||||
|
<info@winimage.com> for the Windows DLL version. The zlib home page is
|
||||||
|
http://zlib.net/ . Before reporting a problem, please check this site to
|
||||||
|
verify that you have the latest version of zlib; otherwise get the latest
|
||||||
|
version and check whether the problem still exists or not.
|
||||||
|
|
||||||
|
PLEASE read the zlib FAQ http://zlib.net/zlib_faq.html before asking for help.
|
||||||
|
|
||||||
|
Mark Nelson <markn@ieee.org> wrote an article about zlib for the Jan. 1997
|
||||||
|
issue of Dr. Dobb's Journal; a copy of the article is available at
|
||||||
|
http://marknelson.us/1997/01/01/zlib-engine/ .
|
||||||
|
|
||||||
|
The changes made in version 1.2.11 are documented in the file ChangeLog.
|
||||||
|
|
||||||
|
Unsupported third party contributions are provided in directory contrib/ .
|
||||||
|
|
||||||
|
zlib is available in Java using the java.util.zip package, documented at
|
||||||
|
http://java.sun.com/developer/technicalArticles/Programming/compression/ .
|
||||||
|
|
||||||
|
A Perl interface to zlib written by Paul Marquess <pmqs@cpan.org> is available
|
||||||
|
at CPAN (Comprehensive Perl Archive Network) sites, including
|
||||||
|
http://search.cpan.org/~pmqs/IO-Compress-Zlib/ .
|
||||||
|
|
||||||
|
A Python interface to zlib written by A.M. Kuchling <amk@amk.ca> is
|
||||||
|
available in Python 1.5 and later versions, see
|
||||||
|
http://docs.python.org/library/zlib.html .
|
||||||
|
|
||||||
|
zlib is built into tcl: http://wiki.tcl.tk/4610 .
|
||||||
|
|
||||||
|
An experimental package to read and write files in .zip format, written on top
|
||||||
|
of zlib by Gilles Vollant <info@winimage.com>, is available in the
|
||||||
|
contrib/minizip directory of zlib.
|
||||||
|
|
||||||
|
|
||||||
|
Notes for some targets:
|
||||||
|
|
||||||
|
- For Windows DLL versions, please see win32/DLL_FAQ.txt
|
||||||
|
|
||||||
|
- For 64-bit Irix, deflate.c must be compiled without any optimization. With
|
||||||
|
-O, one libpng test fails. The test works in 32 bit mode (with the -n32
|
||||||
|
compiler flag). The compiler bug has been reported to SGI.
|
||||||
|
|
||||||
|
- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works
|
||||||
|
when compiled with cc.
|
||||||
|
|
||||||
|
- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is
|
||||||
|
necessary to get gzprintf working correctly. This is done by configure.
|
||||||
|
|
||||||
|
- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with
|
||||||
|
other compilers. Use "make test" to check your compiler.
|
||||||
|
|
||||||
|
- gzdopen is not supported on RISCOS or BEOS.
|
||||||
|
|
||||||
|
- For PalmOs, see http://palmzlib.sourceforge.net/
|
||||||
|
|
||||||
|
|
||||||
|
Acknowledgments:
|
||||||
|
|
||||||
|
The deflate format used by zlib was defined by Phil Katz. The deflate and
|
||||||
|
zlib specifications were written by L. Peter Deutsch. Thanks to all the
|
||||||
|
people who reported problems and suggested various improvements in zlib; they
|
||||||
|
are too numerous to cite here.
|
||||||
|
|
||||||
|
Copyright notice:
|
||||||
|
|
||||||
|
(C) 1995-2017 Jean-loup Gailly and Mark Adler
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
Jean-loup Gailly Mark Adler
|
||||||
|
jloup@gzip.org madler@alumni.caltech.edu
|
||||||
|
|
||||||
|
If you use the zlib library in a product, we would appreciate *not* receiving
|
||||||
|
lengthy legal documents to sign. The sources are provided for free but without
|
||||||
|
warranty of any kind. The library has been entirely written by Jean-loup
|
||||||
|
Gailly and Mark Adler; it does not include third-party code.
|
||||||
|
|
||||||
|
If you redistribute modified sources, we would appreciate that you include in
|
||||||
|
the file ChangeLog history information documenting your changes. Please read
|
||||||
|
the FAQ for more information on the distribution of modified source versions.
|
||||||
22
bin/curl/COPYING.txt
Normal file
22
bin/curl/COPYING.txt
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
COPYRIGHT AND PERMISSION NOTICE
|
||||||
|
|
||||||
|
Copyright (c) 1996 - 2019, Daniel Stenberg, <daniel@haxx.se>, and many
|
||||||
|
contributors, see the THANKS file.
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and distribute this software for any purpose
|
||||||
|
with or without fee is hereby granted, provided that the above copyright
|
||||||
|
notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN
|
||||||
|
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||||
|
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||||
|
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
|
||||||
|
OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
Except as contained in this notice, the name of a copyright holder shall not
|
||||||
|
be used in advertising or otherwise to promote the sale, use or other dealings
|
||||||
|
in this Software without prior written authorization of the copyright holder.
|
||||||
125
bin/curl/LICENSE-openssl.txt
Normal file
125
bin/curl/LICENSE-openssl.txt
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
|
||||||
|
LICENSE ISSUES
|
||||||
|
==============
|
||||||
|
|
||||||
|
The OpenSSL toolkit stays under a double license, i.e. both the conditions of
|
||||||
|
the OpenSSL License and the original SSLeay license apply to the toolkit.
|
||||||
|
See below for the actual license texts.
|
||||||
|
|
||||||
|
OpenSSL License
|
||||||
|
---------------
|
||||||
|
|
||||||
|
/* ====================================================================
|
||||||
|
* Copyright (c) 1998-2019 The OpenSSL Project. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* 3. All advertising materials mentioning features or use of this
|
||||||
|
* software must display the following acknowledgment:
|
||||||
|
* "This product includes software developed by the OpenSSL Project
|
||||||
|
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
|
||||||
|
*
|
||||||
|
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||||
|
* endorse or promote products derived from this software without
|
||||||
|
* prior written permission. For written permission, please contact
|
||||||
|
* openssl-core@openssl.org.
|
||||||
|
*
|
||||||
|
* 5. Products derived from this software may not be called "OpenSSL"
|
||||||
|
* nor may "OpenSSL" appear in their names without prior written
|
||||||
|
* permission of the OpenSSL Project.
|
||||||
|
*
|
||||||
|
* 6. Redistributions of any form whatsoever must retain the following
|
||||||
|
* acknowledgment:
|
||||||
|
* "This product includes software developed by the OpenSSL Project
|
||||||
|
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||||
|
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||||
|
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||||
|
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
* ====================================================================
|
||||||
|
*
|
||||||
|
* This product includes cryptographic software written by Eric Young
|
||||||
|
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||||
|
* Hudson (tjh@cryptsoft.com).
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
Original SSLeay License
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This package is an SSL implementation written
|
||||||
|
* by Eric Young (eay@cryptsoft.com).
|
||||||
|
* The implementation was written so as to conform with Netscapes SSL.
|
||||||
|
*
|
||||||
|
* This library is free for commercial and non-commercial use as long as
|
||||||
|
* the following conditions are aheared to. The following conditions
|
||||||
|
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||||
|
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||||
|
* included with this distribution is covered by the same copyright terms
|
||||||
|
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||||
|
*
|
||||||
|
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||||
|
* the code are not to be removed.
|
||||||
|
* If this package is used in a product, Eric Young should be given attribution
|
||||||
|
* as the author of the parts of the library used.
|
||||||
|
* This can be in the form of a textual message at program startup or
|
||||||
|
* in documentation (online or textual) provided with the package.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* "This product includes cryptographic software written by
|
||||||
|
* Eric Young (eay@cryptsoft.com)"
|
||||||
|
* The word 'cryptographic' can be left out if the rouines from the library
|
||||||
|
* being used are not cryptographic related :-).
|
||||||
|
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||||
|
* the apps directory (application code) you must include an acknowledgement:
|
||||||
|
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The licence and distribution terms for any publically available version or
|
||||||
|
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||||
|
* copied and put under another distribution licence
|
||||||
|
* [including the GNU Public Licence.]
|
||||||
|
*/
|
||||||
|
|
||||||
55
bin/curl/README.txt
Normal file
55
bin/curl/README.txt
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
_ _ ____ _
|
||||||
|
___| | | | _ \| |
|
||||||
|
/ __| | | | |_) | |
|
||||||
|
| (__| |_| | _ <| |___
|
||||||
|
\___|\___/|_| \_\_____|
|
||||||
|
|
||||||
|
README
|
||||||
|
|
||||||
|
Curl is a command line tool for transferring data specified with URL
|
||||||
|
syntax. Find out how to use curl by reading the curl.1 man page or the
|
||||||
|
MANUAL document. Find out how to install Curl by reading the INSTALL
|
||||||
|
document.
|
||||||
|
|
||||||
|
libcurl is the library curl is using to do its job. It is readily
|
||||||
|
available to be used by your software. Read the libcurl.3 man page to
|
||||||
|
learn how!
|
||||||
|
|
||||||
|
You find answers to the most frequent questions we get in the FAQ document.
|
||||||
|
|
||||||
|
Study the COPYING file for distribution terms and similar. If you distribute
|
||||||
|
curl binaries or other binaries that involve libcurl, you might enjoy the
|
||||||
|
LICENSE-MIXING document.
|
||||||
|
|
||||||
|
CONTACT
|
||||||
|
|
||||||
|
If you have problems, questions, ideas or suggestions, please contact us
|
||||||
|
by posting to a suitable mailing list. See https://curl.haxx.se/mail/
|
||||||
|
|
||||||
|
All contributors to the project are listed in the THANKS document.
|
||||||
|
|
||||||
|
WEB SITE
|
||||||
|
|
||||||
|
Visit the curl web site for the latest news and downloads:
|
||||||
|
|
||||||
|
https://curl.haxx.se/
|
||||||
|
|
||||||
|
GIT
|
||||||
|
|
||||||
|
To download the very latest source off the GIT server do this:
|
||||||
|
|
||||||
|
git clone https://github.com/curl/curl.git
|
||||||
|
|
||||||
|
(you'll get a directory named curl created, filled with the source code)
|
||||||
|
|
||||||
|
SECURITY PROBLEMS
|
||||||
|
|
||||||
|
Report suspected security problems via our HackerOne page and not in public!
|
||||||
|
|
||||||
|
https://hackerone.com/curl
|
||||||
|
|
||||||
|
NOTICE
|
||||||
|
|
||||||
|
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
|
||||||
|
distribution terms.
|
||||||
250
bin/curl/RELEASE-NOTES.txt
Normal file
250
bin/curl/RELEASE-NOTES.txt
Normal file
@@ -0,0 +1,250 @@
|
|||||||
|
curl and libcurl 7.65.0
|
||||||
|
|
||||||
|
Public curl releases: 181
|
||||||
|
Command line options: 221
|
||||||
|
curl_easy_setopt() options: 268
|
||||||
|
Public functions in libcurl: 80
|
||||||
|
Contributors: 1929
|
||||||
|
|
||||||
|
This release includes the following changes:
|
||||||
|
|
||||||
|
o CURLOPT_DNS_USE_GLOBAL_CACHE: removed [25]
|
||||||
|
o CURLOPT_MAXAGE_CONN: set the maximum allowed age for conn reuse [37]
|
||||||
|
o pipelining: removed [10]
|
||||||
|
|
||||||
|
This release includes the following bugfixes:
|
||||||
|
|
||||||
|
o CVE-2019-5435: Integer overflows in curl_url_set [87]
|
||||||
|
o CVE-2019-5436: tftp: use the current blksize for recvfrom() [82]
|
||||||
|
o --config: clarify that initial : and = might need quoting [17]
|
||||||
|
o AppVeyor: enable testing for WinSSL build [23]
|
||||||
|
o CURLMOPT_TIMERFUNCTION.3: warn about the recursive risk [52]
|
||||||
|
o CURLOPT_ADDRESS_SCOPE: fix range check and more [32]
|
||||||
|
o CURLOPT_CAINFO.3: with Schannel, you want Windows 8 or later [75]
|
||||||
|
o CURLOPT_CHUNK_BGN_FUNCTION.3: document the struct and time value [51]
|
||||||
|
o CURLOPT_READFUNCTION.3: see also CURLOPT_UPLOAD_BUFFERSIZE [71]
|
||||||
|
o CURL_MAX_INPUT_LENGTH: largest acceptable string input size [44]
|
||||||
|
o Curl_disconnect: treat all CONNECT_ONLY connections as "dead" [39]
|
||||||
|
o INTERNALS: Add code highlighting [47]
|
||||||
|
o OS400/ccsidcurl: replace use of Curl_vsetopt [50]
|
||||||
|
o OpenSSL: Report -fips in version if OpenSSL is built with FIPS [55]
|
||||||
|
o README.md: fix no-consecutive-blank-lines Codacy warning [22]
|
||||||
|
o VC15 project: remove MinimalRebuild
|
||||||
|
o VS projects: use Unicode for VC10+ [16]
|
||||||
|
o WRITEFUNCTION: add missing set_in_callback around callback [60]
|
||||||
|
o altsvc: Fix building with cookies disabled [38]
|
||||||
|
o auth: Rename the various authentication clean up functions [61]
|
||||||
|
o base64: build conditionally if there are users
|
||||||
|
o build-openssl.bat: Fixed support for OpenSSL v1.1.0+
|
||||||
|
o build: fix "clarify calculation precedence" warnings [63]
|
||||||
|
o checksrc.bat: ignore snprintf warnings in docs/examples [67]
|
||||||
|
o cirrus: Customize the disabled tests per FreeBSD version
|
||||||
|
o cleanup: remove FIXME and TODO comments [81]
|
||||||
|
o cmake: avoid linking executable for some tests with cmake 3.6+ [18]
|
||||||
|
o cmake: clear CMAKE_REQUIRED_LIBRARIES after each use [19]
|
||||||
|
o cmake: rename CMAKE_USE_DARWINSSL to CMAKE_USE_SECTRANSP [46]
|
||||||
|
o cmake: set SSL_BACKENDS [12]
|
||||||
|
o configure: avoid unportable `==' test(1) operator [1]
|
||||||
|
o configure: error out if OpenSSL wasn't detected when asked for [74]
|
||||||
|
o configure: fix default location for fish completions [13]
|
||||||
|
o cookie: Guard against possible NULL ptr deref [42]
|
||||||
|
o curl: make code work with protocol-disabled libcurl [78]
|
||||||
|
o curl: report error for "--no-" on non-boolean options [86]
|
||||||
|
o curl_easy_getinfo.3: fix minor formatting mistake
|
||||||
|
o curlver.h: use parenthesis in CURL_VERSION_BITS macro [45]
|
||||||
|
o docs/BUG-BOUNTY: bug bounty time [48]
|
||||||
|
o docs/INSTALL: fix broken link [62]
|
||||||
|
o docs/RELEASE-PROCEDURE: link to live iCalendar [79]
|
||||||
|
o documentation: Fix several typos [7]
|
||||||
|
o doh: acknowledge CURL_DISABLE_DOH
|
||||||
|
o doh: disable DOH for the cases it doesn't work [66]
|
||||||
|
o examples: remove unused variables [88]
|
||||||
|
o ftplistparser: fix LGTM alert "Empty block without comment" [14]
|
||||||
|
o hostip: acknowledge CURL_DISABLE_SHUFFLE_DNS [78]
|
||||||
|
o http: Ignore HTTP/2 prior knowledge setting for HTTP proxies [54]
|
||||||
|
o http: acknowledge CURL_DISABLE_HTTP_AUTH
|
||||||
|
o http: mark bundle as not for multiuse on < HTTP/2 response [41]
|
||||||
|
o http_digest: Don't expose functions when HTTP and Crypto Auth are disabled [65]
|
||||||
|
o http_negotiate: do not treat failure of gss_init_sec_context() as fatal [53]
|
||||||
|
o http_ntlm: Corrected the name of the include guard [64]
|
||||||
|
o http_ntlm_wb: Handle auth for only a single request [77]
|
||||||
|
o http_ntlm_wb: Return the correct error on receiving an empty auth message [77]
|
||||||
|
o lib509: add missing include for strdup [22]
|
||||||
|
o lib557: initialize variables [22]
|
||||||
|
o makedebug: Fix ERRORLEVEL detection after running where.exe [58]
|
||||||
|
o mbedtls: enable use of EC keys [85]
|
||||||
|
o mime: acknowledge CURL_DISABLE_MIME
|
||||||
|
o multi: improved HTTP_1_1_REQUIRED handling [2]
|
||||||
|
o netrc: acknowledge CURL_DISABLE_NETRC [78]
|
||||||
|
o nss: allow fifos and character devices for certificates [56]
|
||||||
|
o nss: provide more specific error messages on failed init [43]
|
||||||
|
o ntlm: Fix misaligned function comments for Curl_auth_ntlm_cleanup [70]
|
||||||
|
o ntlm: Support the NT response in the type-3 when OpenSSL doesn't include MD4
|
||||||
|
o openssl: mark connection for close on TLS close_notify [36]
|
||||||
|
o openvms: Remove pre-processor for SecureTransport [40]
|
||||||
|
o openvms: Remove pre-processors for Windows [40]
|
||||||
|
o parse_proxy: use the URL parser API [72]
|
||||||
|
o parsedate: disabled on CURL_DISABLE_PARSEDATE
|
||||||
|
o pingpong: disable more when no pingpong protocols are enabled
|
||||||
|
o polarssl_threadlock: remove conditionally unused code [22]
|
||||||
|
o progress: acknowledge CURL_DISABLE_PROGRESS_METER [78]
|
||||||
|
o proxy: acknowledge DISABLE_PROXY more
|
||||||
|
o resolve: apply Happy Eyeballs philosophy to parallel c-ares queries [3]
|
||||||
|
o revert "multi: support verbose conncache closure handle" [69]
|
||||||
|
o sasl: Don't send authcid as authzid for the PLAIN mechanism as per RFC 4616
|
||||||
|
o sasl: only enable if there's a protocol enabled using it
|
||||||
|
o scripts: fix typos
|
||||||
|
o singleipconnect: show port in the verbose "Trying ..." message
|
||||||
|
o smtp: fix compiler warning [15]
|
||||||
|
o socks5: user name and passwords must be shorter than 256 [8]
|
||||||
|
o socks: fix error message
|
||||||
|
o socksd: new SOCKS 4+5 server for tests [31]
|
||||||
|
o spnego_gssapi: fix return code on gss_init_sec_context() failure [53]
|
||||||
|
o ssh-libssh: remove unused variable [83]
|
||||||
|
o ssh: define USE_SSH if SSH is enabled (any backend) [57]
|
||||||
|
o ssh: move variable declaration to where it's used [83]
|
||||||
|
o test1002: correct the name
|
||||||
|
o test2100: Fix typos in test description
|
||||||
|
o tests/server/util: fix Windows Unicode build [21]
|
||||||
|
o tests: Run global cleanup at end of tests [29]
|
||||||
|
o tests: make Impacket (SMB server) Python 3 compatible [11]
|
||||||
|
o tool_cb_wrt: fix bad-function-cast warning [5]
|
||||||
|
o tool_formparse: remove redundant assignment [83]
|
||||||
|
o tool_help: Warn if curl and libcurl versions do not match [28]
|
||||||
|
o tool_help: include <strings.h> for strcasecmp [4]
|
||||||
|
o transfer: fix LGTM alert "Comparison is always true" [14]
|
||||||
|
o travis: add an osx http-only build [80]
|
||||||
|
o travis: allow builds on branches named "ci"
|
||||||
|
o travis: install dependencies only when needed [24]
|
||||||
|
o travis: update some builds do Xenial [30]
|
||||||
|
o travis: updated mesalink builds [35]
|
||||||
|
o url: always clone the CUROPT_CURLU handle [26]
|
||||||
|
o url: convert the zone id from a IPv6 URL to correct scope id [89]
|
||||||
|
o urlapi: add CURLUPART_ZONEID to set and get [59]
|
||||||
|
o urlapi: increase supported scheme length to 40 bytes [84]
|
||||||
|
o urlapi: require a non-zero host name length when parsing URL [73]
|
||||||
|
o urlapi: stricter CURLUPART_PORT parsing [33]
|
||||||
|
o urlapi: strip off zone id from numerical IPv6 addresses [49]
|
||||||
|
o urlapi: urlencode characters above 0x7f correctly [9]
|
||||||
|
o vauth/cleartext: update the PLAIN login to match RFC 4616 [27]
|
||||||
|
o vauth/oauth2: Fix OAUTHBEARER token generation [6]
|
||||||
|
o vauth: Fix incorrect function description for Curl_auth_user_contains_domain [68]
|
||||||
|
o vtls: fix potential ssl_buffer stack overflow [76]
|
||||||
|
o wildcard: disable from build when FTP isn't present
|
||||||
|
o winbuild: Support MultiSSL builds [34]
|
||||||
|
o xattr: skip unittest on unsupported platforms [20]
|
||||||
|
|
||||||
|
This release includes the following known bugs:
|
||||||
|
|
||||||
|
o see docs/KNOWN_BUGS (https://curl.haxx.se/docs/knownbugs.html)
|
||||||
|
|
||||||
|
This release would not have looked like this without help, code, reports and
|
||||||
|
advice from friends like these:
|
||||||
|
|
||||||
|
Aron Bergman, Brad Spencer, cclauss on github, Dan Fandrich,
|
||||||
|
Daniel Gustafsson, Daniel Stenberg, Eli Schwartz, Even Rouault,
|
||||||
|
Frank Gevaerts, Gisle Vanem, GitYuanQu on github, Guy Poizat, Isaiah Norton,
|
||||||
|
Jakub Zakrzewski, Jan Ehrhardt, Jeroen Ooms, Jonathan Cardoso Machado,
|
||||||
|
Jonathan Moerman, Joombalaya on github, Kamil Dudka, Kristoffer Gleditsch,
|
||||||
|
l00p3r on hackerone, Leonardo Taccari, Marcel Raad, Mert Yazıcıoğlu,
|
||||||
|
nevv on HackerOne/curl, niner on github, Olen Andoni, Omar Ramadan,
|
||||||
|
Paolo Mossino, Patrick Monnerat, Po-Chuan Hsieh, Poul T Lomholt, Ray Satiro,
|
||||||
|
Reed Loden, Ricardo Gomes, Ricky Leverence, Rikard Falkeborn, Roy Bellingan,
|
||||||
|
Simon Warta, Steve Holme, Taiyu Len, Tim Rühsen, Tom van der Woerdt,
|
||||||
|
Tseng Jun, Viktor Szakats, Wenchao Li, Wyatt O'Day, XmiliaH on github,
|
||||||
|
Yiming Jing,
|
||||||
|
(50 contributors)
|
||||||
|
|
||||||
|
Thanks! (and sorry if I forgot to mention someone)
|
||||||
|
|
||||||
|
References to bug reports and discussions on issues:
|
||||||
|
|
||||||
|
[1] = https://curl.haxx.se/bug/?i=3709
|
||||||
|
[2] = https://curl.haxx.se/bug/?i=3707
|
||||||
|
[3] = https://curl.haxx.se/bug/?i=3699
|
||||||
|
[4] = https://curl.haxx.se/bug/?i=3715
|
||||||
|
[5] = https://curl.haxx.se/bug/?i=3718
|
||||||
|
[6] = https://curl.haxx.se/bug/?i=2487
|
||||||
|
[7] = https://curl.haxx.se/bug/?i=3724
|
||||||
|
[8] = https://curl.haxx.se/bug/?i=3737
|
||||||
|
[9] = https://curl.haxx.se/bug/?i=3741
|
||||||
|
[10] = https://curl.haxx.se/bug/?i=3651
|
||||||
|
[11] = https://curl.haxx.se/bug/?i=3731
|
||||||
|
[12] = https://curl.haxx.se/bug/?i=3736
|
||||||
|
[13] = https://curl.haxx.se/bug/?i=3723
|
||||||
|
[14] = https://curl.haxx.se/bug/?i=3732
|
||||||
|
[15] = https://curl.haxx.se/bug/?i=3729
|
||||||
|
[16] = https://curl.haxx.se/bug/?i=3720
|
||||||
|
[17] = https://curl.haxx.se/bug/?i=3738
|
||||||
|
[18] = https://curl.haxx.se/bug/?i=3744
|
||||||
|
[19] = https://curl.haxx.se/bug/?i=3743
|
||||||
|
[20] = https://curl.haxx.se/bug/?i=3759
|
||||||
|
[21] = https://curl.haxx.se/bug/?i=3758
|
||||||
|
[22] = https://curl.haxx.se/bug/?i=3739
|
||||||
|
[23] = https://curl.haxx.se/bug/?i=3725
|
||||||
|
[24] = https://curl.haxx.se/bug/?i=3721
|
||||||
|
[25] = https://curl.haxx.se/bug/?i=3654
|
||||||
|
[26] = https://curl.haxx.se/bug/?i=3753
|
||||||
|
[27] = https://curl.haxx.se/bug/?i=3757
|
||||||
|
[28] = https://curl.haxx.se/bug/?i=3774
|
||||||
|
[29] = https://curl.haxx.se/bug/?i=3783
|
||||||
|
[30] = https://curl.haxx.se/bug/?i=3777
|
||||||
|
[31] = https://curl.haxx.se/bug/?i=3752
|
||||||
|
[32] = https://curl.haxx.se/bug/?i=3713
|
||||||
|
[33] = https://curl.haxx.se/bug/?i=3762
|
||||||
|
[34] = https://curl.haxx.se/bug/?i=3772
|
||||||
|
[35] = https://curl.haxx.se/bug/?i=3823
|
||||||
|
[36] = https://curl.haxx.se/bug/?i=3750
|
||||||
|
[37] = https://curl.haxx.se/bug/?i=3782
|
||||||
|
[38] = https://curl.haxx.se/bug/?i=3717
|
||||||
|
[39] = https://curl.haxx.se/mail/lib-2019-04/0052.html
|
||||||
|
[40] = https://curl.haxx.se/bug/?i=3768
|
||||||
|
[41] = https://curl.haxx.se/bug/?i=3813
|
||||||
|
[42] = https://curl.haxx.se/bug/?i=3820
|
||||||
|
[43] = https://curl.haxx.se/bug/?i=3808
|
||||||
|
[44] = https://curl.haxx.se/bug/?i=3805
|
||||||
|
[45] = https://curl.haxx.se/bug/?i=3809
|
||||||
|
[46] = https://curl.haxx.se/bug/?i=3769
|
||||||
|
[47] = https://curl.haxx.se/bug/?i=3801
|
||||||
|
[48] = https://curl.haxx.se/bug/?i=3488
|
||||||
|
[49] = https://curl.haxx.se/bug/?i=3817
|
||||||
|
[50] = https://curl.haxx.se/bug/?i=3833
|
||||||
|
[51] = https://curl.haxx.se/bug/?i=3829
|
||||||
|
[52] = https://curl.haxx.se/bug/?i=3537
|
||||||
|
[53] = https://curl.haxx.se/bug/?i=3726
|
||||||
|
[54] = https://curl.haxx.se/bug/?i=3570
|
||||||
|
[55] = https://curl.haxx.se/bug/?i=3771
|
||||||
|
[56] = https://curl.haxx.se/bug/?i=3807
|
||||||
|
[57] = https://curl.haxx.se/bug/?i=3846
|
||||||
|
[58] = https://curl.haxx.se/bug/?i=3838
|
||||||
|
[59] = https://curl.haxx.se/bug/?i=3834
|
||||||
|
[60] = https://curl.haxx.se/bug/?i=3837
|
||||||
|
[61] = https://curl.haxx.se/bug/?i=3869
|
||||||
|
[62] = https://curl.haxx.se/bug/?i=3818
|
||||||
|
[63] = https://curl.haxx.se/bug/?i=3866
|
||||||
|
[64] = https://curl.haxx.se/bug/?i=3867
|
||||||
|
[65] = https://curl.haxx.se/bug/?i=3861
|
||||||
|
[66] = https://curl.haxx.se/bug/?i=3850
|
||||||
|
[67] = https://curl.haxx.se/bug/?i=3862
|
||||||
|
[68] = https://curl.haxx.se/bug/?i=3860
|
||||||
|
[69] = https://curl.haxx.se/bug/?i=3856
|
||||||
|
[70] = https://curl.haxx.se/bug/?i=3858
|
||||||
|
[71] = https://curl.haxx.se/bug/?i=3885
|
||||||
|
[72] = https://curl.haxx.se/bug/?i=3878
|
||||||
|
[73] = https://curl.haxx.se/bug/?i=3880
|
||||||
|
[74] = https://curl.haxx.se/bug/?i=3824
|
||||||
|
[75] = https://curl.haxx.se/bug/?i=3711
|
||||||
|
[76] = https://curl.haxx.se/bug/?i=3863
|
||||||
|
[77] = https://curl.haxx.se/bug/?i=3894
|
||||||
|
[78] = https://curl.haxx.se/bug/?i=3844
|
||||||
|
[79] = https://curl.haxx.se/bug/?i=3895
|
||||||
|
[80] = https://curl.haxx.se/bug/?i=3887
|
||||||
|
[81] = https://curl.haxx.se/bug/?i=3876
|
||||||
|
[82] = https://curl.haxx.se/docs/CVE-2019-5436.html
|
||||||
|
[83] = https://curl.haxx.se/bug/?i=3873
|
||||||
|
[84] = https://curl.haxx.se/bug/?i=3905
|
||||||
|
[85] = https://curl.haxx.se/bug/?i=3892
|
||||||
|
[86] = https://curl.haxx.se/bug/?i=3906
|
||||||
|
[87] = https://curl.haxx.se/docs/CVE-2019-5435.html
|
||||||
|
[88] = https://curl.haxx.se/bug/?i=3908
|
||||||
|
[89] = https://curl.haxx.se/bug/?i=3902
|
||||||
3507
bin/curl/bin/curl-ca-bundle.crt
Normal file
3507
bin/curl/bin/curl-ca-bundle.crt
Normal file
File diff suppressed because it is too large
Load Diff
BIN
bin/curl/bin/curl.exe
Normal file
BIN
bin/curl/bin/curl.exe
Normal file
Binary file not shown.
BIN
bin/curl/bin/libcurl-x64.dll
Normal file
BIN
bin/curl/bin/libcurl-x64.dll
Normal file
Binary file not shown.
59
bin/curl/docs/ALTSVC.md
Normal file
59
bin/curl/docs/ALTSVC.md
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
# Alt-Svc
|
||||||
|
|
||||||
|
curl features **EXPERIMENTAL** support for the Alt-Svc: HTTP header.
|
||||||
|
|
||||||
|
## Experimental
|
||||||
|
|
||||||
|
Experimental support in curl means:
|
||||||
|
|
||||||
|
1. Experimental features are provided to allow users to try them out and
|
||||||
|
provide feedback on functionality and API etc before they ship and get
|
||||||
|
"carved in stone".
|
||||||
|
2. You must enable the feature when invoking configure as otherwise curl will
|
||||||
|
not be built with the feature present.
|
||||||
|
3. We strongly advice against using this feature in production.
|
||||||
|
4. **We reserve the right to change behavior** of the feature without sticking
|
||||||
|
to our API/ABI rules as we do for regular features, as long as it is marked
|
||||||
|
experimental.
|
||||||
|
5. Experimental features are clearly marked so in documentation. Beware.
|
||||||
|
|
||||||
|
## Enable Alt-Svc in build
|
||||||
|
|
||||||
|
`./configure --enable-alt-svc`
|
||||||
|
|
||||||
|
## Standard
|
||||||
|
|
||||||
|
[RFC 7838](https://tools.ietf.org/html/rfc7838)
|
||||||
|
|
||||||
|
## What works
|
||||||
|
|
||||||
|
- read alt-svc file from disk
|
||||||
|
- write alt-svc file from disk
|
||||||
|
- parse `Alt-Svc:` response headers, including `ma`, `clear` and `persist`.
|
||||||
|
- replaces old entries when new alternatives are received
|
||||||
|
- unit tests to verify most of this functionality (test 1654)
|
||||||
|
- act on `Alt-Svc:` response headers
|
||||||
|
- build conditionally on `configure --enable-alt-svc` only, feature marked as
|
||||||
|
**EXPERIMENTAL**
|
||||||
|
- implement `CURLOPT_ALTSVC_CTRL`
|
||||||
|
- implement `CURLOPT_ALTSVC`
|
||||||
|
- document `CURLOPT_ALTSVC_CTRL`
|
||||||
|
- document `CURLOPT_ALTSVC`
|
||||||
|
- document `--alt-svc`
|
||||||
|
- add `CURL_VERSION_ALTSVC`
|
||||||
|
- make `curl -V` show 'alt-svc' as a feature if built-in
|
||||||
|
- support `curl --alt-svc [file]` to enable caching, using that file
|
||||||
|
- make `tests/runtests.pl` able to filter tests on the feature `alt-svc`
|
||||||
|
- actually use the existing in-memory alt-svc cache for outgoing connections
|
||||||
|
- alt-svc cache expiry
|
||||||
|
- test 355 and 356 verify curl acting on Alt-Svc, received from header and
|
||||||
|
loaded from cache. The latter needs a debug build since it enables Alt-Svc
|
||||||
|
for plain HTTP.
|
||||||
|
|
||||||
|
## What is left
|
||||||
|
|
||||||
|
- handle multiple response headers, when one of them says `clear` (should
|
||||||
|
override them all)
|
||||||
|
- using `Age:` value for caching age as per spec
|
||||||
|
- `CURLALTSVC_IMMEDIATELY` support
|
||||||
|
- `CURLALTSVC_ALTUSED` support
|
||||||
118
bin/curl/docs/BINDINGS.md
Normal file
118
bin/curl/docs/BINDINGS.md
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
libcurl bindings
|
||||||
|
================
|
||||||
|
|
||||||
|
Creative people have written bindings or interfaces for various environments
|
||||||
|
and programming languages. Using one of these allows you to take advantage of
|
||||||
|
curl powers from within your favourite language or system.
|
||||||
|
|
||||||
|
This is a list of all known interfaces as of this writing.
|
||||||
|
|
||||||
|
The bindings listed below are not part of the curl/libcurl distribution
|
||||||
|
archives, but must be downloaded and installed separately.
|
||||||
|
|
||||||
|
[Ada95](https://web.archive.org/web/20070403105909/www.almroth.com/adacurl/index.html) Written by Andreas Almroth
|
||||||
|
|
||||||
|
[Basic](http://scriptbasic.com/) ScriptBasic bindings written by Peter Verhas
|
||||||
|
|
||||||
|
C++: [curlpp](http://curlpp.org/) Written by Jean-Philippe Barrette-LaPierre,
|
||||||
|
[curlcpp](https://github.com/JosephP91/curlcpp) by Giuseppe Persico and [C++
|
||||||
|
Requests](https://github.com/whoshuu/cpr) by Huu Nguyen
|
||||||
|
|
||||||
|
[Ch](https://chcurl.sourceforge.io/) Written by Stephen Nestinger and Jonathan Rogado
|
||||||
|
|
||||||
|
Cocoa: [BBHTTP](https://github.com/brunodecarvalho/BBHTTP) written by Bruno de Carvalho
|
||||||
|
[curlhandle](https://github.com/karelia/curlhandle) Written by Dan Wood
|
||||||
|
|
||||||
|
[D](https://dlang.org/library/std/net/curl.html) Written by Kenneth Bogert
|
||||||
|
|
||||||
|
[Delphi](https://github.com/Mercury13/curl4delphi) Written by Mikhail Merkuryev
|
||||||
|
|
||||||
|
[Dylan](https://dylanlibs.sourceforge.io/) Written by Chris Double
|
||||||
|
|
||||||
|
[Eiffel](https://room.eiffel.com/library/curl) Written by Eiffel Software
|
||||||
|
|
||||||
|
[Euphoria](https://web.archive.org/web/20050204080544/rays-web.com/eulibcurl.htm) Written by Ray Smith
|
||||||
|
|
||||||
|
[Falcon](http://www.falconpl.org/index.ftd?page_id=prjs&prj_id=curl)
|
||||||
|
|
||||||
|
[Ferite](https://web.archive.org/web/20150102192018/ferite.org/) Written by Paul Querna
|
||||||
|
|
||||||
|
[Gambas](https://gambas.sourceforge.io/)
|
||||||
|
|
||||||
|
[glib/GTK+](https://web.archive.org/web/20100526203452/atterer.net/glibcurl) Written by Richard Atterer
|
||||||
|
|
||||||
|
Go: [go-curl](https://github.com/andelf/go-curl) by ShuYu Wang
|
||||||
|
|
||||||
|
[Guile](http://www.lonelycactus.com/guile-curl.html) Written by Michael L. Gran
|
||||||
|
|
||||||
|
[Harbour](https://github.com/vszakats/harbour-core/tree/master/contrib/hbcurl) Written by Viktor Szakáts
|
||||||
|
|
||||||
|
[Haskell](https://hackage.haskell.org/cgi-bin/hackage-scripts/package/curl) Written by Galois, Inc
|
||||||
|
|
||||||
|
[Java](https://github.com/pjlegato/curl-java)
|
||||||
|
|
||||||
|
[Julia](https://github.com/forio/Curl.jl) Written by Paul Howe
|
||||||
|
|
||||||
|
[Lisp](https://common-lisp.net/project/cl-curl/) Written by Liam Healy
|
||||||
|
|
||||||
|
Lua: [luacurl](http://luacurl.luaforge.net/) by Alexander Marinov, [Lua-cURL](https://github.com/Lua-cURL) by Jürgen Hötzel
|
||||||
|
|
||||||
|
[Mono](https://forge.novell.com/modules/xfmod/project/?libcurl-mono) Written by Jeffrey Phillips
|
||||||
|
|
||||||
|
[.NET](https://sourceforge.net/projects/libcurl-net/) libcurl-net by Jeffrey Phillips
|
||||||
|
|
||||||
|
[node.js](https://github.com/JCMais/node-libcurl) node-libcurl by Jonathan Cardoso Machado
|
||||||
|
|
||||||
|
[Object-Pascal](https://web.archive.org/web/20020610214926/www.tekool.com/opcurl) Free Pascal, Delphi and Kylix binding written by Christophe Espern.
|
||||||
|
|
||||||
|
[OCaml](https://opam.ocaml.org/packages/ocurl/) Written by Lars Nilsson and ygrek
|
||||||
|
|
||||||
|
[Pascal](https://web.archive.org/web/20030804091414/houston.quik.com/jkp/curlpas/) Free Pascal, Delphi and Kylix binding written by Jeffrey Pohlmeyer.
|
||||||
|
|
||||||
|
Perl: [WWW--Curl](https://github.com/szbalint/WWW--Curl) Maintained by Cris
|
||||||
|
Bailiff and Bálint Szilakszi,
|
||||||
|
[perl6-net-curl](https://github.com/azawawi/perl6-net-curl) by Ahmad M. Zawawi
|
||||||
|
|
||||||
|
[PHP](https://php.net/curl) Originally written by Sterling Hughes
|
||||||
|
|
||||||
|
[PostgreSQL](https://github.com/pramsey/pgsql-http) - HTTP client for PostgreSQL
|
||||||
|
|
||||||
|
[Python](http://pycurl.io/) PycURL by Kjetil Jacobsen
|
||||||
|
|
||||||
|
[R](https://cran.r-project.org/package=curl)
|
||||||
|
|
||||||
|
[Rexx](https://rexxcurl.sourceforge.io/) Written Mark Hessling
|
||||||
|
|
||||||
|
[Ring](https://ring-lang.sourceforge.io/doc1.3/libcurl.html) RingLibCurl by Mahmoud Fayed
|
||||||
|
|
||||||
|
RPG, support for ILE/RPG on OS/400 is included in source distribution
|
||||||
|
|
||||||
|
Ruby: [curb](https://github.com/taf2/curb) written by Ross Bamford
|
||||||
|
|
||||||
|
[Rust](https://github.com/carllerche/curl-rust) curl-rust - by Carl Lerche
|
||||||
|
|
||||||
|
[Scheme](https://www.metapaper.net/lisovsky/web/curl/) Bigloo binding by Kirill Lisovsky
|
||||||
|
|
||||||
|
[Scilab](https://help.scilab.org/docs/current/fr_FR/getURL.html) binding by Sylvestre Ledru
|
||||||
|
|
||||||
|
[S-Lang](https://www.jedsoft.org/slang/modules/curl.html) by John E Davis
|
||||||
|
|
||||||
|
[Smalltalk](http://www.squeaksource.com/CurlPlugin/) Written by Danil Osipchuk
|
||||||
|
|
||||||
|
[SP-Forth](https://sourceforge.net/p/spf/spf/ci/master/tree/devel/~ac/lib/lin/curl/) Written by Andrey Cherezov
|
||||||
|
|
||||||
|
[SPL](http://www.clifford.at/spl/) Written by Clifford Wolf
|
||||||
|
|
||||||
|
[Tcl](https://web.archive.org/web/20160826011806/mirror.yellow5.com/tclcurl/) Tclcurl by Andrés García
|
||||||
|
|
||||||
|
[Visual Basic](https://sourceforge.net/projects/libcurl-vb/) libcurl-vb by Jeffrey Phillips
|
||||||
|
|
||||||
|
[Visual Foxpro](https://web.archive.org/web/20130730181523/www.ctl32.com.ar/libcurl.asp) by Carlos Alloatti
|
||||||
|
|
||||||
|
[Q](https://q-lang.sourceforge.io/) The libcurl module is part of the default install
|
||||||
|
|
||||||
|
[wxWidgets](https://wxcode.sourceforge.io/components/wxcurl/) Written by Casey O'Donnell
|
||||||
|
|
||||||
|
[XBLite](https://web.archive.org/web/20060426150418/perso.wanadoo.fr/xblite/libraries.html) Written by David Szafranski
|
||||||
|
|
||||||
|
[Xojo](https://github.com/charonn0/RB-libcURL) Written by Andrew Lambert
|
||||||
106
bin/curl/docs/BUG-BOUNTY.md
Normal file
106
bin/curl/docs/BUG-BOUNTY.md
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
# The curl bug bounty
|
||||||
|
|
||||||
|
The curl project runs a bug bounty program in association with
|
||||||
|
[HackerOne](https://www.hackerone.com) and the [Internet Bug
|
||||||
|
Bounty](https://internetbugbounty.org).
|
||||||
|
|
||||||
|
# How does it work?
|
||||||
|
|
||||||
|
Start out by posting your suspected security vulnerability directly to [curl's
|
||||||
|
HackerOne program](https://hackerone.com/curl).
|
||||||
|
|
||||||
|
After you have reported a security issue, it has been deemed credible, and a
|
||||||
|
patch and advisory has been made public, you may be eligible for a bounty from
|
||||||
|
this program.
|
||||||
|
|
||||||
|
See all details at [https://hackerone.com/curl](https://hackerone.com/curl)
|
||||||
|
|
||||||
|
This bounty is relying on funds from sponsors. If you use curl professionally,
|
||||||
|
consider help funding this! See
|
||||||
|
[https://opencollective.com/curl](https://opencollective.com/curl) for
|
||||||
|
details.
|
||||||
|
|
||||||
|
# What are the reward amounts?
|
||||||
|
|
||||||
|
The curl projects offer monetary compensation for reported and published
|
||||||
|
security vulnerabilities. The amount of money that is rewarded depends on how
|
||||||
|
serious the flaw is determined to be.
|
||||||
|
|
||||||
|
We offer reward money *up to* a certain amount per severity. The curl security
|
||||||
|
team determines the severity of each reported flaw on a case by case basis and
|
||||||
|
the exact amount rewarded to the reporter is then decided.
|
||||||
|
|
||||||
|
Check out the current award amounts at [https://hackerone.com/curl](https://hackerone.com/curl)
|
||||||
|
|
||||||
|
# Who is eligible for a reward?
|
||||||
|
|
||||||
|
Everyone and anyone who reports a security problem in a released curl version
|
||||||
|
that hasn't already been reported can ask for a bounty.
|
||||||
|
|
||||||
|
Vulnerabilities in features that are off by default and documented as
|
||||||
|
experimental are not eligible for a reward.
|
||||||
|
|
||||||
|
The vulnerability has to be fixed and publicly announced (by the curl project)
|
||||||
|
before a bug bounty will be considered.
|
||||||
|
|
||||||
|
Bounties need to be requested within twelve months from the publication of the
|
||||||
|
vulnerability.
|
||||||
|
|
||||||
|
The vulnerabilities must not have been made public before February 1st, 2019.
|
||||||
|
We do not retroactively pay for old, already known, or published security
|
||||||
|
problems.
|
||||||
|
|
||||||
|
# Product vulnerabilities only
|
||||||
|
|
||||||
|
This bug bounty only concerns the curl and libcurl products and thus their
|
||||||
|
respective source codes - when running on existing hardware. It does not
|
||||||
|
include documentation, websites, or other infrastructure.
|
||||||
|
|
||||||
|
The curl security team will be the sole arbiter if a reported flaw can be
|
||||||
|
subject to a bounty or not.
|
||||||
|
|
||||||
|
# How are vulnerabilities graded?
|
||||||
|
|
||||||
|
The grading of each reported vulnerability that makes a reward claim will be
|
||||||
|
performed by the curl security team. The grading will be based on the CVSS
|
||||||
|
(Common Vulnerability Scoring System) 3.0.
|
||||||
|
|
||||||
|
# How are reward amounts determined?
|
||||||
|
|
||||||
|
The curl security team first gives the vulnerability a score, as mentioned
|
||||||
|
above, and based on that level we set an amount depending on the specifics of
|
||||||
|
the individual case. Other sponsors of the program might also get involved and
|
||||||
|
can raise the amounts depending on the particular issue.
|
||||||
|
|
||||||
|
# What happens if the bounty fund is drained?
|
||||||
|
|
||||||
|
The bounty fund depends on sponsors. If we pay out more bounties than we add,
|
||||||
|
the fund will eventually drain. If that end up happening, we will simply not
|
||||||
|
be able to pay out as high bounties as we would like and hope that we can
|
||||||
|
convince new sponsors to help us top up the fund again.
|
||||||
|
|
||||||
|
# Regarding taxes, etc. on the bounties
|
||||||
|
|
||||||
|
In the event that the individual receiving a curl bug bounty needs to pay
|
||||||
|
taxes on the reward money, the responsibility lies with the receiver. The
|
||||||
|
curl project or its security team never actually receive any of this money,
|
||||||
|
hold the money, or pay out the money.
|
||||||
|
|
||||||
|
## Bonus levels
|
||||||
|
|
||||||
|
In cooperation with [Dropbox](https://www.dropbox.com) the curl bug bounty can
|
||||||
|
offer the highest levels of rewards if the issue covers one of the interest
|
||||||
|
areas of theirs - and only if the bug is graded *high* or *critical*. A
|
||||||
|
non-exhaustive list of vulnerabilities Dropbox is interested in are:
|
||||||
|
|
||||||
|
- RCE
|
||||||
|
- URL parsing vulnerabilities with demonstrable security impact
|
||||||
|
|
||||||
|
Dropbox would generally hand out rewards for critical vulnerabilities ranging
|
||||||
|
from 12k-32k USD where RCE is on the upper end of the spectrum.
|
||||||
|
|
||||||
|
URL parsing vulnerabilities with demonstrable security impact might include
|
||||||
|
incorrectly determining the authority of a URL when a special character is
|
||||||
|
inserted into the path of the URL (as a hypothetical). This type of
|
||||||
|
vulnerability would likely yield 6k-12k unless further impact could be
|
||||||
|
demonstrated.
|
||||||
302
bin/curl/docs/BUGS.txt
Normal file
302
bin/curl/docs/BUGS.txt
Normal file
@@ -0,0 +1,302 @@
|
|||||||
|
_ _ ____ _
|
||||||
|
___| | | | _ \| |
|
||||||
|
/ __| | | | |_) | |
|
||||||
|
| (__| |_| | _ <| |___
|
||||||
|
\___|\___/|_| \_\_____|
|
||||||
|
|
||||||
|
BUGS
|
||||||
|
|
||||||
|
1. Bugs
|
||||||
|
1.1 There are still bugs
|
||||||
|
1.2 Where to report
|
||||||
|
1.3 Security bugs
|
||||||
|
1.4 What to report
|
||||||
|
1.5 libcurl problems
|
||||||
|
1.6 Who will fix the problems
|
||||||
|
1.7 How to get a stack trace
|
||||||
|
1.8 Bugs in libcurl bindings
|
||||||
|
1.9 Bugs in old versions
|
||||||
|
|
||||||
|
2. Bug fixing procedure
|
||||||
|
2.1 What happens on first filing
|
||||||
|
2.2 First response
|
||||||
|
2.3 Not reproducible
|
||||||
|
2.4 Unresponsive
|
||||||
|
2.5 Lack of time/interest
|
||||||
|
2.6 KNOWN_BUGS
|
||||||
|
2.7 TODO
|
||||||
|
2.8 Closing off stalled bugs
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
|
||||||
|
1.1 There are still bugs
|
||||||
|
|
||||||
|
Curl and libcurl keep being developed. Adding features and changing code
|
||||||
|
means that bugs will sneak in, no matter how hard we try not to.
|
||||||
|
|
||||||
|
Of course there are lots of bugs left. And lots of misfeatures.
|
||||||
|
|
||||||
|
To help us make curl the stable and solid product we want it to be, we need
|
||||||
|
bug reports and bug fixes.
|
||||||
|
|
||||||
|
1.2 Where to report
|
||||||
|
|
||||||
|
If you can't fix a bug yourself and submit a fix for it, try to report an as
|
||||||
|
detailed report as possible to a curl mailing list to allow one of us to
|
||||||
|
have a go at a solution. You can optionally also post your bug/problem at
|
||||||
|
curl's bug tracking system over at
|
||||||
|
|
||||||
|
https://github.com/curl/curl/issues
|
||||||
|
|
||||||
|
Please read the rest of this document below first before doing that!
|
||||||
|
|
||||||
|
If you feel you need to ask around first, find a suitable mailing list and
|
||||||
|
post there. The lists are available on https://curl.haxx.se/mail/
|
||||||
|
|
||||||
|
1.3 Security bugs
|
||||||
|
|
||||||
|
If you find a bug or problem in curl or libcurl that you think has a
|
||||||
|
security impact, for example a bug that can put users in danger or make them
|
||||||
|
vulnerable if the bug becomes public knowledge, then please report that bug
|
||||||
|
using our security development process.
|
||||||
|
|
||||||
|
Security related bugs or bugs that are suspected to have a security impact,
|
||||||
|
should be reported on the curl security tracker at HackerOne:
|
||||||
|
|
||||||
|
https://hackerone.com/curl
|
||||||
|
|
||||||
|
This ensures that the report reaches the curl security team so that they
|
||||||
|
first can be deal with the report away from the public to minimize the harm
|
||||||
|
and impact it will have on existing users out there who might be using the
|
||||||
|
vulnerable versions.
|
||||||
|
|
||||||
|
The curl project's process for handling security related issues is
|
||||||
|
documented here:
|
||||||
|
|
||||||
|
https://curl.haxx.se/dev/secprocess.html
|
||||||
|
|
||||||
|
1.4 What to report
|
||||||
|
|
||||||
|
When reporting a bug, you should include all information that will help us
|
||||||
|
understand what's wrong, what you expected to happen and how to repeat the
|
||||||
|
bad behavior. You therefore need to tell us:
|
||||||
|
|
||||||
|
- your operating system's name and version number
|
||||||
|
|
||||||
|
- what version of curl you're using (curl -V is fine)
|
||||||
|
|
||||||
|
- versions of the used libraries that libcurl is built to use
|
||||||
|
|
||||||
|
- what URL you were working with (if possible), at least which protocol
|
||||||
|
|
||||||
|
and anything and everything else you think matters. Tell us what you
|
||||||
|
expected to happen, tell use what did happen, tell us how you could make it
|
||||||
|
work another way. Dig around, try out, test. Then include all the tiny bits
|
||||||
|
and pieces in your report. You will benefit from this yourself, as it will
|
||||||
|
enable us to help you quicker and more accurately.
|
||||||
|
|
||||||
|
Since curl deals with networks, it often helps us if you include a protocol
|
||||||
|
debug dump with your bug report. The output you get by using the -v or
|
||||||
|
--trace options.
|
||||||
|
|
||||||
|
If curl crashed, causing a core dump (in unix), there is hardly any use to
|
||||||
|
send that huge file to anyone of us. Unless we have an exact same system
|
||||||
|
setup as you, we can't do much with it. Instead we ask you to get a stack
|
||||||
|
trace and send that (much smaller) output to us instead!
|
||||||
|
|
||||||
|
The address and how to subscribe to the mailing lists are detailed in the
|
||||||
|
MANUAL file.
|
||||||
|
|
||||||
|
1.5 libcurl problems
|
||||||
|
|
||||||
|
When you've written your own application with libcurl to perform transfers,
|
||||||
|
it is even more important to be specific and detailed when reporting bugs.
|
||||||
|
|
||||||
|
Tell us the libcurl version and your operating system. Tell us the name and
|
||||||
|
version of all relevant sub-components like for example the SSL library
|
||||||
|
you're using and what name resolving your libcurl uses. If you use SFTP or
|
||||||
|
SCP, the libssh2 version is relevant etc.
|
||||||
|
|
||||||
|
Showing us a real source code example repeating your problem is the best way
|
||||||
|
to get our attention and it will greatly increase our chances to understand
|
||||||
|
your problem and to work on a fix (if we agree it truly is a problem).
|
||||||
|
|
||||||
|
Lots of problems that appear to be libcurl problems are actually just abuses
|
||||||
|
of the libcurl API or other malfunctions in your applications. It is advised
|
||||||
|
that you run your problematic program using a memory debug tool like
|
||||||
|
valgrind or similar before you post memory-related or "crashing" problems to
|
||||||
|
us.
|
||||||
|
|
||||||
|
1.6 Who will fix the problems
|
||||||
|
|
||||||
|
If the problems or bugs you describe are considered to be bugs, we want to
|
||||||
|
have the problems fixed.
|
||||||
|
|
||||||
|
There are no developers in the curl project that are paid to work on bugs.
|
||||||
|
All developers that take on reported bugs do this on a voluntary basis. We
|
||||||
|
do it out of an ambition to keep curl and libcurl excellent products and out
|
||||||
|
of pride.
|
||||||
|
|
||||||
|
But please do not assume that you can just lump over something to us and it
|
||||||
|
will then magically be fixed after some given time. Most often we need
|
||||||
|
feedback and help to understand what you've experienced and how to repeat a
|
||||||
|
problem. Then we may only be able to assist YOU to debug the problem and to
|
||||||
|
track down the proper fix.
|
||||||
|
|
||||||
|
We get reports from many people every month and each report can take a
|
||||||
|
considerable amount of time to really go to the bottom with.
|
||||||
|
|
||||||
|
1.7 How to get a stack trace
|
||||||
|
|
||||||
|
First, you must make sure that you compile all sources with -g and that you
|
||||||
|
don't 'strip' the final executable. Try to avoid optimizing the code as
|
||||||
|
well, remove -O, -O2 etc from the compiler options.
|
||||||
|
|
||||||
|
Run the program until it cores.
|
||||||
|
|
||||||
|
Run your debugger on the core file, like '<debugger> curl core'. <debugger>
|
||||||
|
should be replaced with the name of your debugger, in most cases that will
|
||||||
|
be 'gdb', but 'dbx' and others also occur.
|
||||||
|
|
||||||
|
When the debugger has finished loading the core file and presents you a
|
||||||
|
prompt, enter 'where' (without the quotes) and press return.
|
||||||
|
|
||||||
|
The list that is presented is the stack trace. If everything worked, it is
|
||||||
|
supposed to contain the chain of functions that were called when curl
|
||||||
|
crashed. Include the stack trace with your detailed bug report. It'll help a
|
||||||
|
lot.
|
||||||
|
|
||||||
|
1.8 Bugs in libcurl bindings
|
||||||
|
|
||||||
|
There will of course pop up bugs in libcurl bindings. You should then
|
||||||
|
primarily approach the team that works on that particular binding and see
|
||||||
|
what you can do to help them fix the problem.
|
||||||
|
|
||||||
|
If you suspect that the problem exists in the underlying libcurl, then
|
||||||
|
please convert your program over to plain C and follow the steps outlined
|
||||||
|
above.
|
||||||
|
|
||||||
|
1.9 Bugs in old versions
|
||||||
|
|
||||||
|
The curl project typically releases new versions every other month, and we
|
||||||
|
fix several hundred bugs per year. For a huge table of releases, number of
|
||||||
|
bug fixes and more, see: https://curl.haxx.se/docs/releases.html
|
||||||
|
|
||||||
|
The developers in the curl project do not have bandwidth or energy enough to
|
||||||
|
maintain several branches or to spend much time on hunting down problems in
|
||||||
|
old versions when chances are we already fixed them or at least that they've
|
||||||
|
changed nature and appearance in later versions.
|
||||||
|
|
||||||
|
When you experience a problem and want to report it, you really SHOULD
|
||||||
|
include the version number of the curl you're using when you experience the
|
||||||
|
issue. If that version number shows us that you're using an out-of-date
|
||||||
|
curl, you should also try out a modern curl version to see if the problem
|
||||||
|
persists or how/if it has changed in appearance.
|
||||||
|
|
||||||
|
Even if you cannot immediately upgrade your application/system to run the
|
||||||
|
latest curl version, you can most often at least run a test version or
|
||||||
|
experimental build or similar, to get this confirmed or not.
|
||||||
|
|
||||||
|
At times people insist that they cannot upgrade to a modern curl version,
|
||||||
|
but instead they "just want the bug fixed". That's fine, just don't count on
|
||||||
|
us spending many cycles on trying to identify which single commit, if that's
|
||||||
|
even possible, that at some point in the past fixed the problem you're now
|
||||||
|
experiencing.
|
||||||
|
|
||||||
|
Security wise, it is almost always a bad idea to lag behind the current curl
|
||||||
|
versions by a lot. We keeping discovering and reporting security problems
|
||||||
|
over time see you can see in this table:
|
||||||
|
https://curl.haxx.se/docs/vulnerabilities.html
|
||||||
|
|
||||||
|
2. Bug fixing procedure
|
||||||
|
|
||||||
|
2.1 What happens on first filing
|
||||||
|
|
||||||
|
When a new issue is posted in the issue tracker or on the mailing list, the
|
||||||
|
team of developers first need to see the report. Maybe they took the day
|
||||||
|
off, maybe they're off in the woods hunting. Have patience. Allow at least a
|
||||||
|
few days before expecting someone to have responded.
|
||||||
|
|
||||||
|
In the issue tracker you can expect that some labels will be set on the
|
||||||
|
issue to help categorize it.
|
||||||
|
|
||||||
|
2.2 First response
|
||||||
|
|
||||||
|
If your issue/bug report wasn't perfect at once (and few are), chances are
|
||||||
|
that someone will ask follow-up questions. Which version did you use? Which
|
||||||
|
options did you use? How often does the problem occur? How can we reproduce
|
||||||
|
this problem? Which protocols does it involve? Or perhaps much more specific
|
||||||
|
and deep diving questions. It all depends on your specific issue.
|
||||||
|
|
||||||
|
You should then respond to these follow-up questions and provide more info
|
||||||
|
about the problem, so that we can help you figure it out. Or maybe you can
|
||||||
|
help us figure it out. An active back-and-forth communication is important
|
||||||
|
and the key for finding a cure and landing a fix.
|
||||||
|
|
||||||
|
2.3 Not reproducible
|
||||||
|
|
||||||
|
For problems that we can't reproduce and can't understand even after having
|
||||||
|
gotten all the info we need and having studied the source code over again,
|
||||||
|
are really hard to solve so then we may require further work from you who
|
||||||
|
actually see or experience the problem.
|
||||||
|
|
||||||
|
2.4 Unresponsive
|
||||||
|
|
||||||
|
If the problem haven't been understood or reproduced, and there's nobody
|
||||||
|
responding to follow-up questions or questions asking for clarifications or
|
||||||
|
for discussing possible ways to move forward with the task, we take that as
|
||||||
|
a strong suggestion that the bug is not important.
|
||||||
|
|
||||||
|
Unimportant issues will be closed as inactive sooner or later as they can't
|
||||||
|
be fixed. The inactivity period (waiting for responses) should not be
|
||||||
|
shorter than two weeks but may extend months.
|
||||||
|
|
||||||
|
2.5 Lack of time/interest
|
||||||
|
|
||||||
|
Bugs that are filed and are understood can unfortunately end up in the
|
||||||
|
"nobody cares enough about it to work on it" category. Such bugs are
|
||||||
|
perfectly valid problems that *should* get fixed but apparently aren't. We
|
||||||
|
try to mark such bugs as "KNOWN_BUGS material" after a time of inactivity
|
||||||
|
and if no activity is noticed after yet some time those bugs are added to
|
||||||
|
KNOWN_BUGS and are closed in the issue tracker.
|
||||||
|
|
||||||
|
2.6 KNOWN_BUGS
|
||||||
|
|
||||||
|
This is a list of known bugs. Bugs we know exist and that have been pointed
|
||||||
|
out but that haven't yet been fixed. The reasons for why they haven't been
|
||||||
|
fixed can involve anything really, but the primary reason is that nobody has
|
||||||
|
considered these problems to be important enough to spend the necessary time
|
||||||
|
and effort to have them fixed.
|
||||||
|
|
||||||
|
The KNOWN_BUGS are always up for grabs and we will always love the ones who
|
||||||
|
bring one of them back to live and offers solutions to them.
|
||||||
|
|
||||||
|
The KNOWN_BUGS document has a sibling document known as TODO.
|
||||||
|
|
||||||
|
2.7 TODO
|
||||||
|
|
||||||
|
Issues that are filed or reported that aren't really bugs but more missing
|
||||||
|
features or ideas for future improvements and so on are marked as
|
||||||
|
'enhancement' or 'feature-request' and will be added to the TODO document
|
||||||
|
instead and the issue is closed. We don't keep TODO items in the issue
|
||||||
|
tracker.
|
||||||
|
|
||||||
|
The TODO document is full of ideas and suggestions of what we can add or fix
|
||||||
|
one day. You're always encouraged and free to grab one of those items and
|
||||||
|
take up a discussion with the curl development team on how that could be
|
||||||
|
implemented or provided in the project so that you can work on ticking it
|
||||||
|
odd that document.
|
||||||
|
|
||||||
|
If the issue is rather a bug and not a missing feature or functionality, it
|
||||||
|
is listed in KNOWN_BUGS instead.
|
||||||
|
|
||||||
|
2.8 Closing off stalled bugs
|
||||||
|
|
||||||
|
The issue and pull request trackers on https://github.com/curl/curl will
|
||||||
|
only hold "active" entries (using a non-precise definition of what active
|
||||||
|
actually is, but they're at least not completely dead). Those that are
|
||||||
|
abandoned or in other ways dormant will be closed and sometimes added to
|
||||||
|
TODO and KNOWN_BUGS instead.
|
||||||
|
|
||||||
|
This way, we only have "active" issues open on github. Irrelevant issues and
|
||||||
|
pull requests will not distract developers or casual visitors.
|
||||||
162
bin/curl/docs/CHECKSRC.md
Normal file
162
bin/curl/docs/CHECKSRC.md
Normal file
@@ -0,0 +1,162 @@
|
|||||||
|
# checksrc
|
||||||
|
|
||||||
|
This is the tool we use within the curl project to scan C source code and
|
||||||
|
check that it adheres to our [Source Code Style guide](CODE_STYLE.md).
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
checksrc.pl [options] [file1] [file2] ...
|
||||||
|
|
||||||
|
## Command line options
|
||||||
|
|
||||||
|
`-W[file]` whitelists that file and excludes it from being checked. Helpful
|
||||||
|
when, for example, one of the files is generated.
|
||||||
|
|
||||||
|
`-D[dir]` directory name to prepend to file names when accessing them.
|
||||||
|
|
||||||
|
`-h` shows the help output, that also lists all recognized warnings
|
||||||
|
|
||||||
|
## What does checksrc warn for?
|
||||||
|
|
||||||
|
checksrc does not check and verify the code against the entire style guide,
|
||||||
|
but the script is instead an effort to detect the most common mistakes and
|
||||||
|
syntax mistakes that contributors make before they get accustomed to our code
|
||||||
|
style. Heck, many of us regulars do the mistakes too and this script helps us
|
||||||
|
keep the code in shape.
|
||||||
|
|
||||||
|
checksrc.pl -h
|
||||||
|
|
||||||
|
Lists how to use the script and it lists all existing warnings it has and
|
||||||
|
problems it detects. At the time of this writing, the existing checksrc
|
||||||
|
warnings are:
|
||||||
|
|
||||||
|
- `ASSIGNWITHINCONDITION`: Assignment within a conditional expression. The
|
||||||
|
code style mandates the assignment to be done outside of it.
|
||||||
|
|
||||||
|
- `ASTERISKNOSPACE`: A pointer was declared like `char* name` instead of the more
|
||||||
|
appropriate `char *name` style. The asterisk should sit next to the name.
|
||||||
|
|
||||||
|
- `ASTERISKSPACE`: A pointer was declared like `char * name` instead of the
|
||||||
|
more appropriate `char *name` style. The asterisk should sit right next to
|
||||||
|
the name without a space in between.
|
||||||
|
|
||||||
|
- `BADCOMMAND`: There's a bad !checksrc! instruction in the code. See the
|
||||||
|
**Ignore certain warnings** section below for details.
|
||||||
|
|
||||||
|
- `BANNEDFUNC`: A banned function was used. The functions sprintf, vsprintf,
|
||||||
|
strcat, strncat, gets are **never** allowed in curl source code.
|
||||||
|
|
||||||
|
- `BRACEELSE`: '} else' on the same line. The else is supposed to be on the
|
||||||
|
following line.
|
||||||
|
|
||||||
|
- `BRACEPOS`: wrong position for an open brace (`{`).
|
||||||
|
|
||||||
|
- `COMMANOSPACE`: a comma without following space
|
||||||
|
|
||||||
|
- `COPYRIGHT`: the file is missing a copyright statement!
|
||||||
|
|
||||||
|
- `CPPCOMMENTS`: `//` comment detected, that's not C89 compliant
|
||||||
|
|
||||||
|
- `FOPENMODE`: `fopen()` needs a macro for the mode string, use it
|
||||||
|
|
||||||
|
- `INDENTATION`: detected a wrong start column for code. Note that this
|
||||||
|
warning only checks some specific places and will certainly miss many bad
|
||||||
|
indentations.
|
||||||
|
|
||||||
|
- `LONGLINE`: A line is longer than 79 columns.
|
||||||
|
|
||||||
|
- `MULTISPACE`: Multiple spaces were found where only one should be used.
|
||||||
|
|
||||||
|
- `NOSPACEEQUALS`: An equals sign was found without preceding space. We prefer
|
||||||
|
`a = 2` and *not* `a=2`.
|
||||||
|
|
||||||
|
- `OPENCOMMENT`: File ended with a comment (`/*`) still "open".
|
||||||
|
|
||||||
|
- `PARENBRACE`: `){` was used without sufficient space in between.
|
||||||
|
|
||||||
|
- `RETURNNOSPACE`: `return` was used without space between the keyword and the
|
||||||
|
following value.
|
||||||
|
|
||||||
|
- `SEMINOSPACE`: There was no space (or newline) following a semicolon.
|
||||||
|
|
||||||
|
- `SIZEOFNOPAREN`: Found use of sizeof without parentheses. We prefer
|
||||||
|
`sizeof(int)` style.
|
||||||
|
|
||||||
|
- `SNPRINTF` - Found use of `snprintf()`. Since we use an internal replacement
|
||||||
|
with a different return code etc, we prefer `msnprintf()`.
|
||||||
|
|
||||||
|
- `SPACEAFTERPAREN`: there was a space after open parenthesis, `( text`.
|
||||||
|
|
||||||
|
- `SPACEBEFORECLOSE`: there was a space before a close parenthesis, `text )`.
|
||||||
|
|
||||||
|
- `SPACEBEFORECOMMA`: there was a space before a comma, `one , two`.
|
||||||
|
|
||||||
|
- `SPACEBEFOREPAREN`: there was a space before an open parenthesis, `if (`,
|
||||||
|
where one was not expected
|
||||||
|
|
||||||
|
- `SPACESEMICOLON`: there was a space before semicolon, ` ;`.
|
||||||
|
|
||||||
|
- `TABS`: TAB characters are not allowed!
|
||||||
|
|
||||||
|
- `TRAILINGSPACE`: Trailing white space on the line
|
||||||
|
|
||||||
|
- `UNUSEDIGNORE`: a checksrc inlined warning ignore was asked for but not used,
|
||||||
|
that's an ignore that should be removed or changed to get used.
|
||||||
|
|
||||||
|
### Extended warnings
|
||||||
|
|
||||||
|
Some warnings are quite computationally expensive to perform, so they are
|
||||||
|
turned off by default. To enable these warnings, place a `.checksrc` file in
|
||||||
|
the directory where they should be activated with commands to enable the
|
||||||
|
warnings you are interested in. The format of the file is to enable one
|
||||||
|
warning per line like so: `enable <EXTENDEDWARNING>`
|
||||||
|
|
||||||
|
Currently there is one extended warning which can be enabled:
|
||||||
|
|
||||||
|
- `COPYRIGHTYEAR`: the current changeset hasn't updated the copyright year in
|
||||||
|
the source file
|
||||||
|
|
||||||
|
## Ignore certain warnings
|
||||||
|
|
||||||
|
Due to the nature of the source code and the flaws of the checksrc tool, there
|
||||||
|
is sometimes a need to ignore specific warnings. checksrc allows a few
|
||||||
|
different ways to do this.
|
||||||
|
|
||||||
|
### Inline ignore
|
||||||
|
|
||||||
|
You can control what to ignore within a specific source file by providing
|
||||||
|
instructions to checksrc in the source code itself. You need a magic marker
|
||||||
|
that is `!checksrc!` followed by the instruction. The instruction can ask to
|
||||||
|
ignore a specific warning N number of times or you ignore all of them until
|
||||||
|
you mark the end of the ignored section.
|
||||||
|
|
||||||
|
Inline ignores are only done for that single specific source code file.
|
||||||
|
|
||||||
|
Example
|
||||||
|
|
||||||
|
/* !checksrc! disable LONGLINE all */
|
||||||
|
|
||||||
|
This will ignore the warning for overly long lines until it is re-enabled with:
|
||||||
|
|
||||||
|
/* !checksrc! enable LONGLINE */
|
||||||
|
|
||||||
|
If the enabling isn't performed before the end of the file, it will be enabled
|
||||||
|
automatically for the next file.
|
||||||
|
|
||||||
|
You can also opt to ignore just N violations so that if you have a single long
|
||||||
|
line you just can't shorten and is agreed to be fine anyway:
|
||||||
|
|
||||||
|
/* !checksrc! disable LONGLINE 1 */
|
||||||
|
|
||||||
|
... and the warning for long lines will be enabled again automatically after
|
||||||
|
it has ignored that single warning. The number `1` can of course be changed to
|
||||||
|
any other integer number. It can be used to make sure only the exact intended
|
||||||
|
instances are ignored and nothing extra.
|
||||||
|
|
||||||
|
### Directory wide ignore patterns
|
||||||
|
|
||||||
|
This is a method we've transitioned away from. Use inline ignores as far as
|
||||||
|
possible.
|
||||||
|
|
||||||
|
Make a `checksrc.whitelist` file in the directory of the source code with the
|
||||||
|
false positive, and include the full offending line into this file.
|
||||||
503
bin/curl/docs/CIPHERS.md
Normal file
503
bin/curl/docs/CIPHERS.md
Normal file
@@ -0,0 +1,503 @@
|
|||||||
|
# Ciphers
|
||||||
|
|
||||||
|
With curl's options
|
||||||
|
[`CURLOPT_SSL_CIPHER_LIST`](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_CIPHER_LIST.html)
|
||||||
|
and
|
||||||
|
[`--ciphers`](https://curl.haxx.se/docs/manpage.html#--ciphers)
|
||||||
|
users can control which ciphers to consider when negotiating TLS connections.
|
||||||
|
|
||||||
|
TLS 1.3 ciphers are supported since curl 7.61 with options
|
||||||
|
[`CURLOPT_TLS13_CIPHERS`](https://curl.haxx.se/libcurl/c/CURLOPT_TLS13_CIPHERS.html)
|
||||||
|
and
|
||||||
|
[`--tls13-ciphers`](https://curl.haxx.se/docs/manpage.html#--tls13-ciphers)
|
||||||
|
.
|
||||||
|
|
||||||
|
The names of the known ciphers differ depending on which TLS backend that
|
||||||
|
libcurl was built to use. This is an attempt to list known cipher names.
|
||||||
|
|
||||||
|
## OpenSSL
|
||||||
|
|
||||||
|
(based on [OpenSSL docs](https://www.openssl.org/docs/man1.1.0/apps/ciphers.html))
|
||||||
|
|
||||||
|
When specifying multiple cipher names, separate them with colon (`:`).
|
||||||
|
|
||||||
|
### SSL3 cipher suites
|
||||||
|
|
||||||
|
`NULL-MD5`
|
||||||
|
`NULL-SHA`
|
||||||
|
`RC4-MD5`
|
||||||
|
`RC4-SHA`
|
||||||
|
`IDEA-CBC-SHA`
|
||||||
|
`DES-CBC3-SHA`
|
||||||
|
`DH-DSS-DES-CBC3-SHA`
|
||||||
|
`DH-RSA-DES-CBC3-SHA`
|
||||||
|
`DHE-DSS-DES-CBC3-SHA`
|
||||||
|
`DHE-RSA-DES-CBC3-SHA`
|
||||||
|
`ADH-RC4-MD5`
|
||||||
|
`ADH-DES-CBC3-SHA`
|
||||||
|
|
||||||
|
### TLS v1.0 cipher suites
|
||||||
|
|
||||||
|
`NULL-MD5`
|
||||||
|
`NULL-SHA`
|
||||||
|
`RC4-MD5`
|
||||||
|
`RC4-SHA`
|
||||||
|
`IDEA-CBC-SHA`
|
||||||
|
`DES-CBC3-SHA`
|
||||||
|
`DHE-DSS-DES-CBC3-SHA`
|
||||||
|
`DHE-RSA-DES-CBC3-SHA`
|
||||||
|
`ADH-RC4-MD5`
|
||||||
|
`ADH-DES-CBC3-SHA`
|
||||||
|
|
||||||
|
### AES ciphersuites from RFC3268, extending TLS v1.0
|
||||||
|
|
||||||
|
`AES128-SHA`
|
||||||
|
`AES256-SHA`
|
||||||
|
`DH-DSS-AES128-SHA`
|
||||||
|
`DH-DSS-AES256-SHA`
|
||||||
|
`DH-RSA-AES128-SHA`
|
||||||
|
`DH-RSA-AES256-SHA`
|
||||||
|
`DHE-DSS-AES128-SHA`
|
||||||
|
`DHE-DSS-AES256-SHA`
|
||||||
|
`DHE-RSA-AES128-SHA`
|
||||||
|
`DHE-RSA-AES256-SHA`
|
||||||
|
`ADH-AES128-SHA`
|
||||||
|
`ADH-AES256-SHA`
|
||||||
|
|
||||||
|
### SEED ciphersuites from RFC4162, extending TLS v1.0
|
||||||
|
|
||||||
|
`SEED-SHA`
|
||||||
|
`DH-DSS-SEED-SHA`
|
||||||
|
`DH-RSA-SEED-SHA`
|
||||||
|
`DHE-DSS-SEED-SHA`
|
||||||
|
`DHE-RSA-SEED-SHA`
|
||||||
|
`ADH-SEED-SHA`
|
||||||
|
|
||||||
|
### GOST ciphersuites, extending TLS v1.0
|
||||||
|
|
||||||
|
`GOST94-GOST89-GOST89`
|
||||||
|
`GOST2001-GOST89-GOST89`
|
||||||
|
`GOST94-NULL-GOST94`
|
||||||
|
`GOST2001-NULL-GOST94`
|
||||||
|
|
||||||
|
### Elliptic curve cipher suites
|
||||||
|
|
||||||
|
`ECDHE-RSA-NULL-SHA`
|
||||||
|
`ECDHE-RSA-RC4-SHA`
|
||||||
|
`ECDHE-RSA-DES-CBC3-SHA`
|
||||||
|
`ECDHE-RSA-AES128-SHA`
|
||||||
|
`ECDHE-RSA-AES256-SHA`
|
||||||
|
`ECDHE-ECDSA-NULL-SHA`
|
||||||
|
`ECDHE-ECDSA-RC4-SHA`
|
||||||
|
`ECDHE-ECDSA-DES-CBC3-SHA`
|
||||||
|
`ECDHE-ECDSA-AES128-SHA`
|
||||||
|
`ECDHE-ECDSA-AES256-SHA`
|
||||||
|
`AECDH-NULL-SHA`
|
||||||
|
`AECDH-RC4-SHA`
|
||||||
|
`AECDH-DES-CBC3-SHA`
|
||||||
|
`AECDH-AES128-SHA`
|
||||||
|
`AECDH-AES256-SHA`
|
||||||
|
|
||||||
|
### TLS v1.2 cipher suites
|
||||||
|
|
||||||
|
`NULL-SHA256`
|
||||||
|
`AES128-SHA256`
|
||||||
|
`AES256-SHA256`
|
||||||
|
`AES128-GCM-SHA256`
|
||||||
|
`AES256-GCM-SHA384`
|
||||||
|
`DH-RSA-AES128-SHA256`
|
||||||
|
`DH-RSA-AES256-SHA256`
|
||||||
|
`DH-RSA-AES128-GCM-SHA256`
|
||||||
|
`DH-RSA-AES256-GCM-SHA384`
|
||||||
|
`DH-DSS-AES128-SHA256`
|
||||||
|
`DH-DSS-AES256-SHA256`
|
||||||
|
`DH-DSS-AES128-GCM-SHA256`
|
||||||
|
`DH-DSS-AES256-GCM-SHA384`
|
||||||
|
`DHE-RSA-AES128-SHA256`
|
||||||
|
`DHE-RSA-AES256-SHA256`
|
||||||
|
`DHE-RSA-AES128-GCM-SHA256`
|
||||||
|
`DHE-RSA-AES256-GCM-SHA384`
|
||||||
|
`DHE-DSS-AES128-SHA256`
|
||||||
|
`DHE-DSS-AES256-SHA256`
|
||||||
|
`DHE-DSS-AES128-GCM-SHA256`
|
||||||
|
`DHE-DSS-AES256-GCM-SHA384`
|
||||||
|
`ECDHE-RSA-AES128-SHA256`
|
||||||
|
`ECDHE-RSA-AES256-SHA384`
|
||||||
|
`ECDHE-RSA-AES128-GCM-SHA256`
|
||||||
|
`ECDHE-RSA-AES256-GCM-SHA384`
|
||||||
|
`ECDHE-ECDSA-AES128-SHA256`
|
||||||
|
`ECDHE-ECDSA-AES256-SHA384`
|
||||||
|
`ECDHE-ECDSA-AES128-GCM-SHA256`
|
||||||
|
`ECDHE-ECDSA-AES256-GCM-SHA384`
|
||||||
|
`ADH-AES128-SHA256`
|
||||||
|
`ADH-AES256-SHA256`
|
||||||
|
`ADH-AES128-GCM-SHA256`
|
||||||
|
`ADH-AES256-GCM-SHA384`
|
||||||
|
`AES128-CCM`
|
||||||
|
`AES256-CCM`
|
||||||
|
`DHE-RSA-AES128-CCM`
|
||||||
|
`DHE-RSA-AES256-CCM`
|
||||||
|
`AES128-CCM8`
|
||||||
|
`AES256-CCM8`
|
||||||
|
`DHE-RSA-AES128-CCM8`
|
||||||
|
`DHE-RSA-AES256-CCM8`
|
||||||
|
`ECDHE-ECDSA-AES128-CCM`
|
||||||
|
`ECDHE-ECDSA-AES256-CCM`
|
||||||
|
`ECDHE-ECDSA-AES128-CCM8`
|
||||||
|
`ECDHE-ECDSA-AES256-CCM8`
|
||||||
|
|
||||||
|
### Camellia HMAC-Based ciphersuites from RFC6367, extending TLS v1.2
|
||||||
|
|
||||||
|
`ECDHE-ECDSA-CAMELLIA128-SHA256`
|
||||||
|
`ECDHE-ECDSA-CAMELLIA256-SHA384`
|
||||||
|
`ECDHE-RSA-CAMELLIA128-SHA256`
|
||||||
|
`ECDHE-RSA-CAMELLIA256-SHA384`
|
||||||
|
|
||||||
|
### TLS 1.3 cipher suites
|
||||||
|
|
||||||
|
(Note these ciphers are set with `CURLOPT_TLS13_CIPHERS` and `--tls13-ciphers`)
|
||||||
|
|
||||||
|
`TLS_AES_256_GCM_SHA384`
|
||||||
|
`TLS_CHACHA20_POLY1305_SHA256`
|
||||||
|
`TLS_AES_128_GCM_SHA256`
|
||||||
|
`TLS_AES_128_CCM_8_SHA256`
|
||||||
|
`TLS_AES_128_CCM_SHA256`
|
||||||
|
|
||||||
|
## NSS
|
||||||
|
|
||||||
|
### Totally insecure
|
||||||
|
|
||||||
|
`rc4`
|
||||||
|
`rc4-md5`
|
||||||
|
`rc4export`
|
||||||
|
`rc2`
|
||||||
|
`rc2export`
|
||||||
|
`des`
|
||||||
|
`desede3`
|
||||||
|
|
||||||
|
### SSL3/TLS cipher suites
|
||||||
|
|
||||||
|
`rsa_rc4_128_md5`
|
||||||
|
`rsa_rc4_128_sha`
|
||||||
|
`rsa_3des_sha`
|
||||||
|
`rsa_des_sha`
|
||||||
|
`rsa_rc4_40_md5`
|
||||||
|
`rsa_rc2_40_md5`
|
||||||
|
`rsa_null_md5`
|
||||||
|
`rsa_null_sha`
|
||||||
|
`fips_3des_sha`
|
||||||
|
`fips_des_sha`
|
||||||
|
`fortezza`
|
||||||
|
`fortezza_rc4_128_sha`
|
||||||
|
`fortezza_null`
|
||||||
|
|
||||||
|
### TLS 1.0 Exportable 56-bit Cipher Suites
|
||||||
|
|
||||||
|
`rsa_des_56_sha`
|
||||||
|
`rsa_rc4_56_sha`
|
||||||
|
|
||||||
|
### AES ciphers
|
||||||
|
|
||||||
|
`dhe_dss_aes_128_cbc_sha`
|
||||||
|
`dhe_dss_aes_256_cbc_sha`
|
||||||
|
`dhe_rsa_aes_128_cbc_sha`
|
||||||
|
`dhe_rsa_aes_256_cbc_sha`
|
||||||
|
`rsa_aes_128_sha`
|
||||||
|
`rsa_aes_256_sha`
|
||||||
|
|
||||||
|
### ECC ciphers
|
||||||
|
|
||||||
|
`ecdh_ecdsa_null_sha`
|
||||||
|
`ecdh_ecdsa_rc4_128_sha`
|
||||||
|
`ecdh_ecdsa_3des_sha`
|
||||||
|
`ecdh_ecdsa_aes_128_sha`
|
||||||
|
`ecdh_ecdsa_aes_256_sha`
|
||||||
|
`ecdhe_ecdsa_null_sha`
|
||||||
|
`ecdhe_ecdsa_rc4_128_sha`
|
||||||
|
`ecdhe_ecdsa_3des_sha`
|
||||||
|
`ecdhe_ecdsa_aes_128_sha`
|
||||||
|
`ecdhe_ecdsa_aes_256_sha`
|
||||||
|
`ecdh_rsa_null_sha`
|
||||||
|
`ecdh_rsa_128_sha`
|
||||||
|
`ecdh_rsa_3des_sha`
|
||||||
|
`ecdh_rsa_aes_128_sha`
|
||||||
|
`ecdh_rsa_aes_256_sha`
|
||||||
|
`ecdhe_rsa_null`
|
||||||
|
`ecdhe_rsa_rc4_128_sha`
|
||||||
|
`ecdhe_rsa_3des_sha`
|
||||||
|
`ecdhe_rsa_aes_128_sha`
|
||||||
|
`ecdhe_rsa_aes_256_sha`
|
||||||
|
`ecdh_anon_null_sha`
|
||||||
|
`ecdh_anon_rc4_128sha`
|
||||||
|
`ecdh_anon_3des_sha`
|
||||||
|
`ecdh_anon_aes_128_sha`
|
||||||
|
`ecdh_anon_aes_256_sha`
|
||||||
|
|
||||||
|
### HMAC-SHA256 cipher suites
|
||||||
|
|
||||||
|
`rsa_null_sha_256`
|
||||||
|
`rsa_aes_128_cbc_sha_256`
|
||||||
|
`rsa_aes_256_cbc_sha_256`
|
||||||
|
`dhe_rsa_aes_128_cbc_sha_256`
|
||||||
|
`dhe_rsa_aes_256_cbc_sha_256`
|
||||||
|
`ecdhe_ecdsa_aes_128_cbc_sha_256`
|
||||||
|
`ecdhe_rsa_aes_128_cbc_sha_256`
|
||||||
|
|
||||||
|
### AES GCM cipher suites in RFC 5288 and RFC 5289
|
||||||
|
|
||||||
|
`rsa_aes_128_gcm_sha_256`
|
||||||
|
`dhe_rsa_aes_128_gcm_sha_256`
|
||||||
|
`dhe_dss_aes_128_gcm_sha_256`
|
||||||
|
`ecdhe_ecdsa_aes_128_gcm_sha_256`
|
||||||
|
`ecdh_ecdsa_aes_128_gcm_sha_256`
|
||||||
|
`ecdhe_rsa_aes_128_gcm_sha_256`
|
||||||
|
`ecdh_rsa_aes_128_gcm_sha_256`
|
||||||
|
|
||||||
|
### cipher suites using SHA384
|
||||||
|
|
||||||
|
`rsa_aes_256_gcm_sha_384`
|
||||||
|
`dhe_rsa_aes_256_gcm_sha_384`
|
||||||
|
`dhe_dss_aes_256_gcm_sha_384`
|
||||||
|
`ecdhe_ecdsa_aes_256_sha_384`
|
||||||
|
`ecdhe_rsa_aes_256_sha_384`
|
||||||
|
`ecdhe_ecdsa_aes_256_gcm_sha_384`
|
||||||
|
`ecdhe_rsa_aes_256_gcm_sha_384`
|
||||||
|
|
||||||
|
### chacha20-poly1305 cipher suites
|
||||||
|
|
||||||
|
`ecdhe_rsa_chacha20_poly1305_sha_256`
|
||||||
|
`ecdhe_ecdsa_chacha20_poly1305_sha_256`
|
||||||
|
`dhe_rsa_chacha20_poly1305_sha_256`
|
||||||
|
|
||||||
|
## GSKit
|
||||||
|
|
||||||
|
Ciphers are internally defined as
|
||||||
|
[numeric codes](https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_73/apis/gsk_attribute_set_buffer.htm),
|
||||||
|
but libcurl maps them to the following case-insensitive names.
|
||||||
|
|
||||||
|
### SSL2 cipher suites (insecure: disabled by default)
|
||||||
|
|
||||||
|
`rc2-md5`
|
||||||
|
`rc4-md5`
|
||||||
|
`exp-rc2-md5`
|
||||||
|
`exp-rc4-md5`
|
||||||
|
`des-cbc-md5`
|
||||||
|
`des-cbc3-md5`
|
||||||
|
|
||||||
|
### SSL3 cipher suites
|
||||||
|
|
||||||
|
`null-md5`
|
||||||
|
`null-sha`
|
||||||
|
`rc4-md5`
|
||||||
|
`rc4-sha`
|
||||||
|
`exp-rc2-cbc-md5`
|
||||||
|
`exp-rc4-md5`
|
||||||
|
`exp-des-cbc-sha`
|
||||||
|
`des-cbc3-sha`
|
||||||
|
|
||||||
|
### TLS v1.0 cipher suites
|
||||||
|
|
||||||
|
`null-md5`
|
||||||
|
`null-sha`
|
||||||
|
`rc4-md5`
|
||||||
|
`rc4-sha`
|
||||||
|
`exp-rc2-cbc-md5`
|
||||||
|
`exp-rc4-md5`
|
||||||
|
`exp-des-cbc-sha`
|
||||||
|
`des-cbc3-sha`
|
||||||
|
`aes128-sha`
|
||||||
|
`aes256-sha`
|
||||||
|
|
||||||
|
### TLS v1.1 cipher suites
|
||||||
|
|
||||||
|
`null-md5`
|
||||||
|
`null-sha`
|
||||||
|
`rc4-md5`
|
||||||
|
`rc4-sha`
|
||||||
|
`exp-des-cbc-sha`
|
||||||
|
`des-cbc3-sha`
|
||||||
|
`aes128-sha`
|
||||||
|
`aes256-sha`
|
||||||
|
|
||||||
|
### TLS v1.2 cipher suites
|
||||||
|
|
||||||
|
`null-md5`
|
||||||
|
`null-sha`
|
||||||
|
`null-sha256`
|
||||||
|
`rc4-md5`
|
||||||
|
`rc4-sha`
|
||||||
|
`des-cbc3-sha`
|
||||||
|
`aes128-sha`
|
||||||
|
`aes256-sha`
|
||||||
|
`aes128-sha256`
|
||||||
|
`aes256-sha256`
|
||||||
|
`aes128-gcm-sha256`
|
||||||
|
`aes256-gcm-sha384`
|
||||||
|
|
||||||
|
## WolfSSL
|
||||||
|
|
||||||
|
`RC4-SHA`,
|
||||||
|
`RC4-MD5`,
|
||||||
|
`DES-CBC3-SHA`,
|
||||||
|
`AES128-SHA`,
|
||||||
|
`AES256-SHA`,
|
||||||
|
`NULL-SHA`,
|
||||||
|
`NULL-SHA256`,
|
||||||
|
`DHE-RSA-AES128-SHA`,
|
||||||
|
`DHE-RSA-AES256-SHA`,
|
||||||
|
`DHE-PSK-AES256-GCM-SHA384`,
|
||||||
|
`DHE-PSK-AES128-GCM-SHA256`,
|
||||||
|
`PSK-AES256-GCM-SHA384`,
|
||||||
|
`PSK-AES128-GCM-SHA256`,
|
||||||
|
`DHE-PSK-AES256-CBC-SHA384`,
|
||||||
|
`DHE-PSK-AES128-CBC-SHA256`,
|
||||||
|
`PSK-AES256-CBC-SHA384`,
|
||||||
|
`PSK-AES128-CBC-SHA256`,
|
||||||
|
`PSK-AES128-CBC-SHA`,
|
||||||
|
`PSK-AES256-CBC-SHA`,
|
||||||
|
`DHE-PSK-AES128-CCM`,
|
||||||
|
`DHE-PSK-AES256-CCM`,
|
||||||
|
`PSK-AES128-CCM`,
|
||||||
|
`PSK-AES256-CCM`,
|
||||||
|
`PSK-AES128-CCM-8`,
|
||||||
|
`PSK-AES256-CCM-8`,
|
||||||
|
`DHE-PSK-NULL-SHA384`,
|
||||||
|
`DHE-PSK-NULL-SHA256`,
|
||||||
|
`PSK-NULL-SHA384`,
|
||||||
|
`PSK-NULL-SHA256`,
|
||||||
|
`PSK-NULL-SHA`,
|
||||||
|
`HC128-MD5`,
|
||||||
|
`HC128-SHA`,
|
||||||
|
`HC128-B2B256`,
|
||||||
|
`AES128-B2B256`,
|
||||||
|
`AES256-B2B256`,
|
||||||
|
`RABBIT-SHA`,
|
||||||
|
`NTRU-RC4-SHA`,
|
||||||
|
`NTRU-DES-CBC3-SHA`,
|
||||||
|
`NTRU-AES128-SHA`,
|
||||||
|
`NTRU-AES256-SHA`,
|
||||||
|
`AES128-CCM-8`,
|
||||||
|
`AES256-CCM-8`,
|
||||||
|
`ECDHE-ECDSA-AES128-CCM`,
|
||||||
|
`ECDHE-ECDSA-AES128-CCM-8`,
|
||||||
|
`ECDHE-ECDSA-AES256-CCM-8`,
|
||||||
|
`ECDHE-RSA-AES128-SHA`,
|
||||||
|
`ECDHE-RSA-AES256-SHA`,
|
||||||
|
`ECDHE-ECDSA-AES128-SHA`,
|
||||||
|
`ECDHE-ECDSA-AES256-SHA`,
|
||||||
|
`ECDHE-RSA-RC4-SHA`,
|
||||||
|
`ECDHE-RSA-DES-CBC3-SHA`,
|
||||||
|
`ECDHE-ECDSA-RC4-SHA`,
|
||||||
|
`ECDHE-ECDSA-DES-CBC3-SHA`,
|
||||||
|
`AES128-SHA256`,
|
||||||
|
`AES256-SHA256`,
|
||||||
|
`DHE-RSA-AES128-SHA256`,
|
||||||
|
`DHE-RSA-AES256-SHA256`,
|
||||||
|
`ECDH-RSA-AES128-SHA`,
|
||||||
|
`ECDH-RSA-AES256-SHA`,
|
||||||
|
`ECDH-ECDSA-AES128-SHA`,
|
||||||
|
`ECDH-ECDSA-AES256-SHA`,
|
||||||
|
`ECDH-RSA-RC4-SHA`,
|
||||||
|
`ECDH-RSA-DES-CBC3-SHA`,
|
||||||
|
`ECDH-ECDSA-RC4-SHA`,
|
||||||
|
`ECDH-ECDSA-DES-CBC3-SHA`,
|
||||||
|
`AES128-GCM-SHA256`,
|
||||||
|
`AES256-GCM-SHA384`,
|
||||||
|
`DHE-RSA-AES128-GCM-SHA256`,
|
||||||
|
`DHE-RSA-AES256-GCM-SHA384`,
|
||||||
|
`ECDHE-RSA-AES128-GCM-SHA256`,
|
||||||
|
`ECDHE-RSA-AES256-GCM-SHA384`,
|
||||||
|
`ECDHE-ECDSA-AES128-GCM-SHA256`,
|
||||||
|
`ECDHE-ECDSA-AES256-GCM-SHA384`,
|
||||||
|
`ECDH-RSA-AES128-GCM-SHA256`,
|
||||||
|
`ECDH-RSA-AES256-GCM-SHA384`,
|
||||||
|
`ECDH-ECDSA-AES128-GCM-SHA256`,
|
||||||
|
`ECDH-ECDSA-AES256-GCM-SHA384`,
|
||||||
|
`CAMELLIA128-SHA`,
|
||||||
|
`DHE-RSA-CAMELLIA128-SHA`,
|
||||||
|
`CAMELLIA256-SHA`,
|
||||||
|
`DHE-RSA-CAMELLIA256-SHA`,
|
||||||
|
`CAMELLIA128-SHA256`,
|
||||||
|
`DHE-RSA-CAMELLIA128-SHA256`,
|
||||||
|
`CAMELLIA256-SHA256`,
|
||||||
|
`DHE-RSA-CAMELLIA256-SHA256`,
|
||||||
|
`ECDHE-RSA-AES128-SHA256`,
|
||||||
|
`ECDHE-ECDSA-AES128-SHA256`,
|
||||||
|
`ECDH-RSA-AES128-SHA256`,
|
||||||
|
`ECDH-ECDSA-AES128-SHA256`,
|
||||||
|
`ECDHE-RSA-AES256-SHA384`,
|
||||||
|
`ECDHE-ECDSA-AES256-SHA384`,
|
||||||
|
`ECDH-RSA-AES256-SHA384`,
|
||||||
|
`ECDH-ECDSA-AES256-SHA384`,
|
||||||
|
`ECDHE-RSA-CHACHA20-POLY1305`,
|
||||||
|
`ECDHE-ECDSA-CHACHA20-POLY1305`,
|
||||||
|
`DHE-RSA-CHACHA20-POLY1305`,
|
||||||
|
`ECDHE-RSA-CHACHA20-POLY1305-OLD`,
|
||||||
|
`ECDHE-ECDSA-CHACHA20-POLY1305-OLD`,
|
||||||
|
`DHE-RSA-CHACHA20-POLY1305-OLD`,
|
||||||
|
`ADH-AES128-SHA`,
|
||||||
|
`QSH`,
|
||||||
|
`RENEGOTIATION-INFO`,
|
||||||
|
`IDEA-CBC-SHA`,
|
||||||
|
`ECDHE-ECDSA-NULL-SHA`,
|
||||||
|
`ECDHE-PSK-NULL-SHA256`,
|
||||||
|
`ECDHE-PSK-AES128-CBC-SHA256`,
|
||||||
|
`PSK-CHACHA20-POLY1305`,
|
||||||
|
`ECDHE-PSK-CHACHA20-POLY1305`,
|
||||||
|
`DHE-PSK-CHACHA20-POLY1305`,
|
||||||
|
`EDH-RSA-DES-CBC3-SHA`,
|
||||||
|
|
||||||
|
## Schannel
|
||||||
|
|
||||||
|
Schannel allows the enabling and disabling of encryption algorithms, but not
|
||||||
|
specific ciphersuites. They are
|
||||||
|
[defined](https://docs.microsoft.com/windows/desktop/SecCrypto/alg-id) by
|
||||||
|
Microsoft.
|
||||||
|
|
||||||
|
`CALG_MD2`,
|
||||||
|
`CALG_MD4`,
|
||||||
|
`CALG_MD5`,
|
||||||
|
`CALG_SHA`,
|
||||||
|
`CALG_SHA1`,
|
||||||
|
`CALG_MAC`,
|
||||||
|
`CALG_RSA_SIGN`,
|
||||||
|
`CALG_DSS_SIGN`,
|
||||||
|
`CALG_NO_SIGN`,
|
||||||
|
`CALG_RSA_KEYX`,
|
||||||
|
`CALG_DES`,
|
||||||
|
`CALG_3DES_112`,
|
||||||
|
`CALG_3DES`,
|
||||||
|
`CALG_DESX`,
|
||||||
|
`CALG_RC2`,
|
||||||
|
`CALG_RC4`,
|
||||||
|
`CALG_SEAL`,
|
||||||
|
`CALG_DH_SF`,
|
||||||
|
`CALG_DH_EPHEM`,
|
||||||
|
`CALG_AGREEDKEY_ANY`,
|
||||||
|
`CALG_HUGHES_MD5`,
|
||||||
|
`CALG_SKIPJACK`,
|
||||||
|
`CALG_TEK`,
|
||||||
|
`CALG_CYLINK_MEK`,
|
||||||
|
`CALG_SSL3_SHAMD5`,
|
||||||
|
`CALG_SSL3_MASTER`,
|
||||||
|
`CALG_SCHANNEL_MASTER_HASH`,
|
||||||
|
`CALG_SCHANNEL_MAC_KEY`,
|
||||||
|
`CALG_SCHANNEL_ENC_KEY`,
|
||||||
|
`CALG_PCT1_MASTER`,
|
||||||
|
`CALG_SSL2_MASTER`,
|
||||||
|
`CALG_TLS1_MASTER`,
|
||||||
|
`CALG_RC5`,
|
||||||
|
`CALG_HMAC`,
|
||||||
|
`CALG_TLS1PRF`,
|
||||||
|
`CALG_HASH_REPLACE_OWF`,
|
||||||
|
`CALG_AES_128`,
|
||||||
|
`CALG_AES_192`,
|
||||||
|
`CALG_AES_256`,
|
||||||
|
`CALG_AES`,
|
||||||
|
`CALG_SHA_256`,
|
||||||
|
`CALG_SHA_384`,
|
||||||
|
`CALG_SHA_512`,
|
||||||
|
`CALG_ECDH`,
|
||||||
|
`CALG_ECMQV`,
|
||||||
|
`CALG_ECDSA`,
|
||||||
|
`CALG_ECDH_EPHEM`,
|
||||||
32
bin/curl/docs/CODE_OF_CONDUCT.md
Normal file
32
bin/curl/docs/CODE_OF_CONDUCT.md
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
Contributor Code of Conduct
|
||||||
|
===========================
|
||||||
|
|
||||||
|
As contributors and maintainers of this project, we pledge to respect all
|
||||||
|
people who contribute through reporting issues, posting feature requests,
|
||||||
|
updating documentation, submitting pull requests or patches, and other
|
||||||
|
activities.
|
||||||
|
|
||||||
|
We are committed to making participation in this project a harassment-free
|
||||||
|
experience for everyone, regardless of level of experience, gender, gender
|
||||||
|
identity and expression, sexual orientation, disability, personal appearance,
|
||||||
|
body size, race, ethnicity, age, or religion.
|
||||||
|
|
||||||
|
Examples of unacceptable behavior by participants include the use of sexual
|
||||||
|
language or imagery, derogatory comments or personal attacks, trolling, public
|
||||||
|
or private harassment, insults, or other unprofessional conduct.
|
||||||
|
|
||||||
|
Project maintainers have the right and responsibility to remove, edit, or
|
||||||
|
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||||
|
that are not aligned to this Code of Conduct. Project maintainers who do not
|
||||||
|
follow the Code of Conduct may be removed from the project team.
|
||||||
|
|
||||||
|
This code of conduct applies both within project spaces and in public spaces
|
||||||
|
when an individual is representing the project or its community.
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported by opening an issue or contacting one or more of the project
|
||||||
|
maintainers.
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor
|
||||||
|
Covenant](https://contributor-covenant.org/), version 1.1.0, available at
|
||||||
|
[https://contributor-covenant.org/version/1/1/0/](https://contributor-covenant.org/version/1/1/0/)
|
||||||
246
bin/curl/docs/CODE_STYLE.md
Normal file
246
bin/curl/docs/CODE_STYLE.md
Normal file
@@ -0,0 +1,246 @@
|
|||||||
|
# curl C code style
|
||||||
|
|
||||||
|
Source code that has a common style is easier to read than code that uses
|
||||||
|
different styles in different places. It helps making the code feel like one
|
||||||
|
single code base. Easy-to-read is a very important property of code and helps
|
||||||
|
making it easier to review when new things are added and it helps debugging
|
||||||
|
code when developers are trying to figure out why things go wrong. A unified
|
||||||
|
style is more important than individual contributors having their own personal
|
||||||
|
tastes satisfied.
|
||||||
|
|
||||||
|
Our C code has a few style rules. Most of them are verified and upheld by the
|
||||||
|
`lib/checksrc.pl` script. Invoked with `make checksrc` or even by default by
|
||||||
|
the build system when built after `./configure --enable-debug` has been used.
|
||||||
|
|
||||||
|
It is normally not a problem for anyone to follow the guidelines, as you just
|
||||||
|
need to copy the style already used in the source code and there are no
|
||||||
|
particularly unusual rules in our set of rules.
|
||||||
|
|
||||||
|
We also work hard on writing code that are warning-free on all the major
|
||||||
|
platforms and in general on as many platforms as possible. Code that obviously
|
||||||
|
will cause warnings will not be accepted as-is.
|
||||||
|
|
||||||
|
## Naming
|
||||||
|
|
||||||
|
Try using a non-confusing naming scheme for your new functions and variable
|
||||||
|
names. It doesn't necessarily have to mean that you should use the same as in
|
||||||
|
other places of the code, just that the names should be logical,
|
||||||
|
understandable and be named according to what they're used for. File-local
|
||||||
|
functions should be made static. We like lower case names.
|
||||||
|
|
||||||
|
See the [INTERNALS](INTERNALS.md) document on how we name non-exported
|
||||||
|
library-global symbols.
|
||||||
|
|
||||||
|
## Indenting
|
||||||
|
|
||||||
|
We use only spaces for indentation, never TABs. We use two spaces for each new
|
||||||
|
open brace.
|
||||||
|
|
||||||
|
if(something_is_true) {
|
||||||
|
while(second_statement == fine) {
|
||||||
|
moo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
## Comments
|
||||||
|
|
||||||
|
Since we write C89 code, **//** comments are not allowed. They weren't
|
||||||
|
introduced in the C standard until C99. We use only **/* comments */**.
|
||||||
|
|
||||||
|
/* this is a comment */
|
||||||
|
|
||||||
|
## Long lines
|
||||||
|
|
||||||
|
Source code in curl may never be wider than 79 columns and there are two
|
||||||
|
reasons for maintaining this even in the modern era of very large and high
|
||||||
|
resolution screens:
|
||||||
|
|
||||||
|
1. Narrower columns are easier to read than very wide ones. There's a reason
|
||||||
|
newspapers have used columns for decades or centuries.
|
||||||
|
|
||||||
|
2. Narrower columns allow developers to easier show multiple pieces of code
|
||||||
|
next to each other in different windows. I often have two or three source
|
||||||
|
code windows next to each other on the same screen - as well as multiple
|
||||||
|
terminal and debugging windows.
|
||||||
|
|
||||||
|
## Braces
|
||||||
|
|
||||||
|
In if/while/do/for expressions, we write the open brace on the same line as
|
||||||
|
the keyword and we then set the closing brace on the same indentation level as
|
||||||
|
the initial keyword. Like this:
|
||||||
|
|
||||||
|
if(age < 40) {
|
||||||
|
/* clearly a youngster */
|
||||||
|
}
|
||||||
|
|
||||||
|
You may omit the braces if they would contain only a one-line statement:
|
||||||
|
|
||||||
|
if(!x)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
For functions the opening brace should be on a separate line:
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
## 'else' on the following line
|
||||||
|
|
||||||
|
When adding an **else** clause to a conditional expression using braces, we
|
||||||
|
add it on a new line after the closing brace. Like this:
|
||||||
|
|
||||||
|
if(age < 40) {
|
||||||
|
/* clearly a youngster */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* probably grumpy */
|
||||||
|
}
|
||||||
|
|
||||||
|
## No space before parentheses
|
||||||
|
|
||||||
|
When writing expressions using if/while/do/for, there shall be no space
|
||||||
|
between the keyword and the open parenthesis. Like this:
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
/* loop forever */
|
||||||
|
}
|
||||||
|
|
||||||
|
## Use boolean conditions
|
||||||
|
|
||||||
|
Rather than test a conditional value such as a bool against TRUE or FALSE, a
|
||||||
|
pointer against NULL or != NULL and an int against zero or not zero in
|
||||||
|
if/while conditions we prefer:
|
||||||
|
|
||||||
|
result = do_something();
|
||||||
|
if(!result) {
|
||||||
|
/* something went wrong */
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
## No assignments in conditions
|
||||||
|
|
||||||
|
To increase readability and reduce complexity of conditionals, we avoid
|
||||||
|
assigning variables within if/while conditions. We frown upon this style:
|
||||||
|
|
||||||
|
if((ptr = malloc(100)) == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
and instead we encourage the above version to be spelled out more clearly:
|
||||||
|
|
||||||
|
ptr = malloc(100);
|
||||||
|
if(!ptr)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
## New block on a new line
|
||||||
|
|
||||||
|
We never write multiple statements on the same source line, even for very
|
||||||
|
short if() conditions.
|
||||||
|
|
||||||
|
if(a)
|
||||||
|
return TRUE;
|
||||||
|
else if(b)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
and NEVER:
|
||||||
|
|
||||||
|
if(a) return TRUE;
|
||||||
|
else if(b) return FALSE;
|
||||||
|
|
||||||
|
## Space around operators
|
||||||
|
|
||||||
|
Please use spaces on both sides of operators in C expressions. Postfix **(),
|
||||||
|
[], ->, ., ++, --** and Unary **+, - !, ~, &** operators excluded they should
|
||||||
|
have no space.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
bla = func();
|
||||||
|
who = name[0];
|
||||||
|
age += 1;
|
||||||
|
true = !false;
|
||||||
|
size += -2 + 3 * (a + b);
|
||||||
|
ptr->member = a++;
|
||||||
|
struct.field = b--;
|
||||||
|
ptr = &address;
|
||||||
|
contents = *pointer;
|
||||||
|
complement = ~bits;
|
||||||
|
empty = (!*string) ? TRUE : FALSE;
|
||||||
|
|
||||||
|
## No parentheses for return values
|
||||||
|
|
||||||
|
We use the 'return' statement without extra parentheses around the value:
|
||||||
|
|
||||||
|
int works(void)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
## Parentheses for sizeof arguments
|
||||||
|
|
||||||
|
When using the sizeof operator in code, we prefer it to be written with
|
||||||
|
parentheses around its argument:
|
||||||
|
|
||||||
|
int size = sizeof(int);
|
||||||
|
|
||||||
|
## Column alignment
|
||||||
|
|
||||||
|
Some statements cannot be completed on a single line because the line would be
|
||||||
|
too long, the statement too hard to read, or due to other style guidelines
|
||||||
|
above. In such a case the statement will span multiple lines.
|
||||||
|
|
||||||
|
If a continuation line is part of an expression or sub-expression then you
|
||||||
|
should align on the appropriate column so that it's easy to tell what part of
|
||||||
|
the statement it is. Operators should not start continuation lines. In other
|
||||||
|
cases follow the 2-space indent guideline. Here are some examples from
|
||||||
|
libcurl:
|
||||||
|
|
||||||
|
if(Curl_pipeline_wanted(handle->multi, CURLPIPE_HTTP1) &&
|
||||||
|
(handle->set.httpversion != CURL_HTTP_VERSION_1_0) &&
|
||||||
|
(handle->set.httpreq == HTTPREQ_GET ||
|
||||||
|
handle->set.httpreq == HTTPREQ_HEAD))
|
||||||
|
/* didn't ask for HTTP/1.0 and a GET or HEAD */
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
If no parenthesis, use the default indent:
|
||||||
|
|
||||||
|
data->set.http_disable_hostname_check_before_authentication =
|
||||||
|
(0 != va_arg(param, long)) ? TRUE : FALSE;
|
||||||
|
|
||||||
|
Function invoke with an open parenthesis:
|
||||||
|
|
||||||
|
if(option) {
|
||||||
|
result = parse_login_details(option, strlen(option),
|
||||||
|
(userp ? &user : NULL),
|
||||||
|
(passwdp ? &passwd : NULL),
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
Align with the "current open" parenthesis:
|
||||||
|
|
||||||
|
DEBUGF(infof(data, "Curl_pp_readresp_ %d bytes of trailing "
|
||||||
|
"server response left\n",
|
||||||
|
(int)clipamount));
|
||||||
|
|
||||||
|
## Platform dependent code
|
||||||
|
|
||||||
|
Use **#ifdef HAVE_FEATURE** to do conditional code. We avoid checking for
|
||||||
|
particular operating systems or hardware in the #ifdef lines. The HAVE_FEATURE
|
||||||
|
shall be generated by the configure script for unix-like systems and they are
|
||||||
|
hard-coded in the `config-[system].h` files for the others.
|
||||||
|
|
||||||
|
We also encourage use of macros/functions that possibly are empty or defined
|
||||||
|
to constants when libcurl is built without that feature, to make the code
|
||||||
|
seamless. Like this example where the **magic()** function works differently
|
||||||
|
depending on a build-time conditional:
|
||||||
|
|
||||||
|
#ifdef HAVE_MAGIC
|
||||||
|
void magic(int a)
|
||||||
|
{
|
||||||
|
return a + 2;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define magic(x) 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int content = magic(3);
|
||||||
267
bin/curl/docs/CONTRIBUTE.md
Normal file
267
bin/curl/docs/CONTRIBUTE.md
Normal file
@@ -0,0 +1,267 @@
|
|||||||
|
# Contributing to the curl project
|
||||||
|
|
||||||
|
This document is intended to offer guidelines on how to best contribute to the
|
||||||
|
curl project. This concerns new features as well as corrections to existing
|
||||||
|
flaws or bugs.
|
||||||
|
|
||||||
|
## Learning curl
|
||||||
|
|
||||||
|
### Join the Community
|
||||||
|
|
||||||
|
Skip over to [https://curl.haxx.se/mail/](https://curl.haxx.se/mail/) and join
|
||||||
|
the appropriate mailing list(s). Read up on details before you post
|
||||||
|
questions. Read this file before you start sending patches! We prefer
|
||||||
|
questions sent to and discussions being held on the mailing list(s), not sent
|
||||||
|
to individuals.
|
||||||
|
|
||||||
|
Before posting to one of the curl mailing lists, please read up on the
|
||||||
|
[mailing list etiquette](https://curl.haxx.se/mail/etiquette.html).
|
||||||
|
|
||||||
|
We also hang out on IRC in #curl on irc.freenode.net
|
||||||
|
|
||||||
|
If you're at all interested in the code side of things, consider clicking
|
||||||
|
'watch' on the [curl repo on github](https://github.com/curl/curl) to be
|
||||||
|
notified of pull requests and new issues posted there.
|
||||||
|
|
||||||
|
### License and copyright
|
||||||
|
|
||||||
|
When contributing with code, you agree to put your changes and new code under
|
||||||
|
the same license curl and libcurl is already using unless stated and agreed
|
||||||
|
otherwise.
|
||||||
|
|
||||||
|
If you add a larger piece of code, you can opt to make that file or set of
|
||||||
|
files to use a different license as long as they don't enforce any changes to
|
||||||
|
the rest of the package and they make sense. Such "separate parts" can not be
|
||||||
|
GPL licensed (as we don't want copyleft to affect users of libcurl) but they
|
||||||
|
must use "GPL compatible" licenses (as we want to allow users to use libcurl
|
||||||
|
properly in GPL licensed environments).
|
||||||
|
|
||||||
|
When changing existing source code, you do not alter the copyright of the
|
||||||
|
original file(s). The copyright will still be owned by the original creator(s)
|
||||||
|
or those who have been assigned copyright by the original author(s).
|
||||||
|
|
||||||
|
By submitting a patch to the curl project, you are assumed to have the right
|
||||||
|
to the code and to be allowed by your employer or whatever to hand over that
|
||||||
|
patch/code to us. We will credit you for your changes as far as possible, to
|
||||||
|
give credit but also to keep a trace back to who made what changes. Please
|
||||||
|
always provide us with your full real name when contributing!
|
||||||
|
|
||||||
|
### What To Read
|
||||||
|
|
||||||
|
Source code, the man pages, the [INTERNALS
|
||||||
|
document](https://curl.haxx.se/dev/internals.html),
|
||||||
|
[TODO](https://curl.haxx.se/docs/todo.html),
|
||||||
|
[KNOWN_BUGS](https://curl.haxx.se/docs/knownbugs.html) and the [most recent
|
||||||
|
changes](https://curl.haxx.se/dev/sourceactivity.html) in git. Just lurking on
|
||||||
|
the [curl-library mailing
|
||||||
|
list](https://curl.haxx.se/mail/list.cgi?list=curl-library) will give you a
|
||||||
|
lot of insights on what's going on right now. Asking there is a good idea too.
|
||||||
|
|
||||||
|
## Write a good patch
|
||||||
|
|
||||||
|
### Follow code style
|
||||||
|
|
||||||
|
When writing C code, follow the
|
||||||
|
[CODE_STYLE](https://curl.haxx.se/dev/code-style.html) already established in
|
||||||
|
the project. Consistent style makes code easier to read and mistakes less
|
||||||
|
likely to happen. Run `make checksrc` before you submit anything, to make sure
|
||||||
|
you follow the basic style. That script doesn't verify everything, but if it
|
||||||
|
complains you know you have work to do.
|
||||||
|
|
||||||
|
### Non-clobbering All Over
|
||||||
|
|
||||||
|
When you write new functionality or fix bugs, it is important that you don't
|
||||||
|
fiddle all over the source files and functions. Remember that it is likely
|
||||||
|
that other people have done changes in the same source files as you have and
|
||||||
|
possibly even in the same functions. If you bring completely new
|
||||||
|
functionality, try writing it in a new source file. If you fix bugs, try to
|
||||||
|
fix one bug at a time and send them as separate patches.
|
||||||
|
|
||||||
|
### Write Separate Changes
|
||||||
|
|
||||||
|
It is annoying when you get a huge patch from someone that is said to fix 511
|
||||||
|
odd problems, but discussions and opinions don't agree with 510 of them - or
|
||||||
|
509 of them were already fixed in a different way. Then the person merging
|
||||||
|
this change needs to extract the single interesting patch from somewhere
|
||||||
|
within the huge pile of source, and that creates a lot of extra work.
|
||||||
|
|
||||||
|
Preferably, each fix that corrects a problem should be in its own patch/commit
|
||||||
|
with its own description/commit message stating exactly what they correct so
|
||||||
|
that all changes can be selectively applied by the maintainer or other
|
||||||
|
interested parties.
|
||||||
|
|
||||||
|
Also, separate changes enable bisecting much better for tracking problems
|
||||||
|
and regression in the future.
|
||||||
|
|
||||||
|
### Patch Against Recent Sources
|
||||||
|
|
||||||
|
Please try to get the latest available sources to make your patches against.
|
||||||
|
It makes the lives of the developers so much easier. The very best is if you
|
||||||
|
get the most up-to-date sources from the git repository, but the latest
|
||||||
|
release archive is quite OK as well!
|
||||||
|
|
||||||
|
### Documentation
|
||||||
|
|
||||||
|
Writing docs is dead boring and one of the big problems with many open source
|
||||||
|
projects. But someone's gotta do it! It makes things a lot easier if you
|
||||||
|
submit a small description of your fix or your new features with every
|
||||||
|
contribution so that it can be swiftly added to the package documentation.
|
||||||
|
|
||||||
|
The documentation is always made in man pages (nroff formatted) or plain
|
||||||
|
ASCII files. All HTML files on the web site and in the release archives are
|
||||||
|
generated from the nroff/ASCII versions.
|
||||||
|
|
||||||
|
### Test Cases
|
||||||
|
|
||||||
|
Since the introduction of the test suite, we can quickly verify that the main
|
||||||
|
features are working as they're supposed to. To maintain this situation and
|
||||||
|
improve it, all new features and functions that are added need to be tested
|
||||||
|
in the test suite. Every feature that is added should get at least one valid
|
||||||
|
test case that verifies that it works as documented. If every submitter also
|
||||||
|
posts a few test cases, it won't end up as a heavy burden on a single person!
|
||||||
|
|
||||||
|
If you don't have test cases or perhaps you have done something that is very
|
||||||
|
hard to write tests for, do explain exactly how you have otherwise tested and
|
||||||
|
verified your changes.
|
||||||
|
|
||||||
|
## Sharing Your Changes
|
||||||
|
|
||||||
|
### How to get your changes into the main sources
|
||||||
|
|
||||||
|
Ideally you file a [pull request on
|
||||||
|
github](https://github.com/curl/curl/pulls), but you can also send your plain
|
||||||
|
patch to [the curl-library mailing
|
||||||
|
list](https://curl.haxx.se/mail/list.cgi?list=curl-library).
|
||||||
|
|
||||||
|
Either way, your change will be reviewed and discussed there and you will be
|
||||||
|
expected to correct flaws pointed out and update accordingly, or the change
|
||||||
|
risks stalling and eventually just getting deleted without action. As a
|
||||||
|
submitter of a change, you are the owner of that change until it has been merged.
|
||||||
|
|
||||||
|
Respond on the list or on github about the change and answer questions and/or
|
||||||
|
fix nits/flaws. This is very important. We will take lack of replies as a
|
||||||
|
sign that you're not very anxious to get your patch accepted and we tend to
|
||||||
|
simply drop such changes.
|
||||||
|
|
||||||
|
### About pull requests
|
||||||
|
|
||||||
|
With github it is easy to send a [pull
|
||||||
|
request](https://github.com/curl/curl/pulls) to the curl project to have
|
||||||
|
changes merged.
|
||||||
|
|
||||||
|
We strongly prefer pull requests to mailed patches, as it makes it a proper
|
||||||
|
git commit that is easy to merge and they are easy to track and not that easy
|
||||||
|
to loose in the flood of many emails, like they sometimes do on the mailing
|
||||||
|
lists.
|
||||||
|
|
||||||
|
Every pull request submitted will automatically be tested in several different
|
||||||
|
ways. Every pull request is verified for each of the following:
|
||||||
|
|
||||||
|
- ... it still builds, warning-free, on Linux and macOS, with both
|
||||||
|
clang and gcc
|
||||||
|
- ... it still builds fine on Windows with several MSVC versions
|
||||||
|
- ... it still builds with cmake on Linux, with gcc and clang
|
||||||
|
- ... it follows rudimentary code style rules
|
||||||
|
- ... the test suite still runs 100% fine
|
||||||
|
- ... the release tarball (the "dist") still works
|
||||||
|
- ... it builds fine in-tree as well as out-of-tree
|
||||||
|
- ... code coverage doesn't shrink drastically
|
||||||
|
|
||||||
|
If the pull-request fails one of these tests, it will show up as a red X and
|
||||||
|
you are expected to fix the problem. If you don't understand when the issue is
|
||||||
|
or have other problems to fix the complaint, just ask and other project
|
||||||
|
members will likely be able to help out.
|
||||||
|
|
||||||
|
When you adjust your pull requests after review, consider squashing the
|
||||||
|
commits so that we can review the full updated version more easily.
|
||||||
|
|
||||||
|
### Making quality patches
|
||||||
|
|
||||||
|
Make the patch against as recent source versions as possible.
|
||||||
|
|
||||||
|
If you've followed the tips in this document and your patch still hasn't been
|
||||||
|
incorporated or responded to after some weeks, consider resubmitting it to the
|
||||||
|
list or better yet: change it to a pull request.
|
||||||
|
|
||||||
|
### Write good commit messages
|
||||||
|
|
||||||
|
A short guide to how to write commit messages in the curl project.
|
||||||
|
|
||||||
|
---- start ----
|
||||||
|
[area]: [short line describing the main effect]
|
||||||
|
-- empty line --
|
||||||
|
[full description, no wider than 72 columns that describe as much as
|
||||||
|
possible as to why this change is made, and possibly what things
|
||||||
|
it fixes and everything else that is related]
|
||||||
|
-- empty line --
|
||||||
|
[Closes/Fixes #1234 - if this closes or fixes a github issue]
|
||||||
|
[Bug: URL to source of the report or more related discussion]
|
||||||
|
[Reported-by: John Doe - credit the reporter]
|
||||||
|
[whatever-else-by: credit all helpers, finders, doers]
|
||||||
|
---- stop ----
|
||||||
|
|
||||||
|
Don't forget to use commit --author="" if you commit someone else's work, and
|
||||||
|
make sure that you have your own user and email setup correctly in git before
|
||||||
|
you commit
|
||||||
|
|
||||||
|
### Write Access to git Repository
|
||||||
|
|
||||||
|
If you are a very frequent contributor, you may be given push access to the
|
||||||
|
git repository and then you'll be able to push your changes straight into the
|
||||||
|
git repo instead of sending changes as pull requests or by mail as patches.
|
||||||
|
|
||||||
|
Just ask if this is what you'd want. You will be required to have posted
|
||||||
|
several high quality patches first, before you can be granted push access.
|
||||||
|
|
||||||
|
### How To Make a Patch with git
|
||||||
|
|
||||||
|
You need to first checkout the repository:
|
||||||
|
|
||||||
|
git clone https://github.com/curl/curl.git
|
||||||
|
|
||||||
|
You then proceed and edit all the files you like and you commit them to your
|
||||||
|
local repository:
|
||||||
|
|
||||||
|
git commit [file]
|
||||||
|
|
||||||
|
As usual, group your commits so that you commit all changes at once that
|
||||||
|
constitute a logical change.
|
||||||
|
|
||||||
|
Once you have done all your commits and you're happy with what you see, you
|
||||||
|
can make patches out of your changes that are suitable for mailing:
|
||||||
|
|
||||||
|
git format-patch remotes/origin/master
|
||||||
|
|
||||||
|
This creates files in your local directory named NNNN-[name].patch for each
|
||||||
|
commit.
|
||||||
|
|
||||||
|
Now send those patches off to the curl-library list. You can of course opt to
|
||||||
|
do that with the 'git send-email' command.
|
||||||
|
|
||||||
|
### How To Make a Patch without git
|
||||||
|
|
||||||
|
Keep a copy of the unmodified curl sources. Make your changes in a separate
|
||||||
|
source tree. When you think you have something that you want to offer the
|
||||||
|
curl community, use GNU diff to generate patches.
|
||||||
|
|
||||||
|
If you have modified a single file, try something like:
|
||||||
|
|
||||||
|
diff -u unmodified-file.c my-changed-one.c > my-fixes.diff
|
||||||
|
|
||||||
|
If you have modified several files, possibly in different directories, you
|
||||||
|
can use diff recursively:
|
||||||
|
|
||||||
|
diff -ur curl-original-dir curl-modified-sources-dir > my-fixes.diff
|
||||||
|
|
||||||
|
The GNU diff and GNU patch tools exist for virtually all platforms, including
|
||||||
|
all kinds of Unixes and Windows:
|
||||||
|
|
||||||
|
For unix-like operating systems:
|
||||||
|
|
||||||
|
- [https://savannah.gnu.org/projects/patch/](https://savannah.gnu.org/projects/patch/)
|
||||||
|
- [https://www.gnu.org/software/diffutils/](https://www.gnu.org/software/diffutils/)
|
||||||
|
|
||||||
|
For Windows:
|
||||||
|
|
||||||
|
- [https://gnuwin32.sourceforge.io/packages/patch.htm](https://gnuwin32.sourceforge.io/packages/patch.htm)
|
||||||
|
- [https://gnuwin32.sourceforge.io/packages/diffutils.htm](https://gnuwin32.sourceforge.io/packages/diffutils.htm)
|
||||||
21
bin/curl/docs/DEPRECATE.md
Normal file
21
bin/curl/docs/DEPRECATE.md
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# Items to be removed from future curl releases
|
||||||
|
|
||||||
|
If any of these deprecated features is a cause for concern for you, please
|
||||||
|
email the curl-library mailing list as soon as possible and explain to us why
|
||||||
|
this is a problem for you and how your use case can't be satisfied properly
|
||||||
|
using a work around.
|
||||||
|
|
||||||
|
## HTTP/0.9
|
||||||
|
|
||||||
|
Supporting this is non-obvious and might even come as a surprise to some
|
||||||
|
users. Potentially even being a security risk in some cases.
|
||||||
|
|
||||||
|
### State
|
||||||
|
|
||||||
|
curl 7.64.0 introduces options to disable/enable support for this protocol
|
||||||
|
version. The default remains supported for now.
|
||||||
|
|
||||||
|
### Removal
|
||||||
|
|
||||||
|
The support for HTTP/0.9 will be switched to disabled by default in 6 months,
|
||||||
|
in the September 2019 release (possibly called curl 7.68.0).
|
||||||
1559
bin/curl/docs/FAQ.txt
Normal file
1559
bin/curl/docs/FAQ.txt
Normal file
File diff suppressed because it is too large
Load Diff
204
bin/curl/docs/FEATURES.txt
Normal file
204
bin/curl/docs/FEATURES.txt
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
_ _ ____ _
|
||||||
|
___| | | | _ \| |
|
||||||
|
/ __| | | | |_) | |
|
||||||
|
| (__| |_| | _ <| |___
|
||||||
|
\___|\___/|_| \_\_____|
|
||||||
|
|
||||||
|
FEATURES
|
||||||
|
|
||||||
|
curl tool
|
||||||
|
- config file support
|
||||||
|
- multiple URLs in a single command line
|
||||||
|
- range "globbing" support: [0-13], {one,two,three}
|
||||||
|
- multiple file upload on a single command line
|
||||||
|
- custom maximum transfer rate
|
||||||
|
- redirectable stderr
|
||||||
|
- metalink support (*13)
|
||||||
|
|
||||||
|
libcurl
|
||||||
|
- full URL syntax with no length limit
|
||||||
|
- custom maximum download time
|
||||||
|
- custom least download speed acceptable
|
||||||
|
- custom output result after completion
|
||||||
|
- guesses protocol from host name unless specified
|
||||||
|
- uses .netrc
|
||||||
|
- progress bar with time statistics while downloading
|
||||||
|
- "standard" proxy environment variables support
|
||||||
|
- compiles on win32 (reported builds on 40+ operating systems)
|
||||||
|
- selectable network interface for outgoing traffic
|
||||||
|
- IPv6 support on unix and Windows
|
||||||
|
- persistent connections
|
||||||
|
- socks 4 + 5 support, with or without local name resolving
|
||||||
|
- supports user name and password in proxy environment variables
|
||||||
|
- operations through proxy "tunnel" (using CONNECT)
|
||||||
|
- support for large files (>2GB and >4GB) during upload and download
|
||||||
|
- replaceable memory functions (malloc, free, realloc, etc)
|
||||||
|
- asynchronous name resolving (*6)
|
||||||
|
- both a push and a pull style interface
|
||||||
|
- international domain names (*11)
|
||||||
|
|
||||||
|
HTTP
|
||||||
|
- HTTP/1.1 compliant (optionally uses 1.0)
|
||||||
|
- GET
|
||||||
|
- PUT
|
||||||
|
- HEAD
|
||||||
|
- POST
|
||||||
|
- Pipelining
|
||||||
|
- multipart formpost (RFC1867-style)
|
||||||
|
- authentication: Basic, Digest, NTLM (*9) and Negotiate (SPNEGO) (*3)
|
||||||
|
to server and proxy
|
||||||
|
- resume (both GET and PUT)
|
||||||
|
- follow redirects
|
||||||
|
- maximum amount of redirects to follow
|
||||||
|
- custom HTTP request
|
||||||
|
- cookie get/send fully parsed
|
||||||
|
- reads/writes the netscape cookie file format
|
||||||
|
- custom headers (replace/remove internally generated headers)
|
||||||
|
- custom user-agent string
|
||||||
|
- custom referrer string
|
||||||
|
- range
|
||||||
|
- proxy authentication
|
||||||
|
- time conditions
|
||||||
|
- via http-proxy
|
||||||
|
- retrieve file modification date
|
||||||
|
- Content-Encoding support for deflate and gzip
|
||||||
|
- "Transfer-Encoding: chunked" support in uploads
|
||||||
|
- data compression (*12)
|
||||||
|
- HTTP/2 (*5)
|
||||||
|
|
||||||
|
HTTPS (*1)
|
||||||
|
- (all the HTTP features)
|
||||||
|
- using client certificates
|
||||||
|
- verify server certificate
|
||||||
|
- via http-proxy
|
||||||
|
- select desired encryption
|
||||||
|
- force usage of a specific SSL version (SSLv2 (*7), SSLv3 (*10) or TLSv1)
|
||||||
|
|
||||||
|
FTP
|
||||||
|
- download
|
||||||
|
- authentication
|
||||||
|
- Kerberos 5 (*14)
|
||||||
|
- active/passive using PORT, EPRT, PASV or EPSV
|
||||||
|
- single file size information (compare to HTTP HEAD)
|
||||||
|
- 'type=' URL support
|
||||||
|
- dir listing
|
||||||
|
- dir listing names-only
|
||||||
|
- upload
|
||||||
|
- upload append
|
||||||
|
- upload via http-proxy as HTTP PUT
|
||||||
|
- download resume
|
||||||
|
- upload resume
|
||||||
|
- custom ftp commands (before and/or after the transfer)
|
||||||
|
- simple "range" support
|
||||||
|
- via http-proxy
|
||||||
|
- all operations can be tunneled through a http-proxy
|
||||||
|
- customizable to retrieve file modification date
|
||||||
|
- no dir depth limit
|
||||||
|
|
||||||
|
FTPS (*1)
|
||||||
|
- implicit ftps:// support that use SSL on both connections
|
||||||
|
- explicit "AUTH TLS" and "AUTH SSL" usage to "upgrade" plain ftp://
|
||||||
|
connection to use SSL for both or one of the connections
|
||||||
|
|
||||||
|
SCP (*8)
|
||||||
|
- both password and public key auth
|
||||||
|
|
||||||
|
SFTP (*8)
|
||||||
|
- both password and public key auth
|
||||||
|
- with custom commands sent before/after the transfer
|
||||||
|
|
||||||
|
TFTP
|
||||||
|
- download
|
||||||
|
- upload
|
||||||
|
|
||||||
|
TELNET
|
||||||
|
- connection negotiation
|
||||||
|
- custom telnet options
|
||||||
|
- stdin/stdout I/O
|
||||||
|
|
||||||
|
LDAP (*2)
|
||||||
|
- full LDAP URL support
|
||||||
|
|
||||||
|
DICT
|
||||||
|
- extended DICT URL support
|
||||||
|
|
||||||
|
FILE
|
||||||
|
- URL support
|
||||||
|
- upload
|
||||||
|
- resume
|
||||||
|
|
||||||
|
SMB
|
||||||
|
- SMBv1 over TCP and SSL
|
||||||
|
- download
|
||||||
|
- upload
|
||||||
|
- authentication with NTLMv1
|
||||||
|
|
||||||
|
SMTP
|
||||||
|
- authentication: Plain, Login, CRAM-MD5, Digest-MD5, NTLM (*9), Kerberos 5
|
||||||
|
(*4) and External.
|
||||||
|
- send e-mails
|
||||||
|
- mail from support
|
||||||
|
- mail size support
|
||||||
|
- mail auth support for trusted server-to-server relaying
|
||||||
|
- multiple recipients
|
||||||
|
- via http-proxy
|
||||||
|
|
||||||
|
SMTPS (*1)
|
||||||
|
- implicit smtps:// support
|
||||||
|
- explicit "STARTTLS" usage to "upgrade" plain smtp:// connections to use SSL
|
||||||
|
- via http-proxy
|
||||||
|
|
||||||
|
POP3
|
||||||
|
- authentication: Clear Text, APOP and SASL
|
||||||
|
- SASL based authentication: Plain, Login, CRAM-MD5, Digest-MD5, NTLM (*9),
|
||||||
|
Kerberos 5 (*4) and External.
|
||||||
|
- list e-mails
|
||||||
|
- retrieve e-mails
|
||||||
|
- enhanced command support for: CAPA, DELE, TOP, STAT, UIDL and NOOP via
|
||||||
|
custom requests
|
||||||
|
- via http-proxy
|
||||||
|
|
||||||
|
POP3S (*1)
|
||||||
|
- implicit pop3s:// support
|
||||||
|
- explicit "STLS" usage to "upgrade" plain pop3:// connections to use SSL
|
||||||
|
- via http-proxy
|
||||||
|
|
||||||
|
IMAP
|
||||||
|
- authentication: Clear Text and SASL
|
||||||
|
- SASL based authentication: Plain, Login, CRAM-MD5, Digest-MD5, NTLM (*9),
|
||||||
|
Kerberos 5 (*4) and External.
|
||||||
|
- list the folders of a mailbox
|
||||||
|
- select a mailbox with support for verifying the UIDVALIDITY
|
||||||
|
- fetch e-mails with support for specifying the UID and SECTION
|
||||||
|
- upload e-mails via the append command
|
||||||
|
- enhanced command support for: EXAMINE, CREATE, DELETE, RENAME, STATUS,
|
||||||
|
STORE, COPY and UID via custom requests
|
||||||
|
- via http-proxy
|
||||||
|
|
||||||
|
IMAPS (*1)
|
||||||
|
- implicit imaps:// support
|
||||||
|
- explicit "STARTTLS" usage to "upgrade" plain imap:// connections to use SSL
|
||||||
|
- via http-proxy
|
||||||
|
|
||||||
|
FOOTNOTES
|
||||||
|
=========
|
||||||
|
|
||||||
|
*1 = requires a TLS library
|
||||||
|
*2 = requires OpenLDAP or WinLDAP
|
||||||
|
*3 = requires a GSS-API implementation (such as Heimdal or MIT Kerberos) or
|
||||||
|
SSPI (native Windows)
|
||||||
|
*4 = requires a GSS-API implementation, however, only Windows SSPI is
|
||||||
|
currently supported
|
||||||
|
*5 = requires nghttp2 and possibly a recent TLS library
|
||||||
|
*6 = requires c-ares
|
||||||
|
*7 = requires OpenSSL, NSS, GSKit, WinSSL or Secure Transport; GnuTLS, for
|
||||||
|
example, only supports SSLv3 and TLSv1
|
||||||
|
*8 = requires libssh2
|
||||||
|
*9 = requires OpenSSL, GnuTLS, mbedTLS, NSS, yassl, Secure Transport or SSPI
|
||||||
|
(native Windows)
|
||||||
|
*10 = requires an SSL library that supports SSLv3
|
||||||
|
*11 = requires libidn or Windows
|
||||||
|
*12 = requires libz
|
||||||
|
*13 = requires libmetalink, and either an Apple or Microsoft operating
|
||||||
|
system, or OpenSSL, or GnuTLS, or NSS
|
||||||
|
*14 = requires a GSS-API implementation (such as Heimdal or MIT Kerberos)
|
||||||
144
bin/curl/docs/GOVERNANCE.md
Normal file
144
bin/curl/docs/GOVERNANCE.md
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
# Decision making in the curl project
|
||||||
|
|
||||||
|
A rough guide to how we make decisions and who does what.
|
||||||
|
|
||||||
|
## BDFL
|
||||||
|
|
||||||
|
This project was started by and has to some extent been pushed forward over
|
||||||
|
the years with Daniel Stenberg as the driving force. It matches a standard
|
||||||
|
BDFL (Benevolent Dictator For Life) style project.
|
||||||
|
|
||||||
|
This setup has been used due to convenience and the fact that is has worked
|
||||||
|
fine this far. It is not because someone thinks of it as a superior project
|
||||||
|
leadership model. It will also only continue working as long as Daniel manages
|
||||||
|
to listen in to what the project and the general user population wants and
|
||||||
|
expects from us.
|
||||||
|
|
||||||
|
## Legal entity
|
||||||
|
|
||||||
|
There is no legal entity. The curl project is just a bunch of people scattered
|
||||||
|
around the globe with the common goal to produce source code that creates
|
||||||
|
great products.
|
||||||
|
|
||||||
|
The copyrights in the project are owned by the individuals and organizations
|
||||||
|
that wrote those parts of the code.
|
||||||
|
|
||||||
|
## Decisions
|
||||||
|
|
||||||
|
The curl project is not a democracy, but everyone is entitled to state their
|
||||||
|
opinion and may argue for their sake within the community.
|
||||||
|
|
||||||
|
All and any changes that have been done or will be done are eligible to bring
|
||||||
|
up for discussion, to object to or to praise. Ideally, we find consensus for
|
||||||
|
the appropriate way forward in any given situation or challenge.
|
||||||
|
|
||||||
|
If there is no obvious consensus, a maintainer who's knowledgeable in the
|
||||||
|
specific area will take an "executive" decision that they think is the right
|
||||||
|
for the project.
|
||||||
|
|
||||||
|
## Key roles
|
||||||
|
|
||||||
|
### Maintainers
|
||||||
|
|
||||||
|
A maintainer in the curl project is an individual who has been given
|
||||||
|
permissions to push commits to one of the git repositories.
|
||||||
|
|
||||||
|
Maintainers are free to push commits to the repositories at their own will.
|
||||||
|
Maintainers are however expected to listen to feedback from users and any
|
||||||
|
change that is non-trivial in size or nature *should* be brought to the
|
||||||
|
project as a PR to allow others to comment/object before merge.
|
||||||
|
|
||||||
|
### Former maintainers
|
||||||
|
|
||||||
|
A maintainer who stops being active in the project will at some point get
|
||||||
|
their push permissions removed. We do this for security reasons but also to
|
||||||
|
make sure that we always have the list of maintainers as "the team that push
|
||||||
|
stuff to curl".
|
||||||
|
|
||||||
|
Getting push permissions removed is not a punishment. Everyone who ever worked
|
||||||
|
on maintaining curl is considered a hero, for all time hereafter.
|
||||||
|
|
||||||
|
### Security team members
|
||||||
|
|
||||||
|
We have a security team. That's the team of people who are subscribed to the
|
||||||
|
curl-security mailing list; the receivers of security reports from users and
|
||||||
|
developers. This list of people will vary over time but should be skilled
|
||||||
|
developers familiar with the curl project.
|
||||||
|
|
||||||
|
The security team works best when it consists of a small set of active
|
||||||
|
persons. We invite new members when the team seems to need it, and we also
|
||||||
|
expect to retire security team members as they "drift off" from the project or
|
||||||
|
just find themselves unable to perform their duties there.
|
||||||
|
|
||||||
|
### Server admins
|
||||||
|
|
||||||
|
We run a web server, a mailing list and more on the curl project's primary
|
||||||
|
server. That physical machine is owned and run by Haxx. Daniel is the primary
|
||||||
|
admin of all things curl related server stuff, but Björn Stenberg and Linus
|
||||||
|
Feltzing serve as backup admins for when Daniel is gone or unable.
|
||||||
|
|
||||||
|
The primary server is paid for by Haxx. The machine is physically located in a
|
||||||
|
server bunker in Stockholm Sweden, operated by the company Portlane.
|
||||||
|
|
||||||
|
The web site contents are served to the web via Fastly and Daniel is the
|
||||||
|
primary curl contact with Fastly.
|
||||||
|
|
||||||
|
### BDFL
|
||||||
|
|
||||||
|
That's Daniel.
|
||||||
|
|
||||||
|
# Maintainers
|
||||||
|
|
||||||
|
A curl maintainer is a project volunteer who has the authority and rights to
|
||||||
|
merge changes into a git repository in the curl project.
|
||||||
|
|
||||||
|
Anyone can aspire to become a curl maintainer.
|
||||||
|
|
||||||
|
### Duties
|
||||||
|
|
||||||
|
There are no mandatory duties. We hope and wish that maintainers consider
|
||||||
|
reviewing patches and help merging them, especially when the changes are
|
||||||
|
within the area of personal expertise and experience.
|
||||||
|
|
||||||
|
### Requirements
|
||||||
|
|
||||||
|
- only merge code that meets our quality and style guide requirements.
|
||||||
|
- *never* merge code without doing a PR first, unless the change is "trivial"
|
||||||
|
- if in doubt, ask for input/feedback from others
|
||||||
|
|
||||||
|
### Recommendations
|
||||||
|
|
||||||
|
- please enable 2fa on your github account to reduce risk of malicious source
|
||||||
|
code tampering
|
||||||
|
- consider enabling signed git commits for additional verification of changes
|
||||||
|
|
||||||
|
### Merge advice
|
||||||
|
|
||||||
|
When you're merging patches/PRs...
|
||||||
|
|
||||||
|
- make sure the commit messages follow our template
|
||||||
|
- squash patch sets into a few logical commits even if the PR didn't, if
|
||||||
|
necessary
|
||||||
|
- avoid the "merge" button on github, do it "manually" instead to get full
|
||||||
|
control and full audit trail (github leaves out you as "Committer:")
|
||||||
|
- remember to credit the reporter and the helpers!
|
||||||
|
|
||||||
|
## Who are maintainers?
|
||||||
|
|
||||||
|
The [list of maintainers](https://github.com/orgs/curl/people). Be aware that
|
||||||
|
the level of presence and activity in the project vary greatly between
|
||||||
|
different individuals and over time.
|
||||||
|
|
||||||
|
### Become a maintainer?
|
||||||
|
|
||||||
|
If you think you can help making the project better by shouldering some
|
||||||
|
maintaining responsibilities, then please get in touch.
|
||||||
|
|
||||||
|
You will be expected to be familiar with the curl project and its ways of
|
||||||
|
working. You need to have gotten a few quality patches merged as a proof of
|
||||||
|
this.
|
||||||
|
|
||||||
|
### Stop being a maintainer
|
||||||
|
|
||||||
|
If you (appear to) not be active in the project anymore, you may be removed as
|
||||||
|
a maintainer. Thank you for your service!
|
||||||
70
bin/curl/docs/HELP-US.md
Normal file
70
bin/curl/docs/HELP-US.md
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
# How to get started helping out in the curl project
|
||||||
|
|
||||||
|
We are always in need of more help. If you are new to the project and are
|
||||||
|
looking for ways to contribute and help out, this document aims to give a few
|
||||||
|
good starting points.
|
||||||
|
|
||||||
|
A good idea is to start by subscribing to the [curl-library mailing
|
||||||
|
list](https://cool.haxx.se/mailman/listinfo/curl-library) to keep track of the
|
||||||
|
current discussion topics.
|
||||||
|
|
||||||
|
## Scratch your own itch
|
||||||
|
|
||||||
|
One of the best ways is to start working on any problems or issues you have
|
||||||
|
found yourself or perhaps got annoyed at in the past. It can be a spelling
|
||||||
|
error in an error text or a weirdly phrased section in a man page. Hunt it
|
||||||
|
down and report the bug. Or make your first pull request with a fix for that.
|
||||||
|
|
||||||
|
## Help wanted
|
||||||
|
|
||||||
|
In the issue tracker we occasionally mark bugs with [help
|
||||||
|
wanted](https://github.com/curl/curl/labels/help%20wanted), as a sign that the
|
||||||
|
bug is acknowledged to exist and that there's nobody known to work on this
|
||||||
|
issue for the moment. Those are bugs that are fine to "grab" and provide a
|
||||||
|
pull request for. The complexity level of these will of course vary, so pick
|
||||||
|
one that piques your interest.
|
||||||
|
|
||||||
|
## Work on known bugs
|
||||||
|
|
||||||
|
Some bugs are known and haven't yet received attention and work enough to get
|
||||||
|
fixed. We collect such known existing flaws in the
|
||||||
|
[KNOWN_BUGS](https://curl.haxx.se/docs/knownbugs.html) page. Many of them link
|
||||||
|
to the original bug report with some additional details, but some may also
|
||||||
|
have aged a bit and may require some verification that the bug still exists in
|
||||||
|
the same way and that what was said about it in the past is still valid.
|
||||||
|
|
||||||
|
## Fix autobuild problems
|
||||||
|
|
||||||
|
On the [autobuilds page](https://curl.haxx.se/dev/builds.html) we show a
|
||||||
|
collection of test results from the automatic curl build and tests that are
|
||||||
|
performed by volunteers. Fixing compiler warnings and errors shown there is
|
||||||
|
something we value greatly. Also, if you own or run systems or architectures
|
||||||
|
that aren't already tested in the autobuilds, we also appreciate more
|
||||||
|
volunteers running builds automatically to help us keep curl portable.
|
||||||
|
|
||||||
|
## TODO items
|
||||||
|
|
||||||
|
Ideas for features and functions that we have considered worthwhile to
|
||||||
|
implement and provide are kept in the
|
||||||
|
[TODO](https://curl.haxx.se/docs/todo.html) file. Some of the ideas are
|
||||||
|
rough. Some are well thought out. Some probably aren't really suitable
|
||||||
|
anymore.
|
||||||
|
|
||||||
|
Before you invest a lot of time on a TODO item, do bring it up for discussion
|
||||||
|
on the mailing list. For discussion on applicability but also for ideas and
|
||||||
|
brainstorming on specific ways to do the implementation etc.
|
||||||
|
|
||||||
|
## You decide
|
||||||
|
|
||||||
|
You can also come up with a completely new thing you think we should do. Or
|
||||||
|
not do. Or fix. Or add to the project. You then either bring it to the mailing
|
||||||
|
list first to see if people will shoot down the idea at once, or you bring a
|
||||||
|
first draft of the idea as a pull request and take the discussion there around
|
||||||
|
the specific implementation. Either way is fine.
|
||||||
|
|
||||||
|
## CONTRIBUTE
|
||||||
|
|
||||||
|
We offer [guidelines](https://curl.haxx.se/dev/contribute.html) that are
|
||||||
|
suitable to be familiar with before you decide to contribute to curl. If
|
||||||
|
you're used to open source development, you'll probably not find many
|
||||||
|
surprises in there.
|
||||||
346
bin/curl/docs/HISTORY.md
Normal file
346
bin/curl/docs/HISTORY.md
Normal file
@@ -0,0 +1,346 @@
|
|||||||
|
How curl Became Like This
|
||||||
|
=========================
|
||||||
|
|
||||||
|
Towards the end of 1996, Daniel Stenberg was spending time writing an IRC bot
|
||||||
|
for an Amiga related channel on EFnet. He then came up with the idea to make
|
||||||
|
currency-exchange calculations available to Internet Relay Chat (IRC)
|
||||||
|
users. All the necessary data were published on the Web; he just needed to
|
||||||
|
automate their retrieval.
|
||||||
|
|
||||||
|
Daniel simply adopted an existing command-line open-source tool, httpget, that
|
||||||
|
Brazilian Rafael Sagula had written and recently released version 0.1 of. After
|
||||||
|
a few minor adjustments, it did just what he needed.
|
||||||
|
|
||||||
|
1997
|
||||||
|
----
|
||||||
|
|
||||||
|
HttpGet 1.0 was released on April 8th 1997 with brand new HTTP proxy support.
|
||||||
|
|
||||||
|
We soon found and fixed support for getting currencies over GOPHER. Once FTP
|
||||||
|
download support was added, the name of the project was changed and urlget 2.0
|
||||||
|
was released in August 1997. The http-only days were already passed.
|
||||||
|
|
||||||
|
1998
|
||||||
|
----
|
||||||
|
|
||||||
|
The project slowly grew bigger. When upload capabilities were added and the
|
||||||
|
name once again was misleading, a second name change was made and on March 20,
|
||||||
|
1998 curl 4 was released. (The version numbering from the previous names was
|
||||||
|
kept.)
|
||||||
|
|
||||||
|
(Unrelated to this project a company called Curl Corporation registered a US
|
||||||
|
trademark on the name "CURL" on May 18 1998. That company had then already
|
||||||
|
registered the curl.com domain back in November of the previous year. All this
|
||||||
|
was revealed to us much later.)
|
||||||
|
|
||||||
|
SSL support was added, powered by the SSLeay library.
|
||||||
|
|
||||||
|
August: first announcement of curl on freshmeat.net.
|
||||||
|
|
||||||
|
October: with the curl 4.9 release and the introduction of cookie support,
|
||||||
|
curl was no longer released under the GPL license. Now we're at 4000 lines of
|
||||||
|
code, we switched over to the MPL license to restrict the effects of
|
||||||
|
"copyleft".
|
||||||
|
|
||||||
|
November: configure script and reported successful compiles on several
|
||||||
|
major operating systems. The never-quite-understood -F option was added and
|
||||||
|
curl could now simulate quite a lot of a browser. TELNET support was added.
|
||||||
|
|
||||||
|
Curl 5 was released in December 1998 and introduced the first ever curl man
|
||||||
|
page. People started making Linux RPM packages out of it.
|
||||||
|
|
||||||
|
1999
|
||||||
|
----
|
||||||
|
|
||||||
|
January: DICT support added.
|
||||||
|
|
||||||
|
OpenSSL took over and SSLeay was abandoned.
|
||||||
|
|
||||||
|
May: first Debian package.
|
||||||
|
|
||||||
|
August: LDAP:// and FILE:// support added. The curl web site gets 1300 visits
|
||||||
|
weekly. Moved site to curl.haxx.nu.
|
||||||
|
|
||||||
|
September: Released curl 6.0. 15000 lines of code.
|
||||||
|
|
||||||
|
December 28: added the project on Sourceforge and started using its services
|
||||||
|
for managing the project.
|
||||||
|
|
||||||
|
2000
|
||||||
|
----
|
||||||
|
|
||||||
|
Spring: major internal overhaul to provide a suitable library interface.
|
||||||
|
The first non-beta release was named 7.1 and arrived in August. This offered
|
||||||
|
the easy interface and turned out to be the beginning of actually getting
|
||||||
|
other software and programs to be based on and powered by libcurl. Almost
|
||||||
|
20000 lines of code.
|
||||||
|
|
||||||
|
June: the curl site moves to "curl.haxx.se"
|
||||||
|
|
||||||
|
August, the curl web site gets 4000 visits weekly.
|
||||||
|
|
||||||
|
The PHP guys adopted libcurl already the same month, when the first ever third
|
||||||
|
party libcurl binding showed up. CURL has been a supported module in PHP since
|
||||||
|
the release of PHP 4.0.2. This would soon get followers. More than 16
|
||||||
|
different bindings exist at the time of this writing.
|
||||||
|
|
||||||
|
September: kerberos4 support was added.
|
||||||
|
|
||||||
|
November: started the work on a test suite for curl. It was later re-written
|
||||||
|
from scratch again. The libcurl major SONAME number was set to 1.
|
||||||
|
|
||||||
|
2001
|
||||||
|
----
|
||||||
|
|
||||||
|
January: Daniel released curl 7.5.2 under a new license again: MIT (or
|
||||||
|
MPL). The MIT license is extremely liberal and can be combined with GPL
|
||||||
|
in other projects. This would finally put an end to the "complaints" from
|
||||||
|
people involved in GPLed projects that previously were prohibited from using
|
||||||
|
libcurl while it was released under MPL only. (Due to the fact that MPL is
|
||||||
|
deemed "GPL incompatible".)
|
||||||
|
|
||||||
|
March 22: curl supports HTTP 1.1 starting with the release of 7.7. This
|
||||||
|
also introduced libcurl's ability to do persistent connections. 24000 lines of
|
||||||
|
code. The libcurl major SONAME number was bumped to 2 due to this overhaul.
|
||||||
|
The first experimental ftps:// support was added.
|
||||||
|
|
||||||
|
August: curl is bundled in Mac OS X, 10.1. It was already becoming more and
|
||||||
|
more of a standard utility of Linux distributions and a regular in the BSD
|
||||||
|
ports collections. The curl web site gets 8000 visits weekly. Curl Corporation
|
||||||
|
contacted Daniel to discuss "the name issue". After Daniel's reply, they have
|
||||||
|
never since got back in touch again.
|
||||||
|
|
||||||
|
September: libcurl 7.9 introduces cookie jar and curl_formadd(). During the
|
||||||
|
forthcoming 7.9.x releases, we introduced the multi interface slowly and
|
||||||
|
without many whistles.
|
||||||
|
|
||||||
|
2002
|
||||||
|
----
|
||||||
|
|
||||||
|
June: the curl web site gets 13000 visits weekly. curl and libcurl is
|
||||||
|
35000 lines of code. Reported successful compiles on more than 40 combinations
|
||||||
|
of CPUs and operating systems.
|
||||||
|
|
||||||
|
To estimate number of users of the curl tool or libcurl library is next to
|
||||||
|
impossible. Around 5000 downloaded packages each week from the main site gives
|
||||||
|
a hint, but the packages are mirrored extensively, bundled with numerous OS
|
||||||
|
distributions and otherwise retrieved as part of other software.
|
||||||
|
|
||||||
|
September: with the release of curl 7.10 it is released under the MIT license
|
||||||
|
only.
|
||||||
|
|
||||||
|
2003
|
||||||
|
----
|
||||||
|
|
||||||
|
January: Started working on the distributed curl tests. The autobuilds.
|
||||||
|
|
||||||
|
February: the curl site averages at 20000 visits weekly. At any given moment,
|
||||||
|
there's an average of 3 people browsing the curl.haxx.se site.
|
||||||
|
|
||||||
|
Multiple new authentication schemes are supported: Digest (May), NTLM (June)
|
||||||
|
and Negotiate (June).
|
||||||
|
|
||||||
|
November: curl 7.10.8 is released. 45000 lines of code. ~55000 unique visitors
|
||||||
|
to the curl.haxx.se site. Five official web mirrors.
|
||||||
|
|
||||||
|
December: full-fledged SSL for FTP is supported.
|
||||||
|
|
||||||
|
2004
|
||||||
|
----
|
||||||
|
|
||||||
|
January: curl 7.11.0 introduced large file support.
|
||||||
|
|
||||||
|
June: curl 7.12.0 introduced IDN support. 10 official web mirrors.
|
||||||
|
|
||||||
|
This release bumped the major SONAME to 3 due to the removal of the
|
||||||
|
curl_formparse() function
|
||||||
|
|
||||||
|
August: Curl and libcurl 7.12.1
|
||||||
|
|
||||||
|
Public curl release number: 82
|
||||||
|
Releases counted from the very beginning: 109
|
||||||
|
Available command line options: 96
|
||||||
|
Available curl_easy_setopt() options: 120
|
||||||
|
Number of public functions in libcurl: 36
|
||||||
|
Amount of public web site mirrors: 12
|
||||||
|
Number of known libcurl bindings: 26
|
||||||
|
|
||||||
|
2005
|
||||||
|
----
|
||||||
|
|
||||||
|
April: GnuTLS can now optionally be used for the secure layer when curl is
|
||||||
|
built.
|
||||||
|
|
||||||
|
April: Added the multi_socket() API
|
||||||
|
|
||||||
|
September: TFTP support was added.
|
||||||
|
|
||||||
|
More than 100,000 unique visitors of the curl web site. 25 mirrors.
|
||||||
|
|
||||||
|
December: security vulnerability: libcurl URL Buffer Overflow
|
||||||
|
|
||||||
|
2006
|
||||||
|
----
|
||||||
|
|
||||||
|
January: We dropped support for Gopher. We found bugs in the implementation
|
||||||
|
that turned out to have been introduced years ago, so with the conclusion that
|
||||||
|
nobody had found out in all this time we removed it instead of fixing it.
|
||||||
|
|
||||||
|
March: security vulnerability: libcurl TFTP Packet Buffer Overflow
|
||||||
|
|
||||||
|
September: The major SONAME number for libcurl was bumped to 4 due to the
|
||||||
|
removal of ftp third party transfer support.
|
||||||
|
|
||||||
|
November: Added SCP and SFTP support
|
||||||
|
|
||||||
|
2007
|
||||||
|
----
|
||||||
|
|
||||||
|
February: Added support for the Mozilla NSS library to do the SSL/TLS stuff
|
||||||
|
|
||||||
|
July: security vulnerability: libcurl GnuTLS insufficient cert verification
|
||||||
|
|
||||||
|
2008
|
||||||
|
----
|
||||||
|
|
||||||
|
November:
|
||||||
|
|
||||||
|
Command line options: 128
|
||||||
|
curl_easy_setopt() options: 158
|
||||||
|
Public functions in libcurl: 58
|
||||||
|
Known libcurl bindings: 37
|
||||||
|
Contributors: 683
|
||||||
|
|
||||||
|
145,000 unique visitors. >100 GB downloaded.
|
||||||
|
|
||||||
|
2009
|
||||||
|
----
|
||||||
|
|
||||||
|
March: security vulnerability: libcurl Arbitrary File Access
|
||||||
|
|
||||||
|
August: security vulnerability: libcurl embedded zero in cert name
|
||||||
|
|
||||||
|
December: Added support for IMAP, POP3 and SMTP
|
||||||
|
|
||||||
|
2010
|
||||||
|
----
|
||||||
|
|
||||||
|
January: Added support for RTSP
|
||||||
|
|
||||||
|
February: security vulnerability: libcurl data callback excessive length
|
||||||
|
|
||||||
|
March: The project switched over to use git (hosted by github) instead of CVS
|
||||||
|
for source code control
|
||||||
|
|
||||||
|
May: Added support for RTMP
|
||||||
|
|
||||||
|
Added support for PolarSSL to do the SSL/TLS stuff
|
||||||
|
|
||||||
|
August:
|
||||||
|
|
||||||
|
Public curl releases: 117
|
||||||
|
Command line options: 138
|
||||||
|
curl_easy_setopt() options: 180
|
||||||
|
Public functions in libcurl: 58
|
||||||
|
Known libcurl bindings: 39
|
||||||
|
Contributors: 808
|
||||||
|
|
||||||
|
Gopher support added (re-added actually, see January 2006)
|
||||||
|
|
||||||
|
2011
|
||||||
|
----
|
||||||
|
|
||||||
|
February: added support for the axTLS backend
|
||||||
|
|
||||||
|
April: added the cyassl backend (later renamed to WolfSSL)
|
||||||
|
|
||||||
|
2012
|
||||||
|
----
|
||||||
|
|
||||||
|
July: Added support for Schannel (native Windows TLS backend) and Darwin SSL
|
||||||
|
(Native Mac OS X and iOS TLS backend).
|
||||||
|
|
||||||
|
Supports metalink
|
||||||
|
|
||||||
|
October: SSH-agent support.
|
||||||
|
|
||||||
|
2013
|
||||||
|
----
|
||||||
|
|
||||||
|
February: Cleaned up internals to always uses the "multi" non-blocking
|
||||||
|
approach internally and only expose the blocking API with a wrapper.
|
||||||
|
|
||||||
|
September: First small steps on supporting HTTP/2 with nghttp2.
|
||||||
|
|
||||||
|
October: Removed krb4 support.
|
||||||
|
|
||||||
|
December: Happy eyeballs.
|
||||||
|
|
||||||
|
2014
|
||||||
|
----
|
||||||
|
|
||||||
|
March: first real release supporting HTTP/2
|
||||||
|
|
||||||
|
September: Web site had 245,000 unique visitors and served 236GB data
|
||||||
|
|
||||||
|
2015
|
||||||
|
----
|
||||||
|
|
||||||
|
June: support for multiplexing with HTTP/2
|
||||||
|
|
||||||
|
August: support for HTTP/2 server push
|
||||||
|
|
||||||
|
December: Public Suffix List
|
||||||
|
|
||||||
|
2016
|
||||||
|
----
|
||||||
|
|
||||||
|
January: the curl tool defaults to HTTP/2 for HTTPS URLs
|
||||||
|
|
||||||
|
December: curl 7.52.0 introduced support for HTTPS-proxy!
|
||||||
|
|
||||||
|
First TLS 1.3 support
|
||||||
|
|
||||||
|
2017
|
||||||
|
----
|
||||||
|
|
||||||
|
September: Added Multi-SSL support
|
||||||
|
|
||||||
|
The web site serves 3100 GB/month
|
||||||
|
|
||||||
|
Public curl releases: 169
|
||||||
|
Command line options: 211
|
||||||
|
curl_easy_setopt() options: 249
|
||||||
|
Public functions in libcurl: 74
|
||||||
|
Contributors: 1609
|
||||||
|
|
||||||
|
October: SSLKEYLOGFILE support, new MIME API
|
||||||
|
|
||||||
|
November: brotli
|
||||||
|
|
||||||
|
2018
|
||||||
|
----
|
||||||
|
|
||||||
|
January: new SSH backend powered by libssh
|
||||||
|
|
||||||
|
March: starting with the 1803 release of Windows 10, curl is shipped bundled
|
||||||
|
with Microsoft's operating system.
|
||||||
|
|
||||||
|
July: curl shows headers using bold type face
|
||||||
|
|
||||||
|
October: added DNS-over-HTTPS (DoH) and the URL API
|
||||||
|
|
||||||
|
MesaLink is a new supported TLS backend
|
||||||
|
|
||||||
|
libcurl now does HTTP/2 (and multiplexing) by default on HTTPS URLs
|
||||||
|
|
||||||
|
curl and libcurl are installed in an estimated 5 *billion* instances
|
||||||
|
world-wide.
|
||||||
|
|
||||||
|
October 31: Curl and libcurl 7.62.0
|
||||||
|
|
||||||
|
Public curl releases: 177
|
||||||
|
Command line options: 219
|
||||||
|
curl_easy_setopt() options: 261
|
||||||
|
Public functions in libcurl: 80
|
||||||
|
Contributors: 1808
|
||||||
113
bin/curl/docs/HTTP-COOKIES.md
Normal file
113
bin/curl/docs/HTTP-COOKIES.md
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
# HTTP Cookies
|
||||||
|
|
||||||
|
## Cookie overview
|
||||||
|
|
||||||
|
Cookies are `name=contents` pairs that a HTTP server tells the client to
|
||||||
|
hold and then the client sends back those to the server on subsequent
|
||||||
|
requests to the same domains and paths for which the cookies were set.
|
||||||
|
|
||||||
|
Cookies are either "session cookies" which typically are forgotten when the
|
||||||
|
session is over which is often translated to equal when browser quits, or
|
||||||
|
the cookies aren't session cookies they have expiration dates after which
|
||||||
|
the client will throw them away.
|
||||||
|
|
||||||
|
Cookies are set to the client with the Set-Cookie: header and are sent to
|
||||||
|
servers with the Cookie: header.
|
||||||
|
|
||||||
|
For a very long time, the only spec explaining how to use cookies was the
|
||||||
|
original [Netscape spec from 1994](https://curl.haxx.se/rfc/cookie_spec.html).
|
||||||
|
|
||||||
|
In 2011, [RFC6265](https://www.ietf.org/rfc/rfc6265.txt) was finally
|
||||||
|
published and details how cookies work within HTTP. In 2016, an update which
|
||||||
|
added support for prefixes was
|
||||||
|
[proposed](https://tools.ietf.org/html/draft-ietf-httpbis-cookie-prefixes-00),
|
||||||
|
and in 2017, another update was
|
||||||
|
[drafted](https://tools.ietf.org/html/draft-ietf-httpbis-cookie-alone-01)
|
||||||
|
to deprecate modification of 'secure' cookies from non-secure origins. Both
|
||||||
|
of these drafs have been incorporated into a proposal to
|
||||||
|
[replace](https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-02)
|
||||||
|
RFC6265. Cookie prefixes and secure cookie modification protection has been
|
||||||
|
implemented by curl.
|
||||||
|
|
||||||
|
## Cookies saved to disk
|
||||||
|
|
||||||
|
Netscape once created a file format for storing cookies on disk so that they
|
||||||
|
would survive browser restarts. curl adopted that file format to allow
|
||||||
|
sharing the cookies with browsers, only to see browsers move away from that
|
||||||
|
format. Modern browsers no longer use it, while curl still does.
|
||||||
|
|
||||||
|
The netscape cookie file format stores one cookie per physical line in the
|
||||||
|
file with a bunch of associated meta data, each field separated with
|
||||||
|
TAB. That file is called the cookiejar in curl terminology.
|
||||||
|
|
||||||
|
When libcurl saves a cookiejar, it creates a file header of its own in which
|
||||||
|
there is a URL mention that will link to the web version of this document.
|
||||||
|
|
||||||
|
## Cookies with curl the command line tool
|
||||||
|
|
||||||
|
curl has a full cookie "engine" built in. If you just activate it, you can
|
||||||
|
have curl receive and send cookies exactly as mandated in the specs.
|
||||||
|
|
||||||
|
Command line options:
|
||||||
|
|
||||||
|
`-b, --cookie`
|
||||||
|
|
||||||
|
tell curl a file to read cookies from and start the cookie engine, or if it
|
||||||
|
isn't a file it will pass on the given string. -b name=var works and so does
|
||||||
|
-b cookiefile.
|
||||||
|
|
||||||
|
`-j, --junk-session-cookies`
|
||||||
|
|
||||||
|
when used in combination with -b, it will skip all "session cookies" on load
|
||||||
|
so as to appear to start a new cookie session.
|
||||||
|
|
||||||
|
`-c, --cookie-jar`
|
||||||
|
|
||||||
|
tell curl to start the cookie engine and write cookies to the given file
|
||||||
|
after the request(s)
|
||||||
|
|
||||||
|
## Cookies with libcurl
|
||||||
|
|
||||||
|
libcurl offers several ways to enable and interface the cookie engine. These
|
||||||
|
options are the ones provided by the native API. libcurl bindings may offer
|
||||||
|
access to them using other means.
|
||||||
|
|
||||||
|
`CURLOPT_COOKIE`
|
||||||
|
|
||||||
|
Is used when you want to specify the exact contents of a cookie header to
|
||||||
|
send to the server.
|
||||||
|
|
||||||
|
`CURLOPT_COOKIEFILE`
|
||||||
|
|
||||||
|
Tell libcurl to activate the cookie engine, and to read the initial set of
|
||||||
|
cookies from the given file. Read-only.
|
||||||
|
|
||||||
|
`CURLOPT_COOKIEJAR`
|
||||||
|
|
||||||
|
Tell libcurl to activate the cookie engine, and when the easy handle is
|
||||||
|
closed save all known cookies to the given cookiejar file. Write-only.
|
||||||
|
|
||||||
|
`CURLOPT_COOKIELIST`
|
||||||
|
|
||||||
|
Provide detailed information about a single cookie to add to the internal
|
||||||
|
storage of cookies. Pass in the cookie as a HTTP header with all the details
|
||||||
|
set, or pass in a line from a netscape cookie file. This option can also be
|
||||||
|
used to flush the cookies etc.
|
||||||
|
|
||||||
|
`CURLINFO_COOKIELIST`
|
||||||
|
|
||||||
|
Extract cookie information from the internal cookie storage as a linked
|
||||||
|
list.
|
||||||
|
|
||||||
|
## Cookies with javascript
|
||||||
|
|
||||||
|
These days a lot of the web is built up by javascript. The webbrowser loads
|
||||||
|
complete programs that render the page you see. These javascript programs
|
||||||
|
can also set and access cookies.
|
||||||
|
|
||||||
|
Since curl and libcurl are plain HTTP clients without any knowledge of or
|
||||||
|
capability to handle javascript, such cookies will not be detected or used.
|
||||||
|
|
||||||
|
Often, if you want to mimic what a browser does on such web sites, you can
|
||||||
|
record web browser HTTP traffic when using such a site and then repeat the
|
||||||
|
cookie operations using curl or libcurl.
|
||||||
127
bin/curl/docs/HTTP2.md
Normal file
127
bin/curl/docs/HTTP2.md
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
HTTP/2 with curl
|
||||||
|
================
|
||||||
|
|
||||||
|
[HTTP/2 Spec](https://www.rfc-editor.org/rfc/rfc7540.txt)
|
||||||
|
[http2 explained](https://daniel.haxx.se/http2/)
|
||||||
|
|
||||||
|
Build prerequisites
|
||||||
|
-------------------
|
||||||
|
- nghttp2
|
||||||
|
- OpenSSL, libressl, BoringSSL, NSS, GnutTLS, mbedTLS, wolfSSL or Schannel
|
||||||
|
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.
|
||||||
|
|
||||||
|
`CURL_HTTP_VERSION_2TLS` was added in 7.47.0 as a way to ask libcurl to prefer
|
||||||
|
HTTP/2 for HTTPS but stick to 1.1 by default for plain old HTTP connections.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
`CURLOPT_SSL_ENABLE_ALPN` and `CURLOPT_SSL_ENABLE_NPN` are offered to allow
|
||||||
|
applications to explicitly disable ALPN or NPN.
|
||||||
|
|
||||||
|
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
|
||||||
|
- libressl: ALPN and NPN
|
||||||
|
- BoringSSL: ALPN and NPN
|
||||||
|
- NSS: ALPN and NPN
|
||||||
|
- GnuTLS: ALPN
|
||||||
|
- mbedTLS: ALPN
|
||||||
|
- Schannel: ALPN
|
||||||
|
- wolfSSL: ALPN
|
||||||
|
- Secure Transport: 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.
|
||||||
|
|
||||||
|
curl offers the `--http2-prior-knowledge` command line option to enable use of
|
||||||
|
HTTP/2 without HTTP/1.1 Upgrade.
|
||||||
|
|
||||||
|
Since 7.47.0, the curl tool enables HTTP/2 by default for HTTPS connections.
|
||||||
|
|
||||||
|
curl tool limitations
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
The command line tool won't do any HTTP/2 multiplexing even though libcurl
|
||||||
|
supports it, simply because the curl tool is not written to take advantage of
|
||||||
|
the libcurl API that's necessary for this (the multi interface). We have an
|
||||||
|
outstanding TODO item for this and **you** can help us make it happen.
|
||||||
|
|
||||||
|
The command line tool also doesn't support HTTP/2 server push for the same
|
||||||
|
reason it doesn't do multiplexing: it needs to use the multi interface for
|
||||||
|
that so that multiplexing is supported.
|
||||||
|
|
||||||
|
HTTP Alternative Services
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
Alt-Svc is an 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 application and/or let a
|
||||||
|
subsequent request use the alternate route automatically.
|
||||||
|
|
||||||
|
[Detailed in RFC 7838](https://tools.ietf.org/html/rfc7838)
|
||||||
468
bin/curl/docs/INSTALL.md
Normal file
468
bin/curl/docs/INSTALL.md
Normal file
@@ -0,0 +1,468 @@
|
|||||||
|
# how to install curl and libcurl
|
||||||
|
|
||||||
|
## Installing Binary Packages
|
||||||
|
|
||||||
|
Lots of people download binary distributions of curl and libcurl. This
|
||||||
|
document does not describe how to install curl or libcurl using such a binary
|
||||||
|
package. This document describes how to compile, build and install curl and
|
||||||
|
libcurl from source code.
|
||||||
|
|
||||||
|
## Building from git
|
||||||
|
|
||||||
|
If you get your code off a git repository instead of a release tarball, see
|
||||||
|
the `GIT-INFO` file in the root directory for specific instructions on how to
|
||||||
|
proceed.
|
||||||
|
|
||||||
|
# Unix
|
||||||
|
|
||||||
|
A normal Unix installation is made in three or four steps (after you've
|
||||||
|
unpacked the source archive):
|
||||||
|
|
||||||
|
./configure
|
||||||
|
make
|
||||||
|
make test (optional)
|
||||||
|
make install
|
||||||
|
|
||||||
|
You probably need to be root when doing the last command.
|
||||||
|
|
||||||
|
Get a full listing of all available configure options by invoking it like:
|
||||||
|
|
||||||
|
./configure --help
|
||||||
|
|
||||||
|
If you want to install curl in a different file hierarchy than `/usr/local`,
|
||||||
|
specify that when running configure:
|
||||||
|
|
||||||
|
./configure --prefix=/path/to/curl/tree
|
||||||
|
|
||||||
|
If you have write permission in that directory, you can do 'make install'
|
||||||
|
without being root. An example of this would be to make a local install in
|
||||||
|
your own home directory:
|
||||||
|
|
||||||
|
./configure --prefix=$HOME
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
The configure script always tries to find a working SSL library unless
|
||||||
|
explicitly told not to. If you have OpenSSL installed in the default search
|
||||||
|
path for your compiler/linker, you don't need to do anything special. If you
|
||||||
|
have OpenSSL installed in `/usr/local/ssl`, you can run configure like:
|
||||||
|
|
||||||
|
./configure --with-ssl
|
||||||
|
|
||||||
|
If you have OpenSSL installed somewhere else (for example, `/opt/OpenSSL`) and
|
||||||
|
you have pkg-config installed, set the pkg-config path first, like this:
|
||||||
|
|
||||||
|
env PKG_CONFIG_PATH=/opt/OpenSSL/lib/pkgconfig ./configure --with-ssl
|
||||||
|
|
||||||
|
Without pkg-config installed, use this:
|
||||||
|
|
||||||
|
./configure --with-ssl=/opt/OpenSSL
|
||||||
|
|
||||||
|
If you insist on forcing a build without SSL support, even though you may
|
||||||
|
have OpenSSL installed in your system, you can run configure like this:
|
||||||
|
|
||||||
|
./configure --without-ssl
|
||||||
|
|
||||||
|
If you have OpenSSL installed, but with the libraries in one place and the
|
||||||
|
header files somewhere else, you have to set the `LDFLAGS` and `CPPFLAGS`
|
||||||
|
environment variables prior to running configure. Something like this should
|
||||||
|
work:
|
||||||
|
|
||||||
|
CPPFLAGS="-I/path/to/ssl/include" LDFLAGS="-L/path/to/ssl/lib" ./configure
|
||||||
|
|
||||||
|
If you have shared SSL libs installed in a directory where your run-time
|
||||||
|
linker doesn't find them (which usually causes configure failures), you can
|
||||||
|
provide this option to gcc to set a hard-coded path to the run-time linker:
|
||||||
|
|
||||||
|
LDFLAGS=-Wl,-R/usr/local/ssl/lib ./configure --with-ssl
|
||||||
|
|
||||||
|
## More Options
|
||||||
|
|
||||||
|
To force a static library compile, disable the shared library creation by
|
||||||
|
running configure like:
|
||||||
|
|
||||||
|
./configure --disable-shared
|
||||||
|
|
||||||
|
To tell the configure script to skip searching for thread-safe functions, add
|
||||||
|
an option like:
|
||||||
|
|
||||||
|
./configure --disable-thread
|
||||||
|
|
||||||
|
If you're a curl developer and use gcc, you might want to enable more debug
|
||||||
|
options with the `--enable-debug` option.
|
||||||
|
|
||||||
|
curl can be built to use a whole range of libraries to provide various useful
|
||||||
|
services, and configure will try to auto-detect a decent default. But if you
|
||||||
|
want to alter it, you can select how to deal with each individual library.
|
||||||
|
|
||||||
|
## Select TLS backend
|
||||||
|
|
||||||
|
The default OpenSSL configure check will also detect and use BoringSSL or
|
||||||
|
libressl.
|
||||||
|
|
||||||
|
- GnuTLS: `--without-ssl --with-gnutls`.
|
||||||
|
- wolfSSL: `--without-ssl --with-wolfssl`
|
||||||
|
- NSS: `--without-ssl --with-nss`
|
||||||
|
- PolarSSL: `--without-ssl --with-polarssl`
|
||||||
|
- mbedTLS: `--without-ssl --with-mbedtls`
|
||||||
|
- schannel: `--without-ssl --with-schannel`
|
||||||
|
- secure transport: `--without-ssl --with-secure-transport`
|
||||||
|
- MesaLink: `--without-ssl --with-mesalink`
|
||||||
|
|
||||||
|
# Windows
|
||||||
|
|
||||||
|
## Building Windows DLLs and C run-time (CRT) linkage issues
|
||||||
|
|
||||||
|
As a general rule, building a DLL with static CRT linkage is highly
|
||||||
|
discouraged, and intermixing CRTs in the same app is something to avoid at
|
||||||
|
any cost.
|
||||||
|
|
||||||
|
Reading and comprehending Microsoft Knowledge Base articles KB94248 and
|
||||||
|
KB140584 is a must for any Windows developer. Especially important is full
|
||||||
|
understanding if you are not going to follow the advice given above.
|
||||||
|
|
||||||
|
- [How To Use the C Run-Time](https://support.microsoft.com/help/94248/how-to-use-the-c-run-time)
|
||||||
|
- [Run-Time Library Compiler Options](https://docs.microsoft.com/cpp/build/reference/md-mt-ld-use-run-time-library)
|
||||||
|
- [Potential Errors Passing CRT Objects Across DLL Boundaries](https://docs.microsoft.com/cpp/c-runtime-library/potential-errors-passing-crt-objects-across-dll-boundaries)
|
||||||
|
|
||||||
|
If your app is misbehaving in some strange way, or it is suffering from
|
||||||
|
memory corruption, before asking for further help, please try first to
|
||||||
|
rebuild every single library your app uses as well as your app using the
|
||||||
|
debug multithreaded dynamic C runtime.
|
||||||
|
|
||||||
|
If you get linkage errors read section 5.7 of the FAQ document.
|
||||||
|
|
||||||
|
## MingW32
|
||||||
|
|
||||||
|
Make sure that MinGW32's bin dir is in the search path, for example:
|
||||||
|
|
||||||
|
set PATH=c:\mingw32\bin;%PATH%
|
||||||
|
|
||||||
|
then run `mingw32-make mingw32` in the root dir. There are other
|
||||||
|
make targets available to build libcurl with more features, use:
|
||||||
|
|
||||||
|
- `mingw32-make mingw32-zlib` to build with Zlib support;
|
||||||
|
- `mingw32-make mingw32-ssl-zlib` to build with SSL and Zlib enabled;
|
||||||
|
- `mingw32-make mingw32-ssh2-ssl-zlib` to build with SSH2, SSL, Zlib;
|
||||||
|
- `mingw32-make mingw32-ssh2-ssl-sspi-zlib` to build with SSH2, SSL, Zlib
|
||||||
|
and SSPI support.
|
||||||
|
|
||||||
|
If you have any problems linking libraries or finding header files, be sure
|
||||||
|
to verify that the provided `Makefile.m32` files use the proper paths, and
|
||||||
|
adjust as necessary. It is also possible to override these paths with
|
||||||
|
environment variables, for example:
|
||||||
|
|
||||||
|
set ZLIB_PATH=c:\zlib-1.2.8
|
||||||
|
set OPENSSL_PATH=c:\openssl-1.0.2c
|
||||||
|
set LIBSSH2_PATH=c:\libssh2-1.6.0
|
||||||
|
|
||||||
|
It is also possible to build with other LDAP SDKs than MS LDAP; currently
|
||||||
|
it is possible to build with native Win32 OpenLDAP, or with the Novell CLDAP
|
||||||
|
SDK. If you want to use these you need to set these vars:
|
||||||
|
|
||||||
|
set LDAP_SDK=c:\openldap
|
||||||
|
set USE_LDAP_OPENLDAP=1
|
||||||
|
|
||||||
|
or for using the Novell SDK:
|
||||||
|
|
||||||
|
set USE_LDAP_NOVELL=1
|
||||||
|
|
||||||
|
If you want to enable LDAPS support then set LDAPS=1.
|
||||||
|
|
||||||
|
## Cygwin
|
||||||
|
|
||||||
|
Almost identical to the unix installation. Run the configure script in the
|
||||||
|
curl source tree root with `sh configure`. Make sure you have the `sh`
|
||||||
|
executable in `/bin/` or you'll see the configure fail toward the end.
|
||||||
|
|
||||||
|
Run `make`
|
||||||
|
|
||||||
|
## Disabling Specific Protocols in Windows builds
|
||||||
|
|
||||||
|
The configure utility, unfortunately, is not available for the Windows
|
||||||
|
environment, therefore, you cannot use the various disable-protocol options of
|
||||||
|
the configure utility on this platform.
|
||||||
|
|
||||||
|
However, you can use the following defines to disable specific
|
||||||
|
protocols:
|
||||||
|
|
||||||
|
- `HTTP_ONLY` disables all protocols except HTTP
|
||||||
|
- `CURL_DISABLE_FTP` disables FTP
|
||||||
|
- `CURL_DISABLE_LDAP` disables LDAP
|
||||||
|
- `CURL_DISABLE_TELNET` disables TELNET
|
||||||
|
- `CURL_DISABLE_DICT` disables DICT
|
||||||
|
- `CURL_DISABLE_FILE` disables FILE
|
||||||
|
- `CURL_DISABLE_TFTP` disables TFTP
|
||||||
|
- `CURL_DISABLE_HTTP` disables HTTP
|
||||||
|
- `CURL_DISABLE_IMAP` disables IMAP
|
||||||
|
- `CURL_DISABLE_POP3` disables POP3
|
||||||
|
- `CURL_DISABLE_SMTP` disables SMTP
|
||||||
|
|
||||||
|
If you want to set any of these defines you have the following options:
|
||||||
|
|
||||||
|
- Modify `lib/config-win32.h`
|
||||||
|
- Modify `lib/curl_setup.h`
|
||||||
|
- Modify `winbuild/Makefile.vc`
|
||||||
|
- Modify the "Preprocessor Definitions" in the libcurl project
|
||||||
|
|
||||||
|
Note: The pre-processor settings can be found using the Visual Studio IDE
|
||||||
|
under "Project -> Settings -> C/C++ -> General" in VC6 and "Project ->
|
||||||
|
Properties -> Configuration Properties -> C/C++ -> Preprocessor" in later
|
||||||
|
versions.
|
||||||
|
|
||||||
|
## Using BSD-style lwIP instead of Winsock TCP/IP stack in Win32 builds
|
||||||
|
|
||||||
|
In order to compile libcurl and curl using BSD-style lwIP TCP/IP stack it is
|
||||||
|
necessary to make definition of preprocessor symbol `USE_LWIPSOCK` visible to
|
||||||
|
libcurl and curl compilation processes. To set this definition you have the
|
||||||
|
following alternatives:
|
||||||
|
|
||||||
|
- Modify `lib/config-win32.h` and `src/config-win32.h`
|
||||||
|
- Modify `winbuild/Makefile.vc`
|
||||||
|
- Modify the "Preprocessor Definitions" in the libcurl project
|
||||||
|
|
||||||
|
Note: The pre-processor settings can be found using the Visual Studio IDE
|
||||||
|
under "Project -> Settings -> C/C++ -> General" in VC6 and "Project ->
|
||||||
|
Properties -> Configuration Properties -> C/C++ -> Preprocessor" in later
|
||||||
|
versions.
|
||||||
|
|
||||||
|
Once that libcurl has been built with BSD-style lwIP TCP/IP stack support, in
|
||||||
|
order to use it with your program it is mandatory that your program includes
|
||||||
|
lwIP header file `<lwip/opt.h>` (or another lwIP header that includes this)
|
||||||
|
before including any libcurl header. Your program does not need the
|
||||||
|
`USE_LWIPSOCK` preprocessor definition which is for libcurl internals only.
|
||||||
|
|
||||||
|
Compilation has been verified with [lwIP
|
||||||
|
1.4.0](https://download.savannah.gnu.org/releases/lwip/lwip-1.4.0.zip) and
|
||||||
|
[contrib-1.4.0](https://download.savannah.gnu.org/releases/lwip/contrib-1.4.0.zip).
|
||||||
|
|
||||||
|
This BSD-style lwIP TCP/IP stack support must be considered experimental given
|
||||||
|
that it has been verified that lwIP 1.4.0 still needs some polish, and libcurl
|
||||||
|
might yet need some additional adjustment, caveat emptor.
|
||||||
|
|
||||||
|
## Important static libcurl usage note
|
||||||
|
|
||||||
|
When building an application that uses the static libcurl library on Windows,
|
||||||
|
you must add `-DCURL_STATICLIB` to your `CFLAGS`. Otherwise the linker will
|
||||||
|
look for dynamic import symbols.
|
||||||
|
|
||||||
|
## Legacy Windows and SSL
|
||||||
|
|
||||||
|
Schannel (from Windows SSPI), is the native SSL library in Windows. However,
|
||||||
|
Schannel in Windows <= XP is unable 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 such as OpenSSL.
|
||||||
|
|
||||||
|
# Apple iOS and macOS
|
||||||
|
|
||||||
|
On modern Apple operating systems, curl can be built to use Apple's SSL/TLS
|
||||||
|
implementation, Secure Transport, instead of OpenSSL. To build with Secure
|
||||||
|
Transport for SSL/TLS, use the configure option `--with-darwinssl`. (It is not
|
||||||
|
necessary to use the option `--without-ssl`.) This feature requires iOS 5.0 or
|
||||||
|
later, or OS X 10.5 ("Leopard") or later.
|
||||||
|
|
||||||
|
When Secure Transport is in use, the curl options `--cacert` and `--capath`
|
||||||
|
and their libcurl equivalents, will be ignored, because Secure Transport uses
|
||||||
|
the certificates stored in the Keychain to evaluate whether or not to trust
|
||||||
|
the server. This, of course, includes the root certificates that ship with the
|
||||||
|
OS. The `--cert` and `--engine` options, and their libcurl equivalents, are
|
||||||
|
currently unimplemented in curl with Secure Transport.
|
||||||
|
|
||||||
|
For macOS users: In OS X 10.8 ("Mountain Lion"), Apple made a major overhaul
|
||||||
|
to the Secure Transport API that, among other things, added support for the
|
||||||
|
newer TLS 1.1 and 1.2 protocols. To get curl to support TLS 1.1 and 1.2, you
|
||||||
|
must build curl on Mountain Lion or later, or by using the equivalent SDK. If
|
||||||
|
you set the `MACOSX_DEPLOYMENT_TARGET` environmental variable to an earlier
|
||||||
|
version of macOS prior to building curl, then curl will use the new Secure
|
||||||
|
Transport API on Mountain Lion and later, and fall back on the older API when
|
||||||
|
the same curl binary is executed on older cats. For example, running these
|
||||||
|
commands in curl's directory in the shell will build the code such that it
|
||||||
|
will run on cats as old as OS X 10.6 ("Snow Leopard") (using bash):
|
||||||
|
|
||||||
|
export MACOSX_DEPLOYMENT_TARGET="10.6"
|
||||||
|
./configure --with-darwinssl
|
||||||
|
make
|
||||||
|
|
||||||
|
# Cross compile
|
||||||
|
|
||||||
|
Download and unpack the curl package.
|
||||||
|
|
||||||
|
`cd` to the new directory. (e.g. `cd curl-7.12.3`)
|
||||||
|
|
||||||
|
Set environment variables to point to the cross-compile toolchain and call
|
||||||
|
configure with any options you need. Be sure and specify the `--host` and
|
||||||
|
`--build` parameters at configuration time. The following script is an
|
||||||
|
example of cross-compiling for the IBM 405GP PowerPC processor using the
|
||||||
|
toolchain from MonteVista for Hardhat Linux.
|
||||||
|
|
||||||
|
#! /bin/sh
|
||||||
|
|
||||||
|
export PATH=$PATH:/opt/hardhat/devkit/ppc/405/bin
|
||||||
|
export CPPFLAGS="-I/opt/hardhat/devkit/ppc/405/target/usr/include"
|
||||||
|
export AR=ppc_405-ar
|
||||||
|
export AS=ppc_405-as
|
||||||
|
export LD=ppc_405-ld
|
||||||
|
export RANLIB=ppc_405-ranlib
|
||||||
|
export CC=ppc_405-gcc
|
||||||
|
export NM=ppc_405-nm
|
||||||
|
|
||||||
|
./configure --target=powerpc-hardhat-linux
|
||||||
|
--host=powerpc-hardhat-linux
|
||||||
|
--build=i586-pc-linux-gnu
|
||||||
|
--prefix=/opt/hardhat/devkit/ppc/405/target/usr/local
|
||||||
|
--exec-prefix=/usr/local
|
||||||
|
|
||||||
|
You may also need to provide a parameter like `--with-random=/dev/urandom` to
|
||||||
|
configure as it cannot detect the presence of a random number generating
|
||||||
|
device for a target system. The `--prefix` parameter specifies where curl
|
||||||
|
will be installed. If `configure` completes successfully, do `make` and `make
|
||||||
|
install` as usual.
|
||||||
|
|
||||||
|
In some cases, you may be able to simplify the above commands to as little as:
|
||||||
|
|
||||||
|
./configure --host=ARCH-OS
|
||||||
|
|
||||||
|
# REDUCING SIZE
|
||||||
|
|
||||||
|
There are a number of configure options that can be used to reduce the size of
|
||||||
|
libcurl for embedded applications where binary size is an important factor.
|
||||||
|
First, be sure to set the `CFLAGS` variable when configuring with any relevant
|
||||||
|
compiler optimization flags to reduce the size of the binary. For gcc, this
|
||||||
|
would mean at minimum the -Os option, and potentially the `-march=X`,
|
||||||
|
`-mdynamic-no-pic` and `-flto` options as well, e.g.
|
||||||
|
|
||||||
|
./configure CFLAGS='-Os' LDFLAGS='-Wl,-Bsymbolic'...
|
||||||
|
|
||||||
|
Note that newer compilers often produce smaller code than older versions
|
||||||
|
due to improved optimization.
|
||||||
|
|
||||||
|
Be sure to specify as many `--disable-` and `--without-` flags on the
|
||||||
|
configure command-line as you can to disable all the libcurl features that you
|
||||||
|
know your application is not going to need. Besides specifying the
|
||||||
|
`--disable-PROTOCOL` flags for all the types of URLs your application will not
|
||||||
|
use, here are some other flags that can reduce the size of the library:
|
||||||
|
|
||||||
|
- `--disable-ares` (disables support for the C-ARES DNS library)
|
||||||
|
- `--disable-cookies` (disables support for HTTP cookies)
|
||||||
|
- `--disable-crypto-auth` (disables HTTP cryptographic authentication)
|
||||||
|
- `--disable-ipv6` (disables support for IPv6)
|
||||||
|
- `--disable-manual` (disables support for the built-in documentation)
|
||||||
|
- `--disable-proxy` (disables support for HTTP and SOCKS proxies)
|
||||||
|
- `--disable-unix-sockets` (disables support for UNIX sockets)
|
||||||
|
- `--disable-verbose` (eliminates debugging strings and error code strings)
|
||||||
|
- `--disable-versioned-symbols` (disables support for versioned symbols)
|
||||||
|
- `--enable-hidden-symbols` (eliminates unneeded symbols in the shared library)
|
||||||
|
- `--without-libidn` (disables support for the libidn DNS library)
|
||||||
|
- `--without-librtmp` (disables support for RTMP)
|
||||||
|
- `--without-ssl` (disables support for SSL/TLS)
|
||||||
|
- `--without-zlib` (disables support for on-the-fly decompression)
|
||||||
|
|
||||||
|
The GNU compiler and linker have a number of options that can reduce the
|
||||||
|
size of the libcurl dynamic libraries on some platforms even further.
|
||||||
|
Specify them by providing appropriate `CFLAGS` and `LDFLAGS` variables on
|
||||||
|
the configure command-line, e.g.
|
||||||
|
|
||||||
|
CFLAGS="-Os -ffunction-sections -fdata-sections
|
||||||
|
-fno-unwind-tables -fno-asynchronous-unwind-tables -flto"
|
||||||
|
LDFLAGS="-Wl,-s -Wl,-Bsymbolic -Wl,--gc-sections"
|
||||||
|
|
||||||
|
Be sure also to strip debugging symbols from your binaries after compiling
|
||||||
|
using 'strip' (or the appropriate variant if cross-compiling). If space is
|
||||||
|
really tight, you may be able to remove some unneeded sections of the shared
|
||||||
|
library using the -R option to objcopy (e.g. the .comment section).
|
||||||
|
|
||||||
|
Using these techniques it is possible to create a basic HTTP-only shared
|
||||||
|
libcurl library for i386 Linux platforms that is only 113 KiB in size, and an
|
||||||
|
FTP-only library that is 113 KiB in size (as of libcurl version 7.50.3, using
|
||||||
|
gcc 5.4.0).
|
||||||
|
|
||||||
|
You may find that statically linking libcurl to your application will result
|
||||||
|
in a lower total size than dynamically linking.
|
||||||
|
|
||||||
|
Note that the curl test harness can detect the use of some, but not all, of
|
||||||
|
the `--disable` statements suggested above. Use will cause tests relying on
|
||||||
|
those features to fail. The test harness can be manually forced to skip the
|
||||||
|
relevant tests by specifying certain key words on the `runtests.pl` command
|
||||||
|
line. Following is a list of appropriate key words:
|
||||||
|
|
||||||
|
- `--disable-cookies` !cookies
|
||||||
|
- `--disable-manual` !--manual
|
||||||
|
- `--disable-proxy` !HTTP\ proxy !proxytunnel !SOCKS4 !SOCKS5
|
||||||
|
|
||||||
|
# PORTS
|
||||||
|
|
||||||
|
This is a probably incomplete list of known hardware and operating systems
|
||||||
|
that curl has been compiled for. If you know a system curl compiles and
|
||||||
|
runs on, that isn't listed, please let us know!
|
||||||
|
|
||||||
|
- Alpha DEC OSF 4
|
||||||
|
- Alpha Digital UNIX v3.2
|
||||||
|
- Alpha FreeBSD 4.1, 4.5
|
||||||
|
- Alpha Linux 2.2, 2.4
|
||||||
|
- Alpha NetBSD 1.5.2
|
||||||
|
- Alpha OpenBSD 3.0
|
||||||
|
- Alpha OpenVMS V7.1-1H2
|
||||||
|
- Alpha Tru64 v5.0 5.1
|
||||||
|
- AVR32 Linux
|
||||||
|
- ARM Android 1.5, 2.1, 2.3, 3.2, 4.x
|
||||||
|
- ARM INTEGRITY
|
||||||
|
- ARM iOS
|
||||||
|
- Cell Linux
|
||||||
|
- Cell Cell OS
|
||||||
|
- HP-PA HP-UX 9.X 10.X 11.X
|
||||||
|
- HP-PA Linux
|
||||||
|
- HP3000 MPE/iX
|
||||||
|
- MicroBlaze uClinux
|
||||||
|
- MIPS IRIX 6.2, 6.5
|
||||||
|
- MIPS Linux
|
||||||
|
- OS/400
|
||||||
|
- Pocket PC/Win CE 3.0
|
||||||
|
- Power AIX 3.2.5, 4.2, 4.3.1, 4.3.2, 5.1, 5.2
|
||||||
|
- PowerPC Darwin 1.0
|
||||||
|
- PowerPC INTEGRITY
|
||||||
|
- PowerPC Linux
|
||||||
|
- PowerPC Mac OS 9
|
||||||
|
- PowerPC Mac OS X
|
||||||
|
- SH4 Linux 2.6.X
|
||||||
|
- SH4 OS21
|
||||||
|
- SINIX-Z v5
|
||||||
|
- Sparc Linux
|
||||||
|
- Sparc Solaris 2.4, 2.5, 2.5.1, 2.6, 7, 8, 9, 10
|
||||||
|
- Sparc SunOS 4.1.X
|
||||||
|
- StrongARM (and other ARM) RISC OS 3.1, 4.02
|
||||||
|
- StrongARM/ARM7/ARM9 Linux 2.4, 2.6
|
||||||
|
- StrongARM NetBSD 1.4.1
|
||||||
|
- Symbian OS (P.I.P.S.) 9.x
|
||||||
|
- TPF
|
||||||
|
- Ultrix 4.3a
|
||||||
|
- UNICOS 9.0
|
||||||
|
- i386 BeOS
|
||||||
|
- i386 DOS
|
||||||
|
- i386 eCos 1.3.1
|
||||||
|
- i386 Esix 4.1
|
||||||
|
- i386 FreeBSD
|
||||||
|
- i386 HURD
|
||||||
|
- i386 Haiku OS
|
||||||
|
- i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4, 2.6
|
||||||
|
- i386 Mac OS X
|
||||||
|
- i386 MINIX 3.1
|
||||||
|
- i386 NetBSD
|
||||||
|
- i386 Novell NetWare
|
||||||
|
- i386 OS/2
|
||||||
|
- i386 OpenBSD
|
||||||
|
- i386 QNX 6
|
||||||
|
- i386 SCO unix
|
||||||
|
- i386 Solaris 2.7
|
||||||
|
- i386 Windows 95, 98, ME, NT, 2000, XP, 2003
|
||||||
|
- i486 ncr-sysv4.3.03 (NCR MP-RAS)
|
||||||
|
- ia64 Linux 2.3.99
|
||||||
|
- m68k AmigaOS 3
|
||||||
|
- m68k Linux
|
||||||
|
- m68k uClinux
|
||||||
|
- m68k OpenBSD
|
||||||
|
- m88k dg-dgux5.4R3.00
|
||||||
|
- s390 Linux
|
||||||
|
- x86_64 Linux
|
||||||
|
- XScale/PXA250 Linux 2.4
|
||||||
|
- Nios II uClinux
|
||||||
9
bin/curl/docs/INSTALL.txt
Normal file
9
bin/curl/docs/INSTALL.txt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
_ _ ____ _
|
||||||
|
___| | | | _ \| |
|
||||||
|
/ __| | | | |_) | |
|
||||||
|
| (__| |_| | _ <| |___
|
||||||
|
\___|\___/|_| \_\_____|
|
||||||
|
|
||||||
|
How To Compile
|
||||||
|
|
||||||
|
see INSTALL.md
|
||||||
1100
bin/curl/docs/INTERNALS.md
Normal file
1100
bin/curl/docs/INTERNALS.md
Normal file
File diff suppressed because it is too large
Load Diff
759
bin/curl/docs/KNOWN_BUGS.txt
Normal file
759
bin/curl/docs/KNOWN_BUGS.txt
Normal file
@@ -0,0 +1,759 @@
|
|||||||
|
_ _ ____ _
|
||||||
|
___| | | | _ \| |
|
||||||
|
/ __| | | | |_) | |
|
||||||
|
| (__| |_| | _ <| |___
|
||||||
|
\___|\___/|_| \_\_____|
|
||||||
|
|
||||||
|
Known Bugs
|
||||||
|
|
||||||
|
These are problems and bugs known to exist at the time of this release. Feel
|
||||||
|
free to join in and help us correct one or more of these! Also be sure to
|
||||||
|
check the changelog of the current development status, as one or more of these
|
||||||
|
problems may have been fixed or changed somewhat since this was written!
|
||||||
|
|
||||||
|
1. HTTP
|
||||||
|
1.1 CURLFORM_CONTENTLEN in an array
|
||||||
|
1.2 Disabling HTTP Pipelining
|
||||||
|
1.3 STARTTRANSFER time is wrong for HTTP POSTs
|
||||||
|
1.4 multipart formposts file name encoding
|
||||||
|
1.5 Expect-100 meets 417
|
||||||
|
1.6 Unnecessary close when 401 received waiting for 100
|
||||||
|
1.7 Deflate error after all content was received
|
||||||
|
1.8 DoH isn't used for all name resolves when enabled
|
||||||
|
1.9 HTTP/2 frames while in the connection pool kill reuse
|
||||||
|
1.10 Strips trailing dot from host name
|
||||||
|
1.11 CURLOPT_SEEKFUNCTION not called with CURLFORM_STREAM
|
||||||
|
|
||||||
|
2. TLS
|
||||||
|
2.1 CURLINFO_SSL_VERIFYRESULT has limited support
|
||||||
|
2.2 DER in keychain
|
||||||
|
2.3 GnuTLS backend skips really long certificate fields
|
||||||
|
2.4 DarwinSSL won't import PKCS#12 client certificates without a password
|
||||||
|
2.5 Client cert handling with Issuer DN differs between backends
|
||||||
|
2.6 CURL_GLOBAL_SSL
|
||||||
|
2.7 Client cert (MTLS) issues with Schannel
|
||||||
|
|
||||||
|
3. Email protocols
|
||||||
|
3.1 IMAP SEARCH ALL truncated response
|
||||||
|
3.2 No disconnect command
|
||||||
|
3.3 SMTP to multiple recipients
|
||||||
|
3.4 POP3 expects "CRLF.CRLF" eob for some single-line responses
|
||||||
|
|
||||||
|
4. Command line
|
||||||
|
4.1 -J and -O with %-encoded file names
|
||||||
|
4.2 -J with -C - fails
|
||||||
|
4.3 --retry and transfer timeouts
|
||||||
|
4.4 --upload-file . hang if delay in STDIN
|
||||||
|
4.5 Improve --data-urlencode space encoding
|
||||||
|
|
||||||
|
5. Build and portability issues
|
||||||
|
5.2 curl-config --libs contains private details
|
||||||
|
5.3 curl compiled on OSX 10.13 failed to run on OSX 10.10
|
||||||
|
5.4 Cannot compile against a static build of OpenLDAP
|
||||||
|
5.5 can't handle Unicode arguments in Windows
|
||||||
|
5.6 cmake support gaps
|
||||||
|
5.7 Visual Studio project gaps
|
||||||
|
5.8 configure finding libs in wrong directory
|
||||||
|
5.9 Utilize Requires.private directives in libcurl.pc
|
||||||
|
|
||||||
|
6. Authentication
|
||||||
|
6.1 NTLM authentication and unicode
|
||||||
|
6.2 MIT Kerberos for Windows build
|
||||||
|
6.3 NTLM in system context uses wrong name
|
||||||
|
6.4 Negotiate and Kerberos V5 need a fake user name
|
||||||
|
6.5 NTLM doesn't support password with § character
|
||||||
|
6.6 libcurl can fail to try alternatives with --proxy-any
|
||||||
|
|
||||||
|
7. FTP
|
||||||
|
7.1 FTP without or slow 220 response
|
||||||
|
7.2 FTP with CONNECT and slow server
|
||||||
|
7.3 FTP with NOBODY and FAILONERROR
|
||||||
|
7.4 FTP with ACCT
|
||||||
|
7.5 ASCII FTP
|
||||||
|
7.6 FTP with NULs in URL parts
|
||||||
|
7.7 FTP and empty path parts in the URL
|
||||||
|
7.8 Premature transfer end but healthy control channel
|
||||||
|
7.9 Passive transfer tries only one IP address
|
||||||
|
7.10 Stick to same family over SOCKS proxy
|
||||||
|
|
||||||
|
8. TELNET
|
||||||
|
8.1 TELNET and time limitations don't work
|
||||||
|
8.2 Microsoft telnet server
|
||||||
|
|
||||||
|
9. SFTP and SCP
|
||||||
|
9.1 SFTP doesn't do CURLOPT_POSTQUOTE correct
|
||||||
|
|
||||||
|
10. SOCKS
|
||||||
|
10.1 SOCKS proxy connections are done blocking
|
||||||
|
10.2 SOCKS don't support timeouts
|
||||||
|
10.3 FTPS over SOCKS
|
||||||
|
10.4 active FTP over a SOCKS
|
||||||
|
|
||||||
|
11. Internals
|
||||||
|
11.1 Curl leaks .onion hostnames in DNS
|
||||||
|
11.2 error buffer not set if connection to multiple addresses fails
|
||||||
|
11.3 c-ares deviates from stock resolver on http://1346569778
|
||||||
|
11.4 HTTP test server 'connection-monitor' problems
|
||||||
|
11.5 Connection information when using TCP Fast Open
|
||||||
|
11.6 slow connect to localhost on Windows
|
||||||
|
|
||||||
|
12. LDAP and OpenLDAP
|
||||||
|
12.1 OpenLDAP hangs after returning results
|
||||||
|
|
||||||
|
13. TCP/IP
|
||||||
|
13.1 --interface for ipv6 binds to unusable IP address
|
||||||
|
|
||||||
|
14 DICT
|
||||||
|
14.1 DICT responses show the underlying protocol
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
|
||||||
|
1. HTTP
|
||||||
|
|
||||||
|
1.1 CURLFORM_CONTENTLEN in an array
|
||||||
|
|
||||||
|
It is not possible to pass a 64-bit value using CURLFORM_CONTENTLEN with
|
||||||
|
CURLFORM_ARRAY, when compiled on 32-bit platforms that support 64-bit
|
||||||
|
integers. This is because the underlying structure 'curl_forms' uses a dual
|
||||||
|
purpose char* for storing these values in via casting. For more information
|
||||||
|
see the now closed related issue:
|
||||||
|
https://github.com/curl/curl/issues/608
|
||||||
|
|
||||||
|
1.2 Disabling HTTP Pipelining
|
||||||
|
|
||||||
|
Disabling HTTP Pipelining when there are ongoing transfers can lead to
|
||||||
|
heap corruption and crash. https://curl.haxx.se/bug/view.cgi?id=1411
|
||||||
|
|
||||||
|
Similarly, removing a handle when pipelining corrupts data:
|
||||||
|
https://github.com/curl/curl/issues/2101
|
||||||
|
|
||||||
|
1.3 STARTTRANSFER time is wrong for HTTP POSTs
|
||||||
|
|
||||||
|
Wrong STARTTRANSFER timer accounting for POST requests Timer works fine with
|
||||||
|
GET requests, but while using POST the time for CURLINFO_STARTTRANSFER_TIME
|
||||||
|
is wrong. While using POST CURLINFO_STARTTRANSFER_TIME minus
|
||||||
|
CURLINFO_PRETRANSFER_TIME is near to zero every time.
|
||||||
|
|
||||||
|
https://github.com/curl/curl/issues/218
|
||||||
|
https://curl.haxx.se/bug/view.cgi?id=1213
|
||||||
|
|
||||||
|
1.4 multipart formposts file name encoding
|
||||||
|
|
||||||
|
When creating multipart formposts. The file name part can be encoded with
|
||||||
|
something beyond ascii but currently libcurl will only pass in the verbatim
|
||||||
|
string the app provides. There are several browsers that already do this
|
||||||
|
encoding. The key seems to be the updated draft to RFC2231:
|
||||||
|
https://tools.ietf.org/html/draft-reschke-rfc2231-in-http-02
|
||||||
|
|
||||||
|
1.5 Expect-100 meets 417
|
||||||
|
|
||||||
|
If an upload using Expect: 100-continue receives an HTTP 417 response, it
|
||||||
|
ought to be automatically resent without the Expect:. A workaround is for
|
||||||
|
the client application to redo the transfer after disabling Expect:.
|
||||||
|
https://curl.haxx.se/mail/archive-2008-02/0043.html
|
||||||
|
|
||||||
|
1.6 Unnecessary close when 401 received waiting for 100
|
||||||
|
|
||||||
|
libcurl closes the connection if an HTTP 401 reply is received while it is
|
||||||
|
waiting for the the 100-continue response.
|
||||||
|
https://curl.haxx.se/mail/lib-2008-08/0462.html
|
||||||
|
|
||||||
|
1.7 Deflate error after all content was received
|
||||||
|
|
||||||
|
There's a situation where we can get an error in a HTTP response that is
|
||||||
|
compressed, when that error is detected after all the actual body contents
|
||||||
|
have been received and delivered to the application. This is tricky, but is
|
||||||
|
ultimately a broken server.
|
||||||
|
|
||||||
|
See https://github.com/curl/curl/issues/2719
|
||||||
|
|
||||||
|
1.8 DoH isn't used for all name resolves when enabled
|
||||||
|
|
||||||
|
Even if DoH is specified to be used, there are some name resolves that are
|
||||||
|
done without it. This should be fixed. When the internal function
|
||||||
|
`Curl_resolver_wait_resolv()` is called, it doesn't use DoH to complete the
|
||||||
|
resolve as it otherwise should.
|
||||||
|
|
||||||
|
See https://github.com/curl/curl/pull/3857 and
|
||||||
|
https://github.com/curl/curl/pull/3850
|
||||||
|
|
||||||
|
1.9 HTTP/2 frames while in the connection pool kill reuse
|
||||||
|
|
||||||
|
If the server sends HTTP/2 frames (like for example an HTTP/2 PING frame) to
|
||||||
|
curl while the connection is held in curl's connection pool, the socket will
|
||||||
|
be found readable when considered for reuse and that makes curl think it is
|
||||||
|
dead and then it will be closed and a new connection gets created instead.
|
||||||
|
|
||||||
|
This is *best* fixed by adding monitoring to connections while they are kept
|
||||||
|
in the pool so that pings can be responded to appropriately.
|
||||||
|
|
||||||
|
1.10 Strips trailing dot from host name
|
||||||
|
|
||||||
|
When given a URL with a trailing dot for the host name part:
|
||||||
|
"https://example.com./", libcurl will strip off the dot and use the name
|
||||||
|
without a dot internally and send it dot-less in HTTP Host: headers and in
|
||||||
|
the TLS SNI field. For the purpose of resolving the name to an address
|
||||||
|
the hostname is used as is without any change.
|
||||||
|
|
||||||
|
The HTTP part violates RFC 7230 section 5.4 but the SNI part is accordance
|
||||||
|
with RFC 6066 section 3.
|
||||||
|
|
||||||
|
URLs using these trailing dots are very rare in the wild and we have not seen
|
||||||
|
or gotten any real-world problems with such URLs reported. The popular
|
||||||
|
browsers seem to have stayed with not stripping the dot for both uses (thus
|
||||||
|
they violate RFC 6066 instead of RFC 7230).
|
||||||
|
|
||||||
|
Daniel took the discussion to the HTTPbis mailing list in March 2016:
|
||||||
|
https://lists.w3.org/Archives/Public/ietf-http-wg/2016JanMar/0430.html but
|
||||||
|
there was not major rush or interest to fix this. The impression I get is
|
||||||
|
that most HTTP people rather not rock the boat now and instead prioritize web
|
||||||
|
compatibility rather than to strictly adhere to these RFCs.
|
||||||
|
|
||||||
|
Our current approach allows a knowing client to send a custom HTTP header
|
||||||
|
with the dot added.
|
||||||
|
|
||||||
|
In a few cases there is a difference in name resolving to IP addresses with
|
||||||
|
a trailing dot, but it can be noted that many HTTP servers will not happily
|
||||||
|
accept the trailing dot there unless that has been specifically configured
|
||||||
|
to be a fine virtual host.
|
||||||
|
|
||||||
|
If URLs with trailing dots for host names become more popular or even just
|
||||||
|
used more than for just plain fun experiments, I'm sure we will have reason
|
||||||
|
to go back and reconsider.
|
||||||
|
|
||||||
|
See https://github.com/curl/curl/issues/716 for the discussion.
|
||||||
|
|
||||||
|
1.11 CURLOPT_SEEKFUNCTION not called with CURLFORM_STREAM
|
||||||
|
|
||||||
|
I'm using libcurl to POST form data using a FILE* with the CURLFORM_STREAM
|
||||||
|
option of curl_formadd(). I've noticed that if the connection drops at just
|
||||||
|
the right time, the POST is reattempted without the data from the file. It
|
||||||
|
seems like the file stream position isn't getting reset to the beginning of
|
||||||
|
the file. I found the CURLOPT_SEEKFUNCTION option and set that with a
|
||||||
|
function that performs an fseek() on the FILE*. However, setting that didn't
|
||||||
|
seem to fix the issue or even get called. See
|
||||||
|
https://github.com/curl/curl/issues/768
|
||||||
|
|
||||||
|
|
||||||
|
2. TLS
|
||||||
|
|
||||||
|
2.1 CURLINFO_SSL_VERIFYRESULT has limited support
|
||||||
|
|
||||||
|
CURLINFO_SSL_VERIFYRESULT is only implemented for the OpenSSL and NSS
|
||||||
|
backends, so relying on this information in a generic app is flaky.
|
||||||
|
|
||||||
|
2.2 DER in keychain
|
||||||
|
|
||||||
|
Curl doesn't recognize certificates in DER format in keychain, but it works
|
||||||
|
with PEM. https://curl.haxx.se/bug/view.cgi?id=1065
|
||||||
|
|
||||||
|
2.3 GnuTLS backend skips really long certificate fields
|
||||||
|
|
||||||
|
libcurl calls gnutls_x509_crt_get_dn() with a fixed buffer size and if the
|
||||||
|
field is too long in the cert, it'll just return an error and the field will
|
||||||
|
be displayed blank.
|
||||||
|
|
||||||
|
2.4 DarwinSSL won't import PKCS#12 client certificates without a password
|
||||||
|
|
||||||
|
libcurl calls SecPKCS12Import with the PKCS#12 client certificate, but that
|
||||||
|
function rejects certificates that do not have a password.
|
||||||
|
https://github.com/curl/curl/issues/1308
|
||||||
|
|
||||||
|
2.5 Client cert handling with Issuer DN differs between backends
|
||||||
|
|
||||||
|
When the specified client certificate doesn't match any of the
|
||||||
|
server-specified DNs, the OpenSSL and GnuTLS backends behave differently.
|
||||||
|
The github discussion may contain a solution.
|
||||||
|
|
||||||
|
See https://github.com/curl/curl/issues/1411
|
||||||
|
|
||||||
|
2.6 CURL_GLOBAL_SSL
|
||||||
|
|
||||||
|
Since libcurl 7.57.0, the flag CURL_GLOBAL_SSL is a no-op. The change was
|
||||||
|
merged in https://github.com/curl/curl/commit/d661b0afb571a
|
||||||
|
|
||||||
|
It was removed since it was
|
||||||
|
|
||||||
|
A) never clear for applications on how to deal with init in the light of
|
||||||
|
different SSL backends (the option was added back in the days when life
|
||||||
|
was simpler)
|
||||||
|
|
||||||
|
B) multissl introduced dynamic switching between SSL backends which
|
||||||
|
emphasized (A) even more
|
||||||
|
|
||||||
|
C) libcurl uses some TLS backend functionality even for non-TLS functions (to
|
||||||
|
get "good" random) so applications trying to avoid the init for
|
||||||
|
performance reasons would do wrong anyway
|
||||||
|
|
||||||
|
D) never very carefully documented so all this mostly just happened to work
|
||||||
|
for some users
|
||||||
|
|
||||||
|
However, in spite of the problems with the feature, there were some users who
|
||||||
|
apparently depended on this feature and who now claim libcurl is broken for
|
||||||
|
them. The fix for this situation is not obvious as a downright revert of the
|
||||||
|
patch is totally ruled out due to those reasons above.
|
||||||
|
|
||||||
|
https://github.com/curl/curl/issues/2276
|
||||||
|
|
||||||
|
2.7 Client cert (MTLS) issues with Schannel
|
||||||
|
|
||||||
|
See https://github.com/curl/curl/issues/3145
|
||||||
|
|
||||||
|
|
||||||
|
3. Email protocols
|
||||||
|
|
||||||
|
3.1 IMAP SEARCH ALL truncated response
|
||||||
|
|
||||||
|
IMAP "SEARCH ALL" truncates output on large boxes. "A quick search of the
|
||||||
|
code reveals that pingpong.c contains some truncation code, at line 408, when
|
||||||
|
it deems the server response to be too large truncating it to 40 characters"
|
||||||
|
https://curl.haxx.se/bug/view.cgi?id=1366
|
||||||
|
|
||||||
|
3.2 No disconnect command
|
||||||
|
|
||||||
|
The disconnect commands (LOGOUT and QUIT) may not be sent by IMAP, POP3 and
|
||||||
|
SMTP if a failure occurs during the authentication phase of a connection.
|
||||||
|
|
||||||
|
3.3 SMTP to multiple recipients
|
||||||
|
|
||||||
|
When sending data to multiple recipients, curl will abort and return failure
|
||||||
|
if one of the recipients indicate failure (on the "RCPT TO"
|
||||||
|
command). Ordinary mail programs would proceed and still send to the ones
|
||||||
|
that can receive data. This is subject for change in the future.
|
||||||
|
https://curl.haxx.se/bug/view.cgi?id=1116
|
||||||
|
|
||||||
|
3.4 POP3 expects "CRLF.CRLF" eob for some single-line responses
|
||||||
|
|
||||||
|
You have to tell libcurl not to expect a body, when dealing with one line
|
||||||
|
response commands. Please see the POP3 examples and test cases which show
|
||||||
|
this for the NOOP and DELE commands. https://curl.haxx.se/bug/?i=740
|
||||||
|
|
||||||
|
|
||||||
|
4. Command line
|
||||||
|
|
||||||
|
4.1 -J and -O with %-encoded file names
|
||||||
|
|
||||||
|
-J/--remote-header-name doesn't decode %-encoded file names. RFC6266 details
|
||||||
|
how it should be done. The can of worm is basically that we have no charset
|
||||||
|
handling in curl and ascii >=128 is a challenge for us. Not to mention that
|
||||||
|
decoding also means that we need to check for nastiness that is attempted,
|
||||||
|
like "../" sequences and the like. Probably everything to the left of any
|
||||||
|
embedded slashes should be cut off.
|
||||||
|
https://curl.haxx.se/bug/view.cgi?id=1294
|
||||||
|
|
||||||
|
-O also doesn't decode %-encoded names, and while it has even less
|
||||||
|
information about the charset involved the process is similar to the -J case.
|
||||||
|
|
||||||
|
Note that we won't add decoding to -O without the user asking for it with
|
||||||
|
some other means as well, since -O has always been documented to use the name
|
||||||
|
exactly as specified in the URL.
|
||||||
|
|
||||||
|
4.2 -J with -C - fails
|
||||||
|
|
||||||
|
When using -J (with -O), automatically resumed downloading together with "-C
|
||||||
|
-" fails. Without -J the same command line works! This happens because the
|
||||||
|
resume logic is worked out before the target file name (and thus its
|
||||||
|
pre-transfer size) has been figured out!
|
||||||
|
https://curl.haxx.se/bug/view.cgi?id=1169
|
||||||
|
|
||||||
|
4.3 --retry and transfer timeouts
|
||||||
|
|
||||||
|
If using --retry and the transfer timeouts (possibly due to using -m or
|
||||||
|
-y/-Y) the next attempt doesn't resume the transfer properly from what was
|
||||||
|
downloaded in the previous attempt but will truncate and restart at the
|
||||||
|
original position where it was at before the previous failed attempt. See
|
||||||
|
https://curl.haxx.se/mail/lib-2008-01/0080.html and Mandriva bug report
|
||||||
|
https://qa.mandriva.com/show_bug.cgi?id=22565
|
||||||
|
|
||||||
|
4.4 --upload-file . hangs if delay in STDIN
|
||||||
|
|
||||||
|
"(echo start; sleep 1; echo end) | curl --upload-file . http://mywebsite -vv"
|
||||||
|
|
||||||
|
... causes a hang when it shouldn't.
|
||||||
|
|
||||||
|
See https://github.com/curl/curl/issues/2051
|
||||||
|
|
||||||
|
4.5 Improve --data-urlencode space encoding
|
||||||
|
|
||||||
|
ASCII space characters in --data-urlencode are currently encoded as %20
|
||||||
|
rather than +, which RFC 1866 says should be used.
|
||||||
|
|
||||||
|
See https://github.com/curl/curl/issues/3229
|
||||||
|
|
||||||
|
5. Build and portability issues
|
||||||
|
|
||||||
|
5.2 curl-config --libs contains private details
|
||||||
|
|
||||||
|
"curl-config --libs" will include details set in LDFLAGS when configure is
|
||||||
|
run that might be needed only for building libcurl. Further, curl-config
|
||||||
|
--cflags suffers from the same effects with CFLAGS/CPPFLAGS.
|
||||||
|
|
||||||
|
5.3 curl compiled on OSX 10.13 failed to run on OSX 10.10
|
||||||
|
|
||||||
|
See https://github.com/curl/curl/issues/2905
|
||||||
|
|
||||||
|
5.4 Cannot compile against a static build of OpenLDAP
|
||||||
|
|
||||||
|
See https://github.com/curl/curl/issues/2367
|
||||||
|
|
||||||
|
5.5 can't handle Unicode arguments in Windows
|
||||||
|
|
||||||
|
If a URL or filename can't be encoded using the user's current codepage then
|
||||||
|
it can only be encoded properly in the Unicode character set. Windows uses
|
||||||
|
UTF-16 encoding for Unicode and stores it in wide characters, however curl
|
||||||
|
and libcurl are not equipped for that at the moment. And, except for Cygwin,
|
||||||
|
Windows can't use UTF-8 as a locale.
|
||||||
|
|
||||||
|
https://curl.haxx.se/bug/?i=345
|
||||||
|
https://curl.haxx.se/bug/?i=731
|
||||||
|
|
||||||
|
5.6 cmake support gaps
|
||||||
|
|
||||||
|
The cmake build setup lacks several features that the autoconf build
|
||||||
|
offers. This includes:
|
||||||
|
|
||||||
|
- use of correct soname for the shared library build
|
||||||
|
|
||||||
|
- support for several TLS backends are missing
|
||||||
|
|
||||||
|
- the unit tests cause link failures in regular non-static builds
|
||||||
|
|
||||||
|
- no nghttp2 check
|
||||||
|
|
||||||
|
- unusable tool_hugehelp.c with MinGW, see
|
||||||
|
https://github.com/curl/curl/issues/3125
|
||||||
|
|
||||||
|
5.7 Visual Studio project gaps
|
||||||
|
|
||||||
|
The Visual Studio projects lack some features that the autoconf and nmake
|
||||||
|
builds offer, such as the following:
|
||||||
|
|
||||||
|
- support for zlib and nghttp2
|
||||||
|
- use of static runtime libraries
|
||||||
|
- add the test suite components
|
||||||
|
|
||||||
|
In addition to this the following could be implemented:
|
||||||
|
|
||||||
|
- support for other development IDEs
|
||||||
|
- add PATH environment variables for third-party DLLs
|
||||||
|
|
||||||
|
5.8 configure finding libs in wrong directory
|
||||||
|
|
||||||
|
When the configure script checks for third-party libraries, it adds those
|
||||||
|
directories to the LDFLAGS variable and then tries linking to see if it
|
||||||
|
works. When successful, the found directory is kept in the LDFLAGS variable
|
||||||
|
when the script continues to execute and do more tests and possibly check for
|
||||||
|
more libraries.
|
||||||
|
|
||||||
|
This can make subsequent checks for libraries wrongly detect another
|
||||||
|
installation in a directory that was previously added to LDFLAGS by another
|
||||||
|
library check!
|
||||||
|
|
||||||
|
A possibly better way to do these checks would be to keep the pristine LDFLAGS
|
||||||
|
even after successful checks and instead add those verified paths to a
|
||||||
|
separate variable that only after all library checks have been performed gets
|
||||||
|
appended to LDFLAGS.
|
||||||
|
|
||||||
|
5.9 Utilize Requires.private directives in libcurl.pc
|
||||||
|
|
||||||
|
https://github.com/curl/curl/issues/864
|
||||||
|
|
||||||
|
6. Authentication
|
||||||
|
|
||||||
|
6.1 NTLM authentication and unicode
|
||||||
|
|
||||||
|
NTLM authentication involving unicode user name or password only works
|
||||||
|
properly if built with UNICODE defined together with the WinSSL/Schannel
|
||||||
|
backend. The original problem was mentioned in:
|
||||||
|
https://curl.haxx.se/mail/lib-2009-10/0024.html
|
||||||
|
https://curl.haxx.se/bug/view.cgi?id=896
|
||||||
|
|
||||||
|
The WinSSL/Schannel version verified to work as mentioned in
|
||||||
|
https://curl.haxx.se/mail/lib-2012-07/0073.html
|
||||||
|
|
||||||
|
6.2 MIT Kerberos for Windows build
|
||||||
|
|
||||||
|
libcurl fails to build with MIT Kerberos for Windows (KfW) due to KfW's
|
||||||
|
library header files exporting symbols/macros that should be kept private to
|
||||||
|
the KfW library. See ticket #5601 at https://krbdev.mit.edu/rt/
|
||||||
|
|
||||||
|
6.3 NTLM in system context uses wrong name
|
||||||
|
|
||||||
|
NTLM authentication using SSPI (on Windows) when (lib)curl is running in
|
||||||
|
"system context" will make it use wrong(?) user name - at least when compared
|
||||||
|
to what winhttp does. See https://curl.haxx.se/bug/view.cgi?id=535
|
||||||
|
|
||||||
|
6.4 Negotiate and Kerberos V5 need a fake user name
|
||||||
|
|
||||||
|
In order to get Negotiate (SPNEGO) authentication to work in HTTP or Kerberos
|
||||||
|
V5 in the e-mail protocols, you need to provide a (fake) user name (this
|
||||||
|
concerns both curl and the lib) because the code wrongly only considers
|
||||||
|
authentication if there's a user name provided by setting
|
||||||
|
conn->bits.user_passwd in url.c https://curl.haxx.se/bug/view.cgi?id=440 How?
|
||||||
|
https://curl.haxx.se/mail/lib-2004-08/0182.html A possible solution is to
|
||||||
|
either modify this variable to be set or introduce a variable such as
|
||||||
|
new conn->bits.want_authentication which is set when any of the authentication
|
||||||
|
options are set.
|
||||||
|
|
||||||
|
6.5 NTLM doesn't support password with § character
|
||||||
|
|
||||||
|
https://github.com/curl/curl/issues/2120
|
||||||
|
|
||||||
|
6.6 libcurl can fail to try alternatives with --proxy-any
|
||||||
|
|
||||||
|
When connecting via a proxy using --proxy-any, a failure to establish an
|
||||||
|
authentication will cause libcurl to abort trying other options if the
|
||||||
|
failed method has a higher preference than the alternatives. As an example,
|
||||||
|
--proxy-any against a proxy which advertise Negotiate and NTLM, but which
|
||||||
|
fails to set up Kerberos authentication won't proceed to try authentication
|
||||||
|
using NTLM.
|
||||||
|
|
||||||
|
https://github.com/curl/curl/issues/876
|
||||||
|
|
||||||
|
7. FTP
|
||||||
|
|
||||||
|
7.1 FTP without or slow 220 response
|
||||||
|
|
||||||
|
If a connection is made to a FTP server but the server then just never sends
|
||||||
|
the 220 response or otherwise is dead slow, libcurl will not acknowledge the
|
||||||
|
connection timeout during that phase but only the "real" timeout - which may
|
||||||
|
surprise users as it is probably considered to be the connect phase to most
|
||||||
|
people. Brought up (and is being misunderstood) in:
|
||||||
|
https://curl.haxx.se/bug/view.cgi?id=856
|
||||||
|
|
||||||
|
7.2 FTP with CONNECT and slow server
|
||||||
|
|
||||||
|
When doing FTP over a socks proxy or CONNECT through HTTP proxy and the multi
|
||||||
|
interface is used, libcurl will fail if the (passive) TCP connection for the
|
||||||
|
data transfer isn't more or less instant as the code does not properly wait
|
||||||
|
for the connect to be confirmed. See test case 564 for a first shot at a test
|
||||||
|
case.
|
||||||
|
|
||||||
|
7.3 FTP with NOBODY and FAILONERROR
|
||||||
|
|
||||||
|
It seems sensible to be able to use CURLOPT_NOBODY and CURLOPT_FAILONERROR
|
||||||
|
with FTP to detect if a file exists or not, but it is not working:
|
||||||
|
https://curl.haxx.se/mail/lib-2008-07/0295.html
|
||||||
|
|
||||||
|
7.4 FTP with ACCT
|
||||||
|
|
||||||
|
When doing an operation over FTP that requires the ACCT command (but not when
|
||||||
|
logging in), the operation will fail since libcurl doesn't detect this and
|
||||||
|
thus fails to issue the correct command:
|
||||||
|
https://curl.haxx.se/bug/view.cgi?id=635
|
||||||
|
|
||||||
|
7.5 ASCII FTP
|
||||||
|
|
||||||
|
FTP ASCII transfers do not follow RFC959. They don't convert the data
|
||||||
|
accordingly (not for sending nor for receiving). RFC 959 section 3.1.1.1
|
||||||
|
clearly describes how this should be done:
|
||||||
|
|
||||||
|
The sender converts the data from an internal character representation to
|
||||||
|
the standard 8-bit NVT-ASCII representation (see the Telnet
|
||||||
|
specification). The receiver will convert the data from the standard
|
||||||
|
form to his own internal form.
|
||||||
|
|
||||||
|
Since 7.15.4 at least line endings are converted.
|
||||||
|
|
||||||
|
7.6 FTP with NULs in URL parts
|
||||||
|
|
||||||
|
FTP URLs passed to curl may contain NUL (0x00) in the RFC 1738 <user>,
|
||||||
|
<password>, and <fpath> components, encoded as "%00". The problem is that
|
||||||
|
curl_unescape does not detect this, but instead returns a shortened C string.
|
||||||
|
From a strict FTP protocol standpoint, NUL is a valid character within RFC
|
||||||
|
959 <string>, so the way to handle this correctly in curl would be to use a
|
||||||
|
data structure other than a plain C string, one that can handle embedded NUL
|
||||||
|
characters. From a practical standpoint, most FTP servers would not
|
||||||
|
meaningfully support NUL characters within RFC 959 <string>, anyway (e.g.,
|
||||||
|
Unix pathnames may not contain NUL).
|
||||||
|
|
||||||
|
7.7 FTP and empty path parts in the URL
|
||||||
|
|
||||||
|
libcurl ignores empty path parts in FTP URLs, whereas RFC1738 states that
|
||||||
|
such parts should be sent to the server as 'CWD ' (without an argument). The
|
||||||
|
only exception to this rule, is that we knowingly break this if the empty
|
||||||
|
part is first in the path, as then we use the double slashes to indicate that
|
||||||
|
the user wants to reach the root dir (this exception SHALL remain even when
|
||||||
|
this bug is fixed).
|
||||||
|
|
||||||
|
7.8 Premature transfer end but healthy control channel
|
||||||
|
|
||||||
|
When 'multi_done' is called before the transfer has been completed the normal
|
||||||
|
way, it is considered a "premature" transfer end. In this situation, libcurl
|
||||||
|
closes the connection assuming it doesn't know the state of the connection so
|
||||||
|
it can't be reused for subsequent requests.
|
||||||
|
|
||||||
|
With FTP however, this isn't necessarily true but there are a bunch of
|
||||||
|
situations (listed in the ftp_done code) where it *could* keep the connection
|
||||||
|
alive even in this situation - but the current code doesn't. Fixing this would
|
||||||
|
allow libcurl to reuse FTP connections better.
|
||||||
|
|
||||||
|
7.9 Passive transfer tries only one IP address
|
||||||
|
|
||||||
|
When doing FTP operations through a proxy at localhost, the reported spotted
|
||||||
|
that curl only tried to connect once to the proxy, while it had multiple
|
||||||
|
addresses and a failed connect on one address should make it try the next.
|
||||||
|
|
||||||
|
After switching to passive mode (EPSV), curl should try all IP addresses for
|
||||||
|
"localhost". Currently it tries ::1, but it should also try 127.0.0.1.
|
||||||
|
|
||||||
|
See https://github.com/curl/curl/issues/1508
|
||||||
|
|
||||||
|
7.10 Stick to same family over SOCKS proxy
|
||||||
|
|
||||||
|
When asked to do FTP over a SOCKS proxy, it might connect to the proxy (and
|
||||||
|
then subsequently to the remote server) using for example IPv4. When doing
|
||||||
|
the second connection, curl should make sure that the second connection is
|
||||||
|
using the same IP protocol version as the first connection did and not try
|
||||||
|
others, since the remote server will only accept the same.
|
||||||
|
|
||||||
|
See https://curl.haxx.se/mail/archive-2018-07/0000.html
|
||||||
|
|
||||||
|
8. TELNET
|
||||||
|
|
||||||
|
8.1 TELNET and time limitations don't work
|
||||||
|
|
||||||
|
When using telnet, the time limitation options don't work.
|
||||||
|
https://curl.haxx.se/bug/view.cgi?id=846
|
||||||
|
|
||||||
|
8.2 Microsoft telnet server
|
||||||
|
|
||||||
|
There seems to be a problem when connecting to the Microsoft telnet server.
|
||||||
|
https://curl.haxx.se/bug/view.cgi?id=649
|
||||||
|
|
||||||
|
|
||||||
|
9. SFTP and SCP
|
||||||
|
|
||||||
|
9.1 SFTP doesn't do CURLOPT_POSTQUOTE correct
|
||||||
|
|
||||||
|
When libcurl sends CURLOPT_POSTQUOTE commands when connected to a SFTP server
|
||||||
|
using the multi interface, the commands are not being sent correctly and
|
||||||
|
instead the connection is "cancelled" (the operation is considered done)
|
||||||
|
prematurely. There is a half-baked (busy-looping) patch provided in the bug
|
||||||
|
report but it cannot be accepted as-is. See
|
||||||
|
https://curl.haxx.se/bug/view.cgi?id=748
|
||||||
|
|
||||||
|
|
||||||
|
10. SOCKS
|
||||||
|
|
||||||
|
10.1 SOCKS proxy connections are done blocking
|
||||||
|
|
||||||
|
Both SOCKS5 and SOCKS4 proxy connections are done blocking, which is very bad
|
||||||
|
when used with the multi interface.
|
||||||
|
|
||||||
|
10.2 SOCKS don't support timeouts
|
||||||
|
|
||||||
|
The SOCKS4 connection codes don't properly acknowledge (connect) timeouts.
|
||||||
|
According to bug #1556528, even the SOCKS5 connect code does not do it right:
|
||||||
|
https://curl.haxx.se/bug/view.cgi?id=604
|
||||||
|
|
||||||
|
When connecting to a SOCK proxy, the (connect) timeout is not properly
|
||||||
|
acknowledged after the actual TCP connect (during the SOCKS "negotiate"
|
||||||
|
phase).
|
||||||
|
|
||||||
|
10.3 FTPS over SOCKS
|
||||||
|
|
||||||
|
libcurl doesn't support FTPS over a SOCKS proxy.
|
||||||
|
|
||||||
|
10.4 active FTP over a SOCKS
|
||||||
|
|
||||||
|
libcurl doesn't support active FTP over a SOCKS proxy
|
||||||
|
|
||||||
|
|
||||||
|
11. Internals
|
||||||
|
|
||||||
|
11.1 Curl leaks .onion hostnames in DNS
|
||||||
|
|
||||||
|
Curl sends DNS requests for hostnames with a .onion TLD. This leaks
|
||||||
|
information about what the user is attempting to access, and violates this
|
||||||
|
requirement of RFC7686: https://tools.ietf.org/html/rfc7686
|
||||||
|
|
||||||
|
Issue: https://github.com/curl/curl/issues/543
|
||||||
|
|
||||||
|
11.2 error buffer not set if connection to multiple addresses fails
|
||||||
|
|
||||||
|
If you ask libcurl to resolve a hostname like example.com to IPv6 addresses
|
||||||
|
only. But you only have IPv4 connectivity. libcurl will correctly fail with
|
||||||
|
CURLE_COULDNT_CONNECT. But the error buffer set by CURLOPT_ERRORBUFFER
|
||||||
|
remains empty. Issue: https://github.com/curl/curl/issues/544
|
||||||
|
|
||||||
|
11.3 c-ares deviates from stock resolver on http://1346569778
|
||||||
|
|
||||||
|
When using the socket resolvers, that URL becomes:
|
||||||
|
|
||||||
|
* Rebuilt URL to: http://1346569778/
|
||||||
|
* Trying 80.67.6.50...
|
||||||
|
|
||||||
|
but with c-ares it instead says "Could not resolve: 1346569778 (Domain name
|
||||||
|
not found)"
|
||||||
|
|
||||||
|
See https://github.com/curl/curl/issues/893
|
||||||
|
|
||||||
|
11.4 HTTP test server 'connection-monitor' problems
|
||||||
|
|
||||||
|
The 'connection-monitor' feature of the sws HTTP test server doesn't work
|
||||||
|
properly if some tests are run in unexpected order. Like 1509 and then 1525.
|
||||||
|
|
||||||
|
See https://github.com/curl/curl/issues/868
|
||||||
|
|
||||||
|
11.5 Connection information when using TCP Fast Open
|
||||||
|
|
||||||
|
CURLINFO_LOCAL_PORT (and possibly a few other) fails when TCP Fast Open is
|
||||||
|
enabled.
|
||||||
|
|
||||||
|
See https://github.com/curl/curl/issues/1332
|
||||||
|
|
||||||
|
11.6 slow connect to localhost on Windows
|
||||||
|
|
||||||
|
When connecting to "localhost" on Windows, curl will resolve the name for
|
||||||
|
both ipv4 and ipv6 and try to connect to both happy eyeballs-style. Something
|
||||||
|
in there does however make it take 200 milliseconds to succeed - which is the
|
||||||
|
HAPPY_EYEBALLS_TIMEOUT define exactly. Lowering that define speeds up the
|
||||||
|
connection, suggesting a problem in the HE handling.
|
||||||
|
|
||||||
|
If we can *know* that we're talking to a local host, we should lower the
|
||||||
|
happy eyeballs delay timeout for IPv6 (related: hardcode the "localhost"
|
||||||
|
addresses, mentioned in TODO). Possibly we should reduce that delay for all.
|
||||||
|
|
||||||
|
https://github.com/curl/curl/issues/2281
|
||||||
|
|
||||||
|
12. LDAP and OpenLDAP
|
||||||
|
|
||||||
|
12.1 OpenLDAP hangs after returning results
|
||||||
|
|
||||||
|
By configuration defaults, openldap automatically chase referrals on
|
||||||
|
secondary socket descriptors. The OpenLDAP backend is asynchronous and thus
|
||||||
|
should monitor all socket descriptors involved. Currently, these secondary
|
||||||
|
descriptors are not monitored, causing openldap library to never receive
|
||||||
|
data from them.
|
||||||
|
|
||||||
|
As a temporary workaround, disable referrals chasing by configuration.
|
||||||
|
|
||||||
|
The fix is not easy: proper automatic referrals chasing requires a
|
||||||
|
synchronous bind callback and monitoring an arbitrary number of socket
|
||||||
|
descriptors for a single easy handle (currently limited to 5).
|
||||||
|
|
||||||
|
Generic LDAP is synchronous: OK.
|
||||||
|
|
||||||
|
See https://github.com/curl/curl/issues/622 and
|
||||||
|
https://curl.haxx.se/mail/lib-2016-01/0101.html
|
||||||
|
|
||||||
|
|
||||||
|
13. TCP/IP
|
||||||
|
|
||||||
|
13.1 --interface for ipv6 binds to unusable IP address
|
||||||
|
|
||||||
|
Since IPv6 provides a lot of addresses with different scope, binding to an
|
||||||
|
IPv6 address needs to take the proper care so that it doesn't bind to a
|
||||||
|
locally scoped address as that is bound to fail.
|
||||||
|
|
||||||
|
https://github.com/curl/curl/issues/686
|
||||||
|
|
||||||
|
14. DICT
|
||||||
|
|
||||||
|
14.1 DICT responses show the underlying protocol
|
||||||
|
|
||||||
|
When getting a DICT response, the protocol parts of DICT aren't stripped off
|
||||||
|
from the output.
|
||||||
|
|
||||||
|
https://github.com/curl/curl/issues/1809
|
||||||
123
bin/curl/docs/LICENSE-MIXING.md
Normal file
123
bin/curl/docs/LICENSE-MIXING.md
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
License Mixing
|
||||||
|
==============
|
||||||
|
|
||||||
|
libcurl can be built to use a fair amount of various third party libraries,
|
||||||
|
libraries that are written and provided by other parties that are distributed
|
||||||
|
using their own licenses. Even libcurl itself contains code that may cause
|
||||||
|
problems to some. This document attempts to describe what licenses libcurl and
|
||||||
|
the other libraries use and what possible dilemmas linking and mixing them all
|
||||||
|
can lead to for end users.
|
||||||
|
|
||||||
|
I am not a lawyer and this is not legal advice!
|
||||||
|
|
||||||
|
One common dilemma is that [GPL](https://www.gnu.org/licenses/gpl.html)
|
||||||
|
licensed code is not allowed to be linked with code licensed under the
|
||||||
|
[Original BSD license](https://spdx.org/licenses/BSD-4-Clause.html) (with the
|
||||||
|
announcement clause). You may still build your own copies that use them all,
|
||||||
|
but distributing them as binaries would be to violate the GPL license - unless
|
||||||
|
you accompany your license with an
|
||||||
|
[exception](https://www.gnu.org/licenses/gpl-faq.html#GPLIncompatibleLibs). This
|
||||||
|
particular problem was addressed when the [Modified BSD
|
||||||
|
license](https://opensource.org/licenses/BSD-3-Clause) was created, which does
|
||||||
|
not have the announcement clause that collides with GPL.
|
||||||
|
|
||||||
|
## libcurl
|
||||||
|
|
||||||
|
Uses an [MIT style license](https://curl.haxx.se/docs/copyright.html) that is
|
||||||
|
very liberal.
|
||||||
|
|
||||||
|
## OpenSSL
|
||||||
|
|
||||||
|
(May be used for SSL/TLS support) Uses an Original BSD-style license with an
|
||||||
|
announcement clause that makes it "incompatible" with GPL. You are not
|
||||||
|
allowed to ship binaries that link with OpenSSL that includes GPL code
|
||||||
|
(unless that specific GPL code includes an exception for OpenSSL - a habit
|
||||||
|
that is growing more and more common). If OpenSSL's licensing is a problem
|
||||||
|
for you, consider using another TLS library.
|
||||||
|
|
||||||
|
## GnuTLS
|
||||||
|
|
||||||
|
(May be used for SSL/TLS support) Uses the
|
||||||
|
[LGPL](https://www.gnu.org/licenses/lgpl.html) license. If this is a problem
|
||||||
|
for you, consider using another TLS library. Also note that GnuTLS itself
|
||||||
|
depends on and uses other libs (libgcrypt and libgpg-error) and they too are
|
||||||
|
LGPL- or GPL-licensed.
|
||||||
|
|
||||||
|
## WolfSSL
|
||||||
|
|
||||||
|
(May be used for SSL/TLS support) Uses the GPL license or a proprietary
|
||||||
|
license. If this is a problem for you, consider using another TLS library.
|
||||||
|
|
||||||
|
## NSS
|
||||||
|
|
||||||
|
(May be used for SSL/TLS support) Is covered by the
|
||||||
|
[MPL](https://www.mozilla.org/MPL/) license, the GPL license and the LGPL
|
||||||
|
license. You may choose to license the code under MPL terms, GPL terms, or
|
||||||
|
LGPL terms. These licenses grant you different permissions and impose
|
||||||
|
different obligations. You should select the license that best meets your
|
||||||
|
needs.
|
||||||
|
|
||||||
|
## mbedTLS
|
||||||
|
|
||||||
|
(May be used for SSL/TLS support) Uses the [Apache 2.0
|
||||||
|
license](https://opensource.org/licenses/Apache-2.0) or the GPL license.
|
||||||
|
You may choose to license the code under Apache 2.0 terms or GPL terms.
|
||||||
|
These licenses grant you different permissions and impose different
|
||||||
|
obligations. You should select the license that best meets your needs.
|
||||||
|
|
||||||
|
## BoringSSL
|
||||||
|
|
||||||
|
(May be used for SSL/TLS support) As an OpenSSL fork, it has the same
|
||||||
|
license as that.
|
||||||
|
|
||||||
|
## libressl
|
||||||
|
|
||||||
|
(May be used for SSL/TLS support) As an OpenSSL fork, it has the same
|
||||||
|
license as that.
|
||||||
|
|
||||||
|
## c-ares
|
||||||
|
|
||||||
|
(Used for asynchronous name resolves) Uses an MIT license that is very
|
||||||
|
liberal and imposes no restrictions on any other library or part you may link
|
||||||
|
with.
|
||||||
|
|
||||||
|
## zlib
|
||||||
|
|
||||||
|
(Used for compressed Transfer-Encoding support) Uses an MIT-style license
|
||||||
|
that shouldn't collide with any other library.
|
||||||
|
|
||||||
|
## MIT Kerberos
|
||||||
|
|
||||||
|
(May be used for GSS support) MIT licensed, that shouldn't collide with any
|
||||||
|
other parts.
|
||||||
|
|
||||||
|
## Heimdal
|
||||||
|
|
||||||
|
(May be used for GSS support) Heimdal is Original BSD licensed with the
|
||||||
|
announcement clause.
|
||||||
|
|
||||||
|
## GNU GSS
|
||||||
|
|
||||||
|
(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 curl to also link
|
||||||
|
and use any Original BSD licensed libraries!
|
||||||
|
|
||||||
|
## libidn
|
||||||
|
|
||||||
|
(Used for IDNA support) Uses the GNU Lesser General Public License [3]. LGPL
|
||||||
|
is a variation of GPL with slightly less aggressive "copyleft". This license
|
||||||
|
requires more requirements to be met when distributing binaries, see the
|
||||||
|
license for details. Also note that if you distribute a binary that includes
|
||||||
|
this library, you must also include the full LGPL license text. Please
|
||||||
|
properly point out what parts of the distributed package that the license
|
||||||
|
addresses.
|
||||||
|
|
||||||
|
## OpenLDAP
|
||||||
|
|
||||||
|
(Used for LDAP support) Uses a Modified BSD-style license. Since libcurl uses
|
||||||
|
OpenLDAP as a shared library only, I have not heard of anyone that ships
|
||||||
|
OpenLDAP linked with libcurl in an app.
|
||||||
|
|
||||||
|
## libssh2
|
||||||
|
|
||||||
|
(Used for scp and sftp support) libssh2 uses a Modified BSD-style license.
|
||||||
285
bin/curl/docs/MAIL-ETIQUETTE.txt
Normal file
285
bin/curl/docs/MAIL-ETIQUETTE.txt
Normal file
@@ -0,0 +1,285 @@
|
|||||||
|
_ _ ____ _
|
||||||
|
___| | | | _ \| |
|
||||||
|
/ __| | | | |_) | |
|
||||||
|
| (__| |_| | _ <| |___
|
||||||
|
\___|\___/|_| \_\_____|
|
||||||
|
|
||||||
|
MAIL ETIQUETTE
|
||||||
|
|
||||||
|
1. About the lists
|
||||||
|
1.1 Mailing Lists
|
||||||
|
1.2 Netiquette
|
||||||
|
1.3 Do Not Mail a Single Individual
|
||||||
|
1.4 Subscription Required
|
||||||
|
1.5 Moderation of new posters
|
||||||
|
1.6 Handling trolls and spam
|
||||||
|
1.7 How to unsubscribe
|
||||||
|
1.8 I posted, now what?
|
||||||
|
1.9 Your emails are public
|
||||||
|
|
||||||
|
2. Sending mail
|
||||||
|
2.1 Reply or New Mail
|
||||||
|
2.2 Reply to the List
|
||||||
|
2.3 Use a Sensible Subject
|
||||||
|
2.4 Do Not Top-Post
|
||||||
|
2.5 HTML is not for mails
|
||||||
|
2.6 Quoting
|
||||||
|
2.7 Digest
|
||||||
|
2.8 Please Tell Us How You Solved The Problem!
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
|
||||||
|
1. About the lists
|
||||||
|
|
||||||
|
1.1 Mailing Lists
|
||||||
|
|
||||||
|
The mailing lists we have are all listed and described at
|
||||||
|
https://curl.haxx.se/mail/
|
||||||
|
|
||||||
|
Each mailing list is targeted to a specific set of users and subjects,
|
||||||
|
please use the one or the ones that suit you the most.
|
||||||
|
|
||||||
|
Each mailing list has hundreds up to thousands of readers, meaning that
|
||||||
|
each mail sent will be received and read by a very large number of people.
|
||||||
|
People from various cultures, regions, religions and continents.
|
||||||
|
|
||||||
|
1.2 Netiquette
|
||||||
|
|
||||||
|
Netiquette is a common term for how to behave on the internet. Of course, in
|
||||||
|
each particular group and subculture there will be differences in what is
|
||||||
|
acceptable and what is considered good manners.
|
||||||
|
|
||||||
|
This document outlines what we in the curl project consider to be good
|
||||||
|
etiquette, and primarily this focus on how to behave on and how to use our
|
||||||
|
mailing lists.
|
||||||
|
|
||||||
|
1.3 Do Not Mail a Single Individual
|
||||||
|
|
||||||
|
Many people send one question to one person. One person gets many mails, and
|
||||||
|
there is only one person who can give you a reply. The question may be
|
||||||
|
something that other people would also like to ask. These other people have
|
||||||
|
no way to read the reply, but to ask the one person the question. The one
|
||||||
|
person consequently gets overloaded with mail.
|
||||||
|
|
||||||
|
If you really want to contact an individual and perhaps pay for his or her
|
||||||
|
services, by all means go ahead, but if it's just another curl question,
|
||||||
|
take it to a suitable list instead.
|
||||||
|
|
||||||
|
1.4 Subscription Required
|
||||||
|
|
||||||
|
All curl mailing lists require that you are subscribed to allow a mail to go
|
||||||
|
through to all the subscribers.
|
||||||
|
|
||||||
|
If you post without being subscribed (or from a different mail address than
|
||||||
|
the one you are subscribed with), your mail will simply be silently
|
||||||
|
discarded. You have to subscribe first, then post.
|
||||||
|
|
||||||
|
The reason for this unfortunate and strict subscription policy is of course
|
||||||
|
to stop spam from pestering the lists.
|
||||||
|
|
||||||
|
1.5 Moderation of new posters
|
||||||
|
|
||||||
|
Several of the curl mailing lists automatically make all posts from new
|
||||||
|
subscribers be moderated. This means that after you've subscribed and
|
||||||
|
sent your first mail to a list, that mail will not be let through to the
|
||||||
|
list until a mailing list administrator has verified that it is OK and
|
||||||
|
permits it to get posted.
|
||||||
|
|
||||||
|
Once a first post has been made that proves the sender is actually talking
|
||||||
|
about curl-related subjects, the moderation "flag" will be switched off and
|
||||||
|
future posts will go through without being moderated.
|
||||||
|
|
||||||
|
The reason for this moderation policy is that we do suffer from spammers who
|
||||||
|
actually subscribe and send spam to our lists.
|
||||||
|
|
||||||
|
1.6 Handling trolls and spam
|
||||||
|
|
||||||
|
Despite our good intentions and hard work to keep spam off the lists and to
|
||||||
|
maintain a friendly and positive atmosphere, there will be times when spam
|
||||||
|
and or trolls get through.
|
||||||
|
|
||||||
|
Troll - "someone who posts inflammatory, extraneous, or off-topic messages
|
||||||
|
in an online community"
|
||||||
|
|
||||||
|
Spam - "use of electronic messaging systems to send unsolicited bulk
|
||||||
|
messages"
|
||||||
|
|
||||||
|
No matter what, we NEVER EVER respond to trolls or spammers on the list. If
|
||||||
|
you believe the list admin should do something in particular, contact him/her
|
||||||
|
off-list. The subject will be taken care of as much as possible to prevent
|
||||||
|
repeated offenses, but responding on the list to such messages never leads to
|
||||||
|
anything good and only puts the light even more on the offender: which was
|
||||||
|
the entire purpose of it getting sent to the list in the first place.
|
||||||
|
|
||||||
|
Don't feed the trolls!
|
||||||
|
|
||||||
|
1.7 How to unsubscribe
|
||||||
|
|
||||||
|
You can unsubscribe the same way you subscribed in the first place. You go
|
||||||
|
to the page for the particular mailing list you're subscribed to and you enter
|
||||||
|
your email address and password and press the unsubscribe button.
|
||||||
|
|
||||||
|
Also, the instructions to unsubscribe are included in the headers of every
|
||||||
|
mail that is sent out to all curl related mailing lists and there's a footer
|
||||||
|
in each mail that links to the "admin" page on which you can unsubscribe and
|
||||||
|
change other options.
|
||||||
|
|
||||||
|
You NEVER EVER email the mailing list requesting someone else to take you off
|
||||||
|
the list.
|
||||||
|
|
||||||
|
1.8 I posted, now what?
|
||||||
|
|
||||||
|
If you aren't subscribed with the exact same email address that you used to
|
||||||
|
send the email, your post will just be silently discarded.
|
||||||
|
|
||||||
|
If you posted for the first time to the mailing list, you first need to wait
|
||||||
|
for an administrator to allow your email to go through (moderated). This normally
|
||||||
|
happens very quickly but in case we're asleep, you may have to wait a few
|
||||||
|
hours.
|
||||||
|
|
||||||
|
Once your email goes through it is sent out to several hundred or even
|
||||||
|
thousands of recipients. Your email may cover an area that not that many people
|
||||||
|
know about or are interested in. Or possibly the person who knows about it
|
||||||
|
is on vacation or under a very heavy work load right now. You may have to wait
|
||||||
|
for a response and you should not expect to get a response at all, but
|
||||||
|
hopefully you get an answer within a couple of days.
|
||||||
|
|
||||||
|
You do yourself and all of us a service when you include as many details as
|
||||||
|
possible already in your first email. Mention your operating system and
|
||||||
|
environment. Tell us which curl version you're using and tell us what you
|
||||||
|
did, what happened and what you expected would happen. Preferably, show us
|
||||||
|
what you did with details enough to allow others to help point out the problem
|
||||||
|
or repeat the same steps in their locations.
|
||||||
|
|
||||||
|
Failing to include details will only delay responses and make people respond
|
||||||
|
and ask for more details and you will have to send a follow-up email that
|
||||||
|
includes them.
|
||||||
|
|
||||||
|
Expect the responses to primarily help YOU debug the issue, or ask YOU
|
||||||
|
questions that can lead you or others towards a solution or explanation to
|
||||||
|
whatever you experience.
|
||||||
|
|
||||||
|
If you are a repeat offender to the guidelines outlined in this document,
|
||||||
|
chances are that people will ignore you at will and your chances to get
|
||||||
|
responses in the future will greatly diminish.
|
||||||
|
|
||||||
|
1.9 Your emails are public
|
||||||
|
|
||||||
|
Your email, its contents and all its headers and the details in those
|
||||||
|
headers will be received by every subscriber of the mailing list that you
|
||||||
|
send your email to.
|
||||||
|
|
||||||
|
Your email as sent to a curl mailing list will end up in mail archives, on
|
||||||
|
the curl web site and elsewhere, for others to see and read. Today and in
|
||||||
|
the future. In addition to the archives, the mail is sent out to thousands
|
||||||
|
of individuals. There is no way to undo a sent email.
|
||||||
|
|
||||||
|
When sending emails to a curl mailing list, do not include sensitive
|
||||||
|
information such as user names and passwords; use fake ones, temporary ones
|
||||||
|
or just remove them completely from the mail. Note that this includes base64
|
||||||
|
encoded HTTP Basic auth headers.
|
||||||
|
|
||||||
|
This public nature of the curl mailing lists makes automatically inserted mail
|
||||||
|
footers about mails being "private" or "only meant for the recipient" or
|
||||||
|
similar even more silly than usual. Because they are absolutely not private
|
||||||
|
when sent to a public mailing list.
|
||||||
|
|
||||||
|
|
||||||
|
2. Sending mail
|
||||||
|
|
||||||
|
2.1 Reply or New Mail
|
||||||
|
|
||||||
|
Please do not reply to an existing message as a short-cut to post a message
|
||||||
|
to the lists.
|
||||||
|
|
||||||
|
Many mail programs and web archivers use information within mails to keep
|
||||||
|
them together as "threads", as collections of posts that discuss a certain
|
||||||
|
subject. If you don't intend to reply on the same or similar subject, don't
|
||||||
|
just hit reply on an existing mail and change subject, create a new mail.
|
||||||
|
|
||||||
|
2.2 Reply to the List
|
||||||
|
|
||||||
|
When replying to a message from the list, make sure that you do "group
|
||||||
|
reply" or "reply to all", and not just reply to the author of the single
|
||||||
|
mail you reply to.
|
||||||
|
|
||||||
|
We're actively discouraging replying back to the single person by setting
|
||||||
|
the Reply-To: field in outgoing mails back to the mailing list address,
|
||||||
|
making it harder for people to mail the author directly, if only by mistake.
|
||||||
|
|
||||||
|
2.3 Use a Sensible Subject
|
||||||
|
|
||||||
|
Please use a subject of the mail that makes sense and that is related to the
|
||||||
|
contents of your mail. It makes it a lot easier to find your mail afterwards
|
||||||
|
and it makes it easier to track mail threads and topics.
|
||||||
|
|
||||||
|
2.4 Do Not Top-Post
|
||||||
|
|
||||||
|
If you reply to a message, don't use top-posting. Top-posting is when you
|
||||||
|
write the new text at the top of a mail and you insert the previous quoted
|
||||||
|
mail conversation below. It forces users to read the mail in a backwards
|
||||||
|
order to properly understand it.
|
||||||
|
|
||||||
|
This is why top posting is so bad (in top posting order):
|
||||||
|
|
||||||
|
A: Because it messes up the order in which people normally read text.
|
||||||
|
Q: Why is top-posting such a bad thing?
|
||||||
|
A: Top-posting.
|
||||||
|
Q: What is the most annoying thing in e-mail?
|
||||||
|
|
||||||
|
Apart from the screwed up read order (especially when mixed together in a
|
||||||
|
thread when someone responds using the mandated bottom-posting style), it
|
||||||
|
also makes it impossible to quote only parts of the original mail.
|
||||||
|
|
||||||
|
When you reply to a mail. You let the mail client insert the previous mail
|
||||||
|
quoted. Then you put the cursor on the first line of the mail and you move
|
||||||
|
down through the mail, deleting all parts of the quotes that don't add
|
||||||
|
context for your comments. When you want to add a comment you do so, inline,
|
||||||
|
right after the quotes that relate to your comment. Then you continue
|
||||||
|
downwards again.
|
||||||
|
|
||||||
|
When most of the quotes have been removed and you've added your own words,
|
||||||
|
you're done!
|
||||||
|
|
||||||
|
2.5 HTML is not for mails
|
||||||
|
|
||||||
|
Please switch off those HTML encoded messages. You can mail all those funny
|
||||||
|
mails to your friends. We speak plain text mails.
|
||||||
|
|
||||||
|
2.6 Quoting
|
||||||
|
|
||||||
|
Quote as little as possible. Just enough to provide the context you cannot
|
||||||
|
leave out. A lengthy description can be found here:
|
||||||
|
|
||||||
|
https://www.netmeister.org/news/learn2quote.html
|
||||||
|
|
||||||
|
2.7 Digest
|
||||||
|
|
||||||
|
We allow subscribers to subscribe to the "digest" version of the mailing
|
||||||
|
lists. A digest is a collection of mails lumped together in one single mail.
|
||||||
|
|
||||||
|
Should you decide to reply to a mail sent out as a digest, there are two
|
||||||
|
things you MUST consider if you really really cannot subscribe normally
|
||||||
|
instead:
|
||||||
|
|
||||||
|
Cut off all mails and chatter that is not related to the mail you want to
|
||||||
|
reply to.
|
||||||
|
|
||||||
|
Change the subject name to something sensible and related to the subject,
|
||||||
|
preferably even the actual subject of the single mail you wanted to reply to
|
||||||
|
|
||||||
|
2.8 Please Tell Us How You Solved The Problem!
|
||||||
|
|
||||||
|
Many people mail questions to the list, people spend some of their time and
|
||||||
|
make an effort in providing good answers to these questions.
|
||||||
|
|
||||||
|
If you are the one who asks, please consider responding once more in case
|
||||||
|
one of the hints was what solved your problems. The guys who write answers
|
||||||
|
feel good to know that they provided a good answer and that you fixed the
|
||||||
|
problem. Far too often, the person who asked the question is never heard from
|
||||||
|
again, and we never get to know if he/she is gone because the problem was
|
||||||
|
solved or perhaps because the problem was unsolvable!
|
||||||
|
|
||||||
|
Getting the solution posted also helps other users that experience the same
|
||||||
|
problem(s). They get to see (possibly in the web archives) that the
|
||||||
|
suggested fixes actually has helped at least one person.
|
||||||
12
bin/curl/docs/README.md
Normal file
12
bin/curl/docs/README.md
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|

|
||||||
|
|
||||||
|
# Documentation
|
||||||
|
|
||||||
|
You'll find a mix of various documentation in this directory and
|
||||||
|
subdirectories, using several different formats. Some of them are not ideal
|
||||||
|
for reading directly in your browser.
|
||||||
|
|
||||||
|
If you'd rather see the rendered version of the documentation, check out the
|
||||||
|
curl web site's [documentation section](https://curl.haxx.se/docs/) for
|
||||||
|
general curl stuff or the [libcurl section](https://curl.haxx.se/libcurl/) for
|
||||||
|
libcurl related documentation.
|
||||||
98
bin/curl/docs/RELEASE-PROCEDURE.md
Normal file
98
bin/curl/docs/RELEASE-PROCEDURE.md
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
curl release procedure - how to do a release
|
||||||
|
============================================
|
||||||
|
|
||||||
|
in the source code repo
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
- edit `RELEASE-NOTES` to be accurate
|
||||||
|
|
||||||
|
- update `docs/THANKS`
|
||||||
|
|
||||||
|
- make sure all relevant changes are committed on the master branch
|
||||||
|
|
||||||
|
- tag the git repo in this style: `git tag -a curl-7_34_0`. -a annotates the
|
||||||
|
tag and we use underscores instead of dots in the version number. Make sure
|
||||||
|
the tag is GPG signed (using -s).
|
||||||
|
|
||||||
|
- run "./maketgz 7.34.0" to build the release tarballs. It is important that
|
||||||
|
you run this on a machine with the correct set of autotools etc installed
|
||||||
|
as this is what then will be shipped and used by most users on \*nix like
|
||||||
|
systems.
|
||||||
|
|
||||||
|
- push the git commits and the new tag
|
||||||
|
|
||||||
|
- gpg sign the 4 tarballs as maketgz suggests
|
||||||
|
|
||||||
|
- upload the 8 resulting files to the primary download directory
|
||||||
|
|
||||||
|
in the curl-www repo
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
- edit `Makefile` (version number and date),
|
||||||
|
|
||||||
|
- edit `_newslog.html` (announce the new release) and
|
||||||
|
|
||||||
|
- edit `_changes.html` (insert changes+bugfixes from RELEASE-NOTES)
|
||||||
|
|
||||||
|
- commit all local changes
|
||||||
|
|
||||||
|
- tag the repo with the same name as used for the source repo.
|
||||||
|
|
||||||
|
- make sure all relevant changes are committed and pushed on the master branch
|
||||||
|
|
||||||
|
(the web site then updates its contents automatically)
|
||||||
|
|
||||||
|
on github
|
||||||
|
---------
|
||||||
|
|
||||||
|
- edit the newly made release tag so that it is listed as the latest release
|
||||||
|
|
||||||
|
inform
|
||||||
|
------
|
||||||
|
|
||||||
|
- send an email to curl-users, curl-announce and curl-library. Insert the
|
||||||
|
RELEASE-NOTES into the mail.
|
||||||
|
|
||||||
|
celebrate
|
||||||
|
---------
|
||||||
|
|
||||||
|
- suitable beverage intake is encouraged for the festivities
|
||||||
|
|
||||||
|
curl release scheduling
|
||||||
|
=======================
|
||||||
|
|
||||||
|
Basics
|
||||||
|
------
|
||||||
|
|
||||||
|
We do releases every 8 weeks on Wednesdays. If critical problems arise, we can
|
||||||
|
insert releases outside of the schedule or we can move the release date - but
|
||||||
|
this is very rare.
|
||||||
|
|
||||||
|
Each 8 week release cycle is split in two 4-week periods.
|
||||||
|
|
||||||
|
- During the first 4 weeks after a release, we allow new features and changes
|
||||||
|
to curl and libcurl. If we accept any such changes, we bump the minor number
|
||||||
|
used for the next release.
|
||||||
|
|
||||||
|
- During the second 4-week period we do not merge any features or changes, we
|
||||||
|
then only focus on fixing bugs and polishing things to make a solid coming
|
||||||
|
release.
|
||||||
|
|
||||||
|
Coming dates
|
||||||
|
------------
|
||||||
|
|
||||||
|
Based on the description above, here are some planned release dates (at the
|
||||||
|
time of this writing):
|
||||||
|
|
||||||
|
- May 22, 2019
|
||||||
|
- July 17, 2019
|
||||||
|
- September 11, 2019
|
||||||
|
- November 6, 2019
|
||||||
|
- January 8, 2020 (moved)
|
||||||
|
- February 27, 2020
|
||||||
|
- April 22, 2020
|
||||||
|
- June 17, 2020
|
||||||
|
|
||||||
|
The above (and more) curl-related dates are published in
|
||||||
|
[iCalendar format](https://calendar.google.com/calendar/ical/c9u5d64odop9js55oltfarjk6g%40group.calendar.google.com/public/basic.ics)
|
||||||
|
as well.
|
||||||
85
bin/curl/docs/RESOURCES.txt
Normal file
85
bin/curl/docs/RESOURCES.txt
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
_ _ ____ _
|
||||||
|
Project ___| | | | _ \| |
|
||||||
|
/ __| | | | |_) | |
|
||||||
|
| (__| |_| | _ <| |___
|
||||||
|
\___|\___/|_| \_\_____|
|
||||||
|
|
||||||
|
|
||||||
|
This document lists documents and standards used by curl.
|
||||||
|
|
||||||
|
RFC 959 - FTP Protocol
|
||||||
|
|
||||||
|
RFC 1635 - How to Use Anonymous FTP
|
||||||
|
|
||||||
|
RFC 1738 - Uniform Resource Locators
|
||||||
|
|
||||||
|
RFC 1777 - Lightweight Directory Access Protocol (LDAP)
|
||||||
|
|
||||||
|
RFC 1808 - Relative Uniform Resource Locators
|
||||||
|
|
||||||
|
RFC 1867 - Form-based File Upload in HTML
|
||||||
|
|
||||||
|
RFC 1950 - ZLIB Compressed Data Format Specification
|
||||||
|
|
||||||
|
RFC 1951 - DEFLATE Compressed Data Format Specification
|
||||||
|
|
||||||
|
RFC 1952 - GZIP File Format Specification
|
||||||
|
|
||||||
|
RFC 1959 - LDAP URL Syntax
|
||||||
|
|
||||||
|
RFC 2045-2049 - Everything you need to know about MIME! (needed for form
|
||||||
|
based upload)
|
||||||
|
|
||||||
|
RFC 2068 - HTTP 1.1 (obsoleted by RFC 2616)
|
||||||
|
|
||||||
|
RFC 2104 - Keyed-Hashing for Message Authentication
|
||||||
|
|
||||||
|
RFC 2109 - HTTP State Management Mechanism (cookie stuff)
|
||||||
|
- Also, read Netscape's specification at
|
||||||
|
https://curl.haxx.se/rfc/cookie_spec.html
|
||||||
|
|
||||||
|
RFC 2183 - The Content-Disposition Header Field
|
||||||
|
|
||||||
|
RFC 2195 - CRAM-MD5 Authentication
|
||||||
|
|
||||||
|
RFC 2229 - A Dictionary Server Protocol
|
||||||
|
|
||||||
|
RFC 2255 - Newer LDAP URL Format
|
||||||
|
|
||||||
|
RFC 2231 - MIME Parameter Value and Encoded Word Extensions:
|
||||||
|
Character Sets, Languages, and Continuations
|
||||||
|
|
||||||
|
RFC 2388 - "Returning Values from Forms: multipart/form-data"
|
||||||
|
Use this as an addition to the RFC1867
|
||||||
|
|
||||||
|
RFC 2396 - "Uniform Resource Identifiers: Generic Syntax and Semantics" This
|
||||||
|
one obsoletes RFC 1738, but since RFC 1738 is often mentioned
|
||||||
|
I've left it in this list.
|
||||||
|
|
||||||
|
RFC 2428 - FTP Extensions for IPv6 and NATs
|
||||||
|
|
||||||
|
RFC 2577 - FTP Security Considerations
|
||||||
|
|
||||||
|
RFC 2616 - HTTP 1.1, the latest
|
||||||
|
|
||||||
|
RFC 2617 - HTTP Authentication
|
||||||
|
|
||||||
|
RFC 2718 - Guidelines for new URL Schemes
|
||||||
|
|
||||||
|
RFC 2732 - Format for Literal IPv6 Addresses in URL's
|
||||||
|
|
||||||
|
RFC 2818 - HTTP Over TLS (TLS is the successor to SSL)
|
||||||
|
|
||||||
|
RFC 2821 - Simple Mail Transfer Protocol (SMTP)
|
||||||
|
|
||||||
|
RFC 2964 - Use of HTTP State Management
|
||||||
|
|
||||||
|
RFC 2965 - HTTP State Management Mechanism. Cookies. Obsoletes RFC2109
|
||||||
|
|
||||||
|
RFC 3207 - SMTP Over TLS
|
||||||
|
|
||||||
|
RFC 4616 - PLAIN Authentication
|
||||||
|
|
||||||
|
RFC 4954 - SMTP Authentication
|
||||||
|
|
||||||
|
RFC 7932 - Brotli Compressed Data Format
|
||||||
59
bin/curl/docs/ROADMAP.md
Normal file
59
bin/curl/docs/ROADMAP.md
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
curl the next few years - perhaps
|
||||||
|
=================================
|
||||||
|
|
||||||
|
Roadmap of things Daniel Stenberg wants to work on next. It is intended to
|
||||||
|
serve as a guideline for others for information, feedback and possible
|
||||||
|
participation.
|
||||||
|
|
||||||
|
HTTP/3
|
||||||
|
------
|
||||||
|
|
||||||
|
See the [QUIC and HTTP/3 wiki page](https://github.com/curl/curl/wiki/QUIC).
|
||||||
|
|
||||||
|
ESNI (Encrypted SNI)
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
See Daniel's post on [Support of Encrypted
|
||||||
|
SNI](https://curl.haxx.se/mail/lib-2019-03/0000.html) on the mailing list.
|
||||||
|
|
||||||
|
HSTS
|
||||||
|
----
|
||||||
|
|
||||||
|
Complete and merge [the existing PR](https://github.com/curl/curl/pull/2682).
|
||||||
|
|
||||||
|
Parallel transfers for the curl tool
|
||||||
|
------------------------------------
|
||||||
|
|
||||||
|
This will require several new command line options to enable and control.
|
||||||
|
|
||||||
|
1. switch to creating a list of all the transfers first before any transfer
|
||||||
|
is done
|
||||||
|
2. make the transfers using the multi interface
|
||||||
|
3. optionally fire up more transfers before the previous has completed
|
||||||
|
|
||||||
|
Option to refuse HTTPS => HTTP redirects
|
||||||
|
----------------------------------------
|
||||||
|
|
||||||
|
Possibly as a new bit to `CURLOPT_FOLLOWLOCATION` ?
|
||||||
|
|
||||||
|
Option to let CURLOPT_CUSTOMREQUEST be overridden on redirect
|
||||||
|
-------------------------------------------------------------
|
||||||
|
|
||||||
|
(This is a common problem for people using `-X` and `-L` together.)
|
||||||
|
|
||||||
|
Possibly as a new bit to `CURLOPT_FOLLOWLOCATION` ?
|
||||||
|
|
||||||
|
Hardcode “localhost”
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
No need to resolve it. Avoid a risk where this is resolved over the network
|
||||||
|
and actually responds with something else than a local address. Some operating
|
||||||
|
systems already do this. Also:
|
||||||
|
https://tools.ietf.org/html/draft-ietf-dnsop-let-localhost-be-localhost-02
|
||||||
|
|
||||||
|
Consider "menu config"-style build feature selection
|
||||||
|
----------------------------------------------------
|
||||||
|
|
||||||
|
Allow easier building of custom libcurl versions with only a selected feature
|
||||||
|
where the available features are easily browsable and toggle-able ON/OFF or
|
||||||
|
similar.
|
||||||
132
bin/curl/docs/SECURITY-PROCESS.md
Normal file
132
bin/curl/docs/SECURITY-PROCESS.md
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
curl security process
|
||||||
|
=====================
|
||||||
|
|
||||||
|
This document describes how security vulnerabilities should be handled in the
|
||||||
|
curl project.
|
||||||
|
|
||||||
|
Publishing Information
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
All known and public curl or libcurl related vulnerabilities are listed on
|
||||||
|
[the curl web site security page](https://curl.haxx.se/docs/security.html).
|
||||||
|
|
||||||
|
Security vulnerabilities **should not** be entered in the project's public bug
|
||||||
|
tracker.
|
||||||
|
|
||||||
|
Vulnerability Handling
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
The typical process for handling a new security vulnerability is as follows.
|
||||||
|
|
||||||
|
No information should be made public about a vulnerability until it is
|
||||||
|
formally announced at the end of this process. That means, for example that a
|
||||||
|
bug tracker entry must NOT be created to track the issue since that will make
|
||||||
|
the issue public and it should not be discussed on any of the project's public
|
||||||
|
mailing lists. Also messages associated with any commits should not make any
|
||||||
|
reference to the security nature of the commit if done prior to the public
|
||||||
|
announcement.
|
||||||
|
|
||||||
|
- The person discovering the issue, the reporter, reports the vulnerability on
|
||||||
|
[https://hackerone.com/curl](https://hackerone.com/curl). Issues filed there
|
||||||
|
reach a handful of selected and trusted people.
|
||||||
|
|
||||||
|
- Messages that do not relate to the reporting or managing of an undisclosed
|
||||||
|
security vulnerability in curl or libcurl are ignored and no further action
|
||||||
|
is required.
|
||||||
|
|
||||||
|
- A person in the security team responds to the original report to acknowledge
|
||||||
|
that a human has seen the report.
|
||||||
|
|
||||||
|
- The security team investigates the report and either rejects it or accepts
|
||||||
|
it.
|
||||||
|
|
||||||
|
- If the report is rejected, the team writes to the reporter to explain why.
|
||||||
|
|
||||||
|
- If the report is accepted, the team writes to the reporter to let him/her
|
||||||
|
know it is accepted and that they are working on a fix.
|
||||||
|
|
||||||
|
- The security team discusses the problem, works out a fix, considers the
|
||||||
|
impact of the problem and suggests a release schedule. This discussion
|
||||||
|
should involve the reporter as much as possible.
|
||||||
|
|
||||||
|
- The release of the information should be "as soon as possible" and is most
|
||||||
|
often synchronized with an upcoming release that contains the fix. If the
|
||||||
|
reporter, or anyone else involved, thinks the next planned release is too
|
||||||
|
far away, then a separate earlier release should be considered.
|
||||||
|
|
||||||
|
- Write a security advisory draft about the problem that explains what the
|
||||||
|
problem is, its impact, which versions it affects, solutions or workarounds,
|
||||||
|
when the release is out and make sure to credit all contributors properly.
|
||||||
|
Figure out the CWE (Common Weakness Enumeration) number for the flaw.
|
||||||
|
|
||||||
|
- Request a CVE number from
|
||||||
|
[HackerOne](https://docs.hackerone.com/programs/cve-requests.html)
|
||||||
|
|
||||||
|
- Consider informing
|
||||||
|
[distros@openwall](https://oss-security.openwall.org/wiki/mailing-lists/distros)
|
||||||
|
to prepare them about the upcoming public security vulnerability
|
||||||
|
announcement - attach the advisory draft for information. Note that
|
||||||
|
'distros' won't accept an embargo longer than 14 days and they do not care
|
||||||
|
for Windows-specific flaws.
|
||||||
|
|
||||||
|
- Update the "security advisory" with the CVE number.
|
||||||
|
|
||||||
|
- The security team commits the fix in a private branch. The commit message
|
||||||
|
should ideally contain the CVE number. This fix is usually also distributed
|
||||||
|
to the 'distros' mailing list to allow them to use the fix prior to the
|
||||||
|
public announcement.
|
||||||
|
|
||||||
|
- No more than 48 hours before the release, the private branch is merged into
|
||||||
|
the master branch and pushed. Once pushed, the information is accessible to
|
||||||
|
the public and the actual release should follow suit immediately afterwards.
|
||||||
|
The time between the push and the release is used for final tests and
|
||||||
|
reviews.
|
||||||
|
|
||||||
|
- The project team creates a release that includes the fix.
|
||||||
|
|
||||||
|
- The project team announces the release and the vulnerability to the world in
|
||||||
|
the same manner we always announce releases. It gets sent to the
|
||||||
|
curl-announce, curl-library and curl-users mailing lists.
|
||||||
|
|
||||||
|
- The security web page on the web site should get the new vulnerability
|
||||||
|
mentioned.
|
||||||
|
|
||||||
|
curl-security (at haxx dot se)
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
This is a private mailing list for discussions on and about curl security
|
||||||
|
issues.
|
||||||
|
|
||||||
|
Who is on this list? There are a couple of criteria you must meet, and then we
|
||||||
|
might ask you to join the list or you can ask to join it. It really isn't very
|
||||||
|
formal. We basically only require that you have a long-term presence in the
|
||||||
|
curl project and you have shown an understanding for the project and its way
|
||||||
|
of working. You must've been around for a good while and you should have no
|
||||||
|
plans in vanishing in the near future.
|
||||||
|
|
||||||
|
We do not make the list of participants public mostly because it tends to vary
|
||||||
|
somewhat over time and a list somewhere will only risk getting outdated.
|
||||||
|
|
||||||
|
Publishing Security Advisories
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
1. Write up the security advisory, using markdown syntax. Use the same
|
||||||
|
subtitles as last time to maintain consistency.
|
||||||
|
|
||||||
|
2. Name the advisory file after the allocated CVE id.
|
||||||
|
|
||||||
|
3. Add a line on the top of the array in `curl-www/docs/vuln.pm'.
|
||||||
|
|
||||||
|
4. Put the new advisory markdown file in the curl-www/docs/ directory. Add it
|
||||||
|
to the git repo.
|
||||||
|
|
||||||
|
5. Run `make` in your local web checkout and verify that things look fine.
|
||||||
|
|
||||||
|
6. On security advisory release day, push the changes on the curl-www
|
||||||
|
repository's remote master branch.
|
||||||
|
|
||||||
|
Bug Bounty
|
||||||
|
----------
|
||||||
|
|
||||||
|
See [BUG-BOUNTY](https://curl.haxx.se/docs/bugbounty.html) for details on the
|
||||||
|
bug bounty program.
|
||||||
87
bin/curl/docs/SSL-PROBLEMS.md
Normal file
87
bin/curl/docs/SSL-PROBLEMS.md
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
_ _ ____ _
|
||||||
|
___| | | | _ \| |
|
||||||
|
/ __| | | | |_) | |
|
||||||
|
| (__| |_| | _ <| |___
|
||||||
|
\___|\___/|_| \_\_____|
|
||||||
|
|
||||||
|
# SSL problems
|
||||||
|
|
||||||
|
First, let's establish that we often refer to TLS and SSL interchangeably as
|
||||||
|
SSL here. The current protocol is called TLS, it was called SSL a long time
|
||||||
|
ago.
|
||||||
|
|
||||||
|
There are several known reasons why a connection that involves SSL might
|
||||||
|
fail. This is a document that attempts to details the most common ones and
|
||||||
|
how to mitigate them.
|
||||||
|
|
||||||
|
## CA certs
|
||||||
|
|
||||||
|
CA certs are used to digitally verify the server's certificate. You need a
|
||||||
|
"ca bundle" for this. See lots of more details on this in the SSLCERTS
|
||||||
|
document.
|
||||||
|
|
||||||
|
## CA bundle missing intermediate certificates
|
||||||
|
|
||||||
|
When using said CA bundle to verify a server cert, you will experience
|
||||||
|
problems if your CA cert does not have the certificates for the
|
||||||
|
intermediates in the whole trust chain.
|
||||||
|
|
||||||
|
## Protocol version
|
||||||
|
|
||||||
|
Some broken servers fail to support the protocol negotiation properly that
|
||||||
|
SSL servers are supposed to handle. This may cause the connection to fail
|
||||||
|
completely. Sometimes you may need to explicitly select a SSL version to use
|
||||||
|
when connecting to make the connection succeed.
|
||||||
|
|
||||||
|
An additional complication can be that modern SSL libraries sometimes are
|
||||||
|
built with support for older SSL and TLS versions disabled!
|
||||||
|
|
||||||
|
All versions of SSL are considered insecure and should be avoided. Use TLS.
|
||||||
|
|
||||||
|
## Ciphers
|
||||||
|
|
||||||
|
Clients give servers a list of ciphers to select from. If the list doesn't
|
||||||
|
include any ciphers the server wants/can use, the connection handshake
|
||||||
|
fails.
|
||||||
|
|
||||||
|
curl has recently disabled the user of a whole bunch of seriously insecure
|
||||||
|
ciphers from its default set (slightly depending on SSL backend in use).
|
||||||
|
|
||||||
|
You may have to explicitly provide an alternative list of ciphers for curl
|
||||||
|
to use to allow the server to use a WEAK cipher for you.
|
||||||
|
|
||||||
|
Note that these weak ciphers are identified as flawed. For example, this
|
||||||
|
includes symmetric ciphers with less than 128 bit keys and RC4.
|
||||||
|
|
||||||
|
Schannel in Windows XP is not able to connect to servers that no longer
|
||||||
|
support the legacy handshakes and algorithms used by those versions, so we
|
||||||
|
advice against building curl to use Schannel on really old Windows versions.
|
||||||
|
|
||||||
|
References:
|
||||||
|
|
||||||
|
https://tools.ietf.org/html/draft-popov-tls-prohibiting-rc4-01
|
||||||
|
|
||||||
|
## Allow BEAST
|
||||||
|
|
||||||
|
BEAST is the name of a TLS 1.0 attack that surfaced 2011. When adding means
|
||||||
|
to mitigate this attack, it turned out that some broken servers out there in
|
||||||
|
the wild didn't work properly with the BEAST mitigation in place.
|
||||||
|
|
||||||
|
To make such broken servers work, the --ssl-allow-beast option was
|
||||||
|
introduced. Exactly as it sounds, it re-introduces the BEAST vulnerability
|
||||||
|
but on the other hand it allows curl to connect to that kind of strange
|
||||||
|
servers.
|
||||||
|
|
||||||
|
## Disabling certificate revocation checks
|
||||||
|
|
||||||
|
Some SSL backends may do certificate revocation checks (CRL, OCSP, etc)
|
||||||
|
depending on the OS or build configuration. The --ssl-no-revoke option was
|
||||||
|
introduced in 7.44.0 to disable revocation checking but currently is only
|
||||||
|
supported for Schannel (the native Windows SSL library), with an exception
|
||||||
|
in the case of Windows' Untrusted Publishers blacklist which it seems can't
|
||||||
|
be bypassed. This option may have broader support to accommodate other SSL
|
||||||
|
backends in the future.
|
||||||
|
|
||||||
|
References:
|
||||||
|
|
||||||
|
https://curl.haxx.se/docs/ssl-compared.html
|
||||||
173
bin/curl/docs/SSLCERTS.md
Normal file
173
bin/curl/docs/SSLCERTS.md
Normal file
@@ -0,0 +1,173 @@
|
|||||||
|
SSL Certificate Verification
|
||||||
|
============================
|
||||||
|
|
||||||
|
SSL is TLS
|
||||||
|
----------
|
||||||
|
|
||||||
|
SSL is the old name. It is called TLS these days.
|
||||||
|
|
||||||
|
|
||||||
|
Native SSL
|
||||||
|
----------
|
||||||
|
|
||||||
|
If libcurl was built with Schannel or Secure Transport support (the native SSL
|
||||||
|
libraries included in Windows and Mac OS X), then this does not apply to
|
||||||
|
you. Scroll down for details on how the OS-native engines handle SSL
|
||||||
|
certificates. If you're not sure, then run "curl -V" and read the results. If
|
||||||
|
the version string says "WinSSL" in it, then it was built with Schannel
|
||||||
|
support.
|
||||||
|
|
||||||
|
It is about trust
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
This system is about trust. In your local CA certificate store you have certs
|
||||||
|
from *trusted* Certificate Authorities that you then can use to verify that the
|
||||||
|
server certificates you see are valid. They're signed by one of the CAs you
|
||||||
|
trust.
|
||||||
|
|
||||||
|
Which CAs do you trust? You can decide to trust the same set of companies your
|
||||||
|
operating system trusts, or the set one of the known browsers trust. That's
|
||||||
|
basically trust via someone else you trust. You should just be aware that
|
||||||
|
modern operating systems and browsers are setup to trust *hundreds* of
|
||||||
|
companies and recent years several such CAs have been found untrustworthy.
|
||||||
|
|
||||||
|
Certificate Verification
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
libcurl performs peer SSL certificate verification by default. This is done
|
||||||
|
by using a CA certificate store that the SSL library can use to make sure the
|
||||||
|
peer's server certificate is valid.
|
||||||
|
|
||||||
|
If you communicate with HTTPS, FTPS or other TLS-using servers using
|
||||||
|
certificates that are signed by CAs present in the store, you can be sure
|
||||||
|
that the remote server really is the one it claims to be.
|
||||||
|
|
||||||
|
If the remote server uses a self-signed certificate, if you don't install a CA
|
||||||
|
cert store, if the server uses a certificate signed by a CA that isn't
|
||||||
|
included in the store you use or if the remote host is an impostor
|
||||||
|
impersonating your favorite site, and you want to transfer files from this
|
||||||
|
server, do one of the following:
|
||||||
|
|
||||||
|
1. Tell libcurl to *not* verify the peer. With libcurl you disable this with
|
||||||
|
`curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);`
|
||||||
|
|
||||||
|
With the curl command line tool, you disable this with -k/--insecure.
|
||||||
|
|
||||||
|
2. Get a CA certificate that can verify the remote server and use the proper
|
||||||
|
option to point out this CA cert for verification when connecting. For
|
||||||
|
libcurl hackers: `curl_easy_setopt(curl, CURLOPT_CAPATH, capath);`
|
||||||
|
|
||||||
|
With the curl command line tool: --cacert [file]
|
||||||
|
|
||||||
|
3. Add the CA cert for your server to the existing default CA certificate
|
||||||
|
store. The default CA certificate store can changed at compile time with the
|
||||||
|
following configure options:
|
||||||
|
|
||||||
|
--with-ca-bundle=FILE: use the specified file as CA certificate store. CA
|
||||||
|
certificates need to be concatenated in PEM format into this file.
|
||||||
|
|
||||||
|
--with-ca-path=PATH: use the specified path as CA certificate store. CA
|
||||||
|
certificates need to be stored as individual PEM files in this directory.
|
||||||
|
You may need to run c_rehash after adding files there.
|
||||||
|
|
||||||
|
If neither of the two options is specified, configure will try to auto-detect
|
||||||
|
a setting. It's also possible to explicitly not hardcode any default store
|
||||||
|
but rely on the built in default the crypto library may provide instead.
|
||||||
|
You can achieve that by passing both --without-ca-bundle and
|
||||||
|
--without-ca-path to the configure script.
|
||||||
|
|
||||||
|
If you use Internet Explorer, this is one way to get extract the CA cert
|
||||||
|
for a particular server:
|
||||||
|
|
||||||
|
- View the certificate by double-clicking the padlock
|
||||||
|
- Find out where the CA certificate is kept (Certificate>
|
||||||
|
Authority Information Access>URL)
|
||||||
|
- Get a copy of the crt file using curl
|
||||||
|
- Convert it from crt to PEM using the openssl tool:
|
||||||
|
openssl x509 -inform DES -in yourdownloaded.crt \
|
||||||
|
-out outcert.pem -text
|
||||||
|
- Add the 'outcert.pem' to the CA certificate store or use it stand-alone
|
||||||
|
as described below.
|
||||||
|
|
||||||
|
If you use the 'openssl' tool, this is one way to get extract the CA cert
|
||||||
|
for a particular server:
|
||||||
|
|
||||||
|
- `openssl s_client -showcerts -servername server -connect server:443 > cacert.pem`
|
||||||
|
- type "quit", followed by the "ENTER" key
|
||||||
|
- The certificate will have "BEGIN CERTIFICATE" and "END CERTIFICATE"
|
||||||
|
markers.
|
||||||
|
- If you want to see the data in the certificate, you can do: "openssl
|
||||||
|
x509 -inform PEM -in certfile -text -out certdata" where certfile is
|
||||||
|
the cert you extracted from logfile. Look in certdata.
|
||||||
|
- If you want to trust the certificate, you can add it to your CA
|
||||||
|
certificate store or use it stand-alone as described. Just remember that
|
||||||
|
the security is no better than the way you obtained the certificate.
|
||||||
|
|
||||||
|
4. If you're using the curl command line tool, you can specify your own CA
|
||||||
|
cert path by setting the environment variable `CURL_CA_BUNDLE` to the path
|
||||||
|
of your choice.
|
||||||
|
|
||||||
|
If you're using the curl command line tool on Windows, curl will search
|
||||||
|
for a CA cert file named "curl-ca-bundle.crt" in these directories and in
|
||||||
|
this order:
|
||||||
|
1. application's directory
|
||||||
|
2. current working directory
|
||||||
|
3. Windows System directory (e.g. C:\windows\system32)
|
||||||
|
4. Windows Directory (e.g. C:\windows)
|
||||||
|
5. all directories along %PATH%
|
||||||
|
|
||||||
|
5. Get a better/different/newer CA cert bundle! One option is to extract the
|
||||||
|
one a recent Firefox browser uses by running 'make ca-bundle' in the curl
|
||||||
|
build tree root, or possibly download a version that was generated this
|
||||||
|
way for you: [CA Extract](https://curl.haxx.se/docs/caextract.html)
|
||||||
|
|
||||||
|
Neglecting to use one of the above methods when dealing with a server using a
|
||||||
|
certificate that isn't signed by one of the certificates in the installed CA
|
||||||
|
certificate store, will cause SSL to report an error ("certificate verify
|
||||||
|
failed") during the handshake and SSL will then refuse further communication
|
||||||
|
with that server.
|
||||||
|
|
||||||
|
Certificate Verification with NSS
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
|
If libcurl was built with NSS support, then depending on the OS distribution,
|
||||||
|
it is probably required to take some additional steps to use the system-wide
|
||||||
|
CA cert db. RedHat ships with an additional module, libnsspem.so, which
|
||||||
|
enables NSS to read the OpenSSL PEM CA bundle. On openSUSE you can install
|
||||||
|
p11-kit-nss-trust which makes NSS use the system wide CA certificate store. NSS
|
||||||
|
also has a new [database format](https://wiki.mozilla.org/NSS_Shared_DB).
|
||||||
|
|
||||||
|
Starting with version 7.19.7, libcurl automatically adds the 'sql:' prefix to
|
||||||
|
the certdb directory (either the hardcoded default /etc/pki/nssdb or the
|
||||||
|
directory configured with SSL_DIR environment variable). To check which certdb
|
||||||
|
format your distribution provides, examine the default certdb location:
|
||||||
|
/etc/pki/nssdb; the new certdb format can be identified by the filenames
|
||||||
|
cert9.db, key4.db, pkcs11.txt; filenames of older versions are cert8.db,
|
||||||
|
key3.db, secmod.db.
|
||||||
|
|
||||||
|
Certificate Verification with Schannel and Secure Transport
|
||||||
|
-----------------------------------------------------------
|
||||||
|
|
||||||
|
If libcurl was built with Schannel (Microsoft's native TLS engine) or Secure
|
||||||
|
Transport (Apple's native TLS engine) support, then libcurl will still perform
|
||||||
|
peer certificate verification, but instead of using a CA cert bundle, it will
|
||||||
|
use the certificates that are built into the OS. These are the same
|
||||||
|
certificates that appear in the Internet Options control panel (under Windows)
|
||||||
|
or Keychain Access application (under OS X). Any custom security rules for
|
||||||
|
certificates will be honored.
|
||||||
|
|
||||||
|
Schannel will run CRL checks on certificates unless peer verification is
|
||||||
|
disabled. Secure Transport on iOS will run OCSP checks on certificates unless
|
||||||
|
peer verification is disabled. Secure Transport on OS X will run either OCSP
|
||||||
|
or CRL checks on certificates if those features are enabled, and this behavior
|
||||||
|
can be adjusted in the preferences of Keychain Access.
|
||||||
|
|
||||||
|
HTTPS proxy
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Since version 7.52.0, curl can do HTTPS to the proxy separately from the
|
||||||
|
connection to the server. This TLS connection is handled separately from the
|
||||||
|
server connection so instead of `--insecure` and `--cacert` to control the
|
||||||
|
certificate verification, you use `--proxy-insecure` and `--proxy-cacert`.
|
||||||
|
With these options, you make sure that the TLS connection and the trust of the
|
||||||
|
proxy can be kept totally separate from the TLS connection to the server.
|
||||||
1959
bin/curl/docs/THANKS.txt
Normal file
1959
bin/curl/docs/THANKS.txt
Normal file
File diff suppressed because it is too large
Load Diff
1324
bin/curl/docs/TODO.txt
Normal file
1324
bin/curl/docs/TODO.txt
Normal file
File diff suppressed because it is too large
Load Diff
758
bin/curl/docs/TheArtOfHttpScripting.txt
Normal file
758
bin/curl/docs/TheArtOfHttpScripting.txt
Normal file
@@ -0,0 +1,758 @@
|
|||||||
|
_ _ ____ _
|
||||||
|
___| | | | _ \| |
|
||||||
|
/ __| | | | |_) | |
|
||||||
|
| (__| |_| | _ <| |___
|
||||||
|
\___|\___/|_| \_\_____|
|
||||||
|
|
||||||
|
|
||||||
|
The Art Of Scripting HTTP Requests Using Curl
|
||||||
|
|
||||||
|
1. HTTP Scripting
|
||||||
|
1.1 Background
|
||||||
|
1.2 The HTTP Protocol
|
||||||
|
1.3 See the Protocol
|
||||||
|
1.4 See the Timing
|
||||||
|
1.5 See the Response
|
||||||
|
2. URL
|
||||||
|
2.1 Spec
|
||||||
|
2.2 Host
|
||||||
|
2.3 Port number
|
||||||
|
2.4 User name and password
|
||||||
|
2.5 Path part
|
||||||
|
3. Fetch a page
|
||||||
|
3.1 GET
|
||||||
|
3.2 HEAD
|
||||||
|
3.3 Multiple URLs in a single command line
|
||||||
|
3.4 Multiple HTTP methods in a single command line
|
||||||
|
4. HTML forms
|
||||||
|
4.1 Forms explained
|
||||||
|
4.2 GET
|
||||||
|
4.3 POST
|
||||||
|
4.4 File Upload POST
|
||||||
|
4.5 Hidden Fields
|
||||||
|
4.6 Figure Out What A POST Looks Like
|
||||||
|
5. HTTP upload
|
||||||
|
5.1 PUT
|
||||||
|
6. HTTP Authentication
|
||||||
|
6.1 Basic Authentication
|
||||||
|
6.2 Other Authentication
|
||||||
|
6.3 Proxy Authentication
|
||||||
|
6.4 Hiding credentials
|
||||||
|
7. More HTTP Headers
|
||||||
|
7.1 Referer
|
||||||
|
7.2 User Agent
|
||||||
|
8. Redirects
|
||||||
|
8.1 Location header
|
||||||
|
8.2 Other redirects
|
||||||
|
9. Cookies
|
||||||
|
9.1 Cookie Basics
|
||||||
|
9.2 Cookie options
|
||||||
|
10. HTTPS
|
||||||
|
10.1 HTTPS is HTTP secure
|
||||||
|
10.2 Certificates
|
||||||
|
11. Custom Request Elements
|
||||||
|
11.1 Modify method and headers
|
||||||
|
11.2 More on changed methods
|
||||||
|
12. Web Login
|
||||||
|
12.1 Some login tricks
|
||||||
|
13. Debug
|
||||||
|
13.1 Some debug tricks
|
||||||
|
14. References
|
||||||
|
14.1 Standards
|
||||||
|
14.2 Sites
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
|
||||||
|
1. HTTP Scripting
|
||||||
|
|
||||||
|
1.1 Background
|
||||||
|
|
||||||
|
This document assumes that you're familiar with HTML and general networking.
|
||||||
|
|
||||||
|
The increasing amount of applications moving to the web has made "HTTP
|
||||||
|
Scripting" more frequently requested and wanted. To be able to automatically
|
||||||
|
extract information from the web, to fake users, to post or upload data to
|
||||||
|
web servers are all important tasks today.
|
||||||
|
|
||||||
|
Curl is a command line tool for doing all sorts of URL manipulations and
|
||||||
|
transfers, but this particular document will focus on how to use it when
|
||||||
|
doing HTTP requests for fun and profit. I'll assume that you know how to
|
||||||
|
invoke 'curl --help' or 'curl --manual' to get basic information about it.
|
||||||
|
|
||||||
|
Curl is not written to do everything for you. It makes the requests, it gets
|
||||||
|
the data, it sends data and it retrieves the information. You probably need
|
||||||
|
to glue everything together using some kind of script language or repeated
|
||||||
|
manual invokes.
|
||||||
|
|
||||||
|
1.2 The HTTP Protocol
|
||||||
|
|
||||||
|
HTTP is the protocol used to fetch data from web servers. It is a very simple
|
||||||
|
protocol that is built upon TCP/IP. The protocol also allows information to
|
||||||
|
get sent to the server from the client using a few different methods, as will
|
||||||
|
be shown here.
|
||||||
|
|
||||||
|
HTTP is plain ASCII text lines being sent by the client to a server to
|
||||||
|
request a particular action, and then the server replies a few text lines
|
||||||
|
before the actual requested content is sent to the client.
|
||||||
|
|
||||||
|
The client, curl, sends a HTTP request. The request contains a method (like
|
||||||
|
GET, POST, HEAD etc), a number of request headers and sometimes a request
|
||||||
|
body. The HTTP server responds with a status line (indicating if things went
|
||||||
|
well), response headers and most often also a response body. The "body" part
|
||||||
|
is the plain data you requested, like the actual HTML or the image etc.
|
||||||
|
|
||||||
|
1.3 See the Protocol
|
||||||
|
|
||||||
|
Using curl's option --verbose (-v as a short option) will display what kind
|
||||||
|
of commands curl sends to the server, as well as a few other informational
|
||||||
|
texts.
|
||||||
|
|
||||||
|
--verbose is the single most useful option when it comes to debug or even
|
||||||
|
understand the curl<->server interaction.
|
||||||
|
|
||||||
|
Sometimes even --verbose is not enough. Then --trace and --trace-ascii offer
|
||||||
|
even more details as they show EVERYTHING curl sends and receives. Use it
|
||||||
|
like this:
|
||||||
|
|
||||||
|
curl --trace-ascii debugdump.txt http://www.example.com/
|
||||||
|
|
||||||
|
1.4 See the Timing
|
||||||
|
|
||||||
|
Many times you may wonder what exactly is taking all the time, or you just
|
||||||
|
want to know the amount of milliseconds between two points in a
|
||||||
|
transfer. For those, and other similar situations, the --trace-time option
|
||||||
|
is what you need. It'll prepend the time to each trace output line:
|
||||||
|
|
||||||
|
curl --trace-ascii d.txt --trace-time http://example.com/
|
||||||
|
|
||||||
|
1.5 See the Response
|
||||||
|
|
||||||
|
By default curl sends the response to stdout. You need to redirect it
|
||||||
|
somewhere to avoid that, most often that is done with -o or -O.
|
||||||
|
|
||||||
|
2. URL
|
||||||
|
|
||||||
|
2.1 Spec
|
||||||
|
|
||||||
|
The Uniform Resource Locator format is how you specify the address of a
|
||||||
|
particular resource on the Internet. You know these, you've seen URLs like
|
||||||
|
https://curl.haxx.se or https://yourbank.com a million times. RFC 3986 is the
|
||||||
|
canonical spec. And yeah, the formal name is not URL, it is URI.
|
||||||
|
|
||||||
|
2.2 Host
|
||||||
|
|
||||||
|
The host name is usually resolved using DNS or your /etc/hosts file to an IP
|
||||||
|
address and that's what curl will communicate with. Alternatively you specify
|
||||||
|
the IP address directly in the URL instead of a name.
|
||||||
|
|
||||||
|
For development and other trying out situations, you can point to a different
|
||||||
|
IP address for a host name than what would otherwise be used, by using curl's
|
||||||
|
--resolve option:
|
||||||
|
|
||||||
|
curl --resolve www.example.org:80:127.0.0.1 http://www.example.org/
|
||||||
|
|
||||||
|
2.3 Port number
|
||||||
|
|
||||||
|
Each protocol curl supports operates on a default port number, be it over TCP
|
||||||
|
or in some cases UDP. Normally you don't have to take that into
|
||||||
|
consideration, but at times you run test servers on other ports or
|
||||||
|
similar. Then you can specify the port number in the URL with a colon and a
|
||||||
|
number immediately following the host name. Like when doing HTTP to port
|
||||||
|
1234:
|
||||||
|
|
||||||
|
curl http://www.example.org:1234/
|
||||||
|
|
||||||
|
The port number you specify in the URL is the number that the server uses to
|
||||||
|
offer its services. Sometimes you may use a local proxy, and then you may
|
||||||
|
need to specify that proxy's port number separately for what curl needs to
|
||||||
|
connect to locally. Like when using a HTTP proxy on port 4321:
|
||||||
|
|
||||||
|
curl --proxy http://proxy.example.org:4321 http://remote.example.org/
|
||||||
|
|
||||||
|
2.4 User name and password
|
||||||
|
|
||||||
|
Some services are setup to require HTTP authentication and then you need to
|
||||||
|
provide name and password which is then transferred to the remote site in
|
||||||
|
various ways depending on the exact authentication protocol used.
|
||||||
|
|
||||||
|
You can opt to either insert the user and password in the URL or you can
|
||||||
|
provide them separately:
|
||||||
|
|
||||||
|
curl http://user:password@example.org/
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
curl -u user:password http://example.org/
|
||||||
|
|
||||||
|
You need to pay attention that this kind of HTTP authentication is not what
|
||||||
|
is usually done and requested by user-oriented web sites these days. They
|
||||||
|
tend to use forms and cookies instead.
|
||||||
|
|
||||||
|
2.5 Path part
|
||||||
|
|
||||||
|
The path part is just sent off to the server to request that it sends back
|
||||||
|
the associated response. The path is what is to the right side of the slash
|
||||||
|
that follows the host name and possibly port number.
|
||||||
|
|
||||||
|
3. Fetch a page
|
||||||
|
|
||||||
|
3.1 GET
|
||||||
|
|
||||||
|
The simplest and most common request/operation made using HTTP is to GET a
|
||||||
|
URL. The URL could itself refer to a web page, an image or a file. The client
|
||||||
|
issues a GET request to the server and receives the document it asked for.
|
||||||
|
If you issue the command line
|
||||||
|
|
||||||
|
curl https://curl.haxx.se
|
||||||
|
|
||||||
|
you get a web page returned in your terminal window. The entire HTML document
|
||||||
|
that that URL holds.
|
||||||
|
|
||||||
|
All HTTP replies contain a set of response headers that are normally hidden,
|
||||||
|
use curl's --include (-i) option to display them as well as the rest of the
|
||||||
|
document.
|
||||||
|
|
||||||
|
3.2 HEAD
|
||||||
|
|
||||||
|
You can ask the remote server for ONLY the headers by using the --head (-I)
|
||||||
|
option which will make curl issue a HEAD request. In some special cases
|
||||||
|
servers deny the HEAD method while others still work, which is a particular
|
||||||
|
kind of annoyance.
|
||||||
|
|
||||||
|
The HEAD method is defined and made so that the server returns the headers
|
||||||
|
exactly the way it would do for a GET, but without a body. It means that you
|
||||||
|
may see a Content-Length: in the response headers, but there must not be an
|
||||||
|
actual body in the HEAD response.
|
||||||
|
|
||||||
|
3.3 Multiple URLs in a single command line
|
||||||
|
|
||||||
|
A single curl command line may involve one or many URLs. The most common case
|
||||||
|
is probably to just use one, but you can specify any amount of URLs. Yes
|
||||||
|
any. No limits. You'll then get requests repeated over and over for all the
|
||||||
|
given URLs.
|
||||||
|
|
||||||
|
Example, send two GETs:
|
||||||
|
|
||||||
|
curl http://url1.example.com http://url2.example.com
|
||||||
|
|
||||||
|
If you use --data to POST to the URL, using multiple URLs means that you send
|
||||||
|
that same POST to all the given URLs.
|
||||||
|
|
||||||
|
Example, send two POSTs:
|
||||||
|
|
||||||
|
curl --data name=curl http://url1.example.com http://url2.example.com
|
||||||
|
|
||||||
|
|
||||||
|
3.4 Multiple HTTP methods in a single command line
|
||||||
|
|
||||||
|
Sometimes you need to operate on several URLs in a single command line and do
|
||||||
|
different HTTP methods on each. For this, you'll enjoy the --next option. It
|
||||||
|
is basically a separator that separates a bunch of options from the next. All
|
||||||
|
the URLs before --next will get the same method and will get all the POST
|
||||||
|
data merged into one.
|
||||||
|
|
||||||
|
When curl reaches the --next on the command line, it'll sort of reset the
|
||||||
|
method and the POST data and allow a new set.
|
||||||
|
|
||||||
|
Perhaps this is best shown with a few examples. To send first a HEAD and then
|
||||||
|
a GET:
|
||||||
|
|
||||||
|
curl -I http://example.com --next http://example.com
|
||||||
|
|
||||||
|
To first send a POST and then a GET:
|
||||||
|
|
||||||
|
curl -d score=10 http://example.com/post.cgi --next http://example.com/results.html
|
||||||
|
|
||||||
|
|
||||||
|
4. HTML forms
|
||||||
|
|
||||||
|
4.1 Forms explained
|
||||||
|
|
||||||
|
Forms are the general way a web site can present a HTML page with fields for
|
||||||
|
the user to enter data in, and then press some kind of 'OK' or 'Submit'
|
||||||
|
button to get that data sent to the server. The server then typically uses
|
||||||
|
the posted data to decide how to act. Like using the entered words to search
|
||||||
|
in a database, or to add the info in a bug tracking system, display the entered
|
||||||
|
address on a map or using the info as a login-prompt verifying that the user
|
||||||
|
is allowed to see what it is about to see.
|
||||||
|
|
||||||
|
Of course there has to be some kind of program on the server end to receive
|
||||||
|
the data you send. You cannot just invent something out of the air.
|
||||||
|
|
||||||
|
4.2 GET
|
||||||
|
|
||||||
|
A GET-form uses the method GET, as specified in HTML like:
|
||||||
|
|
||||||
|
<form method="GET" action="junk.cgi">
|
||||||
|
<input type=text name="birthyear">
|
||||||
|
<input type=submit name=press value="OK">
|
||||||
|
</form>
|
||||||
|
|
||||||
|
In your favorite browser, this form will appear with a text box to fill in
|
||||||
|
and a press-button labeled "OK". If you fill in '1905' and press the OK
|
||||||
|
button, your browser will then create a new URL to get for you. The URL will
|
||||||
|
get "junk.cgi?birthyear=1905&press=OK" appended to the path part of the
|
||||||
|
previous URL.
|
||||||
|
|
||||||
|
If the original form was seen on the page "www.hotmail.com/when/birth.html",
|
||||||
|
the second page you'll get will become
|
||||||
|
"www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK".
|
||||||
|
|
||||||
|
Most search engines work this way.
|
||||||
|
|
||||||
|
To make curl do the GET form post for you, just enter the expected created
|
||||||
|
URL:
|
||||||
|
|
||||||
|
curl "http://www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK"
|
||||||
|
|
||||||
|
4.3 POST
|
||||||
|
|
||||||
|
The GET method makes all input field names get displayed in the URL field of
|
||||||
|
your browser. That's generally a good thing when you want to be able to
|
||||||
|
bookmark that page with your given data, but it is an obvious disadvantage
|
||||||
|
if you entered secret information in one of the fields or if there are a
|
||||||
|
large amount of fields creating a very long and unreadable URL.
|
||||||
|
|
||||||
|
The HTTP protocol then offers the POST method. This way the client sends the
|
||||||
|
data separated from the URL and thus you won't see any of it in the URL
|
||||||
|
address field.
|
||||||
|
|
||||||
|
The form would look very similar to the previous one:
|
||||||
|
|
||||||
|
<form method="POST" action="junk.cgi">
|
||||||
|
<input type=text name="birthyear">
|
||||||
|
<input type=submit name=press value=" OK ">
|
||||||
|
</form>
|
||||||
|
|
||||||
|
And to use curl to post this form with the same data filled in as before, we
|
||||||
|
could do it like:
|
||||||
|
|
||||||
|
curl --data "birthyear=1905&press=%20OK%20" \
|
||||||
|
http://www.example.com/when.cgi
|
||||||
|
|
||||||
|
This kind of POST will use the Content-Type
|
||||||
|
application/x-www-form-urlencoded and is the most widely used POST kind.
|
||||||
|
|
||||||
|
The data you send to the server MUST already be properly encoded, curl will
|
||||||
|
not do that for you. For example, if you want the data to contain a space,
|
||||||
|
you need to replace that space with %20 etc. Failing to comply with this
|
||||||
|
will most likely cause your data to be received wrongly and messed up.
|
||||||
|
|
||||||
|
Recent curl versions can in fact url-encode POST data for you, like this:
|
||||||
|
|
||||||
|
curl --data-urlencode "name=I am Daniel" http://www.example.com
|
||||||
|
|
||||||
|
If you repeat --data several times on the command line, curl will
|
||||||
|
concatenate all the given data pieces - and put a '&' symbol between each
|
||||||
|
data segment.
|
||||||
|
|
||||||
|
4.4 File Upload POST
|
||||||
|
|
||||||
|
Back in late 1995 they defined an additional way to post data over HTTP. It
|
||||||
|
is documented in the RFC 1867, why this method sometimes is referred to as
|
||||||
|
RFC1867-posting.
|
||||||
|
|
||||||
|
This method is mainly designed to better support file uploads. A form that
|
||||||
|
allows a user to upload a file could be written like this in HTML:
|
||||||
|
|
||||||
|
<form method="POST" enctype='multipart/form-data' action="upload.cgi">
|
||||||
|
<input type=file name=upload>
|
||||||
|
<input type=submit name=press value="OK">
|
||||||
|
</form>
|
||||||
|
|
||||||
|
This clearly shows that the Content-Type about to be sent is
|
||||||
|
multipart/form-data.
|
||||||
|
|
||||||
|
To post to a form like this with curl, you enter a command line like:
|
||||||
|
|
||||||
|
curl --form upload=@localfilename --form press=OK [URL]
|
||||||
|
|
||||||
|
4.5 Hidden Fields
|
||||||
|
|
||||||
|
A very common way for HTML based applications to pass state information
|
||||||
|
between pages is to add hidden fields to the forms. Hidden fields are
|
||||||
|
already filled in, they aren't displayed to the user and they get passed
|
||||||
|
along just as all the other fields.
|
||||||
|
|
||||||
|
A similar example form with one visible field, one hidden field and one
|
||||||
|
submit button could look like:
|
||||||
|
|
||||||
|
<form method="POST" action="foobar.cgi">
|
||||||
|
<input type=text name="birthyear">
|
||||||
|
<input type=hidden name="person" value="daniel">
|
||||||
|
<input type=submit name="press" value="OK">
|
||||||
|
</form>
|
||||||
|
|
||||||
|
To POST this with curl, you won't have to think about if the fields are
|
||||||
|
hidden or not. To curl they're all the same:
|
||||||
|
|
||||||
|
curl --data "birthyear=1905&press=OK&person=daniel" [URL]
|
||||||
|
|
||||||
|
4.6 Figure Out What A POST Looks Like
|
||||||
|
|
||||||
|
When you're about fill in a form and send to a server by using curl instead
|
||||||
|
of a browser, you're of course very interested in sending a POST exactly the
|
||||||
|
way your browser does.
|
||||||
|
|
||||||
|
An easy way to get to see this, is to save the HTML page with the form on
|
||||||
|
your local disk, modify the 'method' to a GET, and press the submit button
|
||||||
|
(you could also change the action URL if you want to).
|
||||||
|
|
||||||
|
You will then clearly see the data get appended to the URL, separated with a
|
||||||
|
'?'-letter as GET forms are supposed to.
|
||||||
|
|
||||||
|
5. HTTP upload
|
||||||
|
|
||||||
|
5.1 PUT
|
||||||
|
|
||||||
|
Perhaps the best way to upload data to a HTTP server is to use PUT. Then
|
||||||
|
again, this of course requires that someone put a program or script on the
|
||||||
|
server end that knows how to receive a HTTP PUT stream.
|
||||||
|
|
||||||
|
Put a file to a HTTP server with curl:
|
||||||
|
|
||||||
|
curl --upload-file uploadfile http://www.example.com/receive.cgi
|
||||||
|
|
||||||
|
6. HTTP Authentication
|
||||||
|
|
||||||
|
6.1 Basic Authentication
|
||||||
|
|
||||||
|
HTTP Authentication is the ability to tell the server your username and
|
||||||
|
password so that it can verify that you're allowed to do the request you're
|
||||||
|
doing. The Basic authentication used in HTTP (which is the type curl uses by
|
||||||
|
default) is *plain* *text* based, which means it sends username and password
|
||||||
|
only slightly obfuscated, but still fully readable by anyone that sniffs on
|
||||||
|
the network between you and the remote server.
|
||||||
|
|
||||||
|
To tell curl to use a user and password for authentication:
|
||||||
|
|
||||||
|
curl --user name:password http://www.example.com
|
||||||
|
|
||||||
|
6.2 Other Authentication
|
||||||
|
|
||||||
|
The site might require a different authentication method (check the headers
|
||||||
|
returned by the server), and then --ntlm, --digest, --negotiate or even
|
||||||
|
--anyauth might be options that suit you.
|
||||||
|
|
||||||
|
6.3 Proxy Authentication
|
||||||
|
|
||||||
|
Sometimes your HTTP access is only available through the use of a HTTP
|
||||||
|
proxy. This seems to be especially common at various companies. A HTTP proxy
|
||||||
|
may require its own user and password to allow the client to get through to
|
||||||
|
the Internet. To specify those with curl, run something like:
|
||||||
|
|
||||||
|
curl --proxy-user proxyuser:proxypassword curl.haxx.se
|
||||||
|
|
||||||
|
If your proxy requires the authentication to be done using the NTLM method,
|
||||||
|
use --proxy-ntlm, if it requires Digest use --proxy-digest.
|
||||||
|
|
||||||
|
If you use any one of these user+password options but leave out the password
|
||||||
|
part, curl will prompt for the password interactively.
|
||||||
|
|
||||||
|
6.4 Hiding credentials
|
||||||
|
|
||||||
|
Do note that when a program is run, its parameters might be possible to see
|
||||||
|
when listing the running processes of the system. Thus, other users may be
|
||||||
|
able to watch your passwords if you pass them as plain command line
|
||||||
|
options. There are ways to circumvent this.
|
||||||
|
|
||||||
|
It is worth noting that while this is how HTTP Authentication works, very
|
||||||
|
many web sites will not use this concept when they provide logins etc. See
|
||||||
|
the Web Login chapter further below for more details on that.
|
||||||
|
|
||||||
|
7. More HTTP Headers
|
||||||
|
|
||||||
|
7.1 Referer
|
||||||
|
|
||||||
|
A HTTP request may include a 'referer' field (yes it is misspelled), which
|
||||||
|
can be used to tell from which URL the client got to this particular
|
||||||
|
resource. Some programs/scripts check the referer field of requests to verify
|
||||||
|
that this wasn't arriving from an external site or an unknown page. While
|
||||||
|
this is a stupid way to check something so easily forged, many scripts still
|
||||||
|
do it. Using curl, you can put anything you want in the referer-field and
|
||||||
|
thus more easily be able to fool the server into serving your request.
|
||||||
|
|
||||||
|
Use curl to set the referer field with:
|
||||||
|
|
||||||
|
curl --referer http://www.example.come http://www.example.com
|
||||||
|
|
||||||
|
7.2 User Agent
|
||||||
|
|
||||||
|
Very similar to the referer field, all HTTP requests may set the User-Agent
|
||||||
|
field. It names what user agent (client) that is being used. Many
|
||||||
|
applications use this information to decide how to display pages. Silly web
|
||||||
|
programmers try to make different pages for users of different browsers to
|
||||||
|
make them look the best possible for their particular browsers. They usually
|
||||||
|
also do different kinds of javascript, vbscript etc.
|
||||||
|
|
||||||
|
At times, you will see that getting a page with curl will not return the same
|
||||||
|
page that you see when getting the page with your browser. Then you know it
|
||||||
|
is time to set the User Agent field to fool the server into thinking you're
|
||||||
|
one of those browsers.
|
||||||
|
|
||||||
|
To make curl look like Internet Explorer 5 on a Windows 2000 box:
|
||||||
|
|
||||||
|
curl --user-agent "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" [URL]
|
||||||
|
|
||||||
|
Or why not look like you're using Netscape 4.73 on an old Linux box:
|
||||||
|
|
||||||
|
curl --user-agent "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" [URL]
|
||||||
|
|
||||||
|
8. Redirects
|
||||||
|
|
||||||
|
8.1 Location header
|
||||||
|
|
||||||
|
When a resource is requested from a server, the reply from the server may
|
||||||
|
include a hint about where the browser should go next to find this page, or a
|
||||||
|
new page keeping newly generated output. The header that tells the browser
|
||||||
|
to redirect is Location:.
|
||||||
|
|
||||||
|
Curl does not follow Location: headers by default, but will simply display
|
||||||
|
such pages in the same manner it displays all HTTP replies. It does however
|
||||||
|
feature an option that will make it attempt to follow the Location: pointers.
|
||||||
|
|
||||||
|
To tell curl to follow a Location:
|
||||||
|
|
||||||
|
curl --location http://www.example.com
|
||||||
|
|
||||||
|
If you use curl to POST to a site that immediately redirects you to another
|
||||||
|
page, you can safely use --location (-L) and --data/--form together. Curl will
|
||||||
|
only use POST in the first request, and then revert to GET in the following
|
||||||
|
operations.
|
||||||
|
|
||||||
|
8.2 Other redirects
|
||||||
|
|
||||||
|
Browser typically support at least two other ways of redirects that curl
|
||||||
|
doesn't: first the html may contain a meta refresh tag that asks the browser
|
||||||
|
to load a specific URL after a set number of seconds, or it may use
|
||||||
|
javascript to do it.
|
||||||
|
|
||||||
|
9. Cookies
|
||||||
|
|
||||||
|
9.1 Cookie Basics
|
||||||
|
|
||||||
|
The way the web browsers do "client side state control" is by using
|
||||||
|
cookies. Cookies are just names with associated contents. The cookies are
|
||||||
|
sent to the client by the server. The server tells the client for what path
|
||||||
|
and host name it wants the cookie sent back, and it also sends an expiration
|
||||||
|
date and a few more properties.
|
||||||
|
|
||||||
|
When a client communicates with a server with a name and path as previously
|
||||||
|
specified in a received cookie, the client sends back the cookies and their
|
||||||
|
contents to the server, unless of course they are expired.
|
||||||
|
|
||||||
|
Many applications and servers use this method to connect a series of requests
|
||||||
|
into a single logical session. To be able to use curl in such occasions, we
|
||||||
|
must be able to record and send back cookies the way the web application
|
||||||
|
expects them. The same way browsers deal with them.
|
||||||
|
|
||||||
|
9.2 Cookie options
|
||||||
|
|
||||||
|
The simplest way to send a few cookies to the server when getting a page with
|
||||||
|
curl is to add them on the command line like:
|
||||||
|
|
||||||
|
curl --cookie "name=Daniel" http://www.example.com
|
||||||
|
|
||||||
|
Cookies are sent as common HTTP headers. This is practical as it allows curl
|
||||||
|
to record cookies simply by recording headers. Record cookies with curl by
|
||||||
|
using the --dump-header (-D) option like:
|
||||||
|
|
||||||
|
curl --dump-header headers_and_cookies http://www.example.com
|
||||||
|
|
||||||
|
(Take note that the --cookie-jar option described below is a better way to
|
||||||
|
store cookies.)
|
||||||
|
|
||||||
|
Curl has a full blown cookie parsing engine built-in that comes in use if you
|
||||||
|
want to reconnect to a server and use cookies that were stored from a
|
||||||
|
previous connection (or hand-crafted manually to fool the server into
|
||||||
|
believing you had a previous connection). To use previously stored cookies,
|
||||||
|
you run curl like:
|
||||||
|
|
||||||
|
curl --cookie stored_cookies_in_file http://www.example.com
|
||||||
|
|
||||||
|
Curl's "cookie engine" gets enabled when you use the --cookie option. If you
|
||||||
|
only want curl to understand received cookies, use --cookie with a file that
|
||||||
|
doesn't exist. Example, if you want to let curl understand cookies from a
|
||||||
|
page and follow a location (and thus possibly send back cookies it received),
|
||||||
|
you can invoke it like:
|
||||||
|
|
||||||
|
curl --cookie nada --location http://www.example.com
|
||||||
|
|
||||||
|
Curl has the ability to read and write cookie files that use the same file
|
||||||
|
format that Netscape and Mozilla once used. It is a convenient way to share
|
||||||
|
cookies between scripts or invokes. The --cookie (-b) switch automatically
|
||||||
|
detects if a given file is such a cookie file and parses it, and by using the
|
||||||
|
--cookie-jar (-c) option you'll make curl write a new cookie file at the end
|
||||||
|
of an operation:
|
||||||
|
|
||||||
|
curl --cookie cookies.txt --cookie-jar newcookies.txt \
|
||||||
|
http://www.example.com
|
||||||
|
|
||||||
|
10. HTTPS
|
||||||
|
|
||||||
|
10.1 HTTPS is HTTP secure
|
||||||
|
|
||||||
|
There are a few ways to do secure HTTP transfers. By far the most common
|
||||||
|
protocol for doing this is what is generally known as HTTPS, HTTP over
|
||||||
|
SSL. SSL encrypts all the data that is sent and received over the network and
|
||||||
|
thus makes it harder for attackers to spy on sensitive information.
|
||||||
|
|
||||||
|
SSL (or TLS as the latest version of the standard is called) offers a
|
||||||
|
truckload of advanced features to allow all those encryptions and key
|
||||||
|
infrastructure mechanisms encrypted HTTP requires.
|
||||||
|
|
||||||
|
Curl supports encrypted fetches when built to use a TLS library and it can be
|
||||||
|
built to use one out of a fairly large set of libraries - "curl -V" will show
|
||||||
|
which one your curl was built to use (if any!). To get a page from a HTTPS
|
||||||
|
server, simply run curl like:
|
||||||
|
|
||||||
|
curl https://secure.example.com
|
||||||
|
|
||||||
|
10.2 Certificates
|
||||||
|
|
||||||
|
In the HTTPS world, you use certificates to validate that you are the one
|
||||||
|
you claim to be, as an addition to normal passwords. Curl supports client-
|
||||||
|
side certificates. All certificates are locked with a pass phrase, which you
|
||||||
|
need to enter before the certificate can be used by curl. The pass phrase
|
||||||
|
can be specified on the command line or if not, entered interactively when
|
||||||
|
curl queries for it. Use a certificate with curl on a HTTPS server like:
|
||||||
|
|
||||||
|
curl --cert mycert.pem https://secure.example.com
|
||||||
|
|
||||||
|
curl also tries to verify that the server is who it claims to be, by
|
||||||
|
verifying the server's certificate against a locally stored CA cert
|
||||||
|
bundle. Failing the verification will cause curl to deny the connection. You
|
||||||
|
must then use --insecure (-k) in case you want to tell curl to ignore that
|
||||||
|
the server can't be verified.
|
||||||
|
|
||||||
|
More about server certificate verification and ca cert bundles can be read
|
||||||
|
in the SSLCERTS document, available online here:
|
||||||
|
|
||||||
|
https://curl.haxx.se/docs/sslcerts.html
|
||||||
|
|
||||||
|
At times you may end up with your own CA cert store and then you can tell
|
||||||
|
curl to use that to verify the server's certificate:
|
||||||
|
|
||||||
|
curl --cacert ca-bundle.pem https://example.com/
|
||||||
|
|
||||||
|
|
||||||
|
11. Custom Request Elements
|
||||||
|
|
||||||
|
11.1 Modify method and headers
|
||||||
|
|
||||||
|
Doing fancy stuff, you may need to add or change elements of a single curl
|
||||||
|
request.
|
||||||
|
|
||||||
|
For example, you can change the POST request to a PROPFIND and send the data
|
||||||
|
as "Content-Type: text/xml" (instead of the default Content-Type) like this:
|
||||||
|
|
||||||
|
curl --data "<xml>" --header "Content-Type: text/xml" \
|
||||||
|
--request PROPFIND url.com
|
||||||
|
|
||||||
|
You can delete a default header by providing one without content. Like you
|
||||||
|
can ruin the request by chopping off the Host: header:
|
||||||
|
|
||||||
|
curl --header "Host:" http://www.example.com
|
||||||
|
|
||||||
|
You can add headers the same way. Your server may want a "Destination:"
|
||||||
|
header, and you can add it:
|
||||||
|
|
||||||
|
curl --header "Destination: http://nowhere" http://example.com
|
||||||
|
|
||||||
|
11.2 More on changed methods
|
||||||
|
|
||||||
|
It should be noted that curl selects which methods to use on its own
|
||||||
|
depending on what action to ask for. -d will do POST, -I will do HEAD and so
|
||||||
|
on. If you use the --request / -X option you can change the method keyword
|
||||||
|
curl selects, but you will not modify curl's behavior. This means that if you
|
||||||
|
for example use -d "data" to do a POST, you can modify the method to a
|
||||||
|
PROPFIND with -X and curl will still think it sends a POST. You can change
|
||||||
|
the normal GET to a POST method by simply adding -X POST in a command line
|
||||||
|
like:
|
||||||
|
|
||||||
|
curl -X POST http://example.org/
|
||||||
|
|
||||||
|
... but curl will still think and act as if it sent a GET so it won't send any
|
||||||
|
request body etc.
|
||||||
|
|
||||||
|
|
||||||
|
12. Web Login
|
||||||
|
|
||||||
|
12.1 Some login tricks
|
||||||
|
|
||||||
|
While not strictly just HTTP related, it still causes a lot of people problems
|
||||||
|
so here's the executive run-down of how the vast majority of all login forms
|
||||||
|
work and how to login to them using curl.
|
||||||
|
|
||||||
|
It can also be noted that to do this properly in an automated fashion, you
|
||||||
|
will most certainly need to script things and do multiple curl invokes etc.
|
||||||
|
|
||||||
|
First, servers mostly use cookies to track the logged-in status of the
|
||||||
|
client, so you will need to capture the cookies you receive in the
|
||||||
|
responses. Then, many sites also set a special cookie on the login page (to
|
||||||
|
make sure you got there through their login page) so you should make a habit
|
||||||
|
of first getting the login-form page to capture the cookies set there.
|
||||||
|
|
||||||
|
Some web-based login systems feature various amounts of javascript, and
|
||||||
|
sometimes they use such code to set or modify cookie contents. Possibly they
|
||||||
|
do that to prevent programmed logins, like this manual describes how to...
|
||||||
|
Anyway, if reading the code isn't enough to let you repeat the behavior
|
||||||
|
manually, capturing the HTTP requests done by your browsers and analyzing the
|
||||||
|
sent cookies is usually a working method to work out how to shortcut the
|
||||||
|
javascript need.
|
||||||
|
|
||||||
|
In the actual <form> tag for the login, lots of sites fill-in random/session
|
||||||
|
or otherwise secretly generated hidden tags and you may need to first capture
|
||||||
|
the HTML code for the login form and extract all the hidden fields to be able
|
||||||
|
to do a proper login POST. Remember that the contents need to be URL encoded
|
||||||
|
when sent in a normal POST.
|
||||||
|
|
||||||
|
13. Debug
|
||||||
|
|
||||||
|
13.1 Some debug tricks
|
||||||
|
|
||||||
|
Many times when you run curl on a site, you'll notice that the site doesn't
|
||||||
|
seem to respond the same way to your curl requests as it does to your
|
||||||
|
browser's.
|
||||||
|
|
||||||
|
Then you need to start making your curl requests more similar to your
|
||||||
|
browser's requests:
|
||||||
|
|
||||||
|
* Use the --trace-ascii option to store fully detailed logs of the requests
|
||||||
|
for easier analyzing and better understanding
|
||||||
|
|
||||||
|
* Make sure you check for and use cookies when needed (both reading with
|
||||||
|
--cookie and writing with --cookie-jar)
|
||||||
|
|
||||||
|
* Set user-agent to one like a recent popular browser does
|
||||||
|
|
||||||
|
* Set referer like it is set by the browser
|
||||||
|
|
||||||
|
* If you use POST, make sure you send all the fields and in the same order as
|
||||||
|
the browser does it.
|
||||||
|
|
||||||
|
A very good helper to make sure you do this right, is the LiveHTTPHeader tool
|
||||||
|
that lets you view all headers you send and receive with Mozilla/Firefox
|
||||||
|
(even when using HTTPS). Chrome features similar functionality out of the box
|
||||||
|
among the developer's tools.
|
||||||
|
|
||||||
|
A more raw approach is to capture the HTTP traffic on the network with tools
|
||||||
|
such as ethereal or tcpdump and check what headers that were sent and
|
||||||
|
received by the browser. (HTTPS makes this technique inefficient.)
|
||||||
|
|
||||||
|
14. References
|
||||||
|
|
||||||
|
14.1 Standards
|
||||||
|
|
||||||
|
RFC 7230 is a must to read if you want in-depth understanding of the HTTP
|
||||||
|
protocol
|
||||||
|
|
||||||
|
RFC 3986 explains the URL syntax
|
||||||
|
|
||||||
|
RFC 1867 defines the HTTP post upload format
|
||||||
|
|
||||||
|
RFC 6525 defines how HTTP cookies work
|
||||||
|
|
||||||
|
14.2 Sites
|
||||||
|
|
||||||
|
https://curl.haxx.se is the home of the curl project
|
||||||
56
bin/curl/docs/VERSIONS.txt
Normal file
56
bin/curl/docs/VERSIONS.txt
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
Version Numbers and Releases
|
||||||
|
============================
|
||||||
|
|
||||||
|
Curl is not only curl. Curl is also libcurl. They're actually individually
|
||||||
|
versioned, but they mostly follow each other rather closely.
|
||||||
|
|
||||||
|
The version numbering is always built up using the same system:
|
||||||
|
|
||||||
|
X.Y.Z
|
||||||
|
|
||||||
|
- X is main version 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
|
||||||
|
right of a bumped number will be reset to zero. If Z is zero, it may not be
|
||||||
|
included in the version number.
|
||||||
|
|
||||||
|
The main version number will get bumped when *really* big, world colliding
|
||||||
|
changes are made. The release number is bumped when changes are performed or
|
||||||
|
things/features are added. The patch number is bumped when the changes are
|
||||||
|
mere bugfixes.
|
||||||
|
|
||||||
|
It means that after release 1.2.3, we can release 2.0 if something really big
|
||||||
|
has been made, 1.3 if not that big changes were made or 1.2.4 if mostly bugs
|
||||||
|
were fixed.
|
||||||
|
|
||||||
|
Bumping, as in increasing the number with 1, is unconditionally only
|
||||||
|
affecting one of the numbers (except the ones to the right of it, that may be
|
||||||
|
set to zero). 1 becomes 2, 3 becomes 4, 9 becomes 10, 88 becomes 89 and 99
|
||||||
|
becomes 100. So, after 1.2.9 comes 1.2.10. After 3.99.3, 3.100 might come.
|
||||||
|
|
||||||
|
All original curl source release archives are named according to the libcurl
|
||||||
|
version (not according to the curl client version that, as said before, might
|
||||||
|
differ).
|
||||||
|
|
||||||
|
As a service to any application that might want to support new libcurl
|
||||||
|
features while still being able to build with older versions, all releases
|
||||||
|
have the libcurl version stored in the curl/curlver.h file using a static
|
||||||
|
numbering scheme that can be used for comparison. The version number is
|
||||||
|
defined as:
|
||||||
|
|
||||||
|
#define LIBCURL_VERSION_NUM 0xXXYYZZ
|
||||||
|
|
||||||
|
Where XX, YY and ZZ are the main version, release and patch numbers in
|
||||||
|
hexadecimal. All three number fields are always represented using two digits
|
||||||
|
(eight bits each). 1.2 would appear as "0x010200" while version 9.11.7
|
||||||
|
appears as "0x090b07".
|
||||||
|
|
||||||
|
This 6-digit hexadecimal number is always a greater number in a more recent
|
||||||
|
release. It makes comparisons with greater than and less than work.
|
||||||
|
|
||||||
|
This number is also available as three separate defines:
|
||||||
|
`LIBCURL_VERSION_MAJOR`, `LIBCURL_VERSION_MINOR` and `LIBCURL_VERSION_PATCH`.
|
||||||
68
bin/curl/docs/libcurl/ABI.txt
Normal file
68
bin/curl/docs/libcurl/ABI.txt
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
ABI - Application Binary Interface
|
||||||
|
==================================
|
||||||
|
|
||||||
|
"ABI" describes the low-level interface between an application program and a
|
||||||
|
library. Calling conventions, function arguments, return values, struct
|
||||||
|
sizes/defines and more.
|
||||||
|
|
||||||
|
[Wikipedia has a longer description](https://en.wikipedia.org/wiki/Application_binary_interface)
|
||||||
|
|
||||||
|
Upgrades
|
||||||
|
--------
|
||||||
|
|
||||||
|
In the vast majority of all cases, a typical libcurl upgrade does not break
|
||||||
|
the ABI at all. Your application can remain using libcurl just as before,
|
||||||
|
only with less bugs and possibly with added new features. You need to read
|
||||||
|
the release notes, and if they mention an ABI break/soname bump, you may have
|
||||||
|
to verify that your application still builds fine and uses libcurl as it now
|
||||||
|
is defined to work.
|
||||||
|
|
||||||
|
Version Numbers
|
||||||
|
---------------
|
||||||
|
|
||||||
|
In libcurl land, you really can't tell by the libcurl version number if that
|
||||||
|
libcurl is binary compatible or not with another libcurl version.
|
||||||
|
|
||||||
|
Soname Bumps
|
||||||
|
------------
|
||||||
|
|
||||||
|
Whenever there are changes done to the library that will cause an ABI
|
||||||
|
breakage, that may require your application to get attention or possibly be
|
||||||
|
changed to adhere to new things, we will bump the soname. Then the library
|
||||||
|
will get a different output name and thus can in fact be installed in
|
||||||
|
parallel with an older installed lib (on most systems). Thus, old
|
||||||
|
applications built against the previous ABI version will remain working and
|
||||||
|
using the older lib, while newer applications build and use the newer one.
|
||||||
|
|
||||||
|
During the first seven years of libcurl releases, there have only been four
|
||||||
|
ABI breakages.
|
||||||
|
|
||||||
|
We are determined to bump the SONAME as rarely as possible. Ideally, we
|
||||||
|
never do it again.
|
||||||
|
|
||||||
|
Downgrades
|
||||||
|
----------
|
||||||
|
|
||||||
|
Going to an older libcurl version from one you're currently using can be a
|
||||||
|
tricky thing. Mostly we add features and options to newer libcurls as that
|
||||||
|
won't break ABI or hamper existing applications. This has the implication
|
||||||
|
that going backwards may get you in a situation where you pick a libcurl that
|
||||||
|
doesn't support the options your application needs. Or possibly you even
|
||||||
|
downgrade so far so you cross an ABI break border and thus a different
|
||||||
|
soname, and then your application may need to adapt to the modified ABI.
|
||||||
|
|
||||||
|
History
|
||||||
|
-------
|
||||||
|
|
||||||
|
The previous major library soname number bumps (breaking backwards
|
||||||
|
compatibility) have happened the following times:
|
||||||
|
|
||||||
|
0 - libcurl 7.1, August 2000
|
||||||
|
|
||||||
|
1 - libcurl 7.5 December 2000
|
||||||
|
|
||||||
|
2 - libcurl 7.7 March 2001
|
||||||
|
|
||||||
|
3 - libcurl 7.12.0 June 2004
|
||||||
|
|
||||||
|
4 - libcurl 7.16.0 October 2006
|
||||||
946
bin/curl/docs/libcurl/symbols-in-versions.txt
Normal file
946
bin/curl/docs/libcurl/symbols-in-versions.txt
Normal file
@@ -0,0 +1,946 @@
|
|||||||
|
_ _ ____ _
|
||||||
|
___| | | | _ \| |
|
||||||
|
/ __| | | | |_) | |
|
||||||
|
| (__| |_| | _ <| |___
|
||||||
|
\___|\___/|_| \_\_____|
|
||||||
|
|
||||||
|
This document lists defines and other symbols present in libcurl, together
|
||||||
|
with exact information about the first libcurl version that provides the
|
||||||
|
symbol, the first version in which the symbol was marked as deprecated and
|
||||||
|
for a few symbols the last version that featured it. The names appear in
|
||||||
|
alphabetical order.
|
||||||
|
|
||||||
|
Name Introduced Deprecated Removed
|
||||||
|
|
||||||
|
CURLALTSVC_ALTUSED 7.64.1
|
||||||
|
CURLALTSVC_H1 7.64.1
|
||||||
|
CURLALTSVC_H2 7.64.1
|
||||||
|
CURLALTSVC_H3 7.64.1
|
||||||
|
CURLALTSVC_IMMEDIATELY 7.64.1
|
||||||
|
CURLALTSVC_READONLYFILE 7.64.1
|
||||||
|
CURLAUTH_ANY 7.10.6
|
||||||
|
CURLAUTH_ANYSAFE 7.10.6
|
||||||
|
CURLAUTH_BASIC 7.10.6
|
||||||
|
CURLAUTH_BEARER 7.61.0
|
||||||
|
CURLAUTH_DIGEST 7.10.6
|
||||||
|
CURLAUTH_DIGEST_IE 7.19.3
|
||||||
|
CURLAUTH_GSSAPI 7.55.0
|
||||||
|
CURLAUTH_GSSNEGOTIATE 7.10.6 7.38.0
|
||||||
|
CURLAUTH_NEGOTIATE 7.38.0
|
||||||
|
CURLAUTH_NONE 7.10.6
|
||||||
|
CURLAUTH_NTLM 7.10.6
|
||||||
|
CURLAUTH_NTLM_WB 7.22.0
|
||||||
|
CURLAUTH_ONLY 7.21.3
|
||||||
|
CURLCLOSEPOLICY_CALLBACK 7.7
|
||||||
|
CURLCLOSEPOLICY_LEAST_RECENTLY_USED 7.7
|
||||||
|
CURLCLOSEPOLICY_LEAST_TRAFFIC 7.7
|
||||||
|
CURLCLOSEPOLICY_NONE 7.7
|
||||||
|
CURLCLOSEPOLICY_OLDEST 7.7
|
||||||
|
CURLCLOSEPOLICY_SLOWEST 7.7
|
||||||
|
CURLE_ABORTED_BY_CALLBACK 7.1
|
||||||
|
CURLE_AGAIN 7.18.2
|
||||||
|
CURLE_ALREADY_COMPLETE 7.7.2
|
||||||
|
CURLE_BAD_CALLING_ORDER 7.1 7.17.0
|
||||||
|
CURLE_BAD_CONTENT_ENCODING 7.10
|
||||||
|
CURLE_BAD_DOWNLOAD_RESUME 7.10
|
||||||
|
CURLE_BAD_FUNCTION_ARGUMENT 7.1
|
||||||
|
CURLE_BAD_PASSWORD_ENTERED 7.4.2 7.17.0
|
||||||
|
CURLE_CHUNK_FAILED 7.21.0
|
||||||
|
CURLE_CONV_FAILED 7.15.4
|
||||||
|
CURLE_CONV_REQD 7.15.4
|
||||||
|
CURLE_COULDNT_CONNECT 7.1
|
||||||
|
CURLE_COULDNT_RESOLVE_HOST 7.1
|
||||||
|
CURLE_COULDNT_RESOLVE_PROXY 7.1
|
||||||
|
CURLE_FAILED_INIT 7.1
|
||||||
|
CURLE_FILESIZE_EXCEEDED 7.10.8
|
||||||
|
CURLE_FILE_COULDNT_READ_FILE 7.1
|
||||||
|
CURLE_FTP_ACCEPT_FAILED 7.24.0
|
||||||
|
CURLE_FTP_ACCEPT_TIMEOUT 7.24.0
|
||||||
|
CURLE_FTP_ACCESS_DENIED 7.1
|
||||||
|
CURLE_FTP_BAD_DOWNLOAD_RESUME 7.1 7.1
|
||||||
|
CURLE_FTP_BAD_FILE_LIST 7.21.0
|
||||||
|
CURLE_FTP_CANT_GET_HOST 7.1
|
||||||
|
CURLE_FTP_CANT_RECONNECT 7.1 7.17.0
|
||||||
|
CURLE_FTP_COULDNT_GET_SIZE 7.1 7.17.0
|
||||||
|
CURLE_FTP_COULDNT_RETR_FILE 7.1
|
||||||
|
CURLE_FTP_COULDNT_SET_ASCII 7.1 7.17.0
|
||||||
|
CURLE_FTP_COULDNT_SET_BINARY 7.1 7.17.0
|
||||||
|
CURLE_FTP_COULDNT_SET_TYPE 7.17.0
|
||||||
|
CURLE_FTP_COULDNT_STOR_FILE 7.1
|
||||||
|
CURLE_FTP_COULDNT_USE_REST 7.1
|
||||||
|
CURLE_FTP_PARTIAL_FILE 7.1 7.1
|
||||||
|
CURLE_FTP_PORT_FAILED 7.1
|
||||||
|
CURLE_FTP_PRET_FAILED 7.20.0
|
||||||
|
CURLE_FTP_QUOTE_ERROR 7.1 7.17.0
|
||||||
|
CURLE_FTP_SSL_FAILED 7.11.0 7.17.0
|
||||||
|
CURLE_FTP_USER_PASSWORD_INCORRECT 7.1 7.17.0
|
||||||
|
CURLE_FTP_WEIRD_227_FORMAT 7.1
|
||||||
|
CURLE_FTP_WEIRD_PASS_REPLY 7.1
|
||||||
|
CURLE_FTP_WEIRD_PASV_REPLY 7.1
|
||||||
|
CURLE_FTP_WEIRD_SERVER_REPLY 7.1
|
||||||
|
CURLE_FTP_WEIRD_USER_REPLY 7.1 7.17.0
|
||||||
|
CURLE_FTP_WRITE_ERROR 7.1 7.17.0
|
||||||
|
CURLE_FUNCTION_NOT_FOUND 7.1
|
||||||
|
CURLE_GOT_NOTHING 7.9.1
|
||||||
|
CURLE_HTTP2 7.38.0
|
||||||
|
CURLE_HTTP2_STREAM 7.49.0
|
||||||
|
CURLE_HTTP_NOT_FOUND 7.1
|
||||||
|
CURLE_HTTP_PORT_FAILED 7.3 7.12.0
|
||||||
|
CURLE_HTTP_POST_ERROR 7.1
|
||||||
|
CURLE_HTTP_RANGE_ERROR 7.1 7.17.0
|
||||||
|
CURLE_HTTP_RETURNED_ERROR 7.10.3
|
||||||
|
CURLE_INTERFACE_FAILED 7.12.0
|
||||||
|
CURLE_LDAP_CANNOT_BIND 7.1
|
||||||
|
CURLE_LDAP_INVALID_URL 7.10.8
|
||||||
|
CURLE_LDAP_SEARCH_FAILED 7.1
|
||||||
|
CURLE_LIBRARY_NOT_FOUND 7.1 7.17.0
|
||||||
|
CURLE_LOGIN_DENIED 7.13.1
|
||||||
|
CURLE_MALFORMAT_USER 7.1 7.17.0
|
||||||
|
CURLE_NOT_BUILT_IN 7.21.5
|
||||||
|
CURLE_NO_CONNECTION_AVAILABLE 7.30.0
|
||||||
|
CURLE_OK 7.1
|
||||||
|
CURLE_OPERATION_TIMEDOUT 7.10.2
|
||||||
|
CURLE_OPERATION_TIMEOUTED 7.1 7.17.0
|
||||||
|
CURLE_OUT_OF_MEMORY 7.1
|
||||||
|
CURLE_PARTIAL_FILE 7.1
|
||||||
|
CURLE_PEER_FAILED_VERIFICATION 7.17.1
|
||||||
|
CURLE_QUOTE_ERROR 7.17.0
|
||||||
|
CURLE_RANGE_ERROR 7.17.0
|
||||||
|
CURLE_READ_ERROR 7.1
|
||||||
|
CURLE_RECURSIVE_API_CALL 7.59.0
|
||||||
|
CURLE_RECV_ERROR 7.10
|
||||||
|
CURLE_REMOTE_ACCESS_DENIED 7.17.0
|
||||||
|
CURLE_REMOTE_DISK_FULL 7.17.0
|
||||||
|
CURLE_REMOTE_FILE_EXISTS 7.17.0
|
||||||
|
CURLE_REMOTE_FILE_NOT_FOUND 7.16.1
|
||||||
|
CURLE_RTSP_CSEQ_ERROR 7.20.0
|
||||||
|
CURLE_RTSP_SESSION_ERROR 7.20.0
|
||||||
|
CURLE_SEND_ERROR 7.10
|
||||||
|
CURLE_SEND_FAIL_REWIND 7.12.3
|
||||||
|
CURLE_SHARE_IN_USE 7.9.6 7.17.0
|
||||||
|
CURLE_SSH 7.16.1
|
||||||
|
CURLE_SSL_CACERT 7.10 7.62.0
|
||||||
|
CURLE_SSL_CACERT_BADFILE 7.16.0
|
||||||
|
CURLE_SSL_CERTPROBLEM 7.10
|
||||||
|
CURLE_SSL_CIPHER 7.10
|
||||||
|
CURLE_SSL_CONNECT_ERROR 7.1
|
||||||
|
CURLE_SSL_CRL_BADFILE 7.19.0
|
||||||
|
CURLE_SSL_ENGINE_INITFAILED 7.12.3
|
||||||
|
CURLE_SSL_ENGINE_NOTFOUND 7.9.3
|
||||||
|
CURLE_SSL_ENGINE_SETFAILED 7.9.3
|
||||||
|
CURLE_SSL_INVALIDCERTSTATUS 7.41.0
|
||||||
|
CURLE_SSL_ISSUER_ERROR 7.19.0
|
||||||
|
CURLE_SSL_PEER_CERTIFICATE 7.8 7.17.1
|
||||||
|
CURLE_SSL_PINNEDPUBKEYNOTMATCH 7.39.0
|
||||||
|
CURLE_SSL_SHUTDOWN_FAILED 7.16.1
|
||||||
|
CURLE_TELNET_OPTION_SYNTAX 7.7
|
||||||
|
CURLE_TFTP_DISKFULL 7.15.0 7.17.0
|
||||||
|
CURLE_TFTP_EXISTS 7.15.0 7.17.0
|
||||||
|
CURLE_TFTP_ILLEGAL 7.15.0
|
||||||
|
CURLE_TFTP_NOSUCHUSER 7.15.0
|
||||||
|
CURLE_TFTP_NOTFOUND 7.15.0
|
||||||
|
CURLE_TFTP_PERM 7.15.0
|
||||||
|
CURLE_TFTP_UNKNOWNID 7.15.0
|
||||||
|
CURLE_TOO_MANY_REDIRECTS 7.5
|
||||||
|
CURLE_UNKNOWN_OPTION 7.21.5
|
||||||
|
CURLE_UNKNOWN_TELNET_OPTION 7.7
|
||||||
|
CURLE_UNSUPPORTED_PROTOCOL 7.1
|
||||||
|
CURLE_UPLOAD_FAILED 7.16.3
|
||||||
|
CURLE_URL_MALFORMAT 7.1
|
||||||
|
CURLE_URL_MALFORMAT_USER 7.1 7.17.0
|
||||||
|
CURLE_USE_SSL_FAILED 7.17.0
|
||||||
|
CURLE_WEIRD_SERVER_REPLY 7.51.0
|
||||||
|
CURLE_WRITE_ERROR 7.1
|
||||||
|
CURLFILETYPE_DEVICE_BLOCK 7.21.0
|
||||||
|
CURLFILETYPE_DEVICE_CHAR 7.21.0
|
||||||
|
CURLFILETYPE_DIRECTORY 7.21.0
|
||||||
|
CURLFILETYPE_DOOR 7.21.0
|
||||||
|
CURLFILETYPE_FILE 7.21.0
|
||||||
|
CURLFILETYPE_NAMEDPIPE 7.21.0
|
||||||
|
CURLFILETYPE_SOCKET 7.21.0
|
||||||
|
CURLFILETYPE_SYMLINK 7.21.0
|
||||||
|
CURLFILETYPE_UNKNOWN 7.21.0
|
||||||
|
CURLFINFOFLAG_KNOWN_FILENAME 7.21.0
|
||||||
|
CURLFINFOFLAG_KNOWN_FILETYPE 7.21.0
|
||||||
|
CURLFINFOFLAG_KNOWN_GID 7.21.0
|
||||||
|
CURLFINFOFLAG_KNOWN_HLINKCOUNT 7.21.0
|
||||||
|
CURLFINFOFLAG_KNOWN_PERM 7.21.0
|
||||||
|
CURLFINFOFLAG_KNOWN_SIZE 7.21.0
|
||||||
|
CURLFINFOFLAG_KNOWN_TIME 7.21.0
|
||||||
|
CURLFINFOFLAG_KNOWN_UID 7.21.0
|
||||||
|
CURLFORM_ARRAY 7.9.1 7.56.0
|
||||||
|
CURLFORM_ARRAY_END 7.9.1 7.9.5 7.9.6
|
||||||
|
CURLFORM_ARRAY_START 7.9.1 7.9.5 7.9.6
|
||||||
|
CURLFORM_BUFFER 7.9.8 7.56.0
|
||||||
|
CURLFORM_BUFFERLENGTH 7.9.8 7.56.0
|
||||||
|
CURLFORM_BUFFERPTR 7.9.8 7.56.0
|
||||||
|
CURLFORM_CONTENTHEADER 7.9.3 7.56.0
|
||||||
|
CURLFORM_CONTENTLEN 7.46.0 7.56.0
|
||||||
|
CURLFORM_CONTENTSLENGTH 7.9 7.56.0
|
||||||
|
CURLFORM_CONTENTTYPE 7.9 7.56.0
|
||||||
|
CURLFORM_COPYCONTENTS 7.9 7.56.0
|
||||||
|
CURLFORM_COPYNAME 7.9 7.56.0
|
||||||
|
CURLFORM_END 7.9 7.56.0
|
||||||
|
CURLFORM_FILE 7.9 7.56.0
|
||||||
|
CURLFORM_FILECONTENT 7.9.1 7.56.0
|
||||||
|
CURLFORM_FILENAME 7.9.6 7.56.0
|
||||||
|
CURLFORM_NAMELENGTH 7.9 7.56.0
|
||||||
|
CURLFORM_NOTHING 7.9 7.56.0
|
||||||
|
CURLFORM_PTRCONTENTS 7.9 7.56.0
|
||||||
|
CURLFORM_PTRNAME 7.9 7.56.0
|
||||||
|
CURLFORM_STREAM 7.18.2 7.56.0
|
||||||
|
CURLFTPAUTH_DEFAULT 7.12.2
|
||||||
|
CURLFTPAUTH_SSL 7.12.2
|
||||||
|
CURLFTPAUTH_TLS 7.12.2
|
||||||
|
CURLFTPMETHOD_DEFAULT 7.15.3
|
||||||
|
CURLFTPMETHOD_MULTICWD 7.15.3
|
||||||
|
CURLFTPMETHOD_NOCWD 7.15.3
|
||||||
|
CURLFTPMETHOD_SINGLECWD 7.15.3
|
||||||
|
CURLFTPSSL_ALL 7.11.0 7.17.0
|
||||||
|
CURLFTPSSL_CCC_ACTIVE 7.16.2
|
||||||
|
CURLFTPSSL_CCC_NONE 7.16.2
|
||||||
|
CURLFTPSSL_CCC_PASSIVE 7.16.1
|
||||||
|
CURLFTPSSL_CONTROL 7.11.0 7.17.0
|
||||||
|
CURLFTPSSL_NONE 7.11.0 7.17.0
|
||||||
|
CURLFTPSSL_TRY 7.11.0 7.17.0
|
||||||
|
CURLFTP_CREATE_DIR 7.19.4
|
||||||
|
CURLFTP_CREATE_DIR_NONE 7.19.4
|
||||||
|
CURLFTP_CREATE_DIR_RETRY 7.19.4
|
||||||
|
CURLGSSAPI_DELEGATION_FLAG 7.22.0
|
||||||
|
CURLGSSAPI_DELEGATION_NONE 7.22.0
|
||||||
|
CURLGSSAPI_DELEGATION_POLICY_FLAG 7.22.0
|
||||||
|
CURLHEADER_SEPARATE 7.37.0
|
||||||
|
CURLHEADER_UNIFIED 7.37.0
|
||||||
|
CURLINFO_ACTIVESOCKET 7.45.0
|
||||||
|
CURLINFO_APPCONNECT_TIME 7.19.0
|
||||||
|
CURLINFO_APPCONNECT_TIME_T 7.61.0
|
||||||
|
CURLINFO_CERTINFO 7.19.1
|
||||||
|
CURLINFO_CONDITION_UNMET 7.19.4
|
||||||
|
CURLINFO_CONNECT_TIME 7.4.1
|
||||||
|
CURLINFO_CONNECT_TIME_T 7.61.0
|
||||||
|
CURLINFO_CONTENT_LENGTH_DOWNLOAD 7.6.1
|
||||||
|
CURLINFO_CONTENT_LENGTH_DOWNLOAD_T 7.55.0
|
||||||
|
CURLINFO_CONTENT_LENGTH_UPLOAD 7.6.1
|
||||||
|
CURLINFO_CONTENT_LENGTH_UPLOAD_T 7.55.0
|
||||||
|
CURLINFO_CONTENT_TYPE 7.9.4
|
||||||
|
CURLINFO_COOKIELIST 7.14.1
|
||||||
|
CURLINFO_DATA_IN 7.9.6
|
||||||
|
CURLINFO_DATA_OUT 7.9.6
|
||||||
|
CURLINFO_DOUBLE 7.4.1
|
||||||
|
CURLINFO_EFFECTIVE_URL 7.4
|
||||||
|
CURLINFO_END 7.9.6
|
||||||
|
CURLINFO_FILETIME 7.5
|
||||||
|
CURLINFO_FILETIME_T 7.59.0
|
||||||
|
CURLINFO_FTP_ENTRY_PATH 7.15.4
|
||||||
|
CURLINFO_HEADER_IN 7.9.6
|
||||||
|
CURLINFO_HEADER_OUT 7.9.6
|
||||||
|
CURLINFO_HEADER_SIZE 7.4.1
|
||||||
|
CURLINFO_HTTPAUTH_AVAIL 7.10.8
|
||||||
|
CURLINFO_HTTP_CODE 7.4.1 7.10.8
|
||||||
|
CURLINFO_HTTP_CONNECTCODE 7.10.7
|
||||||
|
CURLINFO_HTTP_VERSION 7.50.0
|
||||||
|
CURLINFO_LASTONE 7.4.1
|
||||||
|
CURLINFO_LASTSOCKET 7.15.2
|
||||||
|
CURLINFO_LOCAL_IP 7.21.0
|
||||||
|
CURLINFO_LOCAL_PORT 7.21.0
|
||||||
|
CURLINFO_LONG 7.4.1
|
||||||
|
CURLINFO_MASK 7.4.1
|
||||||
|
CURLINFO_NAMELOOKUP_TIME 7.4.1
|
||||||
|
CURLINFO_NAMELOOKUP_TIME_T 7.61.0
|
||||||
|
CURLINFO_NONE 7.4.1
|
||||||
|
CURLINFO_NUM_CONNECTS 7.12.3
|
||||||
|
CURLINFO_OFF_T 7.55.0
|
||||||
|
CURLINFO_OS_ERRNO 7.12.2
|
||||||
|
CURLINFO_PRETRANSFER_TIME 7.4.1
|
||||||
|
CURLINFO_PRETRANSFER_TIME_T 7.61.0
|
||||||
|
CURLINFO_PRIMARY_IP 7.19.0
|
||||||
|
CURLINFO_PRIMARY_PORT 7.21.0
|
||||||
|
CURLINFO_PRIVATE 7.10.3
|
||||||
|
CURLINFO_PROTOCOL 7.52.0
|
||||||
|
CURLINFO_PROXYAUTH_AVAIL 7.10.8
|
||||||
|
CURLINFO_PROXY_SSL_VERIFYRESULT 7.52.0
|
||||||
|
CURLINFO_PTR 7.54.1
|
||||||
|
CURLINFO_REDIRECT_COUNT 7.9.7
|
||||||
|
CURLINFO_REDIRECT_TIME 7.9.7
|
||||||
|
CURLINFO_REDIRECT_TIME_T 7.61.0
|
||||||
|
CURLINFO_REDIRECT_URL 7.18.2
|
||||||
|
CURLINFO_REQUEST_SIZE 7.4.1
|
||||||
|
CURLINFO_RESPONSE_CODE 7.10.8
|
||||||
|
CURLINFO_RTSP_CLIENT_CSEQ 7.20.0
|
||||||
|
CURLINFO_RTSP_CSEQ_RECV 7.20.0
|
||||||
|
CURLINFO_RTSP_SERVER_CSEQ 7.20.0
|
||||||
|
CURLINFO_RTSP_SESSION_ID 7.20.0
|
||||||
|
CURLINFO_SCHEME 7.52.0
|
||||||
|
CURLINFO_SIZE_DOWNLOAD 7.4.1
|
||||||
|
CURLINFO_SIZE_DOWNLOAD_T 7.55.0
|
||||||
|
CURLINFO_SIZE_UPLOAD 7.4.1
|
||||||
|
CURLINFO_SIZE_UPLOAD_T 7.55.0
|
||||||
|
CURLINFO_SLIST 7.12.3
|
||||||
|
CURLINFO_SOCKET 7.45.0
|
||||||
|
CURLINFO_SPEED_DOWNLOAD 7.4.1
|
||||||
|
CURLINFO_SPEED_DOWNLOAD_T 7.55.0
|
||||||
|
CURLINFO_SPEED_UPLOAD 7.4.1
|
||||||
|
CURLINFO_SPEED_UPLOAD_T 7.55.0
|
||||||
|
CURLINFO_SSL_DATA_IN 7.12.1
|
||||||
|
CURLINFO_SSL_DATA_OUT 7.12.1
|
||||||
|
CURLINFO_SSL_ENGINES 7.12.3
|
||||||
|
CURLINFO_SSL_VERIFYRESULT 7.5
|
||||||
|
CURLINFO_STARTTRANSFER_TIME 7.9.2
|
||||||
|
CURLINFO_STARTTRANSFER_TIME_T 7.61.0
|
||||||
|
CURLINFO_STRING 7.4.1
|
||||||
|
CURLINFO_TEXT 7.9.6
|
||||||
|
CURLINFO_TLS_SESSION 7.34.0 7.48.0
|
||||||
|
CURLINFO_TLS_SSL_PTR 7.48.0
|
||||||
|
CURLINFO_TOTAL_TIME 7.4.1
|
||||||
|
CURLINFO_TOTAL_TIME_T 7.61.0
|
||||||
|
CURLINFO_TYPEMASK 7.4.1
|
||||||
|
CURLIOCMD_NOP 7.12.3
|
||||||
|
CURLIOCMD_RESTARTREAD 7.12.3
|
||||||
|
CURLIOE_FAILRESTART 7.12.3
|
||||||
|
CURLIOE_OK 7.12.3
|
||||||
|
CURLIOE_UNKNOWNCMD 7.12.3
|
||||||
|
CURLKHMATCH_MISMATCH 7.19.6
|
||||||
|
CURLKHMATCH_MISSING 7.19.6
|
||||||
|
CURLKHMATCH_OK 7.19.6
|
||||||
|
CURLKHSTAT_DEFER 7.19.6
|
||||||
|
CURLKHSTAT_FINE 7.19.6
|
||||||
|
CURLKHSTAT_FINE_ADD_TO_FILE 7.19.6
|
||||||
|
CURLKHSTAT_REJECT 7.19.6
|
||||||
|
CURLKHTYPE_DSS 7.19.6
|
||||||
|
CURLKHTYPE_ECDSA 7.58.0
|
||||||
|
CURLKHTYPE_ED25519 7.58.0
|
||||||
|
CURLKHTYPE_RSA 7.19.6
|
||||||
|
CURLKHTYPE_RSA1 7.19.6
|
||||||
|
CURLKHTYPE_UNKNOWN 7.19.6
|
||||||
|
CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE 7.30.0
|
||||||
|
CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE 7.30.0
|
||||||
|
CURLMOPT_MAXCONNECTS 7.16.3
|
||||||
|
CURLMOPT_MAX_HOST_CONNECTIONS 7.30.0
|
||||||
|
CURLMOPT_MAX_PIPELINE_LENGTH 7.30.0
|
||||||
|
CURLMOPT_MAX_TOTAL_CONNECTIONS 7.30.0
|
||||||
|
CURLMOPT_PIPELINING 7.16.0
|
||||||
|
CURLMOPT_PIPELINING_SERVER_BL 7.30.0
|
||||||
|
CURLMOPT_PIPELINING_SITE_BL 7.30.0
|
||||||
|
CURLMOPT_PUSHDATA 7.44.0
|
||||||
|
CURLMOPT_PUSHFUNCTION 7.44.0
|
||||||
|
CURLMOPT_SOCKETDATA 7.15.4
|
||||||
|
CURLMOPT_SOCKETFUNCTION 7.15.4
|
||||||
|
CURLMOPT_TIMERDATA 7.16.0
|
||||||
|
CURLMOPT_TIMERFUNCTION 7.16.0
|
||||||
|
CURLMSG_DONE 7.9.6
|
||||||
|
CURLMSG_NONE 7.9.6
|
||||||
|
CURLM_ADDED_ALREADY 7.32.1
|
||||||
|
CURLM_BAD_EASY_HANDLE 7.9.6
|
||||||
|
CURLM_BAD_HANDLE 7.9.6
|
||||||
|
CURLM_BAD_SOCKET 7.15.4
|
||||||
|
CURLM_CALL_MULTI_PERFORM 7.9.6
|
||||||
|
CURLM_CALL_MULTI_SOCKET 7.15.5
|
||||||
|
CURLM_INTERNAL_ERROR 7.9.6
|
||||||
|
CURLM_OK 7.9.6
|
||||||
|
CURLM_OUT_OF_MEMORY 7.9.6
|
||||||
|
CURLM_RECURSIVE_API_CALL 7.59.0
|
||||||
|
CURLM_UNKNOWN_OPTION 7.15.4
|
||||||
|
CURLOPTTYPE_FUNCTIONPOINT 7.1
|
||||||
|
CURLOPTTYPE_LONG 7.1
|
||||||
|
CURLOPTTYPE_OBJECTPOINT 7.1
|
||||||
|
CURLOPTTYPE_OFF_T 7.11.0
|
||||||
|
CURLOPTTYPE_STRINGPOINT 7.46.0
|
||||||
|
CURLOPT_ABSTRACT_UNIX_SOCKET 7.53.0
|
||||||
|
CURLOPT_ACCEPTTIMEOUT_MS 7.24.0
|
||||||
|
CURLOPT_ACCEPT_ENCODING 7.21.6
|
||||||
|
CURLOPT_ADDRESS_SCOPE 7.19.0
|
||||||
|
CURLOPT_ALTSVC 7.64.1
|
||||||
|
CURLOPT_ALTSVC_CTRL 7.64.1
|
||||||
|
CURLOPT_APPEND 7.17.0
|
||||||
|
CURLOPT_AUTOREFERER 7.1
|
||||||
|
CURLOPT_BUFFERSIZE 7.10
|
||||||
|
CURLOPT_CAINFO 7.4.2
|
||||||
|
CURLOPT_CAPATH 7.9.8
|
||||||
|
CURLOPT_CERTINFO 7.19.1
|
||||||
|
CURLOPT_CHUNK_BGN_FUNCTION 7.21.0
|
||||||
|
CURLOPT_CHUNK_DATA 7.21.0
|
||||||
|
CURLOPT_CHUNK_END_FUNCTION 7.21.0
|
||||||
|
CURLOPT_CLOSEFUNCTION 7.7 7.11.1 7.15.5
|
||||||
|
CURLOPT_CLOSEPOLICY 7.7 7.16.1
|
||||||
|
CURLOPT_CLOSESOCKETDATA 7.21.7
|
||||||
|
CURLOPT_CLOSESOCKETFUNCTION 7.21.7
|
||||||
|
CURLOPT_CONNECTTIMEOUT 7.7
|
||||||
|
CURLOPT_CONNECTTIMEOUT_MS 7.16.2
|
||||||
|
CURLOPT_CONNECT_ONLY 7.15.2
|
||||||
|
CURLOPT_CONNECT_TO 7.49.0
|
||||||
|
CURLOPT_CONV_FROM_NETWORK_FUNCTION 7.15.4
|
||||||
|
CURLOPT_CONV_FROM_UTF8_FUNCTION 7.15.4
|
||||||
|
CURLOPT_CONV_TO_NETWORK_FUNCTION 7.15.4
|
||||||
|
CURLOPT_COOKIE 7.1
|
||||||
|
CURLOPT_COOKIEFILE 7.1
|
||||||
|
CURLOPT_COOKIEJAR 7.9
|
||||||
|
CURLOPT_COOKIELIST 7.14.1
|
||||||
|
CURLOPT_COOKIESESSION 7.9.7
|
||||||
|
CURLOPT_COPYPOSTFIELDS 7.17.1
|
||||||
|
CURLOPT_CRLF 7.1
|
||||||
|
CURLOPT_CRLFILE 7.19.0
|
||||||
|
CURLOPT_CURLU 7.63.0
|
||||||
|
CURLOPT_CUSTOMREQUEST 7.1
|
||||||
|
CURLOPT_DEBUGDATA 7.9.6
|
||||||
|
CURLOPT_DEBUGFUNCTION 7.9.6
|
||||||
|
CURLOPT_DEFAULT_PROTOCOL 7.45.0
|
||||||
|
CURLOPT_DIRLISTONLY 7.17.0
|
||||||
|
CURLOPT_DISALLOW_USERNAME_IN_URL 7.61.0
|
||||||
|
CURLOPT_DNS_CACHE_TIMEOUT 7.9.3
|
||||||
|
CURLOPT_DNS_INTERFACE 7.33.0
|
||||||
|
CURLOPT_DNS_LOCAL_IP4 7.33.0
|
||||||
|
CURLOPT_DNS_LOCAL_IP6 7.33.0
|
||||||
|
CURLOPT_DNS_SERVERS 7.24.0
|
||||||
|
CURLOPT_DNS_SHUFFLE_ADDRESSES 7.60.0
|
||||||
|
CURLOPT_DNS_USE_GLOBAL_CACHE 7.9.3 7.11.1
|
||||||
|
CURLOPT_DOH_URL 7.62.0
|
||||||
|
CURLOPT_EGDSOCKET 7.7
|
||||||
|
CURLOPT_ENCODING 7.10
|
||||||
|
CURLOPT_ERRORBUFFER 7.1
|
||||||
|
CURLOPT_EXPECT_100_TIMEOUT_MS 7.36.0
|
||||||
|
CURLOPT_FAILONERROR 7.1
|
||||||
|
CURLOPT_FILE 7.1 7.9.7
|
||||||
|
CURLOPT_FILETIME 7.5
|
||||||
|
CURLOPT_FNMATCH_DATA 7.21.0
|
||||||
|
CURLOPT_FNMATCH_FUNCTION 7.21.0
|
||||||
|
CURLOPT_FOLLOWLOCATION 7.1
|
||||||
|
CURLOPT_FORBID_REUSE 7.7
|
||||||
|
CURLOPT_FRESH_CONNECT 7.7
|
||||||
|
CURLOPT_FTPAPPEND 7.1 7.16.4
|
||||||
|
CURLOPT_FTPASCII 7.1 7.11.1 7.15.5
|
||||||
|
CURLOPT_FTPLISTONLY 7.1 7.16.4
|
||||||
|
CURLOPT_FTPPORT 7.1
|
||||||
|
CURLOPT_FTPSSLAUTH 7.12.2
|
||||||
|
CURLOPT_FTP_ACCOUNT 7.13.0
|
||||||
|
CURLOPT_FTP_ALTERNATIVE_TO_USER 7.15.5
|
||||||
|
CURLOPT_FTP_CREATE_MISSING_DIRS 7.10.7
|
||||||
|
CURLOPT_FTP_FILEMETHOD 7.15.1
|
||||||
|
CURLOPT_FTP_RESPONSE_TIMEOUT 7.10.8
|
||||||
|
CURLOPT_FTP_SKIP_PASV_IP 7.15.0
|
||||||
|
CURLOPT_FTP_SSL 7.11.0 7.16.4
|
||||||
|
CURLOPT_FTP_SSL_CCC 7.16.1
|
||||||
|
CURLOPT_FTP_USE_EPRT 7.10.5
|
||||||
|
CURLOPT_FTP_USE_EPSV 7.9.2
|
||||||
|
CURLOPT_FTP_USE_PRET 7.20.0
|
||||||
|
CURLOPT_GSSAPI_DELEGATION 7.22.0
|
||||||
|
CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS 7.59.0
|
||||||
|
CURLOPT_HAPROXYPROTOCOL 7.60.0
|
||||||
|
CURLOPT_HEADER 7.1
|
||||||
|
CURLOPT_HEADERDATA 7.10
|
||||||
|
CURLOPT_HEADERFUNCTION 7.7.2
|
||||||
|
CURLOPT_HEADEROPT 7.37.0
|
||||||
|
CURLOPT_HTTP09_ALLOWED 7.64.0
|
||||||
|
CURLOPT_HTTP200ALIASES 7.10.3
|
||||||
|
CURLOPT_HTTPAUTH 7.10.6
|
||||||
|
CURLOPT_HTTPGET 7.8.1
|
||||||
|
CURLOPT_HTTPHEADER 7.1
|
||||||
|
CURLOPT_HTTPPOST 7.1 7.56.0
|
||||||
|
CURLOPT_HTTPPROXYTUNNEL 7.3
|
||||||
|
CURLOPT_HTTPREQUEST 7.1 - 7.15.5
|
||||||
|
CURLOPT_HTTP_CONTENT_DECODING 7.16.2
|
||||||
|
CURLOPT_HTTP_TRANSFER_DECODING 7.16.2
|
||||||
|
CURLOPT_HTTP_VERSION 7.9.1
|
||||||
|
CURLOPT_IGNORE_CONTENT_LENGTH 7.14.1
|
||||||
|
CURLOPT_INFILE 7.1 7.9.7
|
||||||
|
CURLOPT_INFILESIZE 7.1
|
||||||
|
CURLOPT_INFILESIZE_LARGE 7.11.0
|
||||||
|
CURLOPT_INTERFACE 7.3
|
||||||
|
CURLOPT_INTERLEAVEDATA 7.20.0
|
||||||
|
CURLOPT_INTERLEAVEFUNCTION 7.20.0
|
||||||
|
CURLOPT_IOCTLDATA 7.12.3
|
||||||
|
CURLOPT_IOCTLFUNCTION 7.12.3
|
||||||
|
CURLOPT_IPRESOLVE 7.10.8
|
||||||
|
CURLOPT_ISSUERCERT 7.19.0
|
||||||
|
CURLOPT_KEEP_SENDING_ON_ERROR 7.51.0
|
||||||
|
CURLOPT_KEYPASSWD 7.17.0
|
||||||
|
CURLOPT_KRB4LEVEL 7.3 7.17.0
|
||||||
|
CURLOPT_KRBLEVEL 7.16.4
|
||||||
|
CURLOPT_LOCALPORT 7.15.2
|
||||||
|
CURLOPT_LOCALPORTRANGE 7.15.2
|
||||||
|
CURLOPT_LOGIN_OPTIONS 7.34.0
|
||||||
|
CURLOPT_LOW_SPEED_LIMIT 7.1
|
||||||
|
CURLOPT_LOW_SPEED_TIME 7.1
|
||||||
|
CURLOPT_MAIL_AUTH 7.25.0
|
||||||
|
CURLOPT_MAIL_FROM 7.20.0
|
||||||
|
CURLOPT_MAIL_RCPT 7.20.0
|
||||||
|
CURLOPT_MAXAGE_CONN 7.65.0
|
||||||
|
CURLOPT_MAXCONNECTS 7.7
|
||||||
|
CURLOPT_MAXFILESIZE 7.10.8
|
||||||
|
CURLOPT_MAXFILESIZE_LARGE 7.11.0
|
||||||
|
CURLOPT_MAXREDIRS 7.5
|
||||||
|
CURLOPT_MAX_RECV_SPEED_LARGE 7.15.5
|
||||||
|
CURLOPT_MAX_SEND_SPEED_LARGE 7.15.5
|
||||||
|
CURLOPT_MIMEPOST 7.56.0
|
||||||
|
CURLOPT_MUTE 7.1 7.8 7.15.5
|
||||||
|
CURLOPT_NETRC 7.1
|
||||||
|
CURLOPT_NETRC_FILE 7.11.0
|
||||||
|
CURLOPT_NEW_DIRECTORY_PERMS 7.16.4
|
||||||
|
CURLOPT_NEW_FILE_PERMS 7.16.4
|
||||||
|
CURLOPT_NOBODY 7.1
|
||||||
|
CURLOPT_NOPROGRESS 7.1
|
||||||
|
CURLOPT_NOPROXY 7.19.4
|
||||||
|
CURLOPT_NOSIGNAL 7.10
|
||||||
|
CURLOPT_NOTHING 7.1.1 7.11.1 7.11.0
|
||||||
|
CURLOPT_OPENSOCKETDATA 7.17.1
|
||||||
|
CURLOPT_OPENSOCKETFUNCTION 7.17.1
|
||||||
|
CURLOPT_PASSWDDATA 7.4.2 7.11.1 7.15.5
|
||||||
|
CURLOPT_PASSWDFUNCTION 7.4.2 7.11.1 7.15.5
|
||||||
|
CURLOPT_PASSWORD 7.19.1
|
||||||
|
CURLOPT_PASV_HOST 7.12.1 7.16.0 7.15.5
|
||||||
|
CURLOPT_PATH_AS_IS 7.42.0
|
||||||
|
CURLOPT_PINNEDPUBLICKEY 7.39.0
|
||||||
|
CURLOPT_PIPEWAIT 7.43.0
|
||||||
|
CURLOPT_PORT 7.1
|
||||||
|
CURLOPT_POST 7.1
|
||||||
|
CURLOPT_POST301 7.17.1 7.19.1
|
||||||
|
CURLOPT_POSTFIELDS 7.1
|
||||||
|
CURLOPT_POSTFIELDSIZE 7.2
|
||||||
|
CURLOPT_POSTFIELDSIZE_LARGE 7.11.1
|
||||||
|
CURLOPT_POSTQUOTE 7.1
|
||||||
|
CURLOPT_POSTREDIR 7.19.1
|
||||||
|
CURLOPT_PREQUOTE 7.9.5
|
||||||
|
CURLOPT_PRE_PROXY 7.52.0
|
||||||
|
CURLOPT_PRIVATE 7.10.3
|
||||||
|
CURLOPT_PROGRESSDATA 7.1
|
||||||
|
CURLOPT_PROGRESSFUNCTION 7.1 7.32.0
|
||||||
|
CURLOPT_PROTOCOLS 7.19.4
|
||||||
|
CURLOPT_PROXY 7.1
|
||||||
|
CURLOPT_PROXYAUTH 7.10.7
|
||||||
|
CURLOPT_PROXYHEADER 7.37.0
|
||||||
|
CURLOPT_PROXYPASSWORD 7.19.1
|
||||||
|
CURLOPT_PROXYPORT 7.1
|
||||||
|
CURLOPT_PROXYTYPE 7.10
|
||||||
|
CURLOPT_PROXYUSERNAME 7.19.1
|
||||||
|
CURLOPT_PROXYUSERPWD 7.1
|
||||||
|
CURLOPT_PROXY_CAINFO 7.52.0
|
||||||
|
CURLOPT_PROXY_CAPATH 7.52.0
|
||||||
|
CURLOPT_PROXY_CRLFILE 7.52.0
|
||||||
|
CURLOPT_PROXY_KEYPASSWD 7.52.0
|
||||||
|
CURLOPT_PROXY_PINNEDPUBLICKEY 7.52.0
|
||||||
|
CURLOPT_PROXY_SERVICE_NAME 7.43.0
|
||||||
|
CURLOPT_PROXY_SSLCERT 7.52.0
|
||||||
|
CURLOPT_PROXY_SSLCERTTYPE 7.52.0
|
||||||
|
CURLOPT_PROXY_SSLKEY 7.52.0
|
||||||
|
CURLOPT_PROXY_SSLKEYTYPE 7.52.0
|
||||||
|
CURLOPT_PROXY_SSLVERSION 7.52.0
|
||||||
|
CURLOPT_PROXY_SSL_CIPHER_LIST 7.52.0
|
||||||
|
CURLOPT_PROXY_SSL_OPTIONS 7.52.0
|
||||||
|
CURLOPT_PROXY_SSL_VERIFYHOST 7.52.0
|
||||||
|
CURLOPT_PROXY_SSL_VERIFYPEER 7.52.0
|
||||||
|
CURLOPT_PROXY_TLS13_CIPHERS 7.61.0
|
||||||
|
CURLOPT_PROXY_TLSAUTH_PASSWORD 7.52.0
|
||||||
|
CURLOPT_PROXY_TLSAUTH_TYPE 7.52.0
|
||||||
|
CURLOPT_PROXY_TLSAUTH_USERNAME 7.52.0
|
||||||
|
CURLOPT_PROXY_TRANSFER_MODE 7.18.0
|
||||||
|
CURLOPT_PUT 7.1
|
||||||
|
CURLOPT_QUOTE 7.1
|
||||||
|
CURLOPT_RANDOM_FILE 7.7
|
||||||
|
CURLOPT_RANGE 7.1
|
||||||
|
CURLOPT_READDATA 7.9.7
|
||||||
|
CURLOPT_READFUNCTION 7.1
|
||||||
|
CURLOPT_REDIR_PROTOCOLS 7.19.4
|
||||||
|
CURLOPT_REFERER 7.1
|
||||||
|
CURLOPT_REQUEST_TARGET 7.55.0
|
||||||
|
CURLOPT_RESOLVE 7.21.3
|
||||||
|
CURLOPT_RESOLVER_START_DATA 7.59.0
|
||||||
|
CURLOPT_RESOLVER_START_FUNCTION 7.59.0
|
||||||
|
CURLOPT_RESUME_FROM 7.1
|
||||||
|
CURLOPT_RESUME_FROM_LARGE 7.11.0
|
||||||
|
CURLOPT_RTSPHEADER 7.20.0
|
||||||
|
CURLOPT_RTSP_CLIENT_CSEQ 7.20.0
|
||||||
|
CURLOPT_RTSP_REQUEST 7.20.0
|
||||||
|
CURLOPT_RTSP_SERVER_CSEQ 7.20.0
|
||||||
|
CURLOPT_RTSP_SESSION_ID 7.20.0
|
||||||
|
CURLOPT_RTSP_STREAM_URI 7.20.0
|
||||||
|
CURLOPT_RTSP_TRANSPORT 7.20.0
|
||||||
|
CURLOPT_SASL_IR 7.31.0
|
||||||
|
CURLOPT_SEEKDATA 7.18.0
|
||||||
|
CURLOPT_SEEKFUNCTION 7.18.0
|
||||||
|
CURLOPT_SERVER_RESPONSE_TIMEOUT 7.20.0
|
||||||
|
CURLOPT_SERVICE_NAME 7.43.0
|
||||||
|
CURLOPT_SHARE 7.10
|
||||||
|
CURLOPT_SOCKOPTDATA 7.16.0
|
||||||
|
CURLOPT_SOCKOPTFUNCTION 7.16.0
|
||||||
|
CURLOPT_SOCKS5_AUTH 7.55.0
|
||||||
|
CURLOPT_SOCKS5_GSSAPI_NEC 7.19.4
|
||||||
|
CURLOPT_SOCKS5_GSSAPI_SERVICE 7.19.4 7.49.0
|
||||||
|
CURLOPT_SOURCE_HOST 7.12.1 - 7.15.5
|
||||||
|
CURLOPT_SOURCE_PATH 7.12.1 - 7.15.5
|
||||||
|
CURLOPT_SOURCE_PORT 7.12.1 - 7.15.5
|
||||||
|
CURLOPT_SOURCE_POSTQUOTE 7.12.1 - 7.15.5
|
||||||
|
CURLOPT_SOURCE_PREQUOTE 7.12.1 - 7.15.5
|
||||||
|
CURLOPT_SOURCE_QUOTE 7.13.0 - 7.15.5
|
||||||
|
CURLOPT_SOURCE_URL 7.13.0 - 7.15.5
|
||||||
|
CURLOPT_SOURCE_USERPWD 7.12.1 - 7.15.5
|
||||||
|
CURLOPT_SSH_AUTH_TYPES 7.16.1
|
||||||
|
CURLOPT_SSH_COMPRESSION 7.56.0
|
||||||
|
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 7.17.1
|
||||||
|
CURLOPT_SSH_KEYDATA 7.19.6
|
||||||
|
CURLOPT_SSH_KEYFUNCTION 7.19.6
|
||||||
|
CURLOPT_SSH_KNOWNHOSTS 7.19.6
|
||||||
|
CURLOPT_SSH_PRIVATE_KEYFILE 7.16.1
|
||||||
|
CURLOPT_SSH_PUBLIC_KEYFILE 7.16.1
|
||||||
|
CURLOPT_SSLCERT 7.1
|
||||||
|
CURLOPT_SSLCERTPASSWD 7.1.1 7.17.0
|
||||||
|
CURLOPT_SSLCERTTYPE 7.9.3
|
||||||
|
CURLOPT_SSLENGINE 7.9.3
|
||||||
|
CURLOPT_SSLENGINE_DEFAULT 7.9.3
|
||||||
|
CURLOPT_SSLKEY 7.9.3
|
||||||
|
CURLOPT_SSLKEYPASSWD 7.9.3 7.17.0
|
||||||
|
CURLOPT_SSLKEYTYPE 7.9.3
|
||||||
|
CURLOPT_SSLVERSION 7.1
|
||||||
|
CURLOPT_SSL_CIPHER_LIST 7.9
|
||||||
|
CURLOPT_SSL_CTX_DATA 7.10.6
|
||||||
|
CURLOPT_SSL_CTX_FUNCTION 7.10.6
|
||||||
|
CURLOPT_SSL_ENABLE_ALPN 7.36.0
|
||||||
|
CURLOPT_SSL_ENABLE_NPN 7.36.0
|
||||||
|
CURLOPT_SSL_FALSESTART 7.42.0
|
||||||
|
CURLOPT_SSL_OPTIONS 7.25.0
|
||||||
|
CURLOPT_SSL_SESSIONID_CACHE 7.16.0
|
||||||
|
CURLOPT_SSL_VERIFYHOST 7.8.1
|
||||||
|
CURLOPT_SSL_VERIFYPEER 7.4.2
|
||||||
|
CURLOPT_SSL_VERIFYSTATUS 7.41.0
|
||||||
|
CURLOPT_STDERR 7.1
|
||||||
|
CURLOPT_STREAM_DEPENDS 7.46.0
|
||||||
|
CURLOPT_STREAM_DEPENDS_E 7.46.0
|
||||||
|
CURLOPT_STREAM_WEIGHT 7.46.0
|
||||||
|
CURLOPT_SUPPRESS_CONNECT_HEADERS 7.54.0
|
||||||
|
CURLOPT_TCP_FASTOPEN 7.49.0
|
||||||
|
CURLOPT_TCP_KEEPALIVE 7.25.0
|
||||||
|
CURLOPT_TCP_KEEPIDLE 7.25.0
|
||||||
|
CURLOPT_TCP_KEEPINTVL 7.25.0
|
||||||
|
CURLOPT_TCP_NODELAY 7.11.2
|
||||||
|
CURLOPT_TELNETOPTIONS 7.7
|
||||||
|
CURLOPT_TFTP_BLKSIZE 7.19.4
|
||||||
|
CURLOPT_TFTP_NO_OPTIONS 7.48.0
|
||||||
|
CURLOPT_TIMECONDITION 7.1
|
||||||
|
CURLOPT_TIMEOUT 7.1
|
||||||
|
CURLOPT_TIMEOUT_MS 7.16.2
|
||||||
|
CURLOPT_TIMEVALUE 7.1
|
||||||
|
CURLOPT_TIMEVALUE_LARGE 7.59.0
|
||||||
|
CURLOPT_TLS13_CIPHERS 7.61.0
|
||||||
|
CURLOPT_TLSAUTH_PASSWORD 7.21.4
|
||||||
|
CURLOPT_TLSAUTH_TYPE 7.21.4
|
||||||
|
CURLOPT_TLSAUTH_USERNAME 7.21.4
|
||||||
|
CURLOPT_TRAILERDATA 7.64.0
|
||||||
|
CURLOPT_TRAILERFUNCTION 7.64.0
|
||||||
|
CURLOPT_TRANSFERTEXT 7.1.1
|
||||||
|
CURLOPT_TRANSFER_ENCODING 7.21.6
|
||||||
|
CURLOPT_UNIX_SOCKET_PATH 7.40.0
|
||||||
|
CURLOPT_UNRESTRICTED_AUTH 7.10.4
|
||||||
|
CURLOPT_UPKEEP_INTERVAL_MS 7.62.0
|
||||||
|
CURLOPT_UPLOAD 7.1
|
||||||
|
CURLOPT_UPLOAD_BUFFERSIZE 7.62.0
|
||||||
|
CURLOPT_URL 7.1
|
||||||
|
CURLOPT_USERAGENT 7.1
|
||||||
|
CURLOPT_USERNAME 7.19.1
|
||||||
|
CURLOPT_USERPWD 7.1
|
||||||
|
CURLOPT_USE_SSL 7.17.0
|
||||||
|
CURLOPT_VERBOSE 7.1
|
||||||
|
CURLOPT_WILDCARDMATCH 7.21.0
|
||||||
|
CURLOPT_WRITEDATA 7.9.7
|
||||||
|
CURLOPT_WRITEFUNCTION 7.1
|
||||||
|
CURLOPT_WRITEHEADER 7.1
|
||||||
|
CURLOPT_WRITEINFO 7.1
|
||||||
|
CURLOPT_XFERINFODATA 7.32.0
|
||||||
|
CURLOPT_XFERINFOFUNCTION 7.32.0
|
||||||
|
CURLOPT_XOAUTH2_BEARER 7.33.0
|
||||||
|
CURLPAUSE_ALL 7.18.0
|
||||||
|
CURLPAUSE_CONT 7.18.0
|
||||||
|
CURLPAUSE_RECV 7.18.0
|
||||||
|
CURLPAUSE_RECV_CONT 7.18.0
|
||||||
|
CURLPAUSE_SEND 7.18.0
|
||||||
|
CURLPAUSE_SEND_CONT 7.18.0
|
||||||
|
CURLPIPE_HTTP1 7.43.0
|
||||||
|
CURLPIPE_MULTIPLEX 7.43.0
|
||||||
|
CURLPIPE_NOTHING 7.43.0
|
||||||
|
CURLPROTO_ALL 7.19.4
|
||||||
|
CURLPROTO_DICT 7.19.4
|
||||||
|
CURLPROTO_FILE 7.19.4
|
||||||
|
CURLPROTO_FTP 7.19.4
|
||||||
|
CURLPROTO_FTPS 7.19.4
|
||||||
|
CURLPROTO_GOPHER 7.21.2
|
||||||
|
CURLPROTO_HTTP 7.19.4
|
||||||
|
CURLPROTO_HTTPS 7.19.4
|
||||||
|
CURLPROTO_IMAP 7.20.0
|
||||||
|
CURLPROTO_IMAPS 7.20.0
|
||||||
|
CURLPROTO_LDAP 7.19.4
|
||||||
|
CURLPROTO_LDAPS 7.19.4
|
||||||
|
CURLPROTO_POP3 7.20.0
|
||||||
|
CURLPROTO_POP3S 7.20.0
|
||||||
|
CURLPROTO_RTMP 7.21.0
|
||||||
|
CURLPROTO_RTMPE 7.21.0
|
||||||
|
CURLPROTO_RTMPS 7.21.0
|
||||||
|
CURLPROTO_RTMPT 7.21.0
|
||||||
|
CURLPROTO_RTMPTE 7.21.0
|
||||||
|
CURLPROTO_RTMPTS 7.21.0
|
||||||
|
CURLPROTO_RTSP 7.20.0
|
||||||
|
CURLPROTO_SCP 7.19.4
|
||||||
|
CURLPROTO_SFTP 7.19.4
|
||||||
|
CURLPROTO_SMB 7.40.0
|
||||||
|
CURLPROTO_SMBS 7.40.0
|
||||||
|
CURLPROTO_SMTP 7.20.0
|
||||||
|
CURLPROTO_SMTPS 7.20.0
|
||||||
|
CURLPROTO_TELNET 7.19.4
|
||||||
|
CURLPROTO_TFTP 7.19.4
|
||||||
|
CURLPROXY_HTTP 7.10
|
||||||
|
CURLPROXY_HTTPS 7.52.0
|
||||||
|
CURLPROXY_HTTP_1_0 7.19.4
|
||||||
|
CURLPROXY_SOCKS4 7.10
|
||||||
|
CURLPROXY_SOCKS4A 7.18.0
|
||||||
|
CURLPROXY_SOCKS5 7.10
|
||||||
|
CURLPROXY_SOCKS5_HOSTNAME 7.18.0
|
||||||
|
CURLSHE_BAD_OPTION 7.10.3
|
||||||
|
CURLSHE_INVALID 7.10.3
|
||||||
|
CURLSHE_IN_USE 7.10.3
|
||||||
|
CURLSHE_NOMEM 7.12.0
|
||||||
|
CURLSHE_NOT_BUILT_IN 7.23.0
|
||||||
|
CURLSHE_OK 7.10.3
|
||||||
|
CURLSHOPT_LOCKFUNC 7.10.3
|
||||||
|
CURLSHOPT_NONE 7.10.3
|
||||||
|
CURLSHOPT_SHARE 7.10.3
|
||||||
|
CURLSHOPT_UNLOCKFUNC 7.10.3
|
||||||
|
CURLSHOPT_UNSHARE 7.10.3
|
||||||
|
CURLSHOPT_USERDATA 7.10.3
|
||||||
|
CURLSOCKTYPE_ACCEPT 7.28.0
|
||||||
|
CURLSOCKTYPE_IPCXN 7.16.0
|
||||||
|
CURLSSH_AUTH_AGENT 7.28.0
|
||||||
|
CURLSSH_AUTH_ANY 7.16.1
|
||||||
|
CURLSSH_AUTH_DEFAULT 7.16.1
|
||||||
|
CURLSSH_AUTH_GSSAPI 7.58.0
|
||||||
|
CURLSSH_AUTH_HOST 7.16.1
|
||||||
|
CURLSSH_AUTH_KEYBOARD 7.16.1
|
||||||
|
CURLSSH_AUTH_NONE 7.16.1
|
||||||
|
CURLSSH_AUTH_PASSWORD 7.16.1
|
||||||
|
CURLSSH_AUTH_PUBLICKEY 7.16.1
|
||||||
|
CURLSSLBACKEND_AXTLS 7.38.0 7.61.0
|
||||||
|
CURLSSLBACKEND_BORINGSSL 7.49.0
|
||||||
|
CURLSSLBACKEND_CYASSL 7.34.0
|
||||||
|
CURLSSLBACKEND_DARWINSSL 7.34.0 7.64.1
|
||||||
|
CURLSSLBACKEND_GNUTLS 7.34.0
|
||||||
|
CURLSSLBACKEND_GSKIT 7.34.0
|
||||||
|
CURLSSLBACKEND_LIBRESSL 7.49.0
|
||||||
|
CURLSSLBACKEND_MBEDTLS 7.46.0
|
||||||
|
CURLSSLBACKEND_MESALINK 7.62.0
|
||||||
|
CURLSSLBACKEND_NONE 7.34.0
|
||||||
|
CURLSSLBACKEND_NSS 7.34.0
|
||||||
|
CURLSSLBACKEND_OPENSSL 7.34.0
|
||||||
|
CURLSSLBACKEND_POLARSSL 7.34.0
|
||||||
|
CURLSSLBACKEND_QSOSSL 7.34.0 - 7.38.1
|
||||||
|
CURLSSLBACKEND_SCHANNEL 7.34.0
|
||||||
|
CURLSSLBACKEND_SECURETRANSPORT 7.64.1
|
||||||
|
CURLSSLBACKEND_WOLFSSL 7.49.0
|
||||||
|
CURLSSLOPT_ALLOW_BEAST 7.25.0
|
||||||
|
CURLSSLOPT_NO_REVOKE 7.44.0
|
||||||
|
CURLSSLSET_NO_BACKENDS 7.56.0
|
||||||
|
CURLSSLSET_OK 7.56.0
|
||||||
|
CURLSSLSET_TOO_LATE 7.56.0
|
||||||
|
CURLSSLSET_UNKNOWN_BACKEND 7.56.0
|
||||||
|
CURLUE_BAD_HANDLE 7.62.0
|
||||||
|
CURLUE_BAD_PARTPOINTER 7.62.0
|
||||||
|
CURLUE_BAD_PORT_NUMBER 7.62.0
|
||||||
|
CURLUE_MALFORMED_INPUT 7.62.0
|
||||||
|
CURLUE_NO_FRAGMENT 7.62.0
|
||||||
|
CURLUE_NO_HOST 7.62.0
|
||||||
|
CURLUE_NO_OPTIONS 7.62.0
|
||||||
|
CURLUE_NO_PASSWORD 7.62.0
|
||||||
|
CURLUE_NO_PORT 7.62.0
|
||||||
|
CURLUE_NO_QUERY 7.62.0
|
||||||
|
CURLUE_NO_SCHEME 7.62.0
|
||||||
|
CURLUE_NO_USER 7.62.0
|
||||||
|
CURLUE_OK 7.62.0
|
||||||
|
CURLUE_OUT_OF_MEMORY 7.62.0
|
||||||
|
CURLUE_UNKNOWN_PART 7.62.0
|
||||||
|
CURLUE_UNSUPPORTED_SCHEME 7.62.0
|
||||||
|
CURLUE_URLDECODE 7.62.0
|
||||||
|
CURLUE_USER_NOT_ALLOWED 7.62.0
|
||||||
|
CURLUPART_FRAGMENT 7.62.0
|
||||||
|
CURLUPART_HOST 7.62.0
|
||||||
|
CURLUPART_OPTIONS 7.62.0
|
||||||
|
CURLUPART_PASSWORD 7.62.0
|
||||||
|
CURLUPART_PATH 7.62.0
|
||||||
|
CURLUPART_PORT 7.62.0
|
||||||
|
CURLUPART_QUERY 7.62.0
|
||||||
|
CURLUPART_SCHEME 7.62.0
|
||||||
|
CURLUPART_URL 7.62.0
|
||||||
|
CURLUPART_USER 7.62.0
|
||||||
|
CURLUPART_ZONEID 7.65.0
|
||||||
|
CURLUSESSL_ALL 7.17.0
|
||||||
|
CURLUSESSL_CONTROL 7.17.0
|
||||||
|
CURLUSESSL_NONE 7.17.0
|
||||||
|
CURLUSESSL_TRY 7.17.0
|
||||||
|
CURLU_APPENDQUERY 7.62.0
|
||||||
|
CURLU_DEFAULT_PORT 7.62.0
|
||||||
|
CURLU_DEFAULT_SCHEME 7.62.0
|
||||||
|
CURLU_DISALLOW_USER 7.62.0
|
||||||
|
CURLU_GUESS_SCHEME 7.62.0
|
||||||
|
CURLU_NON_SUPPORT_SCHEME 7.62.0
|
||||||
|
CURLU_NO_DEFAULT_PORT 7.62.0
|
||||||
|
CURLU_PATH_AS_IS 7.62.0
|
||||||
|
CURLU_URLDECODE 7.62.0
|
||||||
|
CURLU_URLENCODE 7.62.0
|
||||||
|
CURLVERSION_FIFTH 7.57.0
|
||||||
|
CURLVERSION_FIRST 7.10
|
||||||
|
CURLVERSION_FOURTH 7.16.1
|
||||||
|
CURLVERSION_NOW 7.10
|
||||||
|
CURLVERSION_SECOND 7.11.1
|
||||||
|
CURLVERSION_THIRD 7.12.0
|
||||||
|
CURL_CHUNK_BGN_FUNC_FAIL 7.21.0
|
||||||
|
CURL_CHUNK_BGN_FUNC_OK 7.21.0
|
||||||
|
CURL_CHUNK_BGN_FUNC_SKIP 7.21.0
|
||||||
|
CURL_CHUNK_END_FUNC_FAIL 7.21.0
|
||||||
|
CURL_CHUNK_END_FUNC_OK 7.21.0
|
||||||
|
CURL_CSELECT_ERR 7.16.3
|
||||||
|
CURL_CSELECT_IN 7.16.3
|
||||||
|
CURL_CSELECT_OUT 7.16.3
|
||||||
|
CURL_DID_MEMORY_FUNC_TYPEDEFS 7.49.0
|
||||||
|
CURL_EASY_NONE 7.14.0 - 7.15.4
|
||||||
|
CURL_EASY_TIMEOUT 7.14.0 - 7.15.4
|
||||||
|
CURL_ERROR_SIZE 7.1
|
||||||
|
CURL_FNMATCHFUNC_FAIL 7.21.0
|
||||||
|
CURL_FNMATCHFUNC_MATCH 7.21.0
|
||||||
|
CURL_FNMATCHFUNC_NOMATCH 7.21.0
|
||||||
|
CURL_FORMADD_DISABLED 7.12.1 7.56.0
|
||||||
|
CURL_FORMADD_ILLEGAL_ARRAY 7.9.8 7.56.0
|
||||||
|
CURL_FORMADD_INCOMPLETE 7.9.8 7.56.0
|
||||||
|
CURL_FORMADD_MEMORY 7.9.8 7.56.0
|
||||||
|
CURL_FORMADD_NULL 7.9.8 7.56.0
|
||||||
|
CURL_FORMADD_OK 7.9.8 7.56.0
|
||||||
|
CURL_FORMADD_OPTION_TWICE 7.9.8 7.56.0
|
||||||
|
CURL_FORMADD_UNKNOWN_OPTION 7.9.8 7.56.0
|
||||||
|
CURL_GLOBAL_ACK_EINTR 7.30.0
|
||||||
|
CURL_GLOBAL_ALL 7.8
|
||||||
|
CURL_GLOBAL_DEFAULT 7.8
|
||||||
|
CURL_GLOBAL_NOTHING 7.8
|
||||||
|
CURL_GLOBAL_SSL 7.8
|
||||||
|
CURL_GLOBAL_WIN32 7.8.1
|
||||||
|
CURL_HET_DEFAULT 7.59.0
|
||||||
|
CURL_HTTPPOST_BUFFER 7.46.0
|
||||||
|
CURL_HTTPPOST_CALLBACK 7.46.0
|
||||||
|
CURL_HTTPPOST_FILENAME 7.46.0
|
||||||
|
CURL_HTTPPOST_LARGE 7.46.0
|
||||||
|
CURL_HTTPPOST_PTRBUFFER 7.46.0
|
||||||
|
CURL_HTTPPOST_PTRCONTENTS 7.46.0
|
||||||
|
CURL_HTTPPOST_PTRNAME 7.46.0
|
||||||
|
CURL_HTTPPOST_READFILE 7.46.0
|
||||||
|
CURL_HTTP_VERSION_1_0 7.9.1
|
||||||
|
CURL_HTTP_VERSION_1_1 7.9.1
|
||||||
|
CURL_HTTP_VERSION_2 7.43.0
|
||||||
|
CURL_HTTP_VERSION_2TLS 7.47.0
|
||||||
|
CURL_HTTP_VERSION_2_0 7.33.0
|
||||||
|
CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE 7.49.0
|
||||||
|
CURL_HTTP_VERSION_NONE 7.9.1
|
||||||
|
CURL_IPRESOLVE_V4 7.10.8
|
||||||
|
CURL_IPRESOLVE_V6 7.10.8
|
||||||
|
CURL_IPRESOLVE_WHATEVER 7.10.8
|
||||||
|
CURL_LOCK_ACCESS_NONE 7.10.3
|
||||||
|
CURL_LOCK_ACCESS_SHARED 7.10.3
|
||||||
|
CURL_LOCK_ACCESS_SINGLE 7.10.3
|
||||||
|
CURL_LOCK_DATA_CONNECT 7.10.3
|
||||||
|
CURL_LOCK_DATA_COOKIE 7.10.3
|
||||||
|
CURL_LOCK_DATA_DNS 7.10.3
|
||||||
|
CURL_LOCK_DATA_NONE 7.10.3
|
||||||
|
CURL_LOCK_DATA_PSL 7.61.0
|
||||||
|
CURL_LOCK_DATA_SHARE 7.10.4
|
||||||
|
CURL_LOCK_DATA_SSL_SESSION 7.10.3
|
||||||
|
CURL_LOCK_TYPE_CONNECT 7.10 - 7.10.2
|
||||||
|
CURL_LOCK_TYPE_COOKIE 7.10 - 7.10.2
|
||||||
|
CURL_LOCK_TYPE_DNS 7.10 - 7.10.2
|
||||||
|
CURL_LOCK_TYPE_NONE 7.10 - 7.10.2
|
||||||
|
CURL_LOCK_TYPE_SSL_SESSION 7.10 - 7.10.2
|
||||||
|
CURL_MAX_HTTP_HEADER 7.19.7
|
||||||
|
CURL_MAX_READ_SIZE 7.53.0
|
||||||
|
CURL_MAX_WRITE_SIZE 7.9.7
|
||||||
|
CURL_NETRC_IGNORED 7.9.8
|
||||||
|
CURL_NETRC_OPTIONAL 7.9.8
|
||||||
|
CURL_NETRC_REQUIRED 7.9.8
|
||||||
|
CURL_POLL_IN 7.14.0
|
||||||
|
CURL_POLL_INOUT 7.14.0
|
||||||
|
CURL_POLL_NONE 7.14.0
|
||||||
|
CURL_POLL_OUT 7.14.0
|
||||||
|
CURL_POLL_REMOVE 7.14.0
|
||||||
|
CURL_PROGRESS_BAR 7.1.1 - 7.4.1
|
||||||
|
CURL_PROGRESS_STATS 7.1.1 - 7.4.1
|
||||||
|
CURL_PUSH_DENY 7.44.0
|
||||||
|
CURL_PUSH_OK 7.44.0
|
||||||
|
CURL_READFUNC_ABORT 7.12.1
|
||||||
|
CURL_READFUNC_PAUSE 7.18.0
|
||||||
|
CURL_REDIR_GET_ALL 7.19.1
|
||||||
|
CURL_REDIR_POST_301 7.19.1
|
||||||
|
CURL_REDIR_POST_302 7.19.1
|
||||||
|
CURL_REDIR_POST_303 7.25.1
|
||||||
|
CURL_REDIR_POST_ALL 7.19.1
|
||||||
|
CURL_RTSPREQ_ANNOUNCE 7.20.0
|
||||||
|
CURL_RTSPREQ_DESCRIBE 7.20.0
|
||||||
|
CURL_RTSPREQ_GET_PARAMETER 7.20.0
|
||||||
|
CURL_RTSPREQ_NONE 7.20.0
|
||||||
|
CURL_RTSPREQ_OPTIONS 7.20.0
|
||||||
|
CURL_RTSPREQ_PAUSE 7.20.0
|
||||||
|
CURL_RTSPREQ_PLAY 7.20.0
|
||||||
|
CURL_RTSPREQ_RECEIVE 7.20.0
|
||||||
|
CURL_RTSPREQ_RECORD 7.20.0
|
||||||
|
CURL_RTSPREQ_SETUP 7.20.0
|
||||||
|
CURL_RTSPREQ_SET_PARAMETER 7.20.0
|
||||||
|
CURL_RTSPREQ_TEARDOWN 7.20.0
|
||||||
|
CURL_SEEKFUNC_CANTSEEK 7.19.5
|
||||||
|
CURL_SEEKFUNC_FAIL 7.19.5
|
||||||
|
CURL_SEEKFUNC_OK 7.19.5
|
||||||
|
CURL_SOCKET_BAD 7.14.0
|
||||||
|
CURL_SOCKET_TIMEOUT 7.14.0
|
||||||
|
CURL_SOCKOPT_ALREADY_CONNECTED 7.21.5
|
||||||
|
CURL_SOCKOPT_ERROR 7.21.5
|
||||||
|
CURL_SOCKOPT_OK 7.21.5
|
||||||
|
CURL_SSLVERSION_DEFAULT 7.9.2
|
||||||
|
CURL_SSLVERSION_MAX_DEFAULT 7.54.0
|
||||||
|
CURL_SSLVERSION_MAX_NONE 7.54.0
|
||||||
|
CURL_SSLVERSION_MAX_TLSv1_0 7.54.0
|
||||||
|
CURL_SSLVERSION_MAX_TLSv1_1 7.54.0
|
||||||
|
CURL_SSLVERSION_MAX_TLSv1_2 7.54.0
|
||||||
|
CURL_SSLVERSION_MAX_TLSv1_3 7.54.0
|
||||||
|
CURL_SSLVERSION_SSLv2 7.9.2
|
||||||
|
CURL_SSLVERSION_SSLv3 7.9.2
|
||||||
|
CURL_SSLVERSION_TLSv1 7.9.2
|
||||||
|
CURL_SSLVERSION_TLSv1_0 7.34.0
|
||||||
|
CURL_SSLVERSION_TLSv1_1 7.34.0
|
||||||
|
CURL_SSLVERSION_TLSv1_2 7.34.0
|
||||||
|
CURL_SSLVERSION_TLSv1_3 7.52.0
|
||||||
|
CURL_STRICTER 7.50.2
|
||||||
|
CURL_TIMECOND_IFMODSINCE 7.9.7
|
||||||
|
CURL_TIMECOND_IFUNMODSINCE 7.9.7
|
||||||
|
CURL_TIMECOND_LASTMOD 7.9.7
|
||||||
|
CURL_TIMECOND_NONE 7.9.7
|
||||||
|
CURL_TLSAUTH_NONE 7.21.4
|
||||||
|
CURL_TLSAUTH_SRP 7.21.4
|
||||||
|
CURL_TRAILERFUNC_ABORT 7.64.0
|
||||||
|
CURL_TRAILERFUNC_OK 7.64.0
|
||||||
|
CURL_UPKEEP_INTERVAL_DEFAULT 7.62.0
|
||||||
|
CURL_VERSION_ALTSVC 7.64.1
|
||||||
|
CURL_VERSION_ASYNCHDNS 7.10.7
|
||||||
|
CURL_VERSION_BROTLI 7.57.0
|
||||||
|
CURL_VERSION_CONV 7.15.4
|
||||||
|
CURL_VERSION_CURLDEBUG 7.19.6
|
||||||
|
CURL_VERSION_DEBUG 7.10.6
|
||||||
|
CURL_VERSION_GSSAPI 7.38.0
|
||||||
|
CURL_VERSION_GSSNEGOTIATE 7.10.6 7.38.0
|
||||||
|
CURL_VERSION_HTTP2 7.33.0
|
||||||
|
CURL_VERSION_HTTPS_PROXY 7.52.0
|
||||||
|
CURL_VERSION_IDN 7.12.0
|
||||||
|
CURL_VERSION_IPV6 7.10
|
||||||
|
CURL_VERSION_KERBEROS4 7.10 7.33.0
|
||||||
|
CURL_VERSION_KERBEROS5 7.40.0
|
||||||
|
CURL_VERSION_LARGEFILE 7.11.1
|
||||||
|
CURL_VERSION_LIBZ 7.10
|
||||||
|
CURL_VERSION_MULTI_SSL 7.56.0
|
||||||
|
CURL_VERSION_NTLM 7.10.6
|
||||||
|
CURL_VERSION_NTLM_WB 7.22.0
|
||||||
|
CURL_VERSION_PSL 7.47.0
|
||||||
|
CURL_VERSION_SPNEGO 7.10.8
|
||||||
|
CURL_VERSION_SSL 7.10
|
||||||
|
CURL_VERSION_SSPI 7.13.2
|
||||||
|
CURL_VERSION_TLSAUTH_SRP 7.21.4
|
||||||
|
CURL_VERSION_UNIX_SOCKETS 7.40.0
|
||||||
|
CURL_WAIT_POLLIN 7.28.0
|
||||||
|
CURL_WAIT_POLLOUT 7.28.0
|
||||||
|
CURL_WAIT_POLLPRI 7.28.0
|
||||||
|
CURL_WRITEFUNC_PAUSE 7.18.0
|
||||||
|
CURL_ZERO_TERMINATED 7.56.0
|
||||||
2867
bin/curl/include/curl/curl.h
Normal file
2867
bin/curl/include/curl/curl.h
Normal file
File diff suppressed because it is too large
Load Diff
77
bin/curl/include/curl/curlver.h
Normal file
77
bin/curl/include/curl/curlver.h
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
#ifndef __CURL_CURLVER_H
|
||||||
|
#define __CURL_CURLVER_H
|
||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 - 2019, 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 https://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.
|
||||||
|
*
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
/* This header file contains nothing but libcurl version info, generated by
|
||||||
|
a script at release-time. This was made its own header file in 7.11.2 */
|
||||||
|
|
||||||
|
/* This is the global package copyright */
|
||||||
|
#define LIBCURL_COPYRIGHT "1996 - 2019 Daniel Stenberg, <daniel@haxx.se>."
|
||||||
|
|
||||||
|
/* This is the version number of the libcurl package from which this header
|
||||||
|
file origins: */
|
||||||
|
#define LIBCURL_VERSION "7.65.0"
|
||||||
|
|
||||||
|
/* The numeric version number is also available "in parts" by using these
|
||||||
|
defines: */
|
||||||
|
#define LIBCURL_VERSION_MAJOR 7
|
||||||
|
#define LIBCURL_VERSION_MINOR 65
|
||||||
|
#define LIBCURL_VERSION_PATCH 0
|
||||||
|
|
||||||
|
/* This is the numeric version of the libcurl version number, meant for easier
|
||||||
|
parsing and comparions by programs. The LIBCURL_VERSION_NUM define will
|
||||||
|
always follow this syntax:
|
||||||
|
|
||||||
|
0xXXYYZZ
|
||||||
|
|
||||||
|
Where XX, YY and ZZ are the main version, release and patch numbers in
|
||||||
|
hexadecimal (using 8 bits each). All three numbers are always represented
|
||||||
|
using two digits. 1.2 would appear as "0x010200" while version 9.11.7
|
||||||
|
appears as "0x090b07".
|
||||||
|
|
||||||
|
This 6-digit (24 bits) hexadecimal number does not show pre-release number,
|
||||||
|
and it is always a greater number in a more recent release. It makes
|
||||||
|
comparisons with greater than and less than work.
|
||||||
|
|
||||||
|
Note: This define is the full hex number and _does not_ use the
|
||||||
|
CURL_VERSION_BITS() macro since curl's own configure script greps for it
|
||||||
|
and needs it to contain the full number.
|
||||||
|
*/
|
||||||
|
#define LIBCURL_VERSION_NUM 0x074100
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is the date and time when the full source package was created. The
|
||||||
|
* timestamp is not stored in git, as the timestamp is properly set in the
|
||||||
|
* tarballs by the maketgz script.
|
||||||
|
*
|
||||||
|
* The format of the date follows this template:
|
||||||
|
*
|
||||||
|
* "2007-11-23"
|
||||||
|
*/
|
||||||
|
#define LIBCURL_TIMESTAMP "2019-05-22"
|
||||||
|
|
||||||
|
#define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|(z))
|
||||||
|
#define CURL_AT_LEAST_VERSION(x,y,z) \
|
||||||
|
(LIBCURL_VERSION_NUM >= CURL_VERSION_BITS(x, y, z))
|
||||||
|
|
||||||
|
#endif /* __CURL_CURLVER_H */
|
||||||
112
bin/curl/include/curl/easy.h
Normal file
112
bin/curl/include/curl/easy.h
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
#ifndef __CURL_EASY_H
|
||||||
|
#define __CURL_EASY_H
|
||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 - 2016, 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 https://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.
|
||||||
|
*
|
||||||
|
***************************************************************************/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CURL_EXTERN CURL *curl_easy_init(void);
|
||||||
|
CURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...);
|
||||||
|
CURL_EXTERN CURLcode curl_easy_perform(CURL *curl);
|
||||||
|
CURL_EXTERN void curl_easy_cleanup(CURL *curl);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME curl_easy_getinfo()
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* Request internal information from the curl session with this function. The
|
||||||
|
* third argument MUST be a pointer to a long, a pointer to a char * or a
|
||||||
|
* pointer to a double (as the documentation describes elsewhere). The data
|
||||||
|
* pointed to will be filled in accordingly and can be relied upon only if the
|
||||||
|
* function returns CURLE_OK. This function is intended to get used *AFTER* a
|
||||||
|
* performed transfer, all results from this function are undefined until the
|
||||||
|
* transfer is completed.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME curl_easy_duphandle()
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* Creates a new curl session handle with the same options set for the handle
|
||||||
|
* passed in. Duplicating a handle could only be a matter of cloning data and
|
||||||
|
* options, internal state info and things like persistent connections cannot
|
||||||
|
* be transferred. It is useful in multithreaded applications when you can run
|
||||||
|
* curl_easy_duphandle() for each new thread to avoid a series of identical
|
||||||
|
* curl_easy_setopt() invokes in every thread.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURL *curl_easy_duphandle(CURL *curl);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME curl_easy_reset()
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* Re-initializes a CURL handle to the default values. This puts back the
|
||||||
|
* handle to the same state as it was in when it was just created.
|
||||||
|
*
|
||||||
|
* It does keep: live connections, the Session ID cache, the DNS cache and the
|
||||||
|
* cookies.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN void curl_easy_reset(CURL *curl);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME curl_easy_recv()
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* Receives data from the connected socket. Use after successful
|
||||||
|
* curl_easy_perform() with CURLOPT_CONNECT_ONLY option.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLcode curl_easy_recv(CURL *curl, void *buffer, size_t buflen,
|
||||||
|
size_t *n);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME curl_easy_send()
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* Sends data over the connected socket. Use after successful
|
||||||
|
* curl_easy_perform() with CURLOPT_CONNECT_ONLY option.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLcode curl_easy_send(CURL *curl, const void *buffer,
|
||||||
|
size_t buflen, size_t *n);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME curl_easy_upkeep()
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* Performs connection upkeep for the given session handle.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLcode curl_easy_upkeep(CURL *curl);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
50
bin/curl/include/curl/mprintf.h
Normal file
50
bin/curl/include/curl/mprintf.h
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
#ifndef __CURL_MPRINTF_H
|
||||||
|
#define __CURL_MPRINTF_H
|
||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 - 2016, 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 https://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 <stdarg.h>
|
||||||
|
#include <stdio.h> /* needed for FILE */
|
||||||
|
#include "curl.h" /* for CURL_EXTERN */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CURL_EXTERN int curl_mprintf(const char *format, ...);
|
||||||
|
CURL_EXTERN int curl_mfprintf(FILE *fd, const char *format, ...);
|
||||||
|
CURL_EXTERN int curl_msprintf(char *buffer, const char *format, ...);
|
||||||
|
CURL_EXTERN int curl_msnprintf(char *buffer, size_t maxlength,
|
||||||
|
const char *format, ...);
|
||||||
|
CURL_EXTERN int curl_mvprintf(const char *format, va_list args);
|
||||||
|
CURL_EXTERN int curl_mvfprintf(FILE *fd, const char *format, va_list args);
|
||||||
|
CURL_EXTERN int curl_mvsprintf(char *buffer, const char *format, va_list args);
|
||||||
|
CURL_EXTERN int curl_mvsnprintf(char *buffer, size_t maxlength,
|
||||||
|
const char *format, va_list args);
|
||||||
|
CURL_EXTERN char *curl_maprintf(const char *format, ...);
|
||||||
|
CURL_EXTERN char *curl_mvaprintf(const char *format, va_list args);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __CURL_MPRINTF_H */
|
||||||
441
bin/curl/include/curl/multi.h
Normal file
441
bin/curl/include/curl/multi.h
Normal file
@@ -0,0 +1,441 @@
|
|||||||
|
#ifndef __CURL_MULTI_H
|
||||||
|
#define __CURL_MULTI_H
|
||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 - 2017, 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 https://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.
|
||||||
|
*
|
||||||
|
***************************************************************************/
|
||||||
|
/*
|
||||||
|
This is an "external" header file. Don't give away any internals here!
|
||||||
|
|
||||||
|
GOALS
|
||||||
|
|
||||||
|
o Enable a "pull" interface. The application that uses libcurl decides where
|
||||||
|
and when to ask libcurl to get/send data.
|
||||||
|
|
||||||
|
o Enable multiple simultaneous transfers in the same thread without making it
|
||||||
|
complicated for the application.
|
||||||
|
|
||||||
|
o Enable the application to select() on its own file descriptors and curl's
|
||||||
|
file descriptors simultaneous easily.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This header file should not really need to include "curl.h" since curl.h
|
||||||
|
* itself includes this file and we expect user applications to do #include
|
||||||
|
* <curl/curl.h> without the need for especially including multi.h.
|
||||||
|
*
|
||||||
|
* For some reason we added this include here at one point, and rather than to
|
||||||
|
* break existing (wrongly written) libcurl applications, we leave it as-is
|
||||||
|
* but with this warning attached.
|
||||||
|
*/
|
||||||
|
#include "curl.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(BUILDING_LIBCURL) || defined(CURL_STRICTER)
|
||||||
|
typedef struct Curl_multi CURLM;
|
||||||
|
#else
|
||||||
|
typedef void CURLM;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CURLM_CALL_MULTI_PERFORM = -1, /* please call curl_multi_perform() or
|
||||||
|
curl_multi_socket*() soon */
|
||||||
|
CURLM_OK,
|
||||||
|
CURLM_BAD_HANDLE, /* the passed-in handle is not a valid CURLM handle */
|
||||||
|
CURLM_BAD_EASY_HANDLE, /* an easy handle was not good/valid */
|
||||||
|
CURLM_OUT_OF_MEMORY, /* if you ever get this, you're in deep sh*t */
|
||||||
|
CURLM_INTERNAL_ERROR, /* this is a libcurl bug */
|
||||||
|
CURLM_BAD_SOCKET, /* the passed in socket argument did not match */
|
||||||
|
CURLM_UNKNOWN_OPTION, /* curl_multi_setopt() with unsupported option */
|
||||||
|
CURLM_ADDED_ALREADY, /* an easy handle already added to a multi handle was
|
||||||
|
attempted to get added - again */
|
||||||
|
CURLM_RECURSIVE_API_CALL, /* an api function was called from inside a
|
||||||
|
callback */
|
||||||
|
CURLM_LAST
|
||||||
|
} CURLMcode;
|
||||||
|
|
||||||
|
/* just to make code nicer when using curl_multi_socket() you can now check
|
||||||
|
for CURLM_CALL_MULTI_SOCKET too in the same style it works for
|
||||||
|
curl_multi_perform() and CURLM_CALL_MULTI_PERFORM */
|
||||||
|
#define CURLM_CALL_MULTI_SOCKET CURLM_CALL_MULTI_PERFORM
|
||||||
|
|
||||||
|
/* bitmask bits for CURLMOPT_PIPELINING */
|
||||||
|
#define CURLPIPE_NOTHING 0L
|
||||||
|
#define CURLPIPE_HTTP1 1L
|
||||||
|
#define CURLPIPE_MULTIPLEX 2L
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CURLMSG_NONE, /* first, not used */
|
||||||
|
CURLMSG_DONE, /* This easy handle has completed. 'result' contains
|
||||||
|
the CURLcode of the transfer */
|
||||||
|
CURLMSG_LAST /* last, not used */
|
||||||
|
} CURLMSG;
|
||||||
|
|
||||||
|
struct CURLMsg {
|
||||||
|
CURLMSG msg; /* what this message means */
|
||||||
|
CURL *easy_handle; /* the handle it concerns */
|
||||||
|
union {
|
||||||
|
void *whatever; /* message-specific data */
|
||||||
|
CURLcode result; /* return code for transfer */
|
||||||
|
} data;
|
||||||
|
};
|
||||||
|
typedef struct CURLMsg CURLMsg;
|
||||||
|
|
||||||
|
/* Based on poll(2) structure and values.
|
||||||
|
* We don't use pollfd and POLL* constants explicitly
|
||||||
|
* to cover platforms without poll(). */
|
||||||
|
#define CURL_WAIT_POLLIN 0x0001
|
||||||
|
#define CURL_WAIT_POLLPRI 0x0002
|
||||||
|
#define CURL_WAIT_POLLOUT 0x0004
|
||||||
|
|
||||||
|
struct curl_waitfd {
|
||||||
|
curl_socket_t fd;
|
||||||
|
short events;
|
||||||
|
short revents; /* not supported yet */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_init()
|
||||||
|
*
|
||||||
|
* Desc: inititalize multi-style curl usage
|
||||||
|
*
|
||||||
|
* Returns: a new CURLM handle to use in all 'curl_multi' functions.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLM *curl_multi_init(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_add_handle()
|
||||||
|
*
|
||||||
|
* Desc: add a standard curl handle to the multi stack
|
||||||
|
*
|
||||||
|
* Returns: CURLMcode type, general multi error code.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle,
|
||||||
|
CURL *curl_handle);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_remove_handle()
|
||||||
|
*
|
||||||
|
* Desc: removes a curl handle from the multi stack again
|
||||||
|
*
|
||||||
|
* Returns: CURLMcode type, general multi error code.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle,
|
||||||
|
CURL *curl_handle);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_fdset()
|
||||||
|
*
|
||||||
|
* Desc: Ask curl for its fd_set sets. The app can use these to select() or
|
||||||
|
* poll() on. We want curl_multi_perform() called as soon as one of
|
||||||
|
* them are ready.
|
||||||
|
*
|
||||||
|
* Returns: CURLMcode type, general multi error code.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_fdset(CURLM *multi_handle,
|
||||||
|
fd_set *read_fd_set,
|
||||||
|
fd_set *write_fd_set,
|
||||||
|
fd_set *exc_fd_set,
|
||||||
|
int *max_fd);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_wait()
|
||||||
|
*
|
||||||
|
* Desc: Poll on all fds within a CURLM set as well as any
|
||||||
|
* additional fds passed to the function.
|
||||||
|
*
|
||||||
|
* Returns: CURLMcode type, general multi error code.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_wait(CURLM *multi_handle,
|
||||||
|
struct curl_waitfd extra_fds[],
|
||||||
|
unsigned int extra_nfds,
|
||||||
|
int timeout_ms,
|
||||||
|
int *ret);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_perform()
|
||||||
|
*
|
||||||
|
* Desc: When the app thinks there's data available for curl it calls this
|
||||||
|
* function to read/write whatever there is right now. This returns
|
||||||
|
* as soon as the reads and writes are done. This function does not
|
||||||
|
* require that there actually is data available for reading or that
|
||||||
|
* data can be written, it can be called just in case. It returns
|
||||||
|
* the number of handles that still transfer data in the second
|
||||||
|
* argument's integer-pointer.
|
||||||
|
*
|
||||||
|
* Returns: CURLMcode type, general multi error code. *NOTE* that this only
|
||||||
|
* returns errors etc regarding the whole multi stack. There might
|
||||||
|
* still have occurred problems on individual transfers even when
|
||||||
|
* this returns OK.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle,
|
||||||
|
int *running_handles);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_cleanup()
|
||||||
|
*
|
||||||
|
* Desc: Cleans up and removes a whole multi stack. It does not free or
|
||||||
|
* touch any individual easy handles in any way. We need to define
|
||||||
|
* in what state those handles will be if this function is called
|
||||||
|
* in the middle of a transfer.
|
||||||
|
*
|
||||||
|
* Returns: CURLMcode type, general multi error code.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_info_read()
|
||||||
|
*
|
||||||
|
* Desc: Ask the multi handle if there's any messages/informationals from
|
||||||
|
* the individual transfers. Messages include informationals such as
|
||||||
|
* error code from the transfer or just the fact that a transfer is
|
||||||
|
* completed. More details on these should be written down as well.
|
||||||
|
*
|
||||||
|
* Repeated calls to this function will return a new struct each
|
||||||
|
* time, until a special "end of msgs" struct is returned as a signal
|
||||||
|
* that there is no more to get at this point.
|
||||||
|
*
|
||||||
|
* The data the returned pointer points to will not survive calling
|
||||||
|
* curl_multi_cleanup().
|
||||||
|
*
|
||||||
|
* The 'CURLMsg' struct is meant to be very simple and only contain
|
||||||
|
* very basic information. If more involved information is wanted,
|
||||||
|
* we will provide the particular "transfer handle" in that struct
|
||||||
|
* and that should/could/would be used in subsequent
|
||||||
|
* curl_easy_getinfo() calls (or similar). The point being that we
|
||||||
|
* must never expose complex structs to applications, as then we'll
|
||||||
|
* undoubtably get backwards compatibility problems in the future.
|
||||||
|
*
|
||||||
|
* Returns: 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 read) in the integer the second argument points
|
||||||
|
* to.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLMsg *curl_multi_info_read(CURLM *multi_handle,
|
||||||
|
int *msgs_in_queue);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_strerror()
|
||||||
|
*
|
||||||
|
* Desc: The curl_multi_strerror function may be used to turn a CURLMcode
|
||||||
|
* value into the equivalent human readable error string. This is
|
||||||
|
* useful for printing meaningful error messages.
|
||||||
|
*
|
||||||
|
* Returns: A pointer to a zero-terminated error message.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN const char *curl_multi_strerror(CURLMcode);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_socket() and
|
||||||
|
* curl_multi_socket_all()
|
||||||
|
*
|
||||||
|
* Desc: An alternative version of curl_multi_perform() that allows the
|
||||||
|
* application to pass in one of the file descriptors that have been
|
||||||
|
* detected to have "action" on them and let libcurl perform.
|
||||||
|
* See man page for details.
|
||||||
|
*/
|
||||||
|
#define CURL_POLL_NONE 0
|
||||||
|
#define CURL_POLL_IN 1
|
||||||
|
#define CURL_POLL_OUT 2
|
||||||
|
#define CURL_POLL_INOUT 3
|
||||||
|
#define CURL_POLL_REMOVE 4
|
||||||
|
|
||||||
|
#define CURL_SOCKET_TIMEOUT CURL_SOCKET_BAD
|
||||||
|
|
||||||
|
#define CURL_CSELECT_IN 0x01
|
||||||
|
#define CURL_CSELECT_OUT 0x02
|
||||||
|
#define CURL_CSELECT_ERR 0x04
|
||||||
|
|
||||||
|
typedef int (*curl_socket_callback)(CURL *easy, /* easy handle */
|
||||||
|
curl_socket_t s, /* socket */
|
||||||
|
int what, /* see above */
|
||||||
|
void *userp, /* private callback
|
||||||
|
pointer */
|
||||||
|
void *socketp); /* private socket
|
||||||
|
pointer */
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_timer_callback
|
||||||
|
*
|
||||||
|
* Desc: Called by libcurl whenever the library detects a change in the
|
||||||
|
* maximum number of milliseconds the app is allowed to wait before
|
||||||
|
* curl_multi_socket() or curl_multi_perform() must be called
|
||||||
|
* (to allow libcurl's timed events to take place).
|
||||||
|
*
|
||||||
|
* Returns: The callback should return zero.
|
||||||
|
*/
|
||||||
|
typedef int (*curl_multi_timer_callback)(CURLM *multi, /* multi handle */
|
||||||
|
long timeout_ms, /* see above */
|
||||||
|
void *userp); /* private callback
|
||||||
|
pointer */
|
||||||
|
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_socket(CURLM *multi_handle, curl_socket_t s,
|
||||||
|
int *running_handles);
|
||||||
|
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_socket_action(CURLM *multi_handle,
|
||||||
|
curl_socket_t s,
|
||||||
|
int ev_bitmask,
|
||||||
|
int *running_handles);
|
||||||
|
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_socket_all(CURLM *multi_handle,
|
||||||
|
int *running_handles);
|
||||||
|
|
||||||
|
#ifndef CURL_ALLOW_OLD_MULTI_SOCKET
|
||||||
|
/* This macro below was added in 7.16.3 to push users who recompile to use
|
||||||
|
the new curl_multi_socket_action() instead of the old curl_multi_socket()
|
||||||
|
*/
|
||||||
|
#define curl_multi_socket(x,y,z) curl_multi_socket_action(x,y,0,z)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_timeout()
|
||||||
|
*
|
||||||
|
* Desc: Returns the maximum number of milliseconds the app is allowed to
|
||||||
|
* wait before curl_multi_socket() or curl_multi_perform() must be
|
||||||
|
* called (to allow libcurl's timed events to take place).
|
||||||
|
*
|
||||||
|
* Returns: CURLM error code.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_timeout(CURLM *multi_handle,
|
||||||
|
long *milliseconds);
|
||||||
|
|
||||||
|
#undef CINIT /* re-using the same name as in curl.h */
|
||||||
|
|
||||||
|
#ifdef CURL_ISOCPP
|
||||||
|
#define CINIT(name,type,num) CURLMOPT_ ## name = CURLOPTTYPE_ ## type + num
|
||||||
|
#else
|
||||||
|
/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */
|
||||||
|
#define LONG CURLOPTTYPE_LONG
|
||||||
|
#define OBJECTPOINT CURLOPTTYPE_OBJECTPOINT
|
||||||
|
#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT
|
||||||
|
#define OFF_T CURLOPTTYPE_OFF_T
|
||||||
|
#define CINIT(name,type,number) CURLMOPT_/**/name = type + number
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
/* This is the socket callback function pointer */
|
||||||
|
CINIT(SOCKETFUNCTION, FUNCTIONPOINT, 1),
|
||||||
|
|
||||||
|
/* This is the argument passed to the socket callback */
|
||||||
|
CINIT(SOCKETDATA, OBJECTPOINT, 2),
|
||||||
|
|
||||||
|
/* set to 1 to enable pipelining for this multi handle */
|
||||||
|
CINIT(PIPELINING, LONG, 3),
|
||||||
|
|
||||||
|
/* This is the timer callback function pointer */
|
||||||
|
CINIT(TIMERFUNCTION, FUNCTIONPOINT, 4),
|
||||||
|
|
||||||
|
/* This is the argument passed to the timer callback */
|
||||||
|
CINIT(TIMERDATA, OBJECTPOINT, 5),
|
||||||
|
|
||||||
|
/* maximum number of entries in the connection cache */
|
||||||
|
CINIT(MAXCONNECTS, LONG, 6),
|
||||||
|
|
||||||
|
/* maximum number of (pipelining) connections to one host */
|
||||||
|
CINIT(MAX_HOST_CONNECTIONS, LONG, 7),
|
||||||
|
|
||||||
|
/* maximum number of requests in a pipeline */
|
||||||
|
CINIT(MAX_PIPELINE_LENGTH, LONG, 8),
|
||||||
|
|
||||||
|
/* a connection with a content-length longer than this
|
||||||
|
will not be considered for pipelining */
|
||||||
|
CINIT(CONTENT_LENGTH_PENALTY_SIZE, OFF_T, 9),
|
||||||
|
|
||||||
|
/* a connection with a chunk length longer than this
|
||||||
|
will not be considered for pipelining */
|
||||||
|
CINIT(CHUNK_LENGTH_PENALTY_SIZE, OFF_T, 10),
|
||||||
|
|
||||||
|
/* a list of site names(+port) that are blacklisted from
|
||||||
|
pipelining */
|
||||||
|
CINIT(PIPELINING_SITE_BL, OBJECTPOINT, 11),
|
||||||
|
|
||||||
|
/* a list of server types that are blacklisted from
|
||||||
|
pipelining */
|
||||||
|
CINIT(PIPELINING_SERVER_BL, OBJECTPOINT, 12),
|
||||||
|
|
||||||
|
/* maximum number of open connections in total */
|
||||||
|
CINIT(MAX_TOTAL_CONNECTIONS, LONG, 13),
|
||||||
|
|
||||||
|
/* This is the server push callback function pointer */
|
||||||
|
CINIT(PUSHFUNCTION, FUNCTIONPOINT, 14),
|
||||||
|
|
||||||
|
/* This is the argument passed to the server push callback */
|
||||||
|
CINIT(PUSHDATA, OBJECTPOINT, 15),
|
||||||
|
|
||||||
|
CURLMOPT_LASTENTRY /* the last unused */
|
||||||
|
} CURLMoption;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_setopt()
|
||||||
|
*
|
||||||
|
* Desc: Sets options for the multi handle.
|
||||||
|
*
|
||||||
|
* Returns: CURLM error code.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_setopt(CURLM *multi_handle,
|
||||||
|
CURLMoption option, ...);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_assign()
|
||||||
|
*
|
||||||
|
* Desc: This function sets an association in the multi handle between the
|
||||||
|
* given socket and a private pointer of the application. This is
|
||||||
|
* (only) useful for curl_multi_socket uses.
|
||||||
|
*
|
||||||
|
* Returns: CURLM error code.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_assign(CURLM *multi_handle,
|
||||||
|
curl_socket_t sockfd, void *sockp);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_push_callback
|
||||||
|
*
|
||||||
|
* Desc: This callback gets called when a new stream is being pushed by the
|
||||||
|
* server. It approves or denies the new stream.
|
||||||
|
*
|
||||||
|
* Returns: CURL_PUSH_OK or CURL_PUSH_DENY.
|
||||||
|
*/
|
||||||
|
#define CURL_PUSH_OK 0
|
||||||
|
#define CURL_PUSH_DENY 1
|
||||||
|
|
||||||
|
struct curl_pushheaders; /* forward declaration only */
|
||||||
|
|
||||||
|
CURL_EXTERN char *curl_pushheader_bynum(struct curl_pushheaders *h,
|
||||||
|
size_t num);
|
||||||
|
CURL_EXTERN char *curl_pushheader_byname(struct curl_pushheaders *h,
|
||||||
|
const char *name);
|
||||||
|
|
||||||
|
typedef int (*curl_push_callback)(CURL *parent,
|
||||||
|
CURL *easy,
|
||||||
|
size_t num_headers,
|
||||||
|
struct curl_pushheaders *headers,
|
||||||
|
void *userp);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* end of extern "C" */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
33
bin/curl/include/curl/stdcheaders.h
Normal file
33
bin/curl/include/curl/stdcheaders.h
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
#ifndef __STDC_HEADERS_H
|
||||||
|
#define __STDC_HEADERS_H
|
||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 - 2016, 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 https://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 <sys/types.h>
|
||||||
|
|
||||||
|
size_t fread(void *, size_t, size_t, FILE *);
|
||||||
|
size_t fwrite(const void *, size_t, size_t, FILE *);
|
||||||
|
|
||||||
|
int strcasecmp(const char *, const char *);
|
||||||
|
int strncasecmp(const char *, const char *, size_t);
|
||||||
|
|
||||||
|
#endif /* __STDC_HEADERS_H */
|
||||||
493
bin/curl/include/curl/system.h
Normal file
493
bin/curl/include/curl/system.h
Normal file
@@ -0,0 +1,493 @@
|
|||||||
|
#ifndef __CURL_SYSTEM_H
|
||||||
|
#define __CURL_SYSTEM_H
|
||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 - 2017, 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 https://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.
|
||||||
|
*
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Try to keep one section per platform, compiler and architecture, otherwise,
|
||||||
|
* if an existing section is reused for a different one and later on the
|
||||||
|
* original is adjusted, probably the piggybacking one can be adversely
|
||||||
|
* changed.
|
||||||
|
*
|
||||||
|
* In order to differentiate between platforms/compilers/architectures use
|
||||||
|
* only compiler built in predefined preprocessor symbols.
|
||||||
|
*
|
||||||
|
* curl_off_t
|
||||||
|
* ----------
|
||||||
|
*
|
||||||
|
* For any given platform/compiler curl_off_t must be typedef'ed to a 64-bit
|
||||||
|
* wide signed integral data type. The width of this data type must remain
|
||||||
|
* constant and independent of any possible large file support settings.
|
||||||
|
*
|
||||||
|
* As an exception to the above, curl_off_t shall be typedef'ed to a 32-bit
|
||||||
|
* wide signed integral data type if there is no 64-bit type.
|
||||||
|
*
|
||||||
|
* As a general rule, curl_off_t shall not be mapped to off_t. This rule shall
|
||||||
|
* only be violated if off_t is the only 64-bit data type available and the
|
||||||
|
* size of off_t is independent of large file support settings. Keep your
|
||||||
|
* build on the safe side avoiding an off_t gating. If you have a 64-bit
|
||||||
|
* off_t then take for sure that another 64-bit data type exists, dig deeper
|
||||||
|
* and you will find it.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(__DJGPP__) || defined(__GO32__)
|
||||||
|
# if defined(__DJGPP__) && (__DJGPP__ > 1)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# else
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# endif
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T int
|
||||||
|
|
||||||
|
#elif defined(__SALFORDC__)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T int
|
||||||
|
|
||||||
|
#elif defined(__BORLANDC__)
|
||||||
|
# if (__BORLANDC__ < 0x520)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# else
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T __int64
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "I64d"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "I64u"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T i64
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ui64
|
||||||
|
# endif
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T int
|
||||||
|
|
||||||
|
#elif defined(__TURBOC__)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T int
|
||||||
|
|
||||||
|
#elif defined(__WATCOMC__)
|
||||||
|
# if defined(__386__)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T __int64
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "I64d"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "I64u"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T i64
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ui64
|
||||||
|
# else
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# endif
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T int
|
||||||
|
|
||||||
|
#elif defined(__POCC__)
|
||||||
|
# if (__POCC__ < 280)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# elif defined(_MSC_VER)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T __int64
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "I64d"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "I64u"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T i64
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ui64
|
||||||
|
# else
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# endif
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T int
|
||||||
|
|
||||||
|
#elif defined(__LCC__)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T int
|
||||||
|
|
||||||
|
#elif defined(__SYMBIAN32__)
|
||||||
|
# if defined(__EABI__) /* Treat all ARM compilers equally */
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# elif defined(__CW32__)
|
||||||
|
# pragma longlong on
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# elif defined(__VC32__)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T __int64
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# endif
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int
|
||||||
|
|
||||||
|
#elif defined(__MWERKS__)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T int
|
||||||
|
|
||||||
|
#elif defined(_WIN32_WCE)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T __int64
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "I64d"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "I64u"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T i64
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ui64
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T int
|
||||||
|
|
||||||
|
#elif defined(__MINGW32__)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "I64d"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "I64u"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
|
||||||
|
# define CURL_PULL_SYS_TYPES_H 1
|
||||||
|
# define CURL_PULL_WS2TCPIP_H 1
|
||||||
|
|
||||||
|
#elif defined(__VMS)
|
||||||
|
# if defined(__VAX)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# else
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# endif
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int
|
||||||
|
|
||||||
|
#elif defined(__OS400__)
|
||||||
|
# if defined(__ILEC400__)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
|
||||||
|
# define CURL_PULL_SYS_TYPES_H 1
|
||||||
|
# define CURL_PULL_SYS_SOCKET_H 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__MVS__)
|
||||||
|
# if defined(__IBMC__) || defined(__IBMCPP__)
|
||||||
|
# if defined(_ILP32)
|
||||||
|
# elif defined(_LP64)
|
||||||
|
# endif
|
||||||
|
# if defined(_LONG_LONG)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# elif defined(_LP64)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# else
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# endif
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
|
||||||
|
# define CURL_PULL_SYS_TYPES_H 1
|
||||||
|
# define CURL_PULL_SYS_SOCKET_H 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__370__)
|
||||||
|
# if defined(__IBMC__) || defined(__IBMCPP__)
|
||||||
|
# if defined(_ILP32)
|
||||||
|
# elif defined(_LP64)
|
||||||
|
# endif
|
||||||
|
# if defined(_LONG_LONG)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# elif defined(_LP64)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# else
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# endif
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
|
||||||
|
# define CURL_PULL_SYS_TYPES_H 1
|
||||||
|
# define CURL_PULL_SYS_SOCKET_H 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(TPF)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T int
|
||||||
|
|
||||||
|
#elif defined(__TINYC__) /* also known as tcc */
|
||||||
|
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
|
||||||
|
# define CURL_PULL_SYS_TYPES_H 1
|
||||||
|
# define CURL_PULL_SYS_SOCKET_H 1
|
||||||
|
|
||||||
|
#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) /* Oracle Solaris Studio */
|
||||||
|
# if !defined(__LP64) && (defined(__ILP32) || \
|
||||||
|
defined(__i386) || \
|
||||||
|
defined(__sparcv8) || \
|
||||||
|
defined(__sparcv8plus))
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# elif defined(__LP64) || \
|
||||||
|
defined(__amd64) || defined(__sparcv9)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# endif
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
|
||||||
|
# define CURL_PULL_SYS_TYPES_H 1
|
||||||
|
# define CURL_PULL_SYS_SOCKET_H 1
|
||||||
|
|
||||||
|
#elif defined(__xlc__) /* IBM xlc compiler */
|
||||||
|
# if !defined(_LP64)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# else
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# endif
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
|
||||||
|
# define CURL_PULL_SYS_TYPES_H 1
|
||||||
|
# define CURL_PULL_SYS_SOCKET_H 1
|
||||||
|
|
||||||
|
/* ===================================== */
|
||||||
|
/* KEEP MSVC THE PENULTIMATE ENTRY */
|
||||||
|
/* ===================================== */
|
||||||
|
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
# if (_MSC_VER >= 900) && (_INTEGRAL_MAX_BITS >= 64)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T __int64
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "I64d"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "I64u"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T i64
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ui64
|
||||||
|
# else
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# endif
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T int
|
||||||
|
|
||||||
|
/* ===================================== */
|
||||||
|
/* KEEP GENERIC GCC THE LAST ENTRY */
|
||||||
|
/* ===================================== */
|
||||||
|
|
||||||
|
#elif defined(__GNUC__) && !defined(_SCO_DS)
|
||||||
|
# if !defined(__LP64__) && \
|
||||||
|
(defined(__ILP32__) || defined(__i386__) || defined(__hppa__) || \
|
||||||
|
defined(__ppc__) || defined(__powerpc__) || defined(__arm__) || \
|
||||||
|
defined(__sparc__) || defined(__mips__) || defined(__sh__) || \
|
||||||
|
defined(__XTENSA__) || \
|
||||||
|
(defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 4) || \
|
||||||
|
(defined(__LONG_MAX__) && __LONG_MAX__ == 2147483647L))
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# elif defined(__LP64__) || \
|
||||||
|
defined(__x86_64__) || defined(__ppc64__) || defined(__sparc64__) || \
|
||||||
|
(defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 8) || \
|
||||||
|
(defined(__LONG_MAX__) && __LONG_MAX__ == 9223372036854775807L)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# endif
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
|
||||||
|
# define CURL_PULL_SYS_TYPES_H 1
|
||||||
|
# define CURL_PULL_SYS_SOCKET_H 1
|
||||||
|
|
||||||
|
#else
|
||||||
|
/* generic "safe guess" on old 32 bit style */
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T int
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _AIX
|
||||||
|
/* AIX needs <sys/poll.h> */
|
||||||
|
#define CURL_PULL_SYS_POLL_H
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* CURL_PULL_WS2TCPIP_H is defined above when inclusion of header file */
|
||||||
|
/* ws2tcpip.h is required here to properly make type definitions below. */
|
||||||
|
#ifdef CURL_PULL_WS2TCPIP_H
|
||||||
|
# include <winsock2.h>
|
||||||
|
# include <windows.h>
|
||||||
|
# include <ws2tcpip.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* CURL_PULL_SYS_TYPES_H is defined above when inclusion of header file */
|
||||||
|
/* sys/types.h is required here to properly make type definitions below. */
|
||||||
|
#ifdef CURL_PULL_SYS_TYPES_H
|
||||||
|
# include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* CURL_PULL_SYS_SOCKET_H is defined above when inclusion of header file */
|
||||||
|
/* sys/socket.h is required here to properly make type definitions below. */
|
||||||
|
#ifdef CURL_PULL_SYS_SOCKET_H
|
||||||
|
# include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* CURL_PULL_SYS_POLL_H is defined above when inclusion of header file */
|
||||||
|
/* sys/poll.h is required here to properly make type definitions below. */
|
||||||
|
#ifdef CURL_PULL_SYS_POLL_H
|
||||||
|
# include <sys/poll.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Data type definition of curl_socklen_t. */
|
||||||
|
#ifdef CURL_TYPEOF_CURL_SOCKLEN_T
|
||||||
|
typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Data type definition of curl_off_t. */
|
||||||
|
|
||||||
|
#ifdef CURL_TYPEOF_CURL_OFF_T
|
||||||
|
typedef CURL_TYPEOF_CURL_OFF_T curl_off_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* CURL_ISOCPP and CURL_OFF_T_C definitions are done here in order to allow
|
||||||
|
* these to be visible and exported by the external libcurl interface API,
|
||||||
|
* while also making them visible to the library internals, simply including
|
||||||
|
* curl_setup.h, without actually needing to include curl.h internally.
|
||||||
|
* If some day this section would grow big enough, all this should be moved
|
||||||
|
* to its own header file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Figure out if we can use the ## preprocessor operator, which is supported
|
||||||
|
* by ISO/ANSI C and C++. Some compilers support it without setting __STDC__
|
||||||
|
* or __cplusplus so we need to carefully check for them too.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) || \
|
||||||
|
defined(__HP_aCC) || defined(__BORLANDC__) || defined(__LCC__) || \
|
||||||
|
defined(__POCC__) || defined(__SALFORDC__) || defined(__HIGHC__) || \
|
||||||
|
defined(__ILEC400__)
|
||||||
|
/* This compiler is believed to have an ISO compatible preprocessor */
|
||||||
|
#define CURL_ISOCPP
|
||||||
|
#else
|
||||||
|
/* This compiler is believed NOT to have an ISO compatible preprocessor */
|
||||||
|
#undef CURL_ISOCPP
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Macros for minimum-width signed and unsigned curl_off_t integer constants.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(__BORLANDC__) && (__BORLANDC__ == 0x0551)
|
||||||
|
# define __CURL_OFF_T_C_HLPR2(x) x
|
||||||
|
# define __CURL_OFF_T_C_HLPR1(x) __CURL_OFF_T_C_HLPR2(x)
|
||||||
|
# define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \
|
||||||
|
__CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_T)
|
||||||
|
# define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \
|
||||||
|
__CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_TU)
|
||||||
|
#else
|
||||||
|
# ifdef CURL_ISOCPP
|
||||||
|
# define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val ## Suffix
|
||||||
|
# else
|
||||||
|
# define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val/**/Suffix
|
||||||
|
# endif
|
||||||
|
# define __CURL_OFF_T_C_HLPR1(Val,Suffix) __CURL_OFF_T_C_HLPR2(Val,Suffix)
|
||||||
|
# define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_T)
|
||||||
|
# define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_TU)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __CURL_SYSTEM_H */
|
||||||
694
bin/curl/include/curl/typecheck-gcc.h
Normal file
694
bin/curl/include/curl/typecheck-gcc.h
Normal file
@@ -0,0 +1,694 @@
|
|||||||
|
#ifndef __CURL_TYPECHECK_GCC_H
|
||||||
|
#define __CURL_TYPECHECK_GCC_H
|
||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 - 2019, 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 https://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.
|
||||||
|
*
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
/* wraps curl_easy_setopt() with typechecking */
|
||||||
|
|
||||||
|
/* To add a new kind of warning, add an
|
||||||
|
* if(_curl_is_sometype_option(_curl_opt))
|
||||||
|
* if(!_curl_is_sometype(value))
|
||||||
|
* _curl_easy_setopt_err_sometype();
|
||||||
|
* block and define _curl_is_sometype_option, _curl_is_sometype and
|
||||||
|
* _curl_easy_setopt_err_sometype below
|
||||||
|
*
|
||||||
|
* NOTE: We use two nested 'if' statements here instead of the && operator, in
|
||||||
|
* order to work around gcc bug #32061. It affects only gcc 4.3.x/4.4.x
|
||||||
|
* when compiling with -Wlogical-op.
|
||||||
|
*
|
||||||
|
* To add an option that uses the same type as an existing option, you'll just
|
||||||
|
* need to extend the appropriate _curl_*_option macro
|
||||||
|
*/
|
||||||
|
#define curl_easy_setopt(handle, option, value) \
|
||||||
|
__extension__ ({ \
|
||||||
|
__typeof__(option) _curl_opt = option; \
|
||||||
|
if(__builtin_constant_p(_curl_opt)) { \
|
||||||
|
if(_curl_is_long_option(_curl_opt)) \
|
||||||
|
if(!_curl_is_long(value)) \
|
||||||
|
_curl_easy_setopt_err_long(); \
|
||||||
|
if(_curl_is_off_t_option(_curl_opt)) \
|
||||||
|
if(!_curl_is_off_t(value)) \
|
||||||
|
_curl_easy_setopt_err_curl_off_t(); \
|
||||||
|
if(_curl_is_string_option(_curl_opt)) \
|
||||||
|
if(!_curl_is_string(value)) \
|
||||||
|
_curl_easy_setopt_err_string(); \
|
||||||
|
if(_curl_is_write_cb_option(_curl_opt)) \
|
||||||
|
if(!_curl_is_write_cb(value)) \
|
||||||
|
_curl_easy_setopt_err_write_callback(); \
|
||||||
|
if((_curl_opt) == CURLOPT_RESOLVER_START_FUNCTION) \
|
||||||
|
if(!_curl_is_resolver_start_callback(value)) \
|
||||||
|
_curl_easy_setopt_err_resolver_start_callback(); \
|
||||||
|
if((_curl_opt) == CURLOPT_READFUNCTION) \
|
||||||
|
if(!_curl_is_read_cb(value)) \
|
||||||
|
_curl_easy_setopt_err_read_cb(); \
|
||||||
|
if((_curl_opt) == CURLOPT_IOCTLFUNCTION) \
|
||||||
|
if(!_curl_is_ioctl_cb(value)) \
|
||||||
|
_curl_easy_setopt_err_ioctl_cb(); \
|
||||||
|
if((_curl_opt) == CURLOPT_SOCKOPTFUNCTION) \
|
||||||
|
if(!_curl_is_sockopt_cb(value)) \
|
||||||
|
_curl_easy_setopt_err_sockopt_cb(); \
|
||||||
|
if((_curl_opt) == CURLOPT_OPENSOCKETFUNCTION) \
|
||||||
|
if(!_curl_is_opensocket_cb(value)) \
|
||||||
|
_curl_easy_setopt_err_opensocket_cb(); \
|
||||||
|
if((_curl_opt) == CURLOPT_PROGRESSFUNCTION) \
|
||||||
|
if(!_curl_is_progress_cb(value)) \
|
||||||
|
_curl_easy_setopt_err_progress_cb(); \
|
||||||
|
if((_curl_opt) == CURLOPT_DEBUGFUNCTION) \
|
||||||
|
if(!_curl_is_debug_cb(value)) \
|
||||||
|
_curl_easy_setopt_err_debug_cb(); \
|
||||||
|
if((_curl_opt) == CURLOPT_SSL_CTX_FUNCTION) \
|
||||||
|
if(!_curl_is_ssl_ctx_cb(value)) \
|
||||||
|
_curl_easy_setopt_err_ssl_ctx_cb(); \
|
||||||
|
if(_curl_is_conv_cb_option(_curl_opt)) \
|
||||||
|
if(!_curl_is_conv_cb(value)) \
|
||||||
|
_curl_easy_setopt_err_conv_cb(); \
|
||||||
|
if((_curl_opt) == CURLOPT_SEEKFUNCTION) \
|
||||||
|
if(!_curl_is_seek_cb(value)) \
|
||||||
|
_curl_easy_setopt_err_seek_cb(); \
|
||||||
|
if(_curl_is_cb_data_option(_curl_opt)) \
|
||||||
|
if(!_curl_is_cb_data(value)) \
|
||||||
|
_curl_easy_setopt_err_cb_data(); \
|
||||||
|
if((_curl_opt) == CURLOPT_ERRORBUFFER) \
|
||||||
|
if(!_curl_is_error_buffer(value)) \
|
||||||
|
_curl_easy_setopt_err_error_buffer(); \
|
||||||
|
if((_curl_opt) == CURLOPT_STDERR) \
|
||||||
|
if(!_curl_is_FILE(value)) \
|
||||||
|
_curl_easy_setopt_err_FILE(); \
|
||||||
|
if(_curl_is_postfields_option(_curl_opt)) \
|
||||||
|
if(!_curl_is_postfields(value)) \
|
||||||
|
_curl_easy_setopt_err_postfields(); \
|
||||||
|
if((_curl_opt) == CURLOPT_HTTPPOST) \
|
||||||
|
if(!_curl_is_arr((value), struct curl_httppost)) \
|
||||||
|
_curl_easy_setopt_err_curl_httpost(); \
|
||||||
|
if((_curl_opt) == CURLOPT_MIMEPOST) \
|
||||||
|
if(!_curl_is_ptr((value), curl_mime)) \
|
||||||
|
_curl_easy_setopt_err_curl_mimepost(); \
|
||||||
|
if(_curl_is_slist_option(_curl_opt)) \
|
||||||
|
if(!_curl_is_arr((value), struct curl_slist)) \
|
||||||
|
_curl_easy_setopt_err_curl_slist(); \
|
||||||
|
if((_curl_opt) == CURLOPT_SHARE) \
|
||||||
|
if(!_curl_is_ptr((value), CURLSH)) \
|
||||||
|
_curl_easy_setopt_err_CURLSH(); \
|
||||||
|
} \
|
||||||
|
curl_easy_setopt(handle, _curl_opt, value); \
|
||||||
|
})
|
||||||
|
|
||||||
|
/* wraps curl_easy_getinfo() with typechecking */
|
||||||
|
#define curl_easy_getinfo(handle, info, arg) \
|
||||||
|
__extension__ ({ \
|
||||||
|
__typeof__(info) _curl_info = info; \
|
||||||
|
if(__builtin_constant_p(_curl_info)) { \
|
||||||
|
if(_curl_is_string_info(_curl_info)) \
|
||||||
|
if(!_curl_is_arr((arg), char *)) \
|
||||||
|
_curl_easy_getinfo_err_string(); \
|
||||||
|
if(_curl_is_long_info(_curl_info)) \
|
||||||
|
if(!_curl_is_arr((arg), long)) \
|
||||||
|
_curl_easy_getinfo_err_long(); \
|
||||||
|
if(_curl_is_double_info(_curl_info)) \
|
||||||
|
if(!_curl_is_arr((arg), double)) \
|
||||||
|
_curl_easy_getinfo_err_double(); \
|
||||||
|
if(_curl_is_slist_info(_curl_info)) \
|
||||||
|
if(!_curl_is_arr((arg), struct curl_slist *)) \
|
||||||
|
_curl_easy_getinfo_err_curl_slist(); \
|
||||||
|
if(_curl_is_tlssessioninfo_info(_curl_info)) \
|
||||||
|
if(!_curl_is_arr((arg), struct curl_tlssessioninfo *)) \
|
||||||
|
_curl_easy_getinfo_err_curl_tlssesssioninfo(); \
|
||||||
|
if(_curl_is_certinfo_info(_curl_info)) \
|
||||||
|
if(!_curl_is_arr((arg), struct curl_certinfo *)) \
|
||||||
|
_curl_easy_getinfo_err_curl_certinfo(); \
|
||||||
|
if(_curl_is_socket_info(_curl_info)) \
|
||||||
|
if(!_curl_is_arr((arg), curl_socket_t)) \
|
||||||
|
_curl_easy_getinfo_err_curl_socket(); \
|
||||||
|
if(_curl_is_off_t_info(_curl_info)) \
|
||||||
|
if(!_curl_is_arr((arg), curl_off_t)) \
|
||||||
|
_curl_easy_getinfo_err_curl_off_t(); \
|
||||||
|
} \
|
||||||
|
curl_easy_getinfo(handle, _curl_info, arg); \
|
||||||
|
})
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For now, just make sure that the functions are called with three arguments
|
||||||
|
*/
|
||||||
|
#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param)
|
||||||
|
#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param)
|
||||||
|
|
||||||
|
|
||||||
|
/* the actual warnings, triggered by calling the _curl_easy_setopt_err*
|
||||||
|
* functions */
|
||||||
|
|
||||||
|
/* To define a new warning, use _CURL_WARNING(identifier, "message") */
|
||||||
|
#define _CURL_WARNING(id, message) \
|
||||||
|
static void __attribute__((__warning__(message))) \
|
||||||
|
__attribute__((__unused__)) __attribute__((__noinline__)) \
|
||||||
|
id(void) { __asm__(""); }
|
||||||
|
|
||||||
|
_CURL_WARNING(_curl_easy_setopt_err_long,
|
||||||
|
"curl_easy_setopt expects a long argument for this option")
|
||||||
|
_CURL_WARNING(_curl_easy_setopt_err_curl_off_t,
|
||||||
|
"curl_easy_setopt expects a curl_off_t argument for this option")
|
||||||
|
_CURL_WARNING(_curl_easy_setopt_err_string,
|
||||||
|
"curl_easy_setopt expects a "
|
||||||
|
"string ('char *' or char[]) argument for this option"
|
||||||
|
)
|
||||||
|
_CURL_WARNING(_curl_easy_setopt_err_write_callback,
|
||||||
|
"curl_easy_setopt expects a curl_write_callback argument for this option")
|
||||||
|
_CURL_WARNING(_curl_easy_setopt_err_resolver_start_callback,
|
||||||
|
"curl_easy_setopt expects a "
|
||||||
|
"curl_resolver_start_callback argument for this option"
|
||||||
|
)
|
||||||
|
_CURL_WARNING(_curl_easy_setopt_err_read_cb,
|
||||||
|
"curl_easy_setopt expects a curl_read_callback argument for this option")
|
||||||
|
_CURL_WARNING(_curl_easy_setopt_err_ioctl_cb,
|
||||||
|
"curl_easy_setopt expects a curl_ioctl_callback argument for this option")
|
||||||
|
_CURL_WARNING(_curl_easy_setopt_err_sockopt_cb,
|
||||||
|
"curl_easy_setopt expects a curl_sockopt_callback argument for this option")
|
||||||
|
_CURL_WARNING(_curl_easy_setopt_err_opensocket_cb,
|
||||||
|
"curl_easy_setopt expects a "
|
||||||
|
"curl_opensocket_callback argument for this option"
|
||||||
|
)
|
||||||
|
_CURL_WARNING(_curl_easy_setopt_err_progress_cb,
|
||||||
|
"curl_easy_setopt expects a curl_progress_callback argument for this option")
|
||||||
|
_CURL_WARNING(_curl_easy_setopt_err_debug_cb,
|
||||||
|
"curl_easy_setopt expects a curl_debug_callback argument for this option")
|
||||||
|
_CURL_WARNING(_curl_easy_setopt_err_ssl_ctx_cb,
|
||||||
|
"curl_easy_setopt expects a curl_ssl_ctx_callback argument for this option")
|
||||||
|
_CURL_WARNING(_curl_easy_setopt_err_conv_cb,
|
||||||
|
"curl_easy_setopt expects a curl_conv_callback argument for this option")
|
||||||
|
_CURL_WARNING(_curl_easy_setopt_err_seek_cb,
|
||||||
|
"curl_easy_setopt expects a curl_seek_callback argument for this option")
|
||||||
|
_CURL_WARNING(_curl_easy_setopt_err_cb_data,
|
||||||
|
"curl_easy_setopt expects a "
|
||||||
|
"private data pointer as argument for this option")
|
||||||
|
_CURL_WARNING(_curl_easy_setopt_err_error_buffer,
|
||||||
|
"curl_easy_setopt expects a "
|
||||||
|
"char buffer of CURL_ERROR_SIZE as argument for this option")
|
||||||
|
_CURL_WARNING(_curl_easy_setopt_err_FILE,
|
||||||
|
"curl_easy_setopt expects a 'FILE *' argument for this option")
|
||||||
|
_CURL_WARNING(_curl_easy_setopt_err_postfields,
|
||||||
|
"curl_easy_setopt expects a 'void *' or 'char *' argument for this option")
|
||||||
|
_CURL_WARNING(_curl_easy_setopt_err_curl_httpost,
|
||||||
|
"curl_easy_setopt expects a 'struct curl_httppost *' "
|
||||||
|
"argument for this option")
|
||||||
|
_CURL_WARNING(_curl_easy_setopt_err_curl_mimepost,
|
||||||
|
"curl_easy_setopt expects a 'curl_mime *' "
|
||||||
|
"argument for this option")
|
||||||
|
_CURL_WARNING(_curl_easy_setopt_err_curl_slist,
|
||||||
|
"curl_easy_setopt expects a 'struct curl_slist *' argument for this option")
|
||||||
|
_CURL_WARNING(_curl_easy_setopt_err_CURLSH,
|
||||||
|
"curl_easy_setopt expects a CURLSH* argument for this option")
|
||||||
|
|
||||||
|
_CURL_WARNING(_curl_easy_getinfo_err_string,
|
||||||
|
"curl_easy_getinfo expects a pointer to 'char *' for this info")
|
||||||
|
_CURL_WARNING(_curl_easy_getinfo_err_long,
|
||||||
|
"curl_easy_getinfo expects a pointer to long for this info")
|
||||||
|
_CURL_WARNING(_curl_easy_getinfo_err_double,
|
||||||
|
"curl_easy_getinfo expects a pointer to double for this info")
|
||||||
|
_CURL_WARNING(_curl_easy_getinfo_err_curl_slist,
|
||||||
|
"curl_easy_getinfo expects a pointer to 'struct curl_slist *' for this info")
|
||||||
|
_CURL_WARNING(_curl_easy_getinfo_err_curl_tlssesssioninfo,
|
||||||
|
"curl_easy_getinfo expects a pointer to "
|
||||||
|
"'struct curl_tlssessioninfo *' for this info")
|
||||||
|
_CURL_WARNING(_curl_easy_getinfo_err_curl_certinfo,
|
||||||
|
"curl_easy_getinfo expects a pointer to "
|
||||||
|
"'struct curl_certinfo *' for this info")
|
||||||
|
_CURL_WARNING(_curl_easy_getinfo_err_curl_socket,
|
||||||
|
"curl_easy_getinfo expects a pointer to curl_socket_t for this info")
|
||||||
|
_CURL_WARNING(_curl_easy_getinfo_err_curl_off_t,
|
||||||
|
"curl_easy_getinfo expects a pointer to curl_off_t for this info")
|
||||||
|
|
||||||
|
/* groups of curl_easy_setops options that take the same type of argument */
|
||||||
|
|
||||||
|
/* To add a new option to one of the groups, just add
|
||||||
|
* (option) == CURLOPT_SOMETHING
|
||||||
|
* to the or-expression. If the option takes a long or curl_off_t, you don't
|
||||||
|
* have to do anything
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* evaluates to true if option takes a long argument */
|
||||||
|
#define _curl_is_long_option(option) \
|
||||||
|
(0 < (option) && (option) < CURLOPTTYPE_OBJECTPOINT)
|
||||||
|
|
||||||
|
#define _curl_is_off_t_option(option) \
|
||||||
|
((option) > CURLOPTTYPE_OFF_T)
|
||||||
|
|
||||||
|
/* evaluates to true if option takes a char* argument */
|
||||||
|
#define _curl_is_string_option(option) \
|
||||||
|
((option) == CURLOPT_ABSTRACT_UNIX_SOCKET || \
|
||||||
|
(option) == CURLOPT_ACCEPT_ENCODING || \
|
||||||
|
(option) == CURLOPT_ALTSVC || \
|
||||||
|
(option) == CURLOPT_CAINFO || \
|
||||||
|
(option) == CURLOPT_CAPATH || \
|
||||||
|
(option) == CURLOPT_COOKIE || \
|
||||||
|
(option) == CURLOPT_COOKIEFILE || \
|
||||||
|
(option) == CURLOPT_COOKIEJAR || \
|
||||||
|
(option) == CURLOPT_COOKIELIST || \
|
||||||
|
(option) == CURLOPT_CRLFILE || \
|
||||||
|
(option) == CURLOPT_CUSTOMREQUEST || \
|
||||||
|
(option) == CURLOPT_DEFAULT_PROTOCOL || \
|
||||||
|
(option) == CURLOPT_DNS_INTERFACE || \
|
||||||
|
(option) == CURLOPT_DNS_LOCAL_IP4 || \
|
||||||
|
(option) == CURLOPT_DNS_LOCAL_IP6 || \
|
||||||
|
(option) == CURLOPT_DNS_SERVERS || \
|
||||||
|
(option) == CURLOPT_DOH_URL || \
|
||||||
|
(option) == CURLOPT_EGDSOCKET || \
|
||||||
|
(option) == CURLOPT_FTPPORT || \
|
||||||
|
(option) == CURLOPT_FTP_ACCOUNT || \
|
||||||
|
(option) == CURLOPT_FTP_ALTERNATIVE_TO_USER || \
|
||||||
|
(option) == CURLOPT_INTERFACE || \
|
||||||
|
(option) == CURLOPT_ISSUERCERT || \
|
||||||
|
(option) == CURLOPT_KEYPASSWD || \
|
||||||
|
(option) == CURLOPT_KRBLEVEL || \
|
||||||
|
(option) == CURLOPT_LOGIN_OPTIONS || \
|
||||||
|
(option) == CURLOPT_MAIL_AUTH || \
|
||||||
|
(option) == CURLOPT_MAIL_FROM || \
|
||||||
|
(option) == CURLOPT_NETRC_FILE || \
|
||||||
|
(option) == CURLOPT_NOPROXY || \
|
||||||
|
(option) == CURLOPT_PASSWORD || \
|
||||||
|
(option) == CURLOPT_PINNEDPUBLICKEY || \
|
||||||
|
(option) == CURLOPT_PRE_PROXY || \
|
||||||
|
(option) == CURLOPT_PROXY || \
|
||||||
|
(option) == CURLOPT_PROXYPASSWORD || \
|
||||||
|
(option) == CURLOPT_PROXYUSERNAME || \
|
||||||
|
(option) == CURLOPT_PROXYUSERPWD || \
|
||||||
|
(option) == CURLOPT_PROXY_CAINFO || \
|
||||||
|
(option) == CURLOPT_PROXY_CAPATH || \
|
||||||
|
(option) == CURLOPT_PROXY_CRLFILE || \
|
||||||
|
(option) == CURLOPT_PROXY_KEYPASSWD || \
|
||||||
|
(option) == CURLOPT_PROXY_PINNEDPUBLICKEY || \
|
||||||
|
(option) == CURLOPT_PROXY_SERVICE_NAME || \
|
||||||
|
(option) == CURLOPT_PROXY_SSLCERT || \
|
||||||
|
(option) == CURLOPT_PROXY_SSLCERTTYPE || \
|
||||||
|
(option) == CURLOPT_PROXY_SSLKEY || \
|
||||||
|
(option) == CURLOPT_PROXY_SSLKEYTYPE || \
|
||||||
|
(option) == CURLOPT_PROXY_SSL_CIPHER_LIST || \
|
||||||
|
(option) == CURLOPT_PROXY_TLSAUTH_PASSWORD || \
|
||||||
|
(option) == CURLOPT_PROXY_TLSAUTH_USERNAME || \
|
||||||
|
(option) == CURLOPT_PROXY_TLSAUTH_TYPE || \
|
||||||
|
(option) == CURLOPT_RANDOM_FILE || \
|
||||||
|
(option) == CURLOPT_RANGE || \
|
||||||
|
(option) == CURLOPT_REFERER || \
|
||||||
|
(option) == CURLOPT_RTSP_SESSION_ID || \
|
||||||
|
(option) == CURLOPT_RTSP_STREAM_URI || \
|
||||||
|
(option) == CURLOPT_RTSP_TRANSPORT || \
|
||||||
|
(option) == CURLOPT_SERVICE_NAME || \
|
||||||
|
(option) == CURLOPT_SOCKS5_GSSAPI_SERVICE || \
|
||||||
|
(option) == CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 || \
|
||||||
|
(option) == CURLOPT_SSH_KNOWNHOSTS || \
|
||||||
|
(option) == CURLOPT_SSH_PRIVATE_KEYFILE || \
|
||||||
|
(option) == CURLOPT_SSH_PUBLIC_KEYFILE || \
|
||||||
|
(option) == CURLOPT_SSLCERT || \
|
||||||
|
(option) == CURLOPT_SSLCERTTYPE || \
|
||||||
|
(option) == CURLOPT_SSLENGINE || \
|
||||||
|
(option) == CURLOPT_SSLKEY || \
|
||||||
|
(option) == CURLOPT_SSLKEYTYPE || \
|
||||||
|
(option) == CURLOPT_SSL_CIPHER_LIST || \
|
||||||
|
(option) == CURLOPT_TLSAUTH_PASSWORD || \
|
||||||
|
(option) == CURLOPT_TLSAUTH_TYPE || \
|
||||||
|
(option) == CURLOPT_TLSAUTH_USERNAME || \
|
||||||
|
(option) == CURLOPT_UNIX_SOCKET_PATH || \
|
||||||
|
(option) == CURLOPT_URL || \
|
||||||
|
(option) == CURLOPT_USERAGENT || \
|
||||||
|
(option) == CURLOPT_USERNAME || \
|
||||||
|
(option) == CURLOPT_USERPWD || \
|
||||||
|
(option) == CURLOPT_XOAUTH2_BEARER || \
|
||||||
|
0)
|
||||||
|
|
||||||
|
/* evaluates to true if option takes a curl_write_callback argument */
|
||||||
|
#define _curl_is_write_cb_option(option) \
|
||||||
|
((option) == CURLOPT_HEADERFUNCTION || \
|
||||||
|
(option) == CURLOPT_WRITEFUNCTION)
|
||||||
|
|
||||||
|
/* evaluates to true if option takes a curl_conv_callback argument */
|
||||||
|
#define _curl_is_conv_cb_option(option) \
|
||||||
|
((option) == CURLOPT_CONV_TO_NETWORK_FUNCTION || \
|
||||||
|
(option) == CURLOPT_CONV_FROM_NETWORK_FUNCTION || \
|
||||||
|
(option) == CURLOPT_CONV_FROM_UTF8_FUNCTION)
|
||||||
|
|
||||||
|
/* evaluates to true if option takes a data argument to pass to a callback */
|
||||||
|
#define _curl_is_cb_data_option(option) \
|
||||||
|
((option) == CURLOPT_CHUNK_DATA || \
|
||||||
|
(option) == CURLOPT_CLOSESOCKETDATA || \
|
||||||
|
(option) == CURLOPT_DEBUGDATA || \
|
||||||
|
(option) == CURLOPT_FNMATCH_DATA || \
|
||||||
|
(option) == CURLOPT_HEADERDATA || \
|
||||||
|
(option) == CURLOPT_INTERLEAVEDATA || \
|
||||||
|
(option) == CURLOPT_IOCTLDATA || \
|
||||||
|
(option) == CURLOPT_OPENSOCKETDATA || \
|
||||||
|
(option) == CURLOPT_PRIVATE || \
|
||||||
|
(option) == CURLOPT_PROGRESSDATA || \
|
||||||
|
(option) == CURLOPT_READDATA || \
|
||||||
|
(option) == CURLOPT_SEEKDATA || \
|
||||||
|
(option) == CURLOPT_SOCKOPTDATA || \
|
||||||
|
(option) == CURLOPT_SSH_KEYDATA || \
|
||||||
|
(option) == CURLOPT_SSL_CTX_DATA || \
|
||||||
|
(option) == CURLOPT_WRITEDATA || \
|
||||||
|
(option) == CURLOPT_RESOLVER_START_DATA || \
|
||||||
|
(option) == CURLOPT_CURLU || \
|
||||||
|
0)
|
||||||
|
|
||||||
|
/* evaluates to true if option takes a POST data argument (void* or char*) */
|
||||||
|
#define _curl_is_postfields_option(option) \
|
||||||
|
((option) == CURLOPT_POSTFIELDS || \
|
||||||
|
(option) == CURLOPT_COPYPOSTFIELDS || \
|
||||||
|
0)
|
||||||
|
|
||||||
|
/* evaluates to true if option takes a struct curl_slist * argument */
|
||||||
|
#define _curl_is_slist_option(option) \
|
||||||
|
((option) == CURLOPT_HTTP200ALIASES || \
|
||||||
|
(option) == CURLOPT_HTTPHEADER || \
|
||||||
|
(option) == CURLOPT_MAIL_RCPT || \
|
||||||
|
(option) == CURLOPT_POSTQUOTE || \
|
||||||
|
(option) == CURLOPT_PREQUOTE || \
|
||||||
|
(option) == CURLOPT_PROXYHEADER || \
|
||||||
|
(option) == CURLOPT_QUOTE || \
|
||||||
|
(option) == CURLOPT_RESOLVE || \
|
||||||
|
(option) == CURLOPT_TELNETOPTIONS || \
|
||||||
|
0)
|
||||||
|
|
||||||
|
/* groups of curl_easy_getinfo infos that take the same type of argument */
|
||||||
|
|
||||||
|
/* evaluates to true if info expects a pointer to char * argument */
|
||||||
|
#define _curl_is_string_info(info) \
|
||||||
|
(CURLINFO_STRING < (info) && (info) < CURLINFO_LONG)
|
||||||
|
|
||||||
|
/* evaluates to true if info expects a pointer to long argument */
|
||||||
|
#define _curl_is_long_info(info) \
|
||||||
|
(CURLINFO_LONG < (info) && (info) < CURLINFO_DOUBLE)
|
||||||
|
|
||||||
|
/* evaluates to true if info expects a pointer to double argument */
|
||||||
|
#define _curl_is_double_info(info) \
|
||||||
|
(CURLINFO_DOUBLE < (info) && (info) < CURLINFO_SLIST)
|
||||||
|
|
||||||
|
/* true if info expects a pointer to struct curl_slist * argument */
|
||||||
|
#define _curl_is_slist_info(info) \
|
||||||
|
(((info) == CURLINFO_SSL_ENGINES) || ((info) == CURLINFO_COOKIELIST))
|
||||||
|
|
||||||
|
/* true if info expects a pointer to struct curl_tlssessioninfo * argument */
|
||||||
|
#define _curl_is_tlssessioninfo_info(info) \
|
||||||
|
(((info) == CURLINFO_TLS_SSL_PTR) || ((info) == CURLINFO_TLS_SESSION))
|
||||||
|
|
||||||
|
/* true if info expects a pointer to struct curl_certinfo * argument */
|
||||||
|
#define _curl_is_certinfo_info(info) ((info) == CURLINFO_CERTINFO)
|
||||||
|
|
||||||
|
/* true if info expects a pointer to struct curl_socket_t argument */
|
||||||
|
#define _curl_is_socket_info(info) \
|
||||||
|
(CURLINFO_SOCKET < (info) && (info) < CURLINFO_OFF_T)
|
||||||
|
|
||||||
|
/* true if info expects a pointer to curl_off_t argument */
|
||||||
|
#define _curl_is_off_t_info(info) \
|
||||||
|
(CURLINFO_OFF_T < (info))
|
||||||
|
|
||||||
|
|
||||||
|
/* typecheck helpers -- check whether given expression has requested type*/
|
||||||
|
|
||||||
|
/* For pointers, you can use the _curl_is_ptr/_curl_is_arr macros,
|
||||||
|
* otherwise define a new macro. Search for __builtin_types_compatible_p
|
||||||
|
* in the GCC manual.
|
||||||
|
* NOTE: these macros MUST NOT EVALUATE their arguments! The argument is
|
||||||
|
* the actual expression passed to the curl_easy_setopt macro. This
|
||||||
|
* means that you can only apply the sizeof and __typeof__ operators, no
|
||||||
|
* == or whatsoever.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* XXX: should evaluate to true if expr is a pointer */
|
||||||
|
#define _curl_is_any_ptr(expr) \
|
||||||
|
(sizeof(expr) == sizeof(void *))
|
||||||
|
|
||||||
|
/* evaluates to true if expr is NULL */
|
||||||
|
/* XXX: must not evaluate expr, so this check is not accurate */
|
||||||
|
#define _curl_is_NULL(expr) \
|
||||||
|
(__builtin_types_compatible_p(__typeof__(expr), __typeof__(NULL)))
|
||||||
|
|
||||||
|
/* evaluates to true if expr is type*, const type* or NULL */
|
||||||
|
#define _curl_is_ptr(expr, type) \
|
||||||
|
(_curl_is_NULL(expr) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), type *) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), const type *))
|
||||||
|
|
||||||
|
/* evaluates to true if expr is one of type[], type*, NULL or const type* */
|
||||||
|
#define _curl_is_arr(expr, type) \
|
||||||
|
(_curl_is_ptr((expr), type) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), type []))
|
||||||
|
|
||||||
|
/* evaluates to true if expr is a string */
|
||||||
|
#define _curl_is_string(expr) \
|
||||||
|
(_curl_is_arr((expr), char) || \
|
||||||
|
_curl_is_arr((expr), signed char) || \
|
||||||
|
_curl_is_arr((expr), unsigned char))
|
||||||
|
|
||||||
|
/* evaluates to true if expr is a long (no matter the signedness)
|
||||||
|
* XXX: for now, int is also accepted (and therefore short and char, which
|
||||||
|
* are promoted to int when passed to a variadic function) */
|
||||||
|
#define _curl_is_long(expr) \
|
||||||
|
(__builtin_types_compatible_p(__typeof__(expr), long) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), signed long) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), unsigned long) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), int) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), signed int) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), unsigned int) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), short) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), signed short) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), unsigned short) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), char) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), signed char) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), unsigned char))
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type curl_off_t */
|
||||||
|
#define _curl_is_off_t(expr) \
|
||||||
|
(__builtin_types_compatible_p(__typeof__(expr), curl_off_t))
|
||||||
|
|
||||||
|
/* evaluates to true if expr is abuffer suitable for CURLOPT_ERRORBUFFER */
|
||||||
|
/* XXX: also check size of an char[] array? */
|
||||||
|
#define _curl_is_error_buffer(expr) \
|
||||||
|
(_curl_is_NULL(expr) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), char *) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), char[]))
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type (const) void* or (const) FILE* */
|
||||||
|
#if 0
|
||||||
|
#define _curl_is_cb_data(expr) \
|
||||||
|
(_curl_is_ptr((expr), void) || \
|
||||||
|
_curl_is_ptr((expr), FILE))
|
||||||
|
#else /* be less strict */
|
||||||
|
#define _curl_is_cb_data(expr) \
|
||||||
|
_curl_is_any_ptr(expr)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type FILE* */
|
||||||
|
#define _curl_is_FILE(expr) \
|
||||||
|
(_curl_is_NULL(expr) || \
|
||||||
|
(__builtin_types_compatible_p(__typeof__(expr), FILE *)))
|
||||||
|
|
||||||
|
/* evaluates to true if expr can be passed as POST data (void* or char*) */
|
||||||
|
#define _curl_is_postfields(expr) \
|
||||||
|
(_curl_is_ptr((expr), void) || \
|
||||||
|
_curl_is_arr((expr), char) || \
|
||||||
|
_curl_is_arr((expr), unsigned char))
|
||||||
|
|
||||||
|
/* helper: __builtin_types_compatible_p distinguishes between functions and
|
||||||
|
* function pointers, hide it */
|
||||||
|
#define _curl_callback_compatible(func, type) \
|
||||||
|
(__builtin_types_compatible_p(__typeof__(func), type) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(func) *, type))
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type curl_resolver_start_callback */
|
||||||
|
#define _curl_is_resolver_start_callback(expr) \
|
||||||
|
(_curl_is_NULL(expr) || \
|
||||||
|
_curl_callback_compatible((expr), curl_resolver_start_callback))
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type curl_read_callback or "similar" */
|
||||||
|
#define _curl_is_read_cb(expr) \
|
||||||
|
(_curl_is_NULL(expr) || \
|
||||||
|
_curl_callback_compatible((expr), __typeof__(fread) *) || \
|
||||||
|
_curl_callback_compatible((expr), curl_read_callback) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_read_callback1) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_read_callback2) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_read_callback3) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_read_callback4) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_read_callback5) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_read_callback6))
|
||||||
|
typedef size_t (*_curl_read_callback1)(char *, size_t, size_t, void *);
|
||||||
|
typedef size_t (*_curl_read_callback2)(char *, size_t, size_t, const void *);
|
||||||
|
typedef size_t (*_curl_read_callback3)(char *, size_t, size_t, FILE *);
|
||||||
|
typedef size_t (*_curl_read_callback4)(void *, size_t, size_t, void *);
|
||||||
|
typedef size_t (*_curl_read_callback5)(void *, size_t, size_t, const void *);
|
||||||
|
typedef size_t (*_curl_read_callback6)(void *, size_t, size_t, FILE *);
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type curl_write_callback or "similar" */
|
||||||
|
#define _curl_is_write_cb(expr) \
|
||||||
|
(_curl_is_read_cb(expr) || \
|
||||||
|
_curl_callback_compatible((expr), __typeof__(fwrite) *) || \
|
||||||
|
_curl_callback_compatible((expr), curl_write_callback) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_write_callback1) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_write_callback2) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_write_callback3) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_write_callback4) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_write_callback5) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_write_callback6))
|
||||||
|
typedef size_t (*_curl_write_callback1)(const char *, size_t, size_t, void *);
|
||||||
|
typedef size_t (*_curl_write_callback2)(const char *, size_t, size_t,
|
||||||
|
const void *);
|
||||||
|
typedef size_t (*_curl_write_callback3)(const char *, size_t, size_t, FILE *);
|
||||||
|
typedef size_t (*_curl_write_callback4)(const void *, size_t, size_t, void *);
|
||||||
|
typedef size_t (*_curl_write_callback5)(const void *, size_t, size_t,
|
||||||
|
const void *);
|
||||||
|
typedef size_t (*_curl_write_callback6)(const void *, size_t, size_t, FILE *);
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type curl_ioctl_callback or "similar" */
|
||||||
|
#define _curl_is_ioctl_cb(expr) \
|
||||||
|
(_curl_is_NULL(expr) || \
|
||||||
|
_curl_callback_compatible((expr), curl_ioctl_callback) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_ioctl_callback1) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_ioctl_callback2) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_ioctl_callback3) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_ioctl_callback4))
|
||||||
|
typedef curlioerr (*_curl_ioctl_callback1)(CURL *, int, void *);
|
||||||
|
typedef curlioerr (*_curl_ioctl_callback2)(CURL *, int, const void *);
|
||||||
|
typedef curlioerr (*_curl_ioctl_callback3)(CURL *, curliocmd, void *);
|
||||||
|
typedef curlioerr (*_curl_ioctl_callback4)(CURL *, curliocmd, const void *);
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type curl_sockopt_callback or "similar" */
|
||||||
|
#define _curl_is_sockopt_cb(expr) \
|
||||||
|
(_curl_is_NULL(expr) || \
|
||||||
|
_curl_callback_compatible((expr), curl_sockopt_callback) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_sockopt_callback1) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_sockopt_callback2))
|
||||||
|
typedef int (*_curl_sockopt_callback1)(void *, curl_socket_t, curlsocktype);
|
||||||
|
typedef int (*_curl_sockopt_callback2)(const void *, curl_socket_t,
|
||||||
|
curlsocktype);
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type curl_opensocket_callback or
|
||||||
|
"similar" */
|
||||||
|
#define _curl_is_opensocket_cb(expr) \
|
||||||
|
(_curl_is_NULL(expr) || \
|
||||||
|
_curl_callback_compatible((expr), curl_opensocket_callback) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_opensocket_callback1) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_opensocket_callback2) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_opensocket_callback3) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_opensocket_callback4))
|
||||||
|
typedef curl_socket_t (*_curl_opensocket_callback1)
|
||||||
|
(void *, curlsocktype, struct curl_sockaddr *);
|
||||||
|
typedef curl_socket_t (*_curl_opensocket_callback2)
|
||||||
|
(void *, curlsocktype, const struct curl_sockaddr *);
|
||||||
|
typedef curl_socket_t (*_curl_opensocket_callback3)
|
||||||
|
(const void *, curlsocktype, struct curl_sockaddr *);
|
||||||
|
typedef curl_socket_t (*_curl_opensocket_callback4)
|
||||||
|
(const void *, curlsocktype, const struct curl_sockaddr *);
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type curl_progress_callback or "similar" */
|
||||||
|
#define _curl_is_progress_cb(expr) \
|
||||||
|
(_curl_is_NULL(expr) || \
|
||||||
|
_curl_callback_compatible((expr), curl_progress_callback) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_progress_callback1) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_progress_callback2))
|
||||||
|
typedef int (*_curl_progress_callback1)(void *,
|
||||||
|
double, double, double, double);
|
||||||
|
typedef int (*_curl_progress_callback2)(const void *,
|
||||||
|
double, double, double, double);
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type curl_debug_callback or "similar" */
|
||||||
|
#define _curl_is_debug_cb(expr) \
|
||||||
|
(_curl_is_NULL(expr) || \
|
||||||
|
_curl_callback_compatible((expr), curl_debug_callback) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_debug_callback1) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_debug_callback2) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_debug_callback3) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_debug_callback4) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_debug_callback5) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_debug_callback6) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_debug_callback7) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_debug_callback8))
|
||||||
|
typedef int (*_curl_debug_callback1) (CURL *,
|
||||||
|
curl_infotype, char *, size_t, void *);
|
||||||
|
typedef int (*_curl_debug_callback2) (CURL *,
|
||||||
|
curl_infotype, char *, size_t, const void *);
|
||||||
|
typedef int (*_curl_debug_callback3) (CURL *,
|
||||||
|
curl_infotype, const char *, size_t, void *);
|
||||||
|
typedef int (*_curl_debug_callback4) (CURL *,
|
||||||
|
curl_infotype, const char *, size_t, const void *);
|
||||||
|
typedef int (*_curl_debug_callback5) (CURL *,
|
||||||
|
curl_infotype, unsigned char *, size_t, void *);
|
||||||
|
typedef int (*_curl_debug_callback6) (CURL *,
|
||||||
|
curl_infotype, unsigned char *, size_t, const void *);
|
||||||
|
typedef int (*_curl_debug_callback7) (CURL *,
|
||||||
|
curl_infotype, const unsigned char *, size_t, void *);
|
||||||
|
typedef int (*_curl_debug_callback8) (CURL *,
|
||||||
|
curl_infotype, const unsigned char *, size_t, const void *);
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type curl_ssl_ctx_callback or "similar" */
|
||||||
|
/* this is getting even messier... */
|
||||||
|
#define _curl_is_ssl_ctx_cb(expr) \
|
||||||
|
(_curl_is_NULL(expr) || \
|
||||||
|
_curl_callback_compatible((expr), curl_ssl_ctx_callback) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_ssl_ctx_callback1) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_ssl_ctx_callback2) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_ssl_ctx_callback3) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_ssl_ctx_callback4) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_ssl_ctx_callback5) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_ssl_ctx_callback6) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_ssl_ctx_callback7) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_ssl_ctx_callback8))
|
||||||
|
typedef CURLcode (*_curl_ssl_ctx_callback1)(CURL *, void *, void *);
|
||||||
|
typedef CURLcode (*_curl_ssl_ctx_callback2)(CURL *, void *, const void *);
|
||||||
|
typedef CURLcode (*_curl_ssl_ctx_callback3)(CURL *, const void *, void *);
|
||||||
|
typedef CURLcode (*_curl_ssl_ctx_callback4)(CURL *, const void *,
|
||||||
|
const void *);
|
||||||
|
#ifdef HEADER_SSL_H
|
||||||
|
/* hack: if we included OpenSSL's ssl.h, we know about SSL_CTX
|
||||||
|
* this will of course break if we're included before OpenSSL headers...
|
||||||
|
*/
|
||||||
|
typedef CURLcode (*_curl_ssl_ctx_callback5)(CURL *, SSL_CTX, void *);
|
||||||
|
typedef CURLcode (*_curl_ssl_ctx_callback6)(CURL *, SSL_CTX, const void *);
|
||||||
|
typedef CURLcode (*_curl_ssl_ctx_callback7)(CURL *, const SSL_CTX, void *);
|
||||||
|
typedef CURLcode (*_curl_ssl_ctx_callback8)(CURL *, const SSL_CTX,
|
||||||
|
const void *);
|
||||||
|
#else
|
||||||
|
typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback5;
|
||||||
|
typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback6;
|
||||||
|
typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback7;
|
||||||
|
typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback8;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type curl_conv_callback or "similar" */
|
||||||
|
#define _curl_is_conv_cb(expr) \
|
||||||
|
(_curl_is_NULL(expr) || \
|
||||||
|
_curl_callback_compatible((expr), curl_conv_callback) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_conv_callback1) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_conv_callback2) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_conv_callback3) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_conv_callback4))
|
||||||
|
typedef CURLcode (*_curl_conv_callback1)(char *, size_t length);
|
||||||
|
typedef CURLcode (*_curl_conv_callback2)(const char *, size_t length);
|
||||||
|
typedef CURLcode (*_curl_conv_callback3)(void *, size_t length);
|
||||||
|
typedef CURLcode (*_curl_conv_callback4)(const void *, size_t length);
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type curl_seek_callback or "similar" */
|
||||||
|
#define _curl_is_seek_cb(expr) \
|
||||||
|
(_curl_is_NULL(expr) || \
|
||||||
|
_curl_callback_compatible((expr), curl_seek_callback) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_seek_callback1) || \
|
||||||
|
_curl_callback_compatible((expr), _curl_seek_callback2))
|
||||||
|
typedef CURLcode (*_curl_seek_callback1)(void *, curl_off_t, int);
|
||||||
|
typedef CURLcode (*_curl_seek_callback2)(const void *, curl_off_t, int);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __CURL_TYPECHECK_GCC_H */
|
||||||
123
bin/curl/include/curl/urlapi.h
Normal file
123
bin/curl/include/curl/urlapi.h
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
#ifndef __CURL_URLAPI_H
|
||||||
|
#define __CURL_URLAPI_H
|
||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 2018 - 2019, 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 https://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 "curl.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* the error codes for the URL API */
|
||||||
|
typedef enum {
|
||||||
|
CURLUE_OK,
|
||||||
|
CURLUE_BAD_HANDLE, /* 1 */
|
||||||
|
CURLUE_BAD_PARTPOINTER, /* 2 */
|
||||||
|
CURLUE_MALFORMED_INPUT, /* 3 */
|
||||||
|
CURLUE_BAD_PORT_NUMBER, /* 4 */
|
||||||
|
CURLUE_UNSUPPORTED_SCHEME, /* 5 */
|
||||||
|
CURLUE_URLDECODE, /* 6 */
|
||||||
|
CURLUE_OUT_OF_MEMORY, /* 7 */
|
||||||
|
CURLUE_USER_NOT_ALLOWED, /* 8 */
|
||||||
|
CURLUE_UNKNOWN_PART, /* 9 */
|
||||||
|
CURLUE_NO_SCHEME, /* 10 */
|
||||||
|
CURLUE_NO_USER, /* 11 */
|
||||||
|
CURLUE_NO_PASSWORD, /* 12 */
|
||||||
|
CURLUE_NO_OPTIONS, /* 13 */
|
||||||
|
CURLUE_NO_HOST, /* 14 */
|
||||||
|
CURLUE_NO_PORT, /* 15 */
|
||||||
|
CURLUE_NO_QUERY, /* 16 */
|
||||||
|
CURLUE_NO_FRAGMENT /* 17 */
|
||||||
|
} CURLUcode;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CURLUPART_URL,
|
||||||
|
CURLUPART_SCHEME,
|
||||||
|
CURLUPART_USER,
|
||||||
|
CURLUPART_PASSWORD,
|
||||||
|
CURLUPART_OPTIONS,
|
||||||
|
CURLUPART_HOST,
|
||||||
|
CURLUPART_PORT,
|
||||||
|
CURLUPART_PATH,
|
||||||
|
CURLUPART_QUERY,
|
||||||
|
CURLUPART_FRAGMENT,
|
||||||
|
CURLUPART_ZONEID /* added in 7.65.0 */
|
||||||
|
} CURLUPart;
|
||||||
|
|
||||||
|
#define CURLU_DEFAULT_PORT (1<<0) /* return default port number */
|
||||||
|
#define CURLU_NO_DEFAULT_PORT (1<<1) /* act as if no port number was set,
|
||||||
|
if the port number matches the
|
||||||
|
default for the scheme */
|
||||||
|
#define CURLU_DEFAULT_SCHEME (1<<2) /* return default scheme if
|
||||||
|
missing */
|
||||||
|
#define CURLU_NON_SUPPORT_SCHEME (1<<3) /* allow non-supported scheme */
|
||||||
|
#define CURLU_PATH_AS_IS (1<<4) /* leave dot sequences */
|
||||||
|
#define CURLU_DISALLOW_USER (1<<5) /* no user+password allowed */
|
||||||
|
#define CURLU_URLDECODE (1<<6) /* URL decode on get */
|
||||||
|
#define CURLU_URLENCODE (1<<7) /* URL encode on set */
|
||||||
|
#define CURLU_APPENDQUERY (1<<8) /* append a form style part */
|
||||||
|
#define CURLU_GUESS_SCHEME (1<<9) /* legacy curl-style guessing */
|
||||||
|
|
||||||
|
typedef struct Curl_URL CURLU;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* curl_url() creates a new CURLU handle and returns a pointer to it.
|
||||||
|
* Must be freed with curl_url_cleanup().
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLU *curl_url(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* curl_url_cleanup() frees the CURLU handle and related resources used for
|
||||||
|
* the URL parsing. It will not free strings previously returned with the URL
|
||||||
|
* API.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN void curl_url_cleanup(CURLU *handle);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* curl_url_dup() duplicates a CURLU handle and returns a new copy. The new
|
||||||
|
* handle must also be freed with curl_url_cleanup().
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLU *curl_url_dup(CURLU *in);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* curl_url_get() extracts a specific part of the URL from a CURLU
|
||||||
|
* handle. Returns error code. The returned pointer MUST be freed with
|
||||||
|
* curl_free() afterwards.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLUcode curl_url_get(CURLU *handle, CURLUPart what,
|
||||||
|
char **part, unsigned int flags);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* curl_url_set() sets a specific part of the URL in a CURLU handle. Returns
|
||||||
|
* error code. The passed in string will be copied. Passing a NULL instead of
|
||||||
|
* a part string, clears that part.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLUcode curl_url_set(CURLU *handle, CURLUPart what,
|
||||||
|
const char *part, unsigned int flags);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* end of extern "C" */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
BIN
bin/curl/lib/libcurl.a
Normal file
BIN
bin/curl/lib/libcurl.a
Normal file
Binary file not shown.
BIN
bin/curl/lib/libcurl.dll.a
Normal file
BIN
bin/curl/lib/libcurl.dll.a
Normal file
Binary file not shown.
558
bin/curl/mk-ca-bundle.pl
Normal file
558
bin/curl/mk-ca-bundle.pl
Normal file
@@ -0,0 +1,558 @@
|
|||||||
|
#!/usr/bin/env perl
|
||||||
|
# ***************************************************************************
|
||||||
|
# * _ _ ____ _
|
||||||
|
# * Project ___| | | | _ \| |
|
||||||
|
# * / __| | | | |_) | |
|
||||||
|
# * | (__| |_| | _ <| |___
|
||||||
|
# * \___|\___/|_| \_\_____|
|
||||||
|
# *
|
||||||
|
# * Copyright (C) 1998 - 2016, 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 https://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.
|
||||||
|
# *
|
||||||
|
# ***************************************************************************
|
||||||
|
# This Perl script creates a fresh ca-bundle.crt file for use with libcurl.
|
||||||
|
# It downloads certdata.txt from Mozilla's source tree (see URL below),
|
||||||
|
# then parses certdata.txt and extracts CA Root Certificates into PEM format.
|
||||||
|
# These are then processed with the OpenSSL commandline tool to produce the
|
||||||
|
# final ca-bundle.crt file.
|
||||||
|
# The script is based on the parse-certs script written by Roland Krikava.
|
||||||
|
# This Perl script works on almost any platform since its only external
|
||||||
|
# dependency is the OpenSSL commandline tool for optional text listing.
|
||||||
|
# Hacked by Guenter Knauf.
|
||||||
|
#
|
||||||
|
use Encode;
|
||||||
|
use Getopt::Std;
|
||||||
|
use MIME::Base64;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use vars qw($opt_b $opt_d $opt_f $opt_h $opt_i $opt_k $opt_l $opt_m $opt_n $opt_p $opt_q $opt_s $opt_t $opt_u $opt_v $opt_w);
|
||||||
|
use List::Util;
|
||||||
|
use Text::Wrap;
|
||||||
|
my $MOD_SHA = "Digest::SHA";
|
||||||
|
eval "require $MOD_SHA";
|
||||||
|
if ($@) {
|
||||||
|
$MOD_SHA = "Digest::SHA::PurePerl";
|
||||||
|
eval "require $MOD_SHA";
|
||||||
|
}
|
||||||
|
eval "require LWP::UserAgent";
|
||||||
|
|
||||||
|
my %urls = (
|
||||||
|
'nss' =>
|
||||||
|
'https://hg.mozilla.org/projects/nss/raw-file/default/lib/ckfw/builtins/certdata.txt',
|
||||||
|
'central' =>
|
||||||
|
'https://hg.mozilla.org/mozilla-central/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt',
|
||||||
|
'beta' =>
|
||||||
|
'https://hg.mozilla.org/releases/mozilla-beta/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt',
|
||||||
|
'release' =>
|
||||||
|
'https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt',
|
||||||
|
);
|
||||||
|
|
||||||
|
$opt_d = 'release';
|
||||||
|
|
||||||
|
# If the OpenSSL commandline is not in search path you can configure it here!
|
||||||
|
my $openssl = 'openssl';
|
||||||
|
|
||||||
|
my $version = '1.27';
|
||||||
|
|
||||||
|
$opt_w = 76; # default base64 encoded lines length
|
||||||
|
|
||||||
|
# default cert types to include in the output (default is to include CAs which may issue SSL server certs)
|
||||||
|
my $default_mozilla_trust_purposes = "SERVER_AUTH";
|
||||||
|
my $default_mozilla_trust_levels = "TRUSTED_DELEGATOR";
|
||||||
|
$opt_p = $default_mozilla_trust_purposes . ":" . $default_mozilla_trust_levels;
|
||||||
|
|
||||||
|
my @valid_mozilla_trust_purposes = (
|
||||||
|
"DIGITAL_SIGNATURE",
|
||||||
|
"NON_REPUDIATION",
|
||||||
|
"KEY_ENCIPHERMENT",
|
||||||
|
"DATA_ENCIPHERMENT",
|
||||||
|
"KEY_AGREEMENT",
|
||||||
|
"KEY_CERT_SIGN",
|
||||||
|
"CRL_SIGN",
|
||||||
|
"SERVER_AUTH",
|
||||||
|
"CLIENT_AUTH",
|
||||||
|
"CODE_SIGNING",
|
||||||
|
"EMAIL_PROTECTION",
|
||||||
|
"IPSEC_END_SYSTEM",
|
||||||
|
"IPSEC_TUNNEL",
|
||||||
|
"IPSEC_USER",
|
||||||
|
"TIME_STAMPING",
|
||||||
|
"STEP_UP_APPROVED"
|
||||||
|
);
|
||||||
|
|
||||||
|
my @valid_mozilla_trust_levels = (
|
||||||
|
"TRUSTED_DELEGATOR", # CAs
|
||||||
|
"NOT_TRUSTED", # Don't trust these certs.
|
||||||
|
"MUST_VERIFY_TRUST", # This explicitly tells us that it ISN'T a CA but is otherwise ok. In other words, this should tell the app to ignore any other sources that claim this is a CA.
|
||||||
|
"TRUSTED" # This cert is trusted, but only for itself and not for delegates (i.e. it is not a CA).
|
||||||
|
);
|
||||||
|
|
||||||
|
my $default_signature_algorithms = $opt_s = "MD5";
|
||||||
|
|
||||||
|
my @valid_signature_algorithms = (
|
||||||
|
"MD5",
|
||||||
|
"SHA1",
|
||||||
|
"SHA256",
|
||||||
|
"SHA384",
|
||||||
|
"SHA512"
|
||||||
|
);
|
||||||
|
|
||||||
|
$0 =~ s@.*(/|\\)@@;
|
||||||
|
$Getopt::Std::STANDARD_HELP_VERSION = 1;
|
||||||
|
getopts('bd:fhiklmnp:qs:tuvw:');
|
||||||
|
|
||||||
|
if(!defined($opt_d)) {
|
||||||
|
# to make plain "-d" use not cause warnings, and actually still work
|
||||||
|
$opt_d = 'release';
|
||||||
|
}
|
||||||
|
|
||||||
|
# Use predefined URL or else custom URL specified on command line.
|
||||||
|
my $url;
|
||||||
|
if(defined($urls{$opt_d})) {
|
||||||
|
$url = $urls{$opt_d};
|
||||||
|
if(!$opt_k && $url !~ /^https:\/\//i) {
|
||||||
|
die "The URL for '$opt_d' is not HTTPS. Use -k to override (insecure).\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$url = $opt_d;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $curl = `curl -V`;
|
||||||
|
|
||||||
|
if ($opt_i) {
|
||||||
|
print ("=" x 78 . "\n");
|
||||||
|
print "Script Version : $version\n";
|
||||||
|
print "Perl Version : $]\n";
|
||||||
|
print "Operating System Name : $^O\n";
|
||||||
|
print "Getopt::Std.pm Version : ${Getopt::Std::VERSION}\n";
|
||||||
|
print "Encode::Encoding.pm Version : ${Encode::Encoding::VERSION}\n";
|
||||||
|
print "MIME::Base64.pm Version : ${MIME::Base64::VERSION}\n";
|
||||||
|
print "LWP::UserAgent.pm Version : ${LWP::UserAgent::VERSION}\n" if($LWP::UserAgent::VERSION);
|
||||||
|
print "LWP.pm Version : ${LWP::VERSION}\n" if($LWP::VERSION);
|
||||||
|
print "Digest::SHA.pm Version : ${Digest::SHA::VERSION}\n" if ($Digest::SHA::VERSION);
|
||||||
|
print "Digest::SHA::PurePerl.pm Version : ${Digest::SHA::PurePerl::VERSION}\n" if ($Digest::SHA::PurePerl::VERSION);
|
||||||
|
print ("=" x 78 . "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
sub warning_message() {
|
||||||
|
if ( $opt_d =~ m/^risk$/i ) { # Long Form Warning and Exit
|
||||||
|
print "Warning: Use of this script may pose some risk:\n";
|
||||||
|
print "\n";
|
||||||
|
print " 1) If you use HTTP URLs they are subject to a man in the middle attack\n";
|
||||||
|
print " 2) Default to 'release', but more recent updates may be found in other trees\n";
|
||||||
|
print " 3) certdata.txt file format may change, lag time to update this script\n";
|
||||||
|
print " 4) Generally unwise to blindly trust CAs without manual review & verification\n";
|
||||||
|
print " 5) Mozilla apps use additional security checks aren't represented in certdata\n";
|
||||||
|
print " 6) Use of this script will make a security engineer grind his teeth and\n";
|
||||||
|
print " swear at you. ;)\n";
|
||||||
|
exit;
|
||||||
|
} else { # Short Form Warning
|
||||||
|
print "Warning: Use of this script may pose some risk, -d risk for more details.\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub HELP_MESSAGE() {
|
||||||
|
print "Usage:\t${0} [-b] [-d<certdata>] [-f] [-i] [-k] [-l] [-n] [-p<purposes:levels>] [-q] [-s<algorithms>] [-t] [-u] [-v] [-w<l>] [<outputfile>]\n";
|
||||||
|
print "\t-b\tbackup an existing version of ca-bundle.crt\n";
|
||||||
|
print "\t-d\tspecify Mozilla tree to pull certdata.txt or custom URL\n";
|
||||||
|
print "\t\t Valid names are:\n";
|
||||||
|
print "\t\t ", join( ", ", map { ( $_ =~ m/$opt_d/ ) ? "$_ (default)" : "$_" } sort keys %urls ), "\n";
|
||||||
|
print "\t-f\tforce rebuild even if certdata.txt is current\n";
|
||||||
|
print "\t-i\tprint version info about used modules\n";
|
||||||
|
print "\t-k\tallow URLs other than HTTPS, enable HTTP fallback (insecure)\n";
|
||||||
|
print "\t-l\tprint license info about certdata.txt\n";
|
||||||
|
print "\t-m\tinclude meta data in output\n";
|
||||||
|
print "\t-n\tno download of certdata.txt (to use existing)\n";
|
||||||
|
print wrap("\t","\t\t", "-p\tlist of Mozilla trust purposes and levels for certificates to include in output. Takes the form of a comma separated list of purposes, a colon, and a comma separated list of levels. (default: $default_mozilla_trust_purposes:$default_mozilla_trust_levels)"), "\n";
|
||||||
|
print "\t\t Valid purposes are:\n";
|
||||||
|
print wrap("\t\t ","\t\t ", join( ", ", "ALL", @valid_mozilla_trust_purposes ) ), "\n";
|
||||||
|
print "\t\t Valid levels are:\n";
|
||||||
|
print wrap("\t\t ","\t\t ", join( ", ", "ALL", @valid_mozilla_trust_levels ) ), "\n";
|
||||||
|
print "\t-q\tbe really quiet (no progress output at all)\n";
|
||||||
|
print wrap("\t","\t\t", "-s\tcomma separated list of certificate signatures/hashes to output in plain text mode. (default: $default_signature_algorithms)\n");
|
||||||
|
print "\t\t Valid signature algorithms are:\n";
|
||||||
|
print wrap("\t\t ","\t\t ", join( ", ", "ALL", @valid_signature_algorithms ) ), "\n";
|
||||||
|
print "\t-t\tinclude plain text listing of certificates\n";
|
||||||
|
print "\t-u\tunlink (remove) certdata.txt after processing\n";
|
||||||
|
print "\t-v\tbe verbose and print out processed CAs\n";
|
||||||
|
print "\t-w <l>\twrap base64 output lines after <l> chars (default: ${opt_w})\n";
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub VERSION_MESSAGE() {
|
||||||
|
print "${0} version ${version} running Perl ${]} on ${^O}\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
warning_message() unless ($opt_q || $url =~ m/^(ht|f)tps:/i );
|
||||||
|
HELP_MESSAGE() if ($opt_h);
|
||||||
|
|
||||||
|
sub report($@) {
|
||||||
|
my $output = shift;
|
||||||
|
|
||||||
|
print STDERR $output . "\n" unless $opt_q;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub is_in_list($@) {
|
||||||
|
my $target = shift;
|
||||||
|
|
||||||
|
return defined(List::Util::first { $target eq $_ } @_);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parses $param_string as a case insensitive comma separated list with optional whitespace
|
||||||
|
# validates that only allowed parameters are supplied
|
||||||
|
sub parse_csv_param($$@) {
|
||||||
|
my $description = shift;
|
||||||
|
my $param_string = shift;
|
||||||
|
my @valid_values = @_;
|
||||||
|
|
||||||
|
my @values = map {
|
||||||
|
s/^\s+//; # strip leading spaces
|
||||||
|
s/\s+$//; # strip trailing spaces
|
||||||
|
uc $_ # return the modified string as upper case
|
||||||
|
} split( ',', $param_string );
|
||||||
|
|
||||||
|
# Find all values which are not in the list of valid values or "ALL"
|
||||||
|
my @invalid = grep { !is_in_list($_,"ALL",@valid_values) } @values;
|
||||||
|
|
||||||
|
if ( scalar(@invalid) > 0 ) {
|
||||||
|
# Tell the user which parameters were invalid and print the standard help message which will exit
|
||||||
|
print "Error: Invalid ", $description, scalar(@invalid) == 1 ? ": " : "s: ", join( ", ", map { "\"$_\"" } @invalid ), "\n";
|
||||||
|
HELP_MESSAGE();
|
||||||
|
}
|
||||||
|
|
||||||
|
@values = @valid_values if ( is_in_list("ALL",@values) );
|
||||||
|
|
||||||
|
return @values;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub sha256 {
|
||||||
|
my $result;
|
||||||
|
if ($Digest::SHA::VERSION || $Digest::SHA::PurePerl::VERSION) {
|
||||||
|
open(FILE, $_[0]) or die "Can't open '$_[0]': $!";
|
||||||
|
binmode(FILE);
|
||||||
|
$result = $MOD_SHA->new(256)->addfile(*FILE)->hexdigest;
|
||||||
|
close(FILE);
|
||||||
|
} else {
|
||||||
|
# Use OpenSSL command if Perl Digest::SHA modules not available
|
||||||
|
$result = `"$openssl" dgst -r -sha256 "$_[0]"`;
|
||||||
|
$result =~ s/^([0-9a-f]{64}) .+/$1/is;
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sub oldhash {
|
||||||
|
my $hash = "";
|
||||||
|
open(C, "<$_[0]") || return 0;
|
||||||
|
while(<C>) {
|
||||||
|
chomp;
|
||||||
|
if($_ =~ /^\#\# SHA256: (.*)/) {
|
||||||
|
$hash = $1;
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(C);
|
||||||
|
return $hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( $opt_p !~ m/:/ ) {
|
||||||
|
print "Error: Mozilla trust identifier list must include both purposes and levels\n";
|
||||||
|
HELP_MESSAGE();
|
||||||
|
}
|
||||||
|
|
||||||
|
(my $included_mozilla_trust_purposes_string, my $included_mozilla_trust_levels_string) = split( ':', $opt_p );
|
||||||
|
my @included_mozilla_trust_purposes = parse_csv_param( "trust purpose", $included_mozilla_trust_purposes_string, @valid_mozilla_trust_purposes );
|
||||||
|
my @included_mozilla_trust_levels = parse_csv_param( "trust level", $included_mozilla_trust_levels_string, @valid_mozilla_trust_levels );
|
||||||
|
|
||||||
|
my @included_signature_algorithms = parse_csv_param( "signature algorithm", $opt_s, @valid_signature_algorithms );
|
||||||
|
|
||||||
|
sub should_output_cert(%) {
|
||||||
|
my %trust_purposes_by_level = @_;
|
||||||
|
|
||||||
|
foreach my $level (@included_mozilla_trust_levels) {
|
||||||
|
# for each level we want to output, see if any of our desired purposes are included
|
||||||
|
return 1 if ( defined( List::Util::first { is_in_list( $_, @included_mozilla_trust_purposes ) } @{$trust_purposes_by_level{$level}} ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $crt = $ARGV[0] || 'ca-bundle.crt';
|
||||||
|
(my $txt = $url) =~ s@(.*/|\?.*)@@g;
|
||||||
|
|
||||||
|
my $stdout = $crt eq '-';
|
||||||
|
my $resp;
|
||||||
|
my $fetched;
|
||||||
|
|
||||||
|
my $oldhash = oldhash($crt);
|
||||||
|
|
||||||
|
report "SHA256 of old file: $oldhash";
|
||||||
|
|
||||||
|
if(!$opt_n) {
|
||||||
|
report "Downloading $txt ...";
|
||||||
|
|
||||||
|
# If we have an HTTPS URL then use curl
|
||||||
|
if($url =~ /^https:\/\//i) {
|
||||||
|
if($curl) {
|
||||||
|
if($curl =~ /^Protocols:.* https( |$)/m) {
|
||||||
|
report "Get certdata with curl!";
|
||||||
|
my $proto = !$opt_k ? "--proto =https" : "";
|
||||||
|
my $quiet = $opt_q ? "-s" : "";
|
||||||
|
my @out = `curl -w %{response_code} $proto $quiet -o "$txt" "$url"`;
|
||||||
|
if(!$? && @out && $out[0] == 200) {
|
||||||
|
$fetched = 1;
|
||||||
|
report "Downloaded $txt";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
report "Failed downloading via HTTPS with curl";
|
||||||
|
if(-e $txt && !unlink($txt)) {
|
||||||
|
report "Failed to remove '$txt': $!";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
report "curl lacks https support";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
report "curl not found";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# If nothing was fetched then use LWP
|
||||||
|
if(!$fetched) {
|
||||||
|
if($url =~ /^https:\/\//i) {
|
||||||
|
report "Falling back to HTTP";
|
||||||
|
$url =~ s/^https:\/\//http:\/\//i;
|
||||||
|
}
|
||||||
|
if(!$opt_k) {
|
||||||
|
report "URLs other than HTTPS are disabled by default, to enable use -k";
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
|
report "Get certdata with LWP!";
|
||||||
|
if(!defined(${LWP::UserAgent::VERSION})) {
|
||||||
|
report "LWP is not available (LWP::UserAgent not found)";
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
|
my $ua = new LWP::UserAgent(agent => "$0/$version");
|
||||||
|
$ua->env_proxy();
|
||||||
|
$resp = $ua->mirror($url, $txt);
|
||||||
|
if($resp && $resp->code eq '304') {
|
||||||
|
report "Not modified";
|
||||||
|
exit 0 if -e $crt && !$opt_f;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$fetched = 1;
|
||||||
|
report "Downloaded $txt";
|
||||||
|
}
|
||||||
|
if(!$resp || $resp->code !~ /^(?:200|304)$/) {
|
||||||
|
report "Unable to download latest data: "
|
||||||
|
. ($resp? $resp->code . ' - ' . $resp->message : "LWP failed");
|
||||||
|
exit 1 if -e $crt || ! -r $txt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my $filedate = $resp ? $resp->last_modified : (stat($txt))[9];
|
||||||
|
my $datesrc = "as of";
|
||||||
|
if(!$filedate) {
|
||||||
|
# mxr.mozilla.org gave us a time, hg.mozilla.org does not!
|
||||||
|
$filedate = time();
|
||||||
|
$datesrc="downloaded on";
|
||||||
|
}
|
||||||
|
|
||||||
|
# get the hash from the download file
|
||||||
|
my $newhash= sha256($txt);
|
||||||
|
|
||||||
|
if(!$opt_f && $oldhash eq $newhash) {
|
||||||
|
report "Downloaded file identical to previous run\'s source file. Exiting";
|
||||||
|
if($opt_u && -e $txt && !unlink($txt)) {
|
||||||
|
report "Failed to remove $txt: $!\n";
|
||||||
|
}
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
report "SHA256 of new file: $newhash";
|
||||||
|
|
||||||
|
my $currentdate = scalar gmtime($filedate);
|
||||||
|
|
||||||
|
my $format = $opt_t ? "plain text and " : "";
|
||||||
|
if( $stdout ) {
|
||||||
|
open(CRT, '> -') or die "Couldn't open STDOUT: $!\n";
|
||||||
|
} else {
|
||||||
|
open(CRT,">$crt.~") or die "Couldn't open $crt.~: $!\n";
|
||||||
|
}
|
||||||
|
print CRT <<EOT;
|
||||||
|
##
|
||||||
|
## Bundle of CA Root Certificates
|
||||||
|
##
|
||||||
|
## Certificate data from Mozilla ${datesrc}: ${currentdate} GMT
|
||||||
|
##
|
||||||
|
## This is a bundle of X.509 certificates of public Certificate Authorities
|
||||||
|
## (CA). These were automatically extracted from Mozilla's root certificates
|
||||||
|
## file (certdata.txt). This file can be found in the mozilla source tree:
|
||||||
|
## ${url}
|
||||||
|
##
|
||||||
|
## It contains the certificates in ${format}PEM format and therefore
|
||||||
|
## can be directly used with curl / libcurl / php_curl, or with
|
||||||
|
## an Apache+mod_ssl webserver for SSL client authentication.
|
||||||
|
## Just configure this file as the SSLCACertificateFile.
|
||||||
|
##
|
||||||
|
## Conversion done with mk-ca-bundle.pl version $version.
|
||||||
|
## SHA256: $newhash
|
||||||
|
##
|
||||||
|
|
||||||
|
EOT
|
||||||
|
|
||||||
|
report "Processing '$txt' ...";
|
||||||
|
my $caname;
|
||||||
|
my $certnum = 0;
|
||||||
|
my $skipnum = 0;
|
||||||
|
my $start_of_cert = 0;
|
||||||
|
my @precert;
|
||||||
|
|
||||||
|
open(TXT,"$txt") or die "Couldn't open $txt: $!\n";
|
||||||
|
while (<TXT>) {
|
||||||
|
if (/\*\*\*\*\* BEGIN LICENSE BLOCK \*\*\*\*\*/) {
|
||||||
|
print CRT;
|
||||||
|
print if ($opt_l);
|
||||||
|
while (<TXT>) {
|
||||||
|
print CRT;
|
||||||
|
print if ($opt_l);
|
||||||
|
last if (/\*\*\*\*\* END LICENSE BLOCK \*\*\*\*\*/);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elsif(/^# (Issuer|Serial Number|Subject|Not Valid Before|Not Valid After |Fingerprint \(MD5\)|Fingerprint \(SHA1\)):/) {
|
||||||
|
push @precert, $_;
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
elsif(/^#|^\s*$/) {
|
||||||
|
undef @precert;
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
chomp;
|
||||||
|
|
||||||
|
# this is a match for the start of a certificate
|
||||||
|
if (/^CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE/) {
|
||||||
|
$start_of_cert = 1
|
||||||
|
}
|
||||||
|
if ($start_of_cert && /^CKA_LABEL UTF8 \"(.*)\"/) {
|
||||||
|
$caname = $1;
|
||||||
|
}
|
||||||
|
my %trust_purposes_by_level;
|
||||||
|
if ($start_of_cert && /^CKA_VALUE MULTILINE_OCTAL/) {
|
||||||
|
my $data;
|
||||||
|
while (<TXT>) {
|
||||||
|
last if (/^END/);
|
||||||
|
chomp;
|
||||||
|
my @octets = split(/\\/);
|
||||||
|
shift @octets;
|
||||||
|
for (@octets) {
|
||||||
|
$data .= chr(oct);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# scan forwards until the trust part
|
||||||
|
while (<TXT>) {
|
||||||
|
last if (/^CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST/);
|
||||||
|
chomp;
|
||||||
|
}
|
||||||
|
# now scan the trust part to determine how we should trust this cert
|
||||||
|
while (<TXT>) {
|
||||||
|
last if (/^#/);
|
||||||
|
if (/^CKA_TRUST_([A-Z_]+)\s+CK_TRUST\s+CKT_NSS_([A-Z_]+)\s*$/) {
|
||||||
|
if ( !is_in_list($1,@valid_mozilla_trust_purposes) ) {
|
||||||
|
report "Warning: Unrecognized trust purpose for cert: $caname. Trust purpose: $1. Trust Level: $2";
|
||||||
|
} elsif ( !is_in_list($2,@valid_mozilla_trust_levels) ) {
|
||||||
|
report "Warning: Unrecognized trust level for cert: $caname. Trust purpose: $1. Trust Level: $2";
|
||||||
|
} else {
|
||||||
|
push @{$trust_purposes_by_level{$2}}, $1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !should_output_cert(%trust_purposes_by_level) ) {
|
||||||
|
$skipnum ++;
|
||||||
|
report "Skipping: $caname" if ($opt_v);
|
||||||
|
} else {
|
||||||
|
my $encoded = MIME::Base64::encode_base64($data, '');
|
||||||
|
$encoded =~ s/(.{1,${opt_w}})/$1\n/g;
|
||||||
|
my $pem = "-----BEGIN CERTIFICATE-----\n"
|
||||||
|
. $encoded
|
||||||
|
. "-----END CERTIFICATE-----\n";
|
||||||
|
print CRT "\n$caname\n";
|
||||||
|
print CRT @precert if($opt_m);
|
||||||
|
my $maxStringLength = length(decode('UTF-8', $caname, Encode::FB_CROAK | Encode::LEAVE_SRC));
|
||||||
|
if ($opt_t) {
|
||||||
|
foreach my $key (keys %trust_purposes_by_level) {
|
||||||
|
my $string = $key . ": " . join(", ", @{$trust_purposes_by_level{$key}});
|
||||||
|
$maxStringLength = List::Util::max( length($string), $maxStringLength );
|
||||||
|
print CRT $string . "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print CRT ("=" x $maxStringLength . "\n");
|
||||||
|
if (!$opt_t) {
|
||||||
|
print CRT $pem;
|
||||||
|
} else {
|
||||||
|
my $pipe = "";
|
||||||
|
foreach my $hash (@included_signature_algorithms) {
|
||||||
|
$pipe = "|$openssl x509 -" . $hash . " -fingerprint -noout -inform PEM";
|
||||||
|
if (!$stdout) {
|
||||||
|
$pipe .= " >> $crt.~";
|
||||||
|
close(CRT) or die "Couldn't close $crt.~: $!";
|
||||||
|
}
|
||||||
|
open(TMP, $pipe) or die "Couldn't open openssl pipe: $!";
|
||||||
|
print TMP $pem;
|
||||||
|
close(TMP) or die "Couldn't close openssl pipe: $!";
|
||||||
|
if (!$stdout) {
|
||||||
|
open(CRT, ">>$crt.~") or die "Couldn't open $crt.~: $!";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$pipe = "|$openssl x509 -text -inform PEM";
|
||||||
|
if (!$stdout) {
|
||||||
|
$pipe .= " >> $crt.~";
|
||||||
|
close(CRT) or die "Couldn't close $crt.~: $!";
|
||||||
|
}
|
||||||
|
open(TMP, $pipe) or die "Couldn't open openssl pipe: $!";
|
||||||
|
print TMP $pem;
|
||||||
|
close(TMP) or die "Couldn't close openssl pipe: $!";
|
||||||
|
if (!$stdout) {
|
||||||
|
open(CRT, ">>$crt.~") or die "Couldn't open $crt.~: $!";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
report "Parsing: $caname" if ($opt_v);
|
||||||
|
$certnum ++;
|
||||||
|
$start_of_cert = 0;
|
||||||
|
}
|
||||||
|
undef @precert;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
close(TXT) or die "Couldn't close $txt: $!\n";
|
||||||
|
close(CRT) or die "Couldn't close $crt.~: $!\n";
|
||||||
|
unless( $stdout ) {
|
||||||
|
if ($opt_b && -e $crt) {
|
||||||
|
my $bk = 1;
|
||||||
|
while (-e "$crt.~${bk}~") {
|
||||||
|
$bk++;
|
||||||
|
}
|
||||||
|
rename $crt, "$crt.~${bk}~" or die "Failed to create backup $crt.~$bk}~: $!\n";
|
||||||
|
} elsif( -e $crt ) {
|
||||||
|
unlink( $crt ) or die "Failed to remove $crt: $!\n";
|
||||||
|
}
|
||||||
|
rename "$crt.~", $crt or die "Failed to rename $crt.~ to $crt: $!\n";
|
||||||
|
}
|
||||||
|
if($opt_u && -e $txt && !unlink($txt)) {
|
||||||
|
report "Failed to remove $txt: $!\n";
|
||||||
|
}
|
||||||
|
report "Done ($certnum CA certs processed, $skipnum skipped).";
|
||||||
@@ -1,29 +1,92 @@
|
|||||||
@echo off
|
@echo off
|
||||||
|
setlocal EnableDelayedExpansion
|
||||||
|
|
||||||
set ROOT=%~dp0%
|
set ROOT=%~dp0%
|
||||||
|
|
||||||
set OPENSSL_BIN="c:\OpenSSL-Win64\bin\openssl.exe"
|
set OPENSSL_BIN="c:\OpenSSL-Win64\bin\openssl.exe"
|
||||||
set PRIVATE_KEY="c:\src\cert\blockstorage_dev_private.pem"
|
set PRIVATE_KEY="c:\src\cert\blockstorage_dev_private.pem"
|
||||||
set PUBLIC_KEY="%ROOT%\blockstorage_dev_public.pem"
|
set PUBLIC_KEY="%ROOT%blockstorage_dev_public.pem"
|
||||||
|
|
||||||
set SED_BIN=%ROOT%bin\sed.exe
|
set SED_BIN=%ROOT%bin\sed.exe
|
||||||
set GREP_BIN=%ROOT%bin\grep.exe
|
set GREP_BIN=%ROOT%bin\grep.exe
|
||||||
set B64_BIN=%ROOT%bin\b64.exe
|
set B64_BIN=%ROOT%bin\b64.exe
|
||||||
|
set CURL_BIN=%ROOT%bin\curl\bin\curl.exe
|
||||||
|
set JQ_BIN=%ROOT%bin\jq-win64.exe
|
||||||
|
|
||||||
|
set ERROR_EXIT=0
|
||||||
|
|
||||||
pushd "%ROOT%"
|
pushd "%ROOT%"
|
||||||
for /f "tokens=*" %%i in ('%GREP_BIN% -m1 -a version package.json ^| %SED_BIN% -e "s/""""//g" ^| %SED_BIN% -e "s/version: //g" -e "s/,//g"') do (
|
for /f "tokens=*" %%i in ('%GREP_BIN% -m1 -a version package.json ^| %SED_BIN% -e "s/""""//g" ^| %SED_BIN% -e "s/version: //g" -e "s/,//g"') do (
|
||||||
set APP_VER=%%i
|
set APP_VER=%%i
|
||||||
)
|
)
|
||||||
set OUT_FILE=repertory-ui_%APP_VER%_win.exe
|
set OUT_FILE=repertory-ui_%APP_VER%_win.exe
|
||||||
echo %OUT_FILE%
|
|
||||||
|
|
||||||
npm run dist && (
|
call npm run dist && (
|
||||||
pushd dist
|
pushd dist
|
||||||
echo Signing Installation [%OUT_FILE%]
|
(certutil -hashfile "%OUT_FILE%" SHA256 | %SED_BIN% -e "1d" -e "$d" -e "s/\ //g") > "%OUT_FILE%.sha256" || (call :ERROR "Create sha-256 failed")
|
||||||
(certutil -hashfile "%OUT_FILE%" SHA256 | "%SED_BIN%" -e "1d" -e "$d" -e "s/\ //g") > "%OUT_FILE%.sha256"
|
"%OPENSSL_BIN%" dgst -sha256 -sign "%PRIVATE_KEY%" -out "%OUT_FILE%.sig" "%OUT_FILE%" || (call :ERROR "Create signature failed")
|
||||||
"%OPENSSL_BIN%" dgst -sha256 -sign "%PRIVATE_KEY%" -out "%OUT_FILE%.sig" "%OUT_FILE%"
|
"%B64_BIN%" -e "%OUT_FILE%.sig" "%OUT_FILE%.sig.b64" || (call :ERROR "Create base64 failed")
|
||||||
"%B64_BIN%" -e "%OUT_FILE%.sig" "%OUT_FILE%.sig.b64"
|
for /f "delims=" %%i in ('type %OUT_FILE%.sig.b64') do set APP_SIG=!APP_SIG!%%i
|
||||||
|
for /f "delims=" %%i in ('type %OUT_FILE%.sha256') do set APP_SHA256=!APP_SHA256!%%i
|
||||||
|
|
||||||
|
del /q upload_response.json 1>NUL 2>&1
|
||||||
|
|
||||||
|
("%CURL_BIN%" -F name="%OUT_FILE%" -F anonymous=true -F file="@%OUT_FILE%" https://pixeldrain.com/api/file > upload_response.json) || (
|
||||||
|
call :PIXEL_RESPONSE 0
|
||||||
|
)
|
||||||
|
call :PIXEL_RESPONSE 1
|
||||||
|
set PIXEL_LOCATION=https://pixeldrain.com/api/file/!PIXEL_ID!
|
||||||
|
|
||||||
|
del /q releases.json 1>NUL 2>&1
|
||||||
|
|
||||||
|
("%JQ_BIN%" ".Versions.win32|=(.+ ["""%APP_VER%"""]|unique)" ..\releases.json>releases_temp.json && move /Y releases_temp.json releases.json 1>NUL 2>&1) || (call :ERROR "Update releases.json Versions failed")
|
||||||
|
("%JQ_BIN%" ".Locations.win32."""%APP_VER%""".sig="""!APP_SIG!"""" releases.json>releases_temp.json && move /Y releases_temp.json releases.json 1>NUL 2>&1) || (call :ERROR "Update releases.json sig failed")
|
||||||
|
("%JQ_BIN%" ".Locations.win32."""%APP_VER%""".sha256="""!APP_SHA256!"""" releases.json>releases_temp.json && move /Y releases_temp.json releases.json 1>NUL 2>&1) || (call :ERROR "Update releases.json sha256 failed")
|
||||||
|
("%JQ_BIN%" ".Locations.win32."""%APP_VER%""".urls=["""!PIXEL_LOCATION!"""]" releases.json>releases_temp.json && move /Y releases_temp.json releases.json 1>NUL 2>&1) || (call :ERROR "Update releases.json URL failed")
|
||||||
popd
|
popd
|
||||||
) || (
|
) || (
|
||||||
echo Failed
|
call :ERROR "Create dist failed"
|
||||||
)
|
)
|
||||||
popd
|
popd
|
||||||
|
goto :END
|
||||||
|
|
||||||
|
:NO_QUOTES
|
||||||
|
set %~1=!%~1:"=!
|
||||||
|
goto :EOF
|
||||||
|
|
||||||
|
:PIXEL_RESPONSE
|
||||||
|
set PIXEL_RESPONSE=
|
||||||
|
if %1==1 (
|
||||||
|
for /f "delims=" %%i in ('%JQ_BIN% .success upload_response.json') do (
|
||||||
|
if "%%i" == "false" (
|
||||||
|
for /f "delims=" %%i in ('%JQ_BIN% .message upload_response.json') do (
|
||||||
|
set PIXEL_RESPONSE=!PIXEL_RESPONSE!%%i
|
||||||
|
)
|
||||||
|
call :ERROR "Upload to pixeldrain failed: !PIXEL_RESPONSE!"
|
||||||
|
) else (
|
||||||
|
for /f "delims=" %%i in ('%JQ_BIN% .id upload_response.json') do (
|
||||||
|
set PIXEL_ID=%%i
|
||||||
|
call :NO_QUOTES PIXEL_ID
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
) else (
|
||||||
|
for /f "delims=" %%i in ('type upload_response.json') do (
|
||||||
|
set PIXEL_RESPONSE=!PIXEL_RESPONSE!%%i
|
||||||
|
)
|
||||||
|
call :ERROR "Upload to pixeldrain failed: !PIXEL_RESPONSE!"
|
||||||
|
)
|
||||||
|
goto :EOF
|
||||||
|
|
||||||
|
:ERROR
|
||||||
|
echo %1
|
||||||
|
set ERROR_EXIT=1
|
||||||
|
if "%DISABLE_PAUSE%" NEQ "1" (
|
||||||
|
pause
|
||||||
|
)
|
||||||
|
goto :END
|
||||||
|
|
||||||
|
:END
|
||||||
|
if "!ERROR_EXIT!" NEQ "0" (
|
||||||
|
exit !ERROR_EXIT!
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user