removed binaries
This commit is contained in:
parent
d3321b3c57
commit
7ef9f5cd65
BIN
bin/7za.dll
BIN
bin/7za.dll
Binary file not shown.
BIN
bin/7za.exe
BIN
bin/7za.exe
Binary file not shown.
BIN
bin/7zxa.dll
BIN
bin/7zxa.dll
Binary file not shown.
BIN
bin/awk.exe
BIN
bin/awk.exe
Binary file not shown.
BIN
bin/b64.exe
BIN
bin/b64.exe
Binary file not shown.
@ -1,2 +0,0 @@
|
|||||||
[InternetShortcut]
|
|
||||||
URL=https://github.com/curl/curl-for-win
|
|
@ -1,3 +0,0 @@
|
|||||||
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
7904
bin/curl/CHANGES.txt
File diff suppressed because it is too large
Load Diff
@ -1,19 +0,0 @@
|
|||||||
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.
|
|
@ -1,42 +0,0 @@
|
|||||||
/* 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.
|
|
||||||
*/
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
|||||||
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.
|
|
@ -1,115 +0,0 @@
|
|||||||
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.
|
|
@ -1,22 +0,0 @@
|
|||||||
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.
|
|
@ -1,125 +0,0 @@
|
|||||||
|
|
||||||
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.]
|
|
||||||
*/
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
|||||||
_ _ ____ _
|
|
||||||
___| | | | _ \| |
|
|
||||||
/ __| | | | |_) | |
|
|
||||||
| (__| |_| | _ <| |___
|
|
||||||
\___|\___/|_| \_\_____|
|
|
||||||
|
|
||||||
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.
|
|
@ -1,250 +0,0 @@
|
|||||||
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
|
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
@ -1,59 +0,0 @@
|
|||||||
# 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
|
|
@ -1,118 +0,0 @@
|
|||||||
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
|
|
@ -1,106 +0,0 @@
|
|||||||
# 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.
|
|
@ -1,302 +0,0 @@
|
|||||||
_ _ ____ _
|
|
||||||
___| | | | _ \| |
|
|
||||||
/ __| | | | |_) | |
|
|
||||||
| (__| |_| | _ <| |___
|
|
||||||
\___|\___/|_| \_\_____|
|
|
||||||
|
|
||||||
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.
|
|
@ -1,162 +0,0 @@
|
|||||||
# 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.
|
|
@ -1,503 +0,0 @@
|
|||||||
# 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`,
|
|
@ -1,32 +0,0 @@
|
|||||||
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/)
|
|
@ -1,246 +0,0 @@
|
|||||||
# 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);
|
|
@ -1,267 +0,0 @@
|
|||||||
# 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)
|
|
@ -1,21 +0,0 @@
|
|||||||
# 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).
|
|
File diff suppressed because it is too large
Load Diff
@ -1,204 +0,0 @@
|
|||||||
_ _ ____ _
|
|
||||||
___| | | | _ \| |
|
|
||||||
/ __| | | | |_) | |
|
|
||||||
| (__| |_| | _ <| |___
|
|
||||||
\___|\___/|_| \_\_____|
|
|
||||||
|
|
||||||
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)
|
|
@ -1,144 +0,0 @@
|
|||||||
# 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!
|
|
@ -1,70 +0,0 @@
|
|||||||
# 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.
|
|
@ -1,346 +0,0 @@
|
|||||||
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
|
|
@ -1,113 +0,0 @@
|
|||||||
# 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.
|
|
@ -1,127 +0,0 @@
|
|||||||
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)
|
|
@ -1,468 +0,0 @@
|
|||||||
# 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
|
|
@ -1,9 +0,0 @@
|
|||||||
_ _ ____ _
|
|
||||||
___| | | | _ \| |
|
|
||||||
/ __| | | | |_) | |
|
|
||||||
| (__| |_| | _ <| |___
|
|
||||||
\___|\___/|_| \_\_____|
|
|
||||||
|
|
||||||
How To Compile
|
|
||||||
|
|
||||||
see INSTALL.md
|
|
File diff suppressed because it is too large
Load Diff
@ -1,759 +0,0 @@
|
|||||||
_ _ ____ _
|
|
||||||
___| | | | _ \| |
|
|
||||||
/ __| | | | |_) | |
|
|
||||||
| (__| |_| | _ <| |___
|
|
||||||
\___|\___/|_| \_\_____|
|
|
||||||
|
|
||||||
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
|
|
@ -1,123 +0,0 @@
|
|||||||
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.
|
|
@ -1,285 +0,0 @@
|
|||||||
_ _ ____ _
|
|
||||||
___| | | | _ \| |
|
|
||||||
/ __| | | | |_) | |
|
|
||||||
| (__| |_| | _ <| |___
|
|
||||||
\___|\___/|_| \_\_____|
|
|
||||||
|
|
||||||
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.
|
|
@ -1,12 +0,0 @@
|
|||||||

|
|
||||||
|
|
||||||
# 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.
|
|
@ -1,98 +0,0 @@
|
|||||||
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.
|
|
@ -1,85 +0,0 @@
|
|||||||
_ _ ____ _
|
|
||||||
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
|
|
@ -1,59 +0,0 @@
|
|||||||
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.
|
|
@ -1,132 +0,0 @@
|
|||||||
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.
|
|
@ -1,87 +0,0 @@
|
|||||||
_ _ ____ _
|
|
||||||
___| | | | _ \| |
|
|
||||||
/ __| | | | |_) | |
|
|
||||||
| (__| |_| | _ <| |___
|
|
||||||
\___|\___/|_| \_\_____|
|
|
||||||
|
|
||||||
# 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
|
|
@ -1,173 +0,0 @@
|
|||||||
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.
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,758 +0,0 @@
|
|||||||
_ _ ____ _
|
|
||||||
___| | | | _ \| |
|
|
||||||
/ __| | | | |_) | |
|
|
||||||
| (__| |_| | _ <| |___
|
|
||||||
\___|\___/|_| \_\_____|
|
|
||||||
|
|
||||||
|
|
||||||
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
|
|
@ -1,56 +0,0 @@
|
|||||||
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`.
|
|
@ -1,68 +0,0 @@
|
|||||||
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
|
|
@ -1,946 +0,0 @@
|
|||||||
_ _ ____ _
|
|
||||||
___| | | | _ \| |
|
|
||||||
/ __| | | | |_) | |
|
|
||||||
| (__| |_| | _ <| |___
|
|
||||||
\___|\___/|_| \_\_____|
|
|
||||||
|
|
||||||
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
|
|
File diff suppressed because it is too large
Load Diff
@ -1,77 +0,0 @@
|
|||||||
#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 */
|
|
@ -1,112 +0,0 @@
|
|||||||
#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
|
|
@ -1,50 +0,0 @@
|
|||||||
#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 */
|
|
@ -1,441 +0,0 @@
|
|||||||
#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
|
|
@ -1,33 +0,0 @@
|
|||||||
#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 */
|
|
@ -1,493 +0,0 @@
|
|||||||
#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 */
|
|
@ -1,694 +0,0 @@
|
|||||||
#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 */
|
|
@ -1,123 +0,0 @@
|
|||||||
#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
|
|
Binary file not shown.
Binary file not shown.
@ -1,558 +0,0 @@
|
|||||||
#!/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).";
|
|
Binary file not shown.
BIN
bin/gawk.exe
BIN
bin/gawk.exe
Binary file not shown.
BIN
bin/grep.exe
BIN
bin/grep.exe
Binary file not shown.
133
bin/igawk
133
bin/igawk
@ -1,133 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
# igawk --- like gawk but do @include processing
|
|
||||||
#
|
|
||||||
# Arnold Robbins, arnold@skeeve.com, Public Domain
|
|
||||||
# July 1993
|
|
||||||
|
|
||||||
if [ "$1" = debug ]
|
|
||||||
then
|
|
||||||
set -x
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
# A literal newline, so that program text is formatted correctly
|
|
||||||
n='
|
|
||||||
'
|
|
||||||
|
|
||||||
# Initialize variables to empty
|
|
||||||
program=
|
|
||||||
opts=
|
|
||||||
|
|
||||||
while [ $# -ne 0 ] # loop over arguments
|
|
||||||
do
|
|
||||||
case $1 in
|
|
||||||
--) shift; break;;
|
|
||||||
|
|
||||||
-W) shift
|
|
||||||
# The ${x?'message here'} construct prints a
|
|
||||||
# diagnostic if $x is the null string
|
|
||||||
set -- -W"${@?'missing operand'}"
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-[vF]) opts="$opts $1 '${2?'missing operand'}'"
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-[vF]*) opts="$opts '$1'" ;;
|
|
||||||
|
|
||||||
-f) program="$program$n@include ${2?'missing operand'}"
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-f*) f=`expr "$1" : '-f\(.*\)'`
|
|
||||||
program="$program$n@include $f";;
|
|
||||||
|
|
||||||
-[W-]file=*)
|
|
||||||
f=`expr "$1" : '-.file=\(.*\)'`
|
|
||||||
program="$program$n@include $f";;
|
|
||||||
|
|
||||||
-[W-]file)
|
|
||||||
program="$program$n@include ${2?'missing operand'}"
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-[W-]source=*)
|
|
||||||
t=`expr "$1" : '-.source=\(.*\)'`
|
|
||||||
program="$program$n$t";;
|
|
||||||
|
|
||||||
-[W-]source)
|
|
||||||
program="$program$n${2?'missing operand'}"
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-[W-]version)
|
|
||||||
echo igawk: version 2.0 1>&2
|
|
||||||
gawk --version
|
|
||||||
exit 0 ;;
|
|
||||||
|
|
||||||
-[W-]*) opts="$opts '$1'" ;;
|
|
||||||
|
|
||||||
*) break;;
|
|
||||||
esac
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ -z "$program" ]
|
|
||||||
then
|
|
||||||
program=${1?'missing program'}
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
# At this point, `program' has the program.
|
|
||||||
expand_prog='
|
|
||||||
|
|
||||||
function pathto(file, i, t, junk)
|
|
||||||
{
|
|
||||||
if (index(file, "/") != 0)
|
|
||||||
return file
|
|
||||||
|
|
||||||
for (i = 1; i <= ndirs; i++) {
|
|
||||||
t = (pathlist[i] "/" file)
|
|
||||||
if ((getline junk < t) > 0) {
|
|
||||||
# found it
|
|
||||||
close(t)
|
|
||||||
return t
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
BEGIN {
|
|
||||||
path = ENVIRON["AWKPATH"]
|
|
||||||
ndirs = split(path, pathlist, ":")
|
|
||||||
for (i = 1; i <= ndirs; i++) {
|
|
||||||
if (pathlist[i] == "")
|
|
||||||
pathlist[i] = "."
|
|
||||||
}
|
|
||||||
stackptr = 0
|
|
||||||
input[stackptr] = ARGV[1] # ARGV[1] is first file
|
|
||||||
|
|
||||||
for (; stackptr >= 0; stackptr--) {
|
|
||||||
while ((getline < input[stackptr]) > 0) {
|
|
||||||
if (tolower($1) != "@include") {
|
|
||||||
print
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
fpath = pathto($2)
|
|
||||||
if (fpath == "") {
|
|
||||||
printf("igawk:%s:%d: cannot find %s\n",
|
|
||||||
input[stackptr], FNR, $2) > "/dev/stderr"
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if (! (fpath in processed)) {
|
|
||||||
processed[fpath] = input[stackptr]
|
|
||||||
input[++stackptr] = fpath # push onto stack
|
|
||||||
} else
|
|
||||||
print $2, "included in", input[stackptr],
|
|
||||||
"already included in",
|
|
||||||
processed[fpath] > "/dev/stderr"
|
|
||||||
}
|
|
||||||
close(input[stackptr])
|
|
||||||
}
|
|
||||||
}' # close quote ends `expand_prog' variable
|
|
||||||
|
|
||||||
processed_program=`gawk -- "$expand_prog" /dev/stdin <<EOF
|
|
||||||
$program
|
|
||||||
EOF
|
|
||||||
`
|
|
||||||
eval gawk $opts -- '"$processed_program"' '"$@"'
|
|
Binary file not shown.
BIN
bin/libintl3.dll
BIN
bin/libintl3.dll
Binary file not shown.
BIN
bin/pcre3.dll
BIN
bin/pcre3.dll
Binary file not shown.
Binary file not shown.
BIN
bin/pgawk.exe
BIN
bin/pgawk.exe
Binary file not shown.
BIN
bin/regex2.dll
BIN
bin/regex2.dll
Binary file not shown.
BIN
bin/sed.exe
BIN
bin/sed.exe
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user