Compare commits

..

No commits in common. "main" and "curl-7_41_0" have entirely different histories.

1517 changed files with 15888 additions and 36498 deletions

View File

@ -1,10 +0,0 @@
;;; Directory Local Variables
;;; See Info node `(emacs) Directory Variables' for more information.
((nil . ((indent-tabs-mode . nil)
(show-trailing-whitespace . t)))
(c-mode . ((c-basic-offset . 2)
))
(c++-mode . ((c-basic-offset . 2)
))
)

View File

@ -1,23 +0,0 @@
How to contribute to curl
=========================
Join the community
------------------
1. Click 'watch' on the github repo
2. Subscribe to the suitable [mailing lists](https://curl.haxx.se/mail/)
Read [CONTRIBUTE](../docs/CONTRIBUTE)
---------------------------------------
Send your suggestions using one of these methods:
-------------------------------------------------
1. in a mail to the mailing list
2. as a [pull request](https://github.com/curl/curl/pulls)
3. as an [issue](https://github.com/curl/curl/issues)
/ The cURL team!

View File

@ -1,9 +0,0 @@
### I did this
### I expected the following
### curl/libcurl version
[curl -V output perhaps?]
### operating system

58
.gitignore vendored
View File

@ -1,52 +1,48 @@
*.asc .deps
.libs
*.lib
*.pdb
*.dll *.dll
*.exe *.exe
*.exp
*.la
*.lib
*.lo
*.o
*.obj *.obj
*.pdb *.asc
*~
.*.swp .*.swp
.cproject
.deps
.dirstamp
.libs
.project
.settings
/build/
/builds/
CHANGES.dist
Debug Debug
INSTALL Release
*.exp
Makefile Makefile
Makefile.in Makefile.in
Release
TAGS
aclocal.m4 aclocal.m4
aclocal.m4.bak
autom4te.cache autom4te.cache
compile
config.cache config.cache
config.guess config.guess
config.log config.log
config.status config.status
config.sub config.sub
configure configure
curl-*.tar.bz2
curl-*.tar.gz
curl-*.tar.lzma
curl-*.zip
curl-config
depcomp depcomp
install-sh
libcurl.pc
libtool libtool
ltmain.sh ltmain.sh
compile
curl-config
libcurl.pc
missing missing
curl-*.tar.gz
curl-*.tar.bz2
curl-*.tar.lzma
curl-*.zip
INSTALL
install-sh
*.o
*.lo
*.la
mkinstalldirs mkinstalldirs
tags tags
test-driver TAGS
scripts/_curl *~
aclocal.m4.bak
CHANGES.dist
.project
.cproject
.settings
.dirstamp

View File

@ -1,20 +1,8 @@
os:
- linux
- osx
sudo: false
language: c language: c
install:
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew update > /dev/null; fi
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew install openssl libidn rtmpdump libssh2 c-ares libmetalink libressl nghttp2; fi
before_script: before_script:
- ./buildconf - ./buildconf
script: ./configure --enable-debug && make && make test-full
compiler: compiler:
- clang - clang
- gcc - gcc

14
CHANGES
View File

@ -1,7 +1,15 @@
See https://curl.haxx.se/changes.html for the edited and human readable online _ _ ____ _
version of what has changed over the years in different curl releases. ___| | | | _ \| |
/ __| | | | |_) | |
| (__| |_| | _ <| |___
\___|\___/|_| \_\_____|
Generate a CHANGES file like the one present in evey release like this: Changelog
This file no longer holds the changelog. Now you can generate it yourself
like this:
$ git log --pretty=fuller --no-color --date=short --decorate=full | \ $ git log --pretty=fuller --no-color --date=short --decorate=full | \
./log2changes.pl ./log2changes.pl
The older, manually edited, changelog is found in git named CHANGES.0

450
CHANGES.0

File diff suppressed because it is too large Load Diff

View File

@ -9,7 +9,7 @@
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -139,7 +139,7 @@ int main(void)
rc = gethostbyname_r(address, &h, &hdata); rc = gethostbyname_r(address, &h, &hdata);
#elif defined(HAVE_GETHOSTBYNAME_R_5) || \ #elif defined(HAVE_GETHOSTBYNAME_R_5) || \
defined(HAVE_GETHOSTBYNAME_R_5_REENTRANT) defined(HAVE_GETHOSTBYNAME_R_5_REENTRANT)
rc = gethostbyname_r(address, &h, buffer, 8192, &h_errnop); rc = gethostbyname_r(address, &h, buffer, 8192, 0, &h_errnop);
(void)hp; /* not used for test */ (void)hp; /* not used for test */
#elif defined(HAVE_GETHOSTBYNAME_R_6) || \ #elif defined(HAVE_GETHOSTBYNAME_R_6) || \
defined(HAVE_GETHOSTBYNAME_R_6_REENTRANT) defined(HAVE_GETHOSTBYNAME_R_6_REENTRANT)

View File

@ -10,8 +10,8 @@ endmacro(add_header_include)
set(signature_call_conv) set(signature_call_conv)
if(HAVE_WINDOWS_H) if(HAVE_WINDOWS_H)
add_header_include(HAVE_WINSOCK2_H "winsock2.h")
add_header_include(HAVE_WINDOWS_H "windows.h") add_header_include(HAVE_WINDOWS_H "windows.h")
add_header_include(HAVE_WINSOCK2_H "winsock2.h")
add_header_include(HAVE_WINSOCK_H "winsock.h") add_header_include(HAVE_WINSOCK_H "winsock.h")
set(_source_epilogue set(_source_epilogue
"${_source_epilogue}\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif") "${_source_epilogue}\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif")

View File

@ -9,7 +9,7 @@
# #
# This software is licensed as described in the file COPYING, which # This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms # you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html. # are also available at http://curl.haxx.se/docs/copyright.html.
# #
# You may opt to use, copy, modify, merge, publish, distribute and/or sell # 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 # copies of the Software, and permit persons to whom the Software is
@ -64,7 +64,7 @@ message(STATUS "curl version=[${CURL_VERSION}]")
# SET(PACKAGE_NAME "curl") # SET(PACKAGE_NAME "curl")
# SET(PACKAGE_VERSION "-") # SET(PACKAGE_VERSION "-")
# SET(PACKAGE_STRING "curl-") # SET(PACKAGE_STRING "curl-")
# SET(PACKAGE_BUGREPORT "a suitable curl mailing list => https://curl.haxx.se/mail/") # SET(PACKAGE_BUGREPORT "a suitable curl mailing list => http://curl.haxx.se/mail/")
set(OPERATING_SYSTEM "${CMAKE_SYSTEM_NAME}") set(OPERATING_SYSTEM "${CMAKE_SYSTEM_NAME}")
set(OS "\"${CMAKE_SYSTEM_NAME}\"") set(OS "\"${CMAKE_SYSTEM_NAME}\"")
@ -76,24 +76,6 @@ option(BUILD_CURL_TESTS "Set to ON to build cURL tests." ON)
option(CURL_STATICLIB "Set to ON to build libcurl with static linking." OFF) option(CURL_STATICLIB "Set to ON to build libcurl with static linking." OFF)
option(ENABLE_ARES "Set to ON to enable c-ares support" OFF) option(ENABLE_ARES "Set to ON to enable c-ares support" OFF)
option(ENABLE_THREADED_RESOLVER "Set to ON to enable POSIX threaded DNS lookup" OFF) option(ENABLE_THREADED_RESOLVER "Set to ON to enable POSIX threaded DNS lookup" OFF)
option(ENABLE_DEBUG "Set to ON to enable curl debug features" OFF)
option(ENABLE_CURLDEBUG "Set to ON to build with TrackMemory feature enabled" OFF)
if (ENABLE_DEBUG)
# DEBUGBUILD will be defined only for Debug builds
if(NOT CMAKE_VERSION VERSION_LESS 3.0)
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS $<$<CONFIG:Debug>:DEBUGBUILD>)
else()
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_DEBUG DEBUGBUILD)
endif()
set(ENABLE_CURLDEBUG ON)
endif()
if (ENABLE_CURLDEBUG)
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS CURLDEBUG)
endif()
# initialize CURL_LIBS # initialize CURL_LIBS
set(CURL_LIBS "") set(CURL_LIBS "")
@ -122,6 +104,11 @@ endif()
option(CURL_HIDDEN_SYMBOLS "Set to ON to hide libcurl internal symbols (=hide all symbols that aren't officially external)." ON) option(CURL_HIDDEN_SYMBOLS "Set to ON to hide libcurl internal symbols (=hide all symbols that aren't officially external)." ON)
mark_as_advanced(CURL_HIDDEN_SYMBOLS) mark_as_advanced(CURL_HIDDEN_SYMBOLS)
# IF(WIN32)
# OPTION(CURL_WINDOWS_SSPI "Use windows libraries to allow NTLM authentication without openssl" ON)
# MARK_AS_ADVANCED(CURL_WINDOWS_SSPI)
# ENDIF()
option(HTTP_ONLY "disables all protocols except HTTP (This overrides all CURL_DISABLE_* options)" OFF) option(HTTP_ONLY "disables all protocols except HTTP (This overrides all CURL_DISABLE_* options)" OFF)
mark_as_advanced(HTTP_ONLY) mark_as_advanced(HTTP_ONLY)
option(CURL_DISABLE_FTP "disables FTP" OFF) option(CURL_DISABLE_FTP "disables FTP" OFF)
@ -181,7 +168,7 @@ option(DISABLED_THREADSAFE "Set to explicitly specify we don't want to use threa
mark_as_advanced(DISABLED_THREADSAFE) mark_as_advanced(DISABLED_THREADSAFE)
option(ENABLE_IPV6 "Define if you want to enable IPv6 support" ON) option(ENABLE_IPV6 "Define if you want to enable IPv6 support" ON)
mark_as_advanced(ENABLE_IPV6) mark_as_advanced(ENABLE_IPV6)
if(ENABLE_IPV6 AND NOT WIN32) if(ENABLE_IPV6)
include(CheckStructHasMember) include(CheckStructHasMember)
check_struct_has_member("struct sockaddr_in6" sin6_addr "netinet/in.h" check_struct_has_member("struct sockaddr_in6" sin6_addr "netinet/in.h"
HAVE_SOCKADDR_IN6_SIN6_ADDR) HAVE_SOCKADDR_IN6_SIN6_ADDR)
@ -248,7 +235,6 @@ include (CheckLibraryExists)
include (CheckSymbolExists) include (CheckSymbolExists)
include (CheckTypeSize) include (CheckTypeSize)
include (CheckCSourceCompiles) include (CheckCSourceCompiles)
include (CMakeDependentOption)
# On windows preload settings # On windows preload settings
if(WIN32) if(WIN32)
@ -286,22 +272,15 @@ endif(NOT NOT_NEED_LIBNSL)
check_function_exists(gethostname HAVE_GETHOSTNAME) check_function_exists(gethostname HAVE_GETHOSTNAME)
set(OPENSSL_DEFAULT ON)
if(WIN32) if(WIN32)
set(OPENSSL_DEFAULT OFF)
check_library_exists_concat("ws2_32" getch HAVE_LIBWS2_32) check_library_exists_concat("ws2_32" getch HAVE_LIBWS2_32)
check_library_exists_concat("winmm" getch HAVE_LIBWINMM) check_library_exists_concat("winmm" getch HAVE_LIBWINMM)
endif() endif()
option(CMAKE_USE_OPENSSL "Use OpenSSL code. Experimental" ${OPENSSL_DEFAULT}) option(CMAKE_USE_OPENSSL "Use OpenSSL code. Experimental" ON)
mark_as_advanced(CMAKE_USE_OPENSSL) mark_as_advanced(CMAKE_USE_OPENSSL)
if(WIN32) set(USE_SSLEAY OFF)
CMAKE_DEPENDENT_OPTION(CURL_WINDOWS_SSPI "Use windows libraries to allow NTLM authentication without openssl" ON
"NOT CMAKE_USE_OPENSSL" OFF)
mark_as_advanced(CURL_WINDOWS_SSPI)
endif()
set(USE_OPENSSL OFF) set(USE_OPENSSL OFF)
set(HAVE_LIBCRYPTO OFF) set(HAVE_LIBCRYPTO OFF)
set(HAVE_LIBSSL OFF) set(HAVE_LIBSSL OFF)
@ -310,6 +289,7 @@ if(CMAKE_USE_OPENSSL)
find_package(OpenSSL) find_package(OpenSSL)
if(OPENSSL_FOUND) if(OPENSSL_FOUND)
list(APPEND CURL_LIBS ${OPENSSL_LIBRARIES}) list(APPEND CURL_LIBS ${OPENSSL_LIBRARIES})
set(USE_SSLEAY ON)
set(USE_OPENSSL ON) set(USE_OPENSSL ON)
set(HAVE_LIBCRYPTO ON) set(HAVE_LIBCRYPTO ON)
set(HAVE_LIBSSL ON) set(HAVE_LIBSSL ON)
@ -324,8 +304,6 @@ if(CMAKE_USE_OPENSSL)
check_include_file("openssl/ssl.h" HAVE_OPENSSL_SSL_H) check_include_file("openssl/ssl.h" HAVE_OPENSSL_SSL_H)
check_include_file("openssl/x509.h" HAVE_OPENSSL_X509_H) check_include_file("openssl/x509.h" HAVE_OPENSSL_X509_H)
check_include_file("openssl/rand.h" HAVE_OPENSSL_RAND_H) check_include_file("openssl/rand.h" HAVE_OPENSSL_RAND_H)
elseif(WIN32)
set(CURL_WINDOWS_SSPI ON)
endif() endif()
endif() endif()
@ -361,10 +339,9 @@ if(NOT CURL_DISABLE_LDAP)
check_include_file_concat("winber.h" HAVE_WINBER_H) check_include_file_concat("winber.h" HAVE_WINBER_H)
endif() endif()
set(CMAKE_REQUIRED_INCLUDES_BAK ${CMAKE_REQUIRED_INCLUDES})
set(CMAKE_LDAP_INCLUDE_DIR "" CACHE STRING "Path to LDAP include directory") set(CMAKE_LDAP_INCLUDE_DIR "" CACHE STRING "Path to LDAP include directory")
if(CMAKE_LDAP_INCLUDE_DIR) if(CMAKE_LDAP_INCLUDE_DIR)
list(APPEND CMAKE_REQUIRED_INCLUDES ${CMAKE_LDAP_INCLUDE_DIR}) set(CMAKE_REQUIRED_INCLUDES ${CMAKE_LDAP_INCLUDE_DIR})
endif() endif()
check_include_file_concat("ldap.h" HAVE_LDAP_H) check_include_file_concat("ldap.h" HAVE_LDAP_H)
check_include_file_concat("lber.h" HAVE_LBER_H) check_include_file_concat("lber.h" HAVE_LBER_H)
@ -372,11 +349,9 @@ if(NOT CURL_DISABLE_LDAP)
if(NOT HAVE_LDAP_H) if(NOT HAVE_LDAP_H)
message(STATUS "LDAP_H not found CURL_DISABLE_LDAP set ON") message(STATUS "LDAP_H not found CURL_DISABLE_LDAP set ON")
set(CURL_DISABLE_LDAP ON CACHE BOOL "" FORCE) set(CURL_DISABLE_LDAP ON CACHE BOOL "" FORCE)
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES_BAK}) #LDAP includes won't be used
elseif(NOT HAVE_LIBLDAP) elseif(NOT HAVE_LIBLDAP)
message(STATUS "LDAP library '${CMAKE_LDAP_LIB}' not found CURL_DISABLE_LDAP set ON") message(STATUS "LDAP library '${CMAKE_LDAP_LIB}' not found CURL_DISABLE_LDAP set ON")
set(CURL_DISABLE_LDAP ON CACHE BOOL "" FORCE) set(CURL_DISABLE_LDAP ON CACHE BOOL "" FORCE)
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES_BAK}) #LDAP includes won't be used
else() else()
if(CMAKE_USE_OPENLDAP) if(CMAKE_USE_OPENLDAP)
set(USE_OPENLDAP ON) set(USE_OPENLDAP ON)
@ -457,7 +432,6 @@ if(CURL_ZLIB)
set(HAVE_LIBZ ON) set(HAVE_LIBZ ON)
list(APPEND CURL_LIBS ${ZLIB_LIBRARIES}) list(APPEND CURL_LIBS ${ZLIB_LIBRARIES})
include_directories(${ZLIB_INCLUDE_DIRS}) include_directories(${ZLIB_INCLUDE_DIRS})
list(APPEND CMAKE_REQUIRED_INCLUDES ${ZLIB_INCLUDE_DIRS})
endif() endif()
endif() endif()
@ -473,7 +447,7 @@ if(CMAKE_USE_LIBSSH2)
if(LIBSSH2_FOUND) if(LIBSSH2_FOUND)
list(APPEND CURL_LIBS ${LIBSSH2_LIBRARY}) list(APPEND CURL_LIBS ${LIBSSH2_LIBRARY})
set(CMAKE_REQUIRED_LIBRARIES ${LIBSSH2_LIBRARY}) set(CMAKE_REQUIRED_LIBRARIES ${LIBSSH2_LIBRARY})
list(APPEND CMAKE_REQUIRED_INCLUDES "${LIBSSH2_INCLUDE_DIR}") set(CMAKE_REQUIRED_INCLUDES "${LIBSSH2_INCLUDE_DIR}")
include_directories("${LIBSSH2_INCLUDE_DIR}") include_directories("${LIBSSH2_INCLUDE_DIR}")
set(HAVE_LIBSSH2 ON) set(HAVE_LIBSSH2 ON)
set(USE_LIBSSH2 ON) set(USE_LIBSSH2 ON)
@ -501,12 +475,12 @@ mark_as_advanced(CMAKE_USE_GSSAPI)
if(CMAKE_USE_GSSAPI) if(CMAKE_USE_GSSAPI)
find_package(GSS) find_package(GSS)
set(HAVE_GSSAPI ${GSS_FOUND}) set(HAVE_GSS_API ${GSS_FOUND})
if(GSS_FOUND) if(GSS_FOUND)
message(STATUS "Found ${GSS_FLAVOUR} GSSAPI version: \"${GSS_VERSION}\"") message(STATUS "Found ${GSS_FLAVOUR} GSSAPI version: \"${GSS_VERSION}\"")
list(APPEND CMAKE_REQUIRED_INCLUDES ${GSS_INCLUDE_DIRECTORIES}) set(CMAKE_REQUIRED_INCLUDES ${GSS_INCLUDE_DIR})
check_include_file_concat("gssapi/gssapi.h" HAVE_GSSAPI_GSSAPI_H) check_include_file_concat("gssapi/gssapi.h" HAVE_GSSAPI_GSSAPI_H)
check_include_file_concat("gssapi/gssapi_generic.h" HAVE_GSSAPI_GSSAPI_GENERIC_H) check_include_file_concat("gssapi/gssapi_generic.h" HAVE_GSSAPI_GSSAPI_GENERIC_H)
check_include_file_concat("gssapi/gssapi_krb5.h" HAVE_GSSAPI_GSSAPI_KRB5_H) check_include_file_concat("gssapi/gssapi_krb5.h" HAVE_GSSAPI_GSSAPI_KRB5_H)
@ -542,7 +516,7 @@ if(CMAKE_USE_GSSAPI)
endif() endif()
include_directories(${GSS_INCLUDE_DIRECTORIES}) include_directories(${GSS_INCLUDE_DIR})
link_directories(${GSS_LINK_DIRECTORIES}) link_directories(${GSS_LINK_DIRECTORIES})
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GSS_COMPILER_FLAGS}") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GSS_COMPILER_FLAGS}")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${GSS_LINKER_FLAGS}") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${GSS_LINKER_FLAGS}")
@ -562,25 +536,12 @@ else()
unset(USE_UNIX_SOCKETS CACHE) unset(USE_UNIX_SOCKETS CACHE)
endif() endif()
# Check for header files # Check for header files
if(NOT UNIX) if(NOT UNIX)
check_include_file_concat("windows.h" HAVE_WINDOWS_H) check_include_file_concat("windows.h" HAVE_WINDOWS_H)
check_include_file_concat("winsock.h" HAVE_WINSOCK_H) check_include_file_concat("winsock.h" HAVE_WINSOCK_H)
check_include_file_concat("ws2tcpip.h" HAVE_WS2TCPIP_H) check_include_file_concat("ws2tcpip.h" HAVE_WS2TCPIP_H)
check_include_file_concat("winsock2.h" HAVE_WINSOCK2_H) check_include_file_concat("winsock2.h" HAVE_WINSOCK2_H)
if(CURL_WINDOWS_SSPI)
set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -DSECURITY_WIN32")
check_include_file_concat("sspi.h" HAVE_SSPI_H)
if(HAVE_SSPI_H)
check_include_file_concat("schannel.h" HAVE_SCHANNEL_H)
set(USE_WINDOWS_SSPI ON)
if(HAVE_SCHANNEL_H)
set(USE_SCHANNEL ON)
set(SSL_ENABLED ON)
endif()
endif()
endif()
endif(NOT UNIX) endif(NOT UNIX)
check_include_file_concat("stdio.h" HAVE_STDIO_H) check_include_file_concat("stdio.h" HAVE_STDIO_H)
@ -775,6 +736,7 @@ if(CMAKE_USE_OPENSSL)
HAVE_CRYPTO_CLEANUP_ALL_EX_DATA) HAVE_CRYPTO_CLEANUP_ALL_EX_DATA)
if(HAVE_LIBCRYPTO AND HAVE_LIBSSL) if(HAVE_LIBCRYPTO AND HAVE_LIBSSL)
set(USE_OPENSSL 1) set(USE_OPENSSL 1)
set(USE_SSLEAY 1)
endif(HAVE_LIBCRYPTO AND HAVE_LIBSSL) endif(HAVE_LIBCRYPTO AND HAVE_LIBSSL)
endif(CMAKE_USE_OPENSSL) endif(CMAKE_USE_OPENSSL)
check_symbol_exists(gmtime_r "${CURL_INCLUDES}" HAVE_GMTIME_R) check_symbol_exists(gmtime_r "${CURL_INCLUDES}" HAVE_GMTIME_R)
@ -1061,8 +1023,7 @@ endfunction()
# Clear list and try to detect available features # Clear list and try to detect available features
set(_items) set(_items)
_add_if("WinSSL" SSL_ENABLED AND USE_WINDOWS_SSPI) _add_if("SSL" SSL_ENABLED)
_add_if("OpenSSL" SSL_ENABLED AND USE_OPENSSL)
_add_if("IPv6" ENABLE_IPV6) _add_if("IPv6" ENABLE_IPV6)
_add_if("unix-sockets" USE_UNIX_SOCKETS) _add_if("unix-sockets" USE_UNIX_SOCKETS)
_add_if("libz" HAVE_LIBZ) _add_if("libz" HAVE_LIBZ)
@ -1070,12 +1031,12 @@ _add_if("AsynchDNS" USE_ARES OR USE_THREADS_POSIX)
_add_if("IDN" HAVE_LIBIDN) _add_if("IDN" HAVE_LIBIDN)
# TODO SSP1 (WinSSL) check is missing # TODO SSP1 (WinSSL) check is missing
_add_if("SSPI" USE_WINDOWS_SSPI) _add_if("SSPI" USE_WINDOWS_SSPI)
_add_if("GSS-API" HAVE_GSSAPI) _add_if("GSS-API" HAVE_GSS_API)
# TODO SSP1 missing for SPNEGO # TODO SSP1 missing for SPNEGO
_add_if("SPNEGO" NOT CURL_DISABLE_CRYPTO_AUTH AND _add_if("SPNEGO" NOT CURL_DISABLE_CRYPTO_AUTH AND
(HAVE_GSSAPI OR USE_WINDOWS_SSPI)) (HAVE_GSS_API OR USE_WINDOWS_SSPI))
_add_if("Kerberos" NOT CURL_DISABLE_CRYPTO_AUTH AND _add_if("Kerberos" NOT CURL_DISABLE_CRYPTO_AUTH AND
(HAVE_GSSAPI OR USE_WINDOWS_SSPI)) (HAVE_GSS_API OR USE_WINDOWS_SSPI))
# NTLM support requires crypto function adaptions from various SSL libs # NTLM support requires crypto function adaptions from various SSL libs
# TODO alternative SSL libs tests for SSP1, GNUTLS, NSS, DARWINSSL # TODO alternative SSL libs tests for SSP1, GNUTLS, NSS, DARWINSSL
if(NOT CURL_DISABLE_CRYPTO_AUTH AND (USE_OPENSSL OR if(NOT CURL_DISABLE_CRYPTO_AUTH AND (USE_OPENSSL OR
@ -1160,7 +1121,7 @@ set(VERSIONNUM "${CURL_VERSION_NUM}")
# Finally generate a "curl-config" matching this config # Finally generate a "curl-config" matching this config
configure_file("${CURL_SOURCE_DIR}/curl-config.in" configure_file("${CURL_SOURCE_DIR}/curl-config.in"
"${CURL_BINARY_DIR}/curl-config" @ONLY) "${CURL_BINARY_DIR}/curl-config" @ONLY)
install(FILES "${CURL_BINARY_DIR}/curl-config" install(FILES "${CMAKE_BINARY_DIR}/curl-config"
DESTINATION bin DESTINATION bin
PERMISSIONS PERMISSIONS
OWNER_READ OWNER_WRITE OWNER_EXECUTE OWNER_READ OWNER_WRITE OWNER_EXECUTE
@ -1170,7 +1131,7 @@ install(FILES "${CURL_BINARY_DIR}/curl-config"
# Finally generate a pkg-config file matching this config # Finally generate a pkg-config file matching this config
configure_file("${CURL_SOURCE_DIR}/libcurl.pc.in" configure_file("${CURL_SOURCE_DIR}/libcurl.pc.in"
"${CURL_BINARY_DIR}/libcurl.pc" @ONLY) "${CURL_BINARY_DIR}/libcurl.pc" @ONLY)
install(FILES "${CURL_BINARY_DIR}/libcurl.pc" install(FILES "${CMAKE_BINARY_DIR}/libcurl.pc"
DESTINATION lib/pkgconfig) DESTINATION lib/pkgconfig)
# This needs to be run very last so other parts of the scripts can take advantage of this. # This needs to be run very last so other parts of the scripts can take advantage of this.

View File

@ -1,7 +1,6 @@
COPYRIGHT AND PERMISSION NOTICE COPYRIGHT AND PERMISSION NOTICE
Copyright (c) 1996 - 2016, Daniel Stenberg, <daniel@haxx.se>, and many Copyright (c) 1996 - 2015, Daniel Stenberg, <daniel@haxx.se>.
contributors, see the THANKS file.
All rights reserved. All rights reserved.

View File

@ -65,7 +65,7 @@ else
ARCHES64='-arch x86_64' ARCHES64='-arch x86_64'
#We "know" that 10.4 and earlier do not support 64bit #We "know" that 10.4 and earlier do not support 64bit
OLD_SDK64=`ls $SDK_PATH|egrep -v "10.[0-4]"|head -1` OLD_SDK64=`ls $SDK_PATH|egrep -v "10.[0-4]"|head -1`
NEW_SDK64=`ls -r $SDK_PATH|egrep -v "10.[0-4][^0-9]" | head -1` NEW_SDK64=`ls -r $SDK_PATH|egrep -v "10.[0-4]"|head -1`
if test $USE_OLD -gt 0 if test $USE_OLD -gt 0
then then
SDK64=$OLD_SDK64 SDK64=$OLD_SDK64
@ -94,7 +94,7 @@ if test ! -z $SDK32; then
rm -r libcurl.framework rm -r libcurl.framework
mkdir -p libcurl.framework/${FRAMEWORK_VERSION}/Resources mkdir -p libcurl.framework/${FRAMEWORK_VERSION}/Resources
cp lib/.libs/libcurl.dylib libcurl.framework/${FRAMEWORK_VERSION}/libcurl cp lib/.libs/libcurl.dylib libcurl.framework/${FRAMEWORK_VERSION}/libcurl
install_name_tool -id @rpath/libcurl.framework/${FRAMEWORK_VERSION}/libcurl libcurl.framework/${FRAMEWORK_VERSION}/libcurl install_name_tool -id @executable_path/../Frameworks/libcurl.framework/${FRAMEWORK_VERSION}/libcurl libcurl.framework/${FRAMEWORK_VERSION}/libcurl
/usr/bin/sed -e "s/7\.12\.3/$VERSION/" lib/libcurl.plist >libcurl.framework/${FRAMEWORK_VERSION}/Resources/Info.plist /usr/bin/sed -e "s/7\.12\.3/$VERSION/" lib/libcurl.plist >libcurl.framework/${FRAMEWORK_VERSION}/Resources/Info.plist
mkdir -p libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl mkdir -p libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl
cp include/curl/*.h libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl cp include/curl/*.h libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl
@ -121,7 +121,7 @@ if test ! -z $SDK32; then
echo "----Appending 64 bit framework to 32 bit framework..." echo "----Appending 64 bit framework to 32 bit framework..."
cp lib/.libs/libcurl.dylib libcurl.framework/${FRAMEWORK_VERSION}/libcurl64 cp lib/.libs/libcurl.dylib libcurl.framework/${FRAMEWORK_VERSION}/libcurl64
install_name_tool -id @rpath/libcurl.framework/${FRAMEWORK_VERSION}/libcurl libcurl.framework/${FRAMEWORK_VERSION}/libcurl64 install_name_tool -id @executable_path/../Frameworks/libcurl.framework/${FRAMEWORK_VERSION}/libcurl libcurl.framework/${FRAMEWORK_VERSION}/libcurl64
cp libcurl.framework/${FRAMEWORK_VERSION}/libcurl libcurl.framework/${FRAMEWORK_VERSION}/libcurl32 cp libcurl.framework/${FRAMEWORK_VERSION}/libcurl libcurl.framework/${FRAMEWORK_VERSION}/libcurl32
pwd pwd
lipo libcurl.framework/${FRAMEWORK_VERSION}/libcurl32 libcurl.framework/${FRAMEWORK_VERSION}/libcurl64 -create -output libcurl.framework/${FRAMEWORK_VERSION}/libcurl lipo libcurl.framework/${FRAMEWORK_VERSION}/libcurl32 libcurl.framework/${FRAMEWORK_VERSION}/libcurl64 -create -output libcurl.framework/${FRAMEWORK_VERSION}/libcurl

View File

@ -5,11 +5,11 @@
# | (__| |_| | _ <| |___ # | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____| # \___|\___/|_| \_\_____|
# #
# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. # Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
# #
# This software is licensed as described in the file COPYING, which # This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms # you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html. # are also available at http://curl.haxx.se/docs/copyright.html.
# #
# You may opt to use, copy, modify, merge, publish, distribute and/or sell # 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 # copies of the Software, and permit persons to whom the Software is
@ -32,124 +32,103 @@ CMAKE_DIST = CMakeLists.txt CMake/CMakeConfigurableFile.in \
VC6_LIBTMPL = projects/Windows/VC6/lib/libcurl.tmpl VC6_LIBTMPL = projects/Windows/VC6/lib/libcurl.tmpl
VC6_LIBDSP = projects/Windows/VC6/lib/libcurl.dsp.dist VC6_LIBDSP = projects/Windows/VC6/lib/libcurl.dsp.dist
VC6_LIBDSP_DEPS = $(VC6_LIBTMPL) Makefile.am lib/Makefile.inc VC6_LIBDSP_DEPS = $(VC6_LIBTMPL) Makefile.am lib/Makefile.inc
VC6_SRCTMPL = projects/Windows/VC6/src/curl.tmpl VC6_SRCTMPL = projects/Windows/VC6/src/curlsrc.tmpl
VC6_SRCDSP = projects/Windows/VC6/src/curl.dsp.dist VC6_SRCDSP = projects/Windows/VC6/src/curlsrc.dsp.dist
VC6_SRCDSP_DEPS = $(VC6_SRCTMPL) Makefile.am src/Makefile.inc VC6_SRCDSP_DEPS = $(VC6_SRCTMPL) Makefile.am src/Makefile.inc
VC7_LIBTMPL = projects/Windows/VC7/lib/libcurl.tmpl VC7_LIBTMPL = projects/Windows/VC7/lib/libcurl.tmpl
VC7_LIBVCPROJ = projects/Windows/VC7/lib/libcurl.vcproj.dist VC7_LIBVCPROJ = projects/Windows/VC7/lib/libcurl.vcproj.dist
VC7_LIBVCPROJ_DEPS = $(VC7_LIBTMPL) Makefile.am lib/Makefile.inc VC7_LIBVCPROJ_DEPS = $(VC7_LIBTMPL) Makefile.am lib/Makefile.inc
VC7_SRCTMPL = projects/Windows/VC7/src/curl.tmpl VC7_SRCTMPL = projects/Windows/VC7/src/curlsrc.tmpl
VC7_SRCVCPROJ = projects/Windows/VC7/src/curl.vcproj.dist VC7_SRCVCPROJ = projects/Windows/VC7/src/curlsrc.vcproj.dist
VC7_SRCVCPROJ_DEPS = $(VC7_SRCTMPL) Makefile.am src/Makefile.inc VC7_SRCVCPROJ_DEPS = $(VC7_SRCTMPL) Makefile.am src/Makefile.inc
VC71_LIBTMPL = projects/Windows/VC7.1/lib/libcurl.tmpl VC71_LIBTMPL = projects/Windows/VC7.1/lib/libcurl.tmpl
VC71_LIBVCPROJ = projects/Windows/VC7.1/lib/libcurl.vcproj.dist VC71_LIBVCPROJ = projects/Windows/VC7.1/lib/libcurl.vcproj.dist
VC71_LIBVCPROJ_DEPS = $(VC71_LIBTMPL) Makefile.am lib/Makefile.inc VC71_LIBVCPROJ_DEPS = $(VC71_LIBTMPL) Makefile.am lib/Makefile.inc
VC71_SRCTMPL = projects/Windows/VC7.1/src/curl.tmpl VC71_SRCTMPL = projects/Windows/VC7.1/src/curlsrc.tmpl
VC71_SRCVCPROJ = projects/Windows/VC7.1/src/curl.vcproj.dist VC71_SRCVCPROJ = projects/Windows/VC7.1/src/curlsrc.vcproj.dist
VC71_SRCVCPROJ_DEPS = $(VC71_SRCTMPL) Makefile.am src/Makefile.inc VC71_SRCVCPROJ_DEPS = $(VC71_SRCTMPL) Makefile.am src/Makefile.inc
VC8_LIBTMPL = projects/Windows/VC8/lib/libcurl.tmpl VC8_LIBTMPL = projects/Windows/VC8/lib/libcurl.tmpl
VC8_LIBVCPROJ = projects/Windows/VC8/lib/libcurl.vcproj.dist VC8_LIBVCPROJ = projects/Windows/VC8/lib/libcurl.vcproj.dist
VC8_LIBVCPROJ_DEPS = $(VC8_LIBTMPL) Makefile.am lib/Makefile.inc VC8_LIBVCPROJ_DEPS = $(VC8_LIBTMPL) Makefile.am lib/Makefile.inc
VC8_SRCTMPL = projects/Windows/VC8/src/curl.tmpl VC8_SRCTMPL = projects/Windows/VC8/src/curlsrc.tmpl
VC8_SRCVCPROJ = projects/Windows/VC8/src/curl.vcproj.dist VC8_SRCVCPROJ = projects/Windows/VC8/src/curlsrc.vcproj.dist
VC8_SRCVCPROJ_DEPS = $(VC8_SRCTMPL) Makefile.am src/Makefile.inc VC8_SRCVCPROJ_DEPS = $(VC8_SRCTMPL) Makefile.am src/Makefile.inc
VC9_LIBTMPL = projects/Windows/VC9/lib/libcurl.tmpl VC9_LIBTMPL = projects/Windows/VC9/lib/libcurl.tmpl
VC9_LIBVCPROJ = projects/Windows/VC9/lib/libcurl.vcproj.dist VC9_LIBVCPROJ = projects/Windows/VC9/lib/libcurl.vcproj.dist
VC9_LIBVCPROJ_DEPS = $(VC9_LIBTMPL) Makefile.am lib/Makefile.inc VC9_LIBVCPROJ_DEPS = $(VC9_LIBTMPL) Makefile.am lib/Makefile.inc
VC9_SRCTMPL = projects/Windows/VC9/src/curl.tmpl VC9_SRCTMPL = projects/Windows/VC9/src/curlsrc.tmpl
VC9_SRCVCPROJ = projects/Windows/VC9/src/curl.vcproj.dist VC9_SRCVCPROJ = projects/Windows/VC9/src/curlsrc.vcproj.dist
VC9_SRCVCPROJ_DEPS = $(VC9_SRCTMPL) Makefile.am src/Makefile.inc VC9_SRCVCPROJ_DEPS = $(VC9_SRCTMPL) Makefile.am src/Makefile.inc
VC10_LIBTMPL = projects/Windows/VC10/lib/libcurl.tmpl VC10_LIBTMPL = projects/Windows/VC10/lib/libcurl.tmpl
VC10_LIBVCXPROJ = projects/Windows/VC10/lib/libcurl.vcxproj.dist VC10_LIBVCXPROJ = projects/Windows/VC10/lib/libcurl.vcxproj.dist
VC10_LIBVCXPROJ_DEPS = $(VC10_LIBTMPL) Makefile.am lib/Makefile.inc VC10_LIBVCXPROJ_DEPS = $(VC10_LIBTMPL) Makefile.am lib/Makefile.inc
VC10_SRCTMPL = projects/Windows/VC10/src/curl.tmpl VC10_SRCTMPL = projects/Windows/VC10/src/curlsrc.tmpl
VC10_SRCVCXPROJ = projects/Windows/VC10/src/curl.vcxproj.dist VC10_SRCVCXPROJ = projects/Windows/VC10/src/curlsrc.vcxproj.dist
VC10_SRCVCXPROJ_DEPS = $(VC10_SRCTMPL) Makefile.am src/Makefile.inc VC10_SRCVCXPROJ_DEPS = $(VC10_SRCTMPL) Makefile.am src/Makefile.inc
VC11_LIBTMPL = projects/Windows/VC11/lib/libcurl.tmpl VC11_LIBTMPL = projects/Windows/VC11/lib/libcurl.tmpl
VC11_LIBVCXPROJ = projects/Windows/VC11/lib/libcurl.vcxproj.dist VC11_LIBVCXPROJ = projects/Windows/VC11/lib/libcurl.vcxproj.dist
VC11_LIBVCXPROJ_DEPS = $(VC11_LIBTMPL) Makefile.am lib/Makefile.inc VC11_LIBVCXPROJ_DEPS = $(VC11_LIBTMPL) Makefile.am lib/Makefile.inc
VC11_SRCTMPL = projects/Windows/VC11/src/curl.tmpl VC11_SRCTMPL = projects/Windows/VC11/src/curlsrc.tmpl
VC11_SRCVCXPROJ = projects/Windows/VC11/src/curl.vcxproj.dist VC11_SRCVCXPROJ = projects/Windows/VC11/src/curlsrc.vcxproj.dist
VC11_SRCVCXPROJ_DEPS = $(VC11_SRCTMPL) Makefile.am src/Makefile.inc VC11_SRCVCXPROJ_DEPS = $(VC11_SRCTMPL) Makefile.am src/Makefile.inc
VC12_LIBTMPL = projects/Windows/VC12/lib/libcurl.tmpl VC12_LIBTMPL = projects/Windows/VC12/lib/libcurl.tmpl
VC12_LIBVCXPROJ = projects/Windows/VC12/lib/libcurl.vcxproj.dist VC12_LIBVCXPROJ = projects/Windows/VC12/lib/libcurl.vcxproj.dist
VC12_LIBVCXPROJ_DEPS = $(VC12_LIBTMPL) Makefile.am lib/Makefile.inc VC12_LIBVCXPROJ_DEPS = $(VC12_LIBTMPL) Makefile.am lib/Makefile.inc
VC12_SRCTMPL = projects/Windows/VC12/src/curl.tmpl VC12_SRCTMPL = projects/Windows/VC12/src/curlsrc.tmpl
VC12_SRCVCXPROJ = projects/Windows/VC12/src/curl.vcxproj.dist VC12_SRCVCXPROJ = projects/Windows/VC12/src/curlsrc.vcxproj.dist
VC12_SRCVCXPROJ_DEPS = $(VC12_SRCTMPL) Makefile.am src/Makefile.inc VC12_SRCVCXPROJ_DEPS = $(VC12_SRCTMPL) Makefile.am src/Makefile.inc
VC14_LIBTMPL = projects/Windows/VC14/lib/libcurl.tmpl VC_DIST = projects/README \
VC14_LIBVCXPROJ = projects/Windows/VC14/lib/libcurl.vcxproj.dist projects/build-openssl.bat \
VC14_LIBVCXPROJ_DEPS = $(VC14_LIBTMPL) Makefile.am lib/Makefile.inc projects/checksrc.bat \
VC14_SRCTMPL = projects/Windows/VC14/src/curl.tmpl projects/Windows/VC6/curl-all.dsw \
VC14_SRCVCXPROJ = projects/Windows/VC14/src/curl.vcxproj.dist projects/Windows/VC6/lib/libcurl.dsw \
VC14_SRCVCXPROJ_DEPS = $(VC14_SRCTMPL) Makefile.am src/Makefile.inc projects/Windows/VC6/src/curlsrc.dsw \
projects/Windows/VC7/curl-all.sln \
VC_DIST = projects/README \ projects/Windows/VC7/lib/libcurl.sln \
projects/build-openssl.bat \ projects/Windows/VC7/src/curlsrc.sln \
projects/build-wolfssl.bat \ projects/Windows/VC7.1/curl-all.sln \
projects/checksrc.bat \ projects/Windows/VC7.1/lib/libcurl.sln \
projects/Windows/VC6/curl-all.dsw \ projects/Windows/VC7.1/src/curlsrc.sln \
projects/Windows/VC6/lib/libcurl.dsw \ projects/Windows/VC8/curl-all.sln \
projects/Windows/VC6/src/curl.dsw \ projects/Windows/VC8/lib/libcurl.sln \
projects/Windows/VC7/curl-all.sln \ projects/Windows/VC8/src/curlsrc.sln \
projects/Windows/VC7/lib/libcurl.sln \ projects/Windows/VC9/curl-all.sln \
projects/Windows/VC7/src/curl.sln \ projects/Windows/VC9/lib/libcurl.sln \
projects/Windows/VC7.1/curl-all.sln \ projects/Windows/VC9/src/curlsrc.sln \
projects/Windows/VC7.1/lib/libcurl.sln \ projects/Windows/VC10/curl-all.sln \
projects/Windows/VC7.1/src/curl.sln \ projects/Windows/VC10/lib/libcurl.sln \
projects/Windows/VC8/curl-all.sln \ projects/Windows/VC10/src/curlsrc.sln \
projects/Windows/VC8/lib/libcurl.sln \ projects/Windows/VC11/curl-all.sln \
projects/Windows/VC8/src/curl.sln \ projects/Windows/VC11/lib/libcurl.sln \
projects/Windows/VC9/curl-all.sln \ projects/Windows/VC11/src/curlsrc.sln \
projects/Windows/VC9/lib/libcurl.sln \ projects/Windows/VC12/curl-all.sln \
projects/Windows/VC9/src/curl.sln \ projects/Windows/VC12/lib/libcurl.sln \
projects/Windows/VC10/curl-all.sln \ projects/Windows/VC12/src/curlsrc.sln
projects/Windows/VC10/lib/libcurl.sln \
projects/Windows/VC10/lib/libcurl.vcxproj.filters \
projects/Windows/VC10/src/curl.sln \
projects/Windows/VC10/src/curl.vcxproj.filters \
projects/Windows/VC11/curl-all.sln \
projects/Windows/VC11/lib/libcurl.sln \
projects/Windows/VC11/lib/libcurl.vcxproj.filters \
projects/Windows/VC11/src/curl.sln \
projects/Windows/VC11/src/curl.vcxproj.filters \
projects/Windows/VC12/curl-all.sln \
projects/Windows/VC12/lib/libcurl.sln \
projects/Windows/VC12/lib/libcurl.vcxproj.filters \
projects/Windows/VC12/src/curl.sln \
projects/Windows/VC12/src/curl.vcxproj.filters \
projects/Windows/VC14/curl-all.sln \
projects/Windows/VC14/lib/libcurl.sln \
projects/Windows/VC14/lib/libcurl.vcxproj.filters \
projects/Windows/VC14/src/curl.sln \
projects/Windows/VC14/src/curl.vcxproj.filters
WINBUILD_DIST = winbuild/BUILD.WINDOWS.txt winbuild/gen_resp_file.bat \ WINBUILD_DIST = winbuild/BUILD.WINDOWS.txt winbuild/gen_resp_file.bat \
winbuild/MakefileBuild.vc winbuild/Makefile.vc \ winbuild/MakefileBuild.vc winbuild/Makefile.vc \
winbuild/Makefile.msvc.names winbuild/Makefile.msvc.names
EXTRA_DIST = CHANGES COPYING maketgz Makefile.dist curl-config.in \ EXTRA_DIST = CHANGES COPYING maketgz Makefile.dist curl-config.in \
RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework scripts/zsh.pl \ RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework \
$(CMAKE_DIST) $(VC_DIST) $(WINBUILD_DIST) lib/libcurl.vers.in \ $(CMAKE_DIST) $(VC_DIST) $(WINBUILD_DIST) lib/libcurl.vers.in
buildconf.bat
CLEANFILES = $(VC6_LIBDSP) $(VC6_SRCDSP) $(VC7_LIBVCPROJ) $(VC7_SRCVCPROJ) \ CLEANFILES = $(VC6_LIBDSP) $(VC6_SRCDSP) $(VC7_LIBVCPROJ) $(VC7_SRCVCPROJ) \
$(VC71_LIBVCPROJ) $(VC71_SRCVCPROJ) $(VC8_LIBVCPROJ) $(VC8_SRCVCPROJ) \ $(VC71_LIBVCPROJ) $(VC71_SRCVCPROJ) $(VC8_LIBVCPROJ) $(VC8_SRCVCPROJ) \
$(VC9_LIBVCPROJ) $(VC9_SRCVCPROJ) $(VC10_LIBVCXPROJ) $(VC10_SRCVCXPROJ) \ $(VC9_LIBVCPROJ) $(VC9_SRCVCPROJ) $(VC10_LIBVCXPROJ) $(VC10_SRCVCXPROJ) \
$(VC11_LIBVCXPROJ) $(VC11_SRCVCXPROJ) $(VC12_LIBVCXPROJ) $(VC12_SRCVCXPROJ) \ $(VC11_LIBVCXPROJ) $(VC11_SRCVCXPROJ) $(VC12_LIBVCXPROJ) $(VC12_SRCVCXPROJ)
$(VC14_LIBVCXPROJ) $(VC14_SRCVCXPROJ)
bin_SCRIPTS = curl-config bin_SCRIPTS = curl-config
SUBDIRS = lib src include scripts SUBDIRS = lib src include
DIST_SUBDIRS = $(SUBDIRS) tests packages docs DIST_SUBDIRS = $(SUBDIRS) tests packages docs
pkgconfigdir = $(libdir)/pkgconfig pkgconfigdir = $(libdir)/pkgconfig
@ -169,12 +148,12 @@ dist-hook:
done) done)
html: html:
cd docs && make html cd docs; make html
pdf: pdf:
cd docs && make pdf cd docs; make pdf
check: test examples check-docs check: test examples
if CROSSCOMPILING if CROSSCOMPILING
test-full: test test-full: test
@ -202,9 +181,6 @@ endif
examples: examples:
@(cd docs/examples; $(MAKE) check) @(cd docs/examples; $(MAKE) check)
check-docs:
@(cd docs/libcurl; $(MAKE) check)
# This is a hook to have 'make clean' also clean up the docs and the tests # This is a hook to have 'make clean' also clean up the docs and the tests
# dir. The extra check for the Makefiles being present is necessary because # dir. The extra check for the Makefiles being present is necessary because
# 'make distcheck' will make clean first in these directories _before_ it runs # 'make distcheck' will make clean first in these directories _before_ it runs
@ -290,7 +266,7 @@ vc-ide: $(VC6_LIBDSP_DEPS) $(VC6_SRCDSP_DEPS) $(VC7_LIBVCPROJ_DEPS) \
$(VC8_LIBVCPROJ_DEPS) $(VC8_SRCVCPROJ_DEPS) $(VC9_LIBVCPROJ_DEPS) \ $(VC8_LIBVCPROJ_DEPS) $(VC8_SRCVCPROJ_DEPS) $(VC9_LIBVCPROJ_DEPS) \
$(VC9_SRCVCPROJ_DEPS) $(VC10_LIBVCXPROJ_DEPS) $(VC10_SRCVCXPROJ_DEPS) \ $(VC9_SRCVCPROJ_DEPS) $(VC10_LIBVCXPROJ_DEPS) $(VC10_SRCVCXPROJ_DEPS) \
$(VC11_LIBVCXPROJ_DEPS) $(VC11_SRCVCXPROJ_DEPS) $(VC12_LIBVCXPROJ_DEPS) \ $(VC11_LIBVCXPROJ_DEPS) $(VC11_SRCVCXPROJ_DEPS) $(VC12_LIBVCXPROJ_DEPS) \
$(VC12_SRCVCXPROJ_DEPS) $(VC14_LIBVCXPROJ_DEPS) $(VC14_SRCVCXPROJ_DEPS) $(VC12_SRCVCXPROJ_DEPS)
@(win32_lib_srcs='$(LIB_CFILES)'; \ @(win32_lib_srcs='$(LIB_CFILES)'; \
win32_lib_hdrs='$(LIB_HFILES) config-win32.h'; \ win32_lib_hdrs='$(LIB_HFILES) config-win32.h'; \
win32_lib_rc='$(LIB_RCFILES)'; \ win32_lib_rc='$(LIB_RCFILES)'; \
@ -551,22 +527,4 @@ function gen_element(type, dir, file)\
-v src_rc="$$win32_src_rc" \ -v src_rc="$$win32_src_rc" \
-v src_x_srcs="$$sorted_src_x_srcs" \ -v src_x_srcs="$$sorted_src_x_srcs" \
-v src_x_hdrs="$$sorted_src_x_hdrs" \ -v src_x_hdrs="$$sorted_src_x_hdrs" \
"$$awk_code" $(srcdir)/$(VC12_SRCTMPL) > $(VC12_SRCVCXPROJ) || { exit 1; }; \ "$$awk_code" $(srcdir)/$(VC12_SRCTMPL) > $(VC12_SRCVCXPROJ) || { exit 1; };)
\
echo "generating '$(VC14_LIBVCXPROJ)'"; \
awk -v proj_type=vcxproj \
-v lib_srcs="$$sorted_lib_srcs" \
-v lib_hdrs="$$sorted_lib_hdrs" \
-v lib_rc="$$win32_lib_rc" \
-v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
-v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
"$$awk_code" $(srcdir)/$(VC14_LIBTMPL) > $(VC14_LIBVCXPROJ) || { exit 1; }; \
\
echo "generating '$(VC14_SRCVCXPROJ)'"; \
awk -v proj_type=vcxproj \
-v src_srcs="$$sorted_src_srcs" \
-v src_hdrs="$$sorted_src_hdrs" \
-v src_rc="$$win32_src_rc" \
-v src_x_srcs="$$sorted_src_x_srcs" \
-v src_x_hdrs="$$sorted_src_x_hdrs" \
"$$awk_code" $(srcdir)/$(VC14_SRCTMPL) > $(VC14_SRCVCXPROJ) || { exit 1; };)

View File

@ -5,11 +5,11 @@
# | (__| |_| | _ <| |___ # | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____| # \___|\___/|_| \_\_____|
# #
# Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. # Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
# #
# This software is licensed as described in the file COPYING, which # This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms # you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html. # are also available at http://curl.haxx.se/docs/copyright.html.
# #
# You may opt to use, copy, modify, merge, publish, distribute and/or sell # 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 # copies of the Software, and permit persons to whom the Software is
@ -566,17 +566,6 @@ src/Makefile.vc12: src/Makefile.vc6
@echo "generate $@" @echo "generate $@"
@sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc12/g" -e "s/VC6/VC12/g" src/Makefile.vc6 > src/Makefile.vc12 @sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc12/g" -e "s/VC6/VC12/g" src/Makefile.vc6 > src/Makefile.vc12
# VC14 makefiles are for use with VS2015
vc14: lib/Makefile.vc14 src/Makefile.vc14
lib/Makefile.vc14: lib/Makefile.vc6
@echo "generate $@"
@sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc14/g" -e "s/VC6/VC14/g" lib/Makefile.vc6 > lib/Makefile.vc14
src/Makefile.vc14: src/Makefile.vc6
@echo "generate $@"
@sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc14/g" -e "s/VC6/VC14/g" src/Makefile.vc6 > src/Makefile.vc14
ca-bundle: lib/mk-ca-bundle.pl ca-bundle: lib/mk-ca-bundle.pl
@echo "generate a fresh ca-bundle.crt" @echo "generate a fresh ca-bundle.crt"
@perl $< -b -l -u lib/ca-bundle.crt @perl $< -b -l -u lib/ca-bundle.crt

8
README
View File

@ -24,7 +24,7 @@ README
CONTACT CONTACT
If you have problems, questions, ideas or suggestions, please contact us If you have problems, questions, ideas or suggestions, please contact us
by posting to a suitable mailing list. See https://curl.haxx.se/mail/ by posting to a suitable mailing list. See http://curl.haxx.se/mail/
All contributors to the project are listed in the THANKS document. All contributors to the project are listed in the THANKS document.
@ -32,18 +32,18 @@ WEB SITE
Visit the curl web site for the latest news and downloads: Visit the curl web site for the latest news and downloads:
https://curl.haxx.se/ http://curl.haxx.se/
GIT GIT
To download the very latest source off the GIT server do this: To download the very latest source off the GIT server do this:
git clone https://github.com/curl/curl.git git clone git://github.com/bagder/curl.git
(you'll get a directory named curl created, filled with the source code) (you'll get a directory named curl created, filled with the source code)
NOTICE NOTICE
Curl contains pieces of source code that is Copyright (c) 1998, 1999 Curl contains pieces of source code that is Copyright (c) 1998, 1999
Kungliga Tekniska Högskolan. This notice is included here to comply with the Kungliga Tekniska Högskolan. This notice is included here to comply with the
distribution terms. distribution terms.

View File

@ -1,45 +0,0 @@
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](https://curl.haxx.se/docs/manpage.html) or [the MANUAL
document](https://curl.haxx.se/docs/manual.html). Find out how to install Curl
by reading [the INSTALL document](https://curl.haxx.se/docs/install.html).
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](https://curl.haxx.se/libcurl/c/libcurl.html) to learn how!
You find answers to the most frequent questions we get in [the FAQ
document](https://curl.haxx.se/docs/faq.html).
Study [the COPYING file](https://curl.haxx.se/docs/copyright.html) for
distribution terms and similar. If you distribute curl binaries or other
binaries that involve libcurl, you might enjoy [the LICENSE-MIXING
document](https://curl.haxx.se/legal/licmix.html).
## CONTACT
If you have problems, questions, ideas or suggestions, please contact us by
posting to a suitable [mailing list](https://curl.haxx.se/mail/).
All contributors to the project are listed in [the THANKS
document](https://curl.haxx.se/docs/thanks.html).
## WEB SITE
Visit the [curl web site](https://curl.haxx.se/) for the latest news and
downloads.
## 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)
## 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.

View File

@ -1,159 +1,123 @@
Curl and libcurl 7.48.0 Curl and libcurl 7.41.0
Public curl releases: 153 Public curl releases: 144
Command line options: 179 Command line options: 163
curl_easy_setopt() options: 221 curl_easy_setopt() options: 209
Public functions in libcurl: 61 Public functions in libcurl: 58
Contributors: 1364 Contributors: 1233
This release includes the following changes: This release includes the following changes:
o configure: --with-ca-fallback: use built-in TLS CA fallback [2] o NetWare build: added TLS-SRP enabled build
o TFTP: add --tftp-no-options to expose CURLOPT_TFTP_NO_OPTIONS [22] o winbuild: Added option to build with c-ares
o getinfo: CURLINFO_TLS_SSL_PTR supersedes CURLINFO_TLS_SESSION [25] o Added --cert-status [9]
o added CODE_STYLE.md [47] o Added CURLOPT_SSL_VERIFYSTATUS [10]
o sasl: implement EXTERNAL authentication mechanism
This release includes the following bugfixes: This release includes the following bugfixes:
o Proxy-Connection: stop sending this header by default [1] o sasl_gssapi: Fixed build on NetBSD with built-in GSS-API [1]
o os400: sync ILE/RPG definitions with latest public header files o FTP: fix IPv6 host using link-local address [2]
o cookies: allow spaces in cookie names, cut of trailing spaces [3] o FTP: if EPSV fails on IPV6 connections, bail out
o tool_urlglob: Allow reserved dos device names (Windows) [4] o gssapi: Remove need for duplicated GSS_C_NT_HOSTBASED_SERVICE definitions
o openssl: remove most BoringSSL #ifdefs [5] o NSS: fix compiler error when built http2-enabled
o tool_doswin: Support for literal path prefix \\?\ o mingw build: allow to pass custom CFLAGS [3]
o mbedtls: fix ALPN usage segfault [6] o add -m64 CFLAGS when targeting mingw64, add -m32/-m64 to LDFLAGS [4]
o mbedtls: fix memory leak when destroying SSL connection data [7] o curl_schannel.c: mark session as removed from cache if not freed [5]
o nss: do not count enabled cipher-suites o Curl_pretransfer: reset expected transfer sizes [6]
o examples/cookie_interface.c: add cleanup call o curl.h: remove extra space [7]
o examples: adhere to curl code style o curl_endian: Fixed build when 64-bit integers are not supported [8]
o curlx_tvdiff: handle 32bit time_t overflows [8] o checksrc.bat: Better detection of Perl installation
o dist: ship buildconf.bat too o build-openssl.bat: Added check for Perl installation
o curl.1: --disable-{eprt,epsv} are ignored for IPv6 hosts [9] o http_negotiate: Return CURLcode in Curl_input_negotiate() instead of int
o generate.bat: Fix comment bug by removing old comments [10] o http_negotiate: Added empty decoded challenge message info text
o test1604: Add to Makefile.inc so it gets run o vtls: Removed unimplemented overrides of curlssl_close_all()
o gtls: fix for builds lacking encrypted key file support [11] o sasl_gssapi: Fixed memory leak with local SPN variable
o SCP: use libssh2_scp_recv2 to support > 2GB files on windows [12] o http_negotiate: Use dynamic buffer for SPN generation
o CURLOPT_CONNECTTIMEOUT_MS.3: Fix example to use milliseconds option [13] o ldap: Renamed the CURL_LDAP_WIN definition to USE_WIN32_LDAP
o cookie: do not refuse cookies to localhost [14] o openssl: do public key pinning check independently [11]
o openssl: avoid direct PKEY access with OpenSSL 1.1.0 [15] o timeval: typecast for better type (on Amiga)
o http: Don't break the header into chunks if HTTP/2 [16] o ipv6: enclose AF_INET6 uses with proper #ifdefs for ipv6
o http2: don't decompress gzip decoding automatically [17] o SASL: common URL option and auth capabilities decoders for all protocols
o curlx.c: i2s_ASN1_IA5STRING() clashes with an openssl function o BoringSSL: fix build
o curl.1: add a missing dash o BoringSSL: detected by configure, switches off NTLM
o curl.1: HTTP headers for --cookie must be Set-Cookie style [18] o openvms: Handle openssl/0.8.9zb version parsing
o CURLOPT_COOKIEFILE.3: HTTP headers must be Set-Cookie style [18] o configure: detect libresssl
o curl_sasl: Fix memory leak in digest parser [19] o configure: remove detection of the old yassl emulation API
o src/Makefile.m32: add CURL_{LD,C}FLAGS_EXTRAS support [20] o curl_setup: Disable SMB/CIFS support when HTTP only
o CURLOPT_DEBUGFUNCTION.3: Fix example o imap: remove automatic password setting: it breaks external sasl authentication
o runtests: Fixed usage of %PWD on MinGW64 [21] o sasl: remove XOAUTH2 from default enabled authentication mechanism
o tests/sshserver.pl: use RSA instead of DSA for host auth [23] o runtests: identify BoringSSL and libressl
o multi_remove_handle: keep the timeout list until after disconnect [24] o security: avoid compiler warning
o Curl_read: check for activated HTTP/1 pipelining, not only requested o ldap: build with BoringSSL
o configure: warn on invalid ca bundle or path [26] o des: Added Curl_des_set_odd_parity()
o file: try reading from files with no size [27] o CURLOPT_SEEKFUNCTION.3: also when server closes a connection
o getinfo: Add support for mbedTLS TLS session info o CURLOPT_HTTP_VERSION.3: CURL_HTTP_VERSION_2_0 added in 7.33.0
o formpost: fix memory leaks in AddFormData error branches [28] o build: Removed unused Visual Studio bscmake settings
o makefile.m32: allow to pass .dll/.exe-specific LDFLAGS [29] o build: Enabled DEBUGBUILD in Visual Studio debug builds
o url: if Curl_done is premature then pipeline not in use [30] o build: Renamed top level Visual Studio solution files
o cookie: remove redundant check [31] o build: Removed Visual Studio SuppressStartupBanner directive for VC8+
o cookie: Don't expire session cookies in remove_expired [32] o libcurl-symbols: first basic shot for autogenerated docs
o makefile.m32: fix to allow -ssh2-winssl combination [33] o Makefile.am: fix 'make distcheck'
o checksrc.bat: Fixed cannot find perl if installed but not in path o getpass_r: read from stdin, not stdout! [12]
o build-openssl.bat: Fixed cannot find perl if installed but not in path o getpass: protect include with proper #ifdef
o mbedtls: fix user-specified SSL protocol version o opts: CURLOPT_CAINFO availability depends on SSL engine
o makefile.m32: add missing libs for static -winssl-ssh2 builds [34] o more cleanup of 'CURLcode result' return code
o test46: change cookie expiry date [35] o MD4: replace implementation
o pipeline: Sanity check pipeline pointer before accessing it [36] o MD5: replace implementation
o openssl: use the correct OpenSSL/BoringSSL/LibreSSL in messages o openssl: SSL_SESSION->ssl_version no longer exist [13]
o ftp_done: clear tunnel_state when secondary socket closes [37] o md5: use axTLS's own MD5 functions when available
o opt-docs: fix heading macros [38] o schannel: Removed curl_ prefix from source files
o imap/pop3/smtp: Fixed connections upgraded with TLS are not reused [39] o curl.1: add warning when using -H and redirects
o curl_multi_wait: never return -1 in 'numfds' [40] o curl.1: clarify that -X is used for all requests
o url.c: fix clang warning: no newline at end of file o gskit: Fix exclusive SSLv3 option
o krb5: improved type handling to avoid clang compiler warnings o polarssl: Fix exclusive SSL protocol version options [14]
o cookies: first n/v pair in Set-Cookie: is the cookie, then parameters [41] o http2: Fix bug that associated stream canceled on PUSH_PROMISE
o multi: avoid blocking during CURLM_STATE_WAITPROXYCONNECT [42] o ftp: accept all 2xx responses to the PORT command
o multi hash: ensure modulo performed on curl_socket_t [43] o configure: allow both --with-ca-bundle and --with-ca-path [15]
o curl: glob_range: no need to check unsigned variable for negative o cmake: install the dll file to the correct directory
o easy: add check to malloc() when running event-based o nss: fix NPN/ALPN protocol negotiation
o CURLOPT_SSLENGINE.3: Only for OpenSSL built with engine support [44] o polarssl: fix ALPN protocol negotiation
o version: thread safety o cmake: Fix generation of tool_hugehelp.c on windows
o openssl: verbose: show matching SAN pattern o cmake: fix winsock2 detection on windows
o openssl: adapt to OpenSSL 1.1.0 API breakage in ERR_remove_thread_state() o gnutls: fix build with HTTP2
o formdata.c: Fixed compilation warning o connect: fix a spurious connect failure on dual-stacked hosts [16]
o configure: use cpp -P when needed [45] o test: test 530 is now less timing dependent
o imap.c: Fixed compilation warning with /Wall enabled o telnet: invalid use of custom read function if not set
o config-w32.h: Fixed compilation warning when /Wall enabled
o ftp/imap/pop3/smtp: Fixed compilation warning when /Wall enabled
o build: Added missing Visual Studio filter files for VC10 onwards
o easy: Remove poll failure check in easy_transfer
o mbedtls: fix compiler warning
o build-wolfssl: Update VS properties for wolfSSL v3.9.0
o Fixed various compilation warnings when verbose strings disabled
This release includes the following known bugs: This release includes the following known bugs:
o see docs/KNOWN_BUGS (https://curl.haxx.se/docs/knownbugs.html) o see docs/KNOWN_BUGS (http://curl.haxx.se/docs/knownbugs.html)
This release would not have looked like this without help, code, reports and This release would not have looked like this without help, code, reports and
advice from friends like these: advice from friends like these:
Anders Bakken, Brad Fitzpatrick, Clint Clayton, Dan Fandrich, Alessandro Ghedini, Alexander Peslyak, Ben Boeckel, Brad King, Brad Spencer,
Daniel Stenberg, David Benjamin, David Byron, Emil Lerner, Eric S. Raymond, Chris Young, Dan Fandrich, Daniel Stenberg, Gisle Vanem, Guenter Knauf,
Gisle Vanem, Jaime Fullaondo, Jeffrey Walton, Jesse Tan, Justin Ehlert, Jean-Francois Durand, Joe Mason, John E. Malmberg, Jon Seymour, Julian Ospald,
Kamil Dudka, Kazuho Oku, Ludwig Nussel, Maksim Kuzevanov, Michael König, Kamil Dudka, Kyle J. McKay, Leith Bade, Marc Hoersken, Michael Kaufmann,
Oliver Graute, Patrick Monnerat, Rafael Antonio, Ray Satiro, Seth Mos, Michael Wallner, Mohammad AlSaleh, Nick Zitzmann, Patrick Monnerat,
Shine Fan, Steve Holme, Tatsuhiro Tsujikawa, Timotej Lazar, Tim Rühsen, Ray Satiro, Rich Burridge, Sam Schanken, Sergei Nikulov, Steve Holme,
Viktor Szakáts, Tatsuhiro Tsujikawa, Thomas Klausner, Viktor Szakats, Vojtěch Král,
(30 contributors) Yun SangHo
Thanks! (and sorry if I forgot to mention someone) Thanks! (and sorry if I forgot to mention someone)
References to bug reports and discussions on issues: References to bug reports and discussions on issues:
[1] = https://curl.haxx.se/bug/?i=633 [1] = http://curl.haxx.se/bug/view.cgi?id=1469
[2] = https://curl.haxx.se/bug/?i=569 [2] = http://curl.haxx.se/bug/view.cgi?id=1468
[3] = https://curl.haxx.se/bug/?i=639 [3] = https://github.com/bagder/curl/pull/136
[4] = https://github.com/curl/curl/commit/4520534#commitcomment-15954863 [4] = https://github.com/bagder/curl/pull/134
[5] = https://curl.haxx.se/bug/?i=640 [5] = http://curl.haxx.se/mail/lib-2015-01/0036.html
[6] = https://curl.haxx.se/bug/?i=642 [6] = http://curl.haxx.se/mail/lib-2015-01/0065.html
[7] = https://curl.haxx.se/bug/?i=626 [7] = https://github.com/bagder/curl/pull/137
[8] = https://curl.haxx.se/bug/?i=646 [8] = http://curl.haxx.se/mail/lib-2015-01/0094.html
[9] = https://bugzilla.redhat.com/1305970 [9] = http://curl.haxx.se/docs/manpage.html#--cert-status
[10] = https://curl.haxx.se/bug/?i=649 [10] = http://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYSTATUS.html
[11] = https://curl.haxx.se/bug/?i=651 [11] = http://curl.haxx.se/bug/view.cgi?id=1471
[12] = https://curl.haxx.se/bug/?i=451 [12] = http://curl.haxx.se/bug/view.cgi?id=1476
[13] = https://curl.haxx.se/bug/?i=653 [13] = http://curl.haxx.se/mail/lib-2015-02/0034.html
[14] = https://curl.haxx.se/bug/?i=658 [14] = http://curl.haxx.se/mail/lib-2015-01/0002.html
[15] = https://curl.haxx.se/bug/?i=650 [15] = https://github.com/bagder/curl/pull/139
[16] = https://curl.haxx.se/bug/?i=659 [16] = https://bugzilla.redhat.com/1187531
[17] = https://curl.haxx.se/bug/?i=661
[18] = https://curl.haxx.se/bug/?i=666
[19] = https://curl.haxx.se/bug/?i=667
[20] = https://curl.haxx.se/bug/?i=670
[21] = https://curl.haxx.se/bug/?i=672
[22] = https://curl.haxx.se/bug/?i=481
[23] = https://curl.haxx.se/bug/?i=676
[24] = https://curl.haxx.se/mail/lib-2016-02/0097.html
[25] = https://curl.haxx.se/libcurl/c/CURLINFO_TLS_SSL_PTR.html
[26] = https://curl.haxx.se/bug/?i=404
[27] = https://curl.haxx.se/bug/?i=681
[28] = https://curl.haxx.se/bug/?i=688
[29] = https://curl.haxx.se/bug/?i=689
[30] = https://curl.haxx.se/bug/?i=690
[31] = https://curl.haxx.se/bug/?i=695
[32] = https://curl.haxx.se/bug/?i=697
[33] = https://curl.haxx.se/bug/?i=692
[34] = https://curl.haxx.se/bug/?i=693
[35] = https://curl.haxx.se/bug/?i=697
[36] = https://curl.haxx.se/bug/?i=704
[37] = https://curl.haxx.se/bug/?i=701
[38] = https://curl.haxx.se/bug/?i=705
[39] = https://curl.haxx.se/bug/?i=422
[40] = https://curl.haxx.se/bug/?i=707
[41] = https://curl.haxx.se/bug/?i=709
[42] = https://curl.haxx.se/bug/?i=703
[43] = https://curl.haxx.se/bug/?i=712
[44] = https://curl.haxx.se/mail/lib-2016-03/0150.html
[45] = https://curl.haxx.se/bug/?i=719
[47] = https://curl.haxx.se/dev/code-style.html

View File

@ -5,11 +5,11 @@
# | (__| |_| | _ <| |___ # | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____| # \___|\___/|_| \_\_____|
# #
# Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. # Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
# #
# This software is licensed as described in the file COPYING, which # This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms # you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html. # are also available at http://curl.haxx.se/docs/copyright.html.
# #
# You may opt to use, copy, modify, merge, publish, distribute and/or sell # 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 # copies of the Software, and permit persons to whom the Software is
@ -20,6 +20,7 @@
# #
#*************************************************************************** #***************************************************************************
dnl CURL_CHECK_DEF (SYMBOL, [INCLUDES], [SILENT]) dnl CURL_CHECK_DEF (SYMBOL, [INCLUDES], [SILENT])
dnl ------------------------------------------------- dnl -------------------------------------------------
dnl Use the C preprocessor to find out if the given object-style symbol dnl Use the C preprocessor to find out if the given object-style symbol
@ -30,10 +31,6 @@ dnl result in a set of double-quoted strings the returned expansion will
dnl actually be a single double-quoted string concatenating all them. dnl actually be a single double-quoted string concatenating all them.
AC_DEFUN([CURL_CHECK_DEF], [ AC_DEFUN([CURL_CHECK_DEF], [
AC_REQUIRE([CURL_CPP_P])dnl
OLDCPPFLAGS=$CPPFLAGS
# CPPPFLAGS comes from CURL_CPP_P
CPPFLAGS="$CPPPFLAGS"
AS_VAR_PUSHDEF([ac_HaveDef], [curl_cv_have_def_$1])dnl AS_VAR_PUSHDEF([ac_HaveDef], [curl_cv_have_def_$1])dnl
AS_VAR_PUSHDEF([ac_Def], [curl_cv_def_$1])dnl AS_VAR_PUSHDEF([ac_Def], [curl_cv_def_$1])dnl
if test -z "$SED"; then if test -z "$SED"; then
@ -70,7 +67,6 @@ CURL_DEF_TOKEN $1
fi fi
AS_VAR_POPDEF([ac_Def])dnl AS_VAR_POPDEF([ac_Def])dnl
AS_VAR_POPDEF([ac_HaveDef])dnl AS_VAR_POPDEF([ac_HaveDef])dnl
CPPFLAGS=$OLDCPPFLAGS
]) ])
@ -1855,10 +1851,8 @@ AC_DEFUN([CURL_CHECK_FUNC_CLOCK_GETTIME_MONOTONIC], [
AC_REQUIRE([AC_HEADER_TIME])dnl AC_REQUIRE([AC_HEADER_TIME])dnl
AC_CHECK_HEADERS(sys/types.h sys/time.h time.h) AC_CHECK_HEADERS(sys/types.h sys/time.h time.h)
AC_MSG_CHECKING([for monotonic clock_gettime]) AC_MSG_CHECKING([for monotonic clock_gettime])
# AC_COMPILE_IFELSE([
if test "x$dontwant_rt" == "xno" ; then AC_LANG_PROGRAM([[
AC_COMPILE_IFELSE([
AC_LANG_PROGRAM([[
#ifdef HAVE_SYS_TYPES_H #ifdef HAVE_SYS_TYPES_H
#include <sys/types.h> #include <sys/types.h>
#endif #endif
@ -1872,18 +1866,17 @@ AC_DEFUN([CURL_CHECK_FUNC_CLOCK_GETTIME_MONOTONIC], [
#include <time.h> #include <time.h>
#endif #endif
#endif #endif
]],[[ ]],[[
struct timespec ts; struct timespec ts;
(void)clock_gettime(CLOCK_MONOTONIC, &ts); (void)clock_gettime(CLOCK_MONOTONIC, &ts);
]]) ]])
],[ ],[
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])
ac_cv_func_clock_gettime="yes" ac_cv_func_clock_gettime="yes"
],[ ],[
AC_MSG_RESULT([no]) AC_MSG_RESULT([no])
ac_cv_func_clock_gettime="no" ac_cv_func_clock_gettime="no"
]) ])
fi
dnl Definition of HAVE_CLOCK_GETTIME_MONOTONIC is intentionally postponed dnl Definition of HAVE_CLOCK_GETTIME_MONOTONIC is intentionally postponed
dnl until library linking and run-time checks for clock_gettime succeed. dnl until library linking and run-time checks for clock_gettime succeed.
]) ])
@ -2459,6 +2452,23 @@ AC_DEFUN([CURL_CHECK_FUNC_SELECT], [
]) ])
# This is only a temporary fix. This macro is here to replace the broken one
# delivered by the automake project (including the 1.9.6 release). As soon as
# they ship a working version we SHOULD remove this work-around.
AC_DEFUN([AM_MISSING_HAS_RUN],
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
test x"${MISSING+set}" = xset || MISSING="\${SHELL} \"$am_aux_dir/missing\""
# Use eval to expand $SHELL
if eval "$MISSING --run true"; then
am_missing_run="$MISSING --run "
else
am_missing_run=
AC_MSG_WARN([`missing' script is too old or missing])
fi
])
dnl CURL_VERIFY_RUNTIMELIBS dnl CURL_VERIFY_RUNTIMELIBS
dnl ------------------------------------------------- dnl -------------------------------------------------
dnl Verify that the shared libs found so far can be used when running dnl Verify that the shared libs found so far can be used when running
@ -2574,8 +2584,7 @@ AC_DEFUN([CURL_CHECK_CA_BUNDLE], [
AC_MSG_CHECKING([default CA cert bundle/path]) AC_MSG_CHECKING([default CA cert bundle/path])
AC_ARG_WITH(ca-bundle, AC_ARG_WITH(ca-bundle,
AC_HELP_STRING([--with-ca-bundle=FILE], AC_HELP_STRING([--with-ca-bundle=FILE], [File name to use as CA bundle])
[Path to a file containing CA certificates (example: /etc/ca-bundle.crt)])
AC_HELP_STRING([--without-ca-bundle], [Don't use a default CA bundle]), AC_HELP_STRING([--without-ca-bundle], [Don't use a default CA bundle]),
[ [
want_ca="$withval" want_ca="$withval"
@ -2585,11 +2594,7 @@ AC_HELP_STRING([--without-ca-bundle], [Don't use a default CA bundle]),
], ],
[ want_ca="unset" ]) [ want_ca="unset" ])
AC_ARG_WITH(ca-path, AC_ARG_WITH(ca-path,
AC_HELP_STRING([--with-ca-path=DIRECTORY], AC_HELP_STRING([--with-ca-path=DIRECTORY], [Directory to use as CA path])
[Path to a directory containing CA certificates stored individually, with \
their filenames in a hash format. This option can be used with OpenSSL, \
GnuTLS and PolarSSL backends. Refer to OpenSSL c_rehash for details. \
(example: /etc/certificates)])
AC_HELP_STRING([--without-ca-path], [Don't use a default CA path]), AC_HELP_STRING([--without-ca-path], [Don't use a default CA path]),
[ [
want_capath="$withval" want_capath="$withval"
@ -2599,10 +2604,6 @@ AC_HELP_STRING([--without-ca-path], [Don't use a default CA path]),
], ],
[ want_capath="unset"]) [ want_capath="unset"])
ca_warning=" (warning: certs not found)"
capath_warning=" (warning: certs not found)"
check_capath=""
if test "x$want_ca" != "xno" -a "x$want_ca" != "xunset" -a \ if test "x$want_ca" != "xno" -a "x$want_ca" != "xunset" -a \
"x$want_capath" != "xno" -a "x$want_capath" != "xunset"; then "x$want_capath" != "xno" -a "x$want_capath" != "xunset"; then
dnl both given dnl both given
@ -2614,8 +2615,8 @@ AC_HELP_STRING([--without-ca-path], [Don't use a default CA path]),
capath="no" capath="no"
elif test "x$want_capath" != "xno" -a "x$want_capath" != "xunset"; then elif test "x$want_capath" != "xno" -a "x$want_capath" != "xunset"; then
dnl --with-ca-path given dnl --with-ca-path given
if test "x$OPENSSL_ENABLED" != "x1" -a "x$GNUTLS_ENABLED" != "x1" -a "x$POLARSSL_ENABLED" != "x1"; then if test "x$OPENSSL_ENABLED" != "x1" -a "x$POLARSSL_ENABLED" != "x1"; then
AC_MSG_ERROR([--with-ca-path only works with OpenSSL, GnuTLS or PolarSSL]) AC_MSG_ERROR([--with-ca-path only works with openSSL or PolarSSL])
fi fi
capath="$want_capath" capath="$want_capath"
ca="no" ca="no"
@ -2651,7 +2652,12 @@ AC_HELP_STRING([--without-ca-path], [Don't use a default CA path]),
fi fi
if test "x$want_capath" = "xunset" -a "x$ca" = "xno" -a \ if test "x$want_capath" = "xunset" -a "x$ca" = "xno" -a \
"x$OPENSSL_ENABLED" = "x1"; then "x$OPENSSL_ENABLED" = "x1"; then
check_capath="/etc/ssl/certs/" for a in /etc/ssl/certs/; do
if test -d "$a" && ls "$a"/[[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]].0 >/dev/null 2>/dev/null; then
capath="$a"
break
fi
done
fi fi
else else
dnl no option given and cross-compiling dnl no option given and cross-compiling
@ -2659,30 +2665,6 @@ AC_HELP_STRING([--without-ca-path], [Don't use a default CA path]),
fi fi
fi fi
if test "x$ca" = "xno" || test -f "$ca"; then
ca_warning=""
fi
if test "x$capath" != "xno"; then
check_capath="$capath"
fi
if test ! -z "$check_capath"; then
for a in "$check_capath"; do
if test -d "$a" && ls "$a"/[[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]].0 >/dev/null 2>/dev/null; then
if test "x$capath" = "xno"; then
capath="$a"
fi
capath_warning=""
break
fi
done
fi
if test "x$capath" = "xno"; then
capath_warning=""
fi
if test "x$ca" != "xno"; then if test "x$ca" != "xno"; then
CURL_CA_BUNDLE='"'$ca'"' CURL_CA_BUNDLE='"'$ca'"'
AC_DEFINE_UNQUOTED(CURL_CA_BUNDLE, "$ca", [Location of default ca bundle]) AC_DEFINE_UNQUOTED(CURL_CA_BUNDLE, "$ca", [Location of default ca bundle])
@ -2694,27 +2676,9 @@ AC_HELP_STRING([--without-ca-path], [Don't use a default CA path]),
AC_DEFINE_UNQUOTED(CURL_CA_PATH, "$capath", [Location of default ca path]) AC_DEFINE_UNQUOTED(CURL_CA_PATH, "$capath", [Location of default ca path])
AC_MSG_RESULT([$capath (capath)]) AC_MSG_RESULT([$capath (capath)])
fi fi
if test "x$ca" = "xno" && test "x$capath" = "xno"; then if test "x$ca" == "xno" && test "x$capath" == "xno"; then
AC_MSG_RESULT([no]) AC_MSG_RESULT([no])
fi fi
AC_MSG_CHECKING([whether to use builtin CA store of SSL library])
AC_ARG_WITH(ca-fallback,
AC_HELP_STRING([--with-ca-fallback], [Use the built in CA store of the SSL library])
AC_HELP_STRING([--without-ca-fallback], [Don't use the built in CA store of the SSL library]),
[
if test "x$with_ca_fallback" != "xyes" -a "x$with_ca_fallback" != "xno"; then
AC_MSG_ERROR([--with-ca-fallback only allows yes or no as parameter])
fi
],
[ with_ca_fallback="no"])
AC_MSG_RESULT([$with_ca_fallback])
if test "x$with_ca_fallback" = "xyes"; then
if test "x$OPENSSL_ENABLED" != "x1" -a "x$GNUTLS_ENABLED" != "x1"; then
AC_MSG_ERROR([--with-ca-fallback only works with OpenSSL or GnuTLS])
fi
AC_DEFINE_UNQUOTED(CURL_CA_FALLBACK, 1, [define "1" to use built in CA store of SSL library ])
fi
]) ])
@ -2887,6 +2851,7 @@ AC_DEFUN([CURL_CONFIGURE_CURL_OFF_T], [
# #
x_LP64_long="" x_LP64_long=""
x_LP32_long="" x_LP32_long=""
x_LP16_long=""
# #
if test "$ac_cv_sizeof_long" -eq "8" && if test "$ac_cv_sizeof_long" -eq "8" &&
test "$ac_cv_sizeof_voidp" -ge "8"; then test "$ac_cv_sizeof_voidp" -ge "8"; then
@ -2894,6 +2859,9 @@ AC_DEFUN([CURL_CONFIGURE_CURL_OFF_T], [
elif test "$ac_cv_sizeof_long" -eq "4" && elif test "$ac_cv_sizeof_long" -eq "4" &&
test "$ac_cv_sizeof_voidp" -ge "4"; then test "$ac_cv_sizeof_voidp" -ge "4"; then
x_LP32_long="long" x_LP32_long="long"
elif test "$ac_cv_sizeof_long" -eq "2" &&
test "$ac_cv_sizeof_voidp" -ge "2"; then
x_LP16_long="long"
fi fi
# #
dnl DO_CURL_OFF_T_CHECK results are stored in next 3 vars dnl DO_CURL_OFF_T_CHECK results are stored in next 3 vars
@ -2927,6 +2895,17 @@ AC_DEFUN([CURL_CONFIGURE_CURL_OFF_T], [
done done
AC_MSG_RESULT([$curl_typeof_curl_off_t]) AC_MSG_RESULT([$curl_typeof_curl_off_t])
fi fi
if test "$curl_typeof_curl_off_t" = "unknown"; then
AC_MSG_CHECKING([for 16-bit curl_off_t data type])
for t2 in \
"$x_LP16_long" \
'int16_t' \
'__int16' \
'int' ; do
DO_CURL_OFF_T_CHECK([$t2], [2])
done
AC_MSG_RESULT([$curl_typeof_curl_off_t])
fi
if test "$curl_typeof_curl_off_t" = "unknown"; then if test "$curl_typeof_curl_off_t" = "unknown"; then
AC_MSG_ERROR([cannot find data type for curl_off_t.]) AC_MSG_ERROR([cannot find data type for curl_off_t.])
fi fi
@ -3087,14 +3066,12 @@ dnl Optionally PKG_CONFIG_LIBDIR may be given as $pcdir.
dnl dnl
AC_DEFUN([CURL_CHECK_PKGCONFIG], [ AC_DEFUN([CURL_CHECK_PKGCONFIG], [
if test -n "$PKG_CONFIG"; then
PKGCONFIG="$PKG_CONFIG"
else
AC_PATH_TOOL([PKGCONFIG], [pkg-config], [no],
[$PATH:/usr/bin:/usr/local/bin])
fi
if test "x$PKGCONFIG" != "xno"; then PKGCONFIG="no"
AC_PATH_TOOL( PKGCONFIG, pkg-config, no, $PATH:/usr/bin:/usr/local/bin)
if test x$PKGCONFIG != xno; then
AC_MSG_CHECKING([for $1 options with pkg-config]) AC_MSG_CHECKING([for $1 options with pkg-config])
dnl ask pkg-config about $1 dnl ask pkg-config about $1
itexists=`CURL_EXPORT_PCDIR([$2]) dnl itexists=`CURL_EXPORT_PCDIR([$2]) dnl
@ -3151,48 +3128,3 @@ use vars qw(
1; 1;
_EOF _EOF
]) ])
dnl CURL_CPP_P
dnl
dnl Check if $cpp -P should be used for extract define values due to gcc 5
dnl splitting up strings and defines between line outputs. gcc by default
dnl (without -P) will show TEST EINVAL TEST as
dnl
dnl # 13 "conftest.c"
dnl TEST
dnl # 13 "conftest.c" 3 4
dnl 22
dnl # 13 "conftest.c"
dnl TEST
AC_DEFUN([CURL_CPP_P], [
AC_MSG_CHECKING([if cpp -P is needed])
AC_EGREP_CPP([TEST.*TEST], [
#include <errno.h>
TEST EINVAL TEST
], [cpp=no], [cpp=yes])
AC_MSG_RESULT([$cpp])
dnl we need cpp -P so check if it works then
if test "x$cpp" = "xyes"; then
AC_MSG_CHECKING([if cpp -P works])
OLDCPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS -P"
AC_EGREP_CPP([TEST.*TEST], [
#include <errno.h>
TEST EINVAL TEST
], [cpp_p=yes], [cpp_p=no])
AC_MSG_RESULT([$cpp_p])
if test "x$cpp_p" = "xno"; then
AC_MSG_WARN([failed to figure out cpp -P alternative])
# without -P
CPPPFLAGS=$OLDCPPFLAGS
else
# with -P
CPPPFLAGS=$CPPFLAGS
fi
dnl restore CPPFLAGS
CPPFLAGS=$OLDCPPFLAGS
fi
])

View File

@ -1,35 +0,0 @@
version: 7.47.0.{build}
environment:
matrix:
- PRJ_GEN: "Visual Studio 11 2012 Win64"
BDIR: msvc2012
PRJ_CFG: Release
OPENSSL: OFF
- PRJ_GEN: "Visual Studio 12 2013 Win64"
BDIR: msvc2013
PRJ_CFG: Release
OPENSSL: OFF
- PRJ_GEN: "Visual Studio 14 2015 Win64"
BDIR: msvc2015
PRJ_CFG: Release
OPENSSL: OFF
- PRJ_GEN: "Visual Studio 11 2012 Win64"
BDIR: msvc2012
PRJ_CFG: Release
OPENSSL: ON
- PRJ_GEN: "Visual Studio 12 2013 Win64"
BDIR: msvc2013
PRJ_CFG: Release
OPENSSL: ON
- PRJ_GEN: "Visual Studio 14 2015 Win64"
BDIR: msvc2015
PRJ_CFG: Release
OPENSSL: ON
build_script:
- mkdir build.%BDIR%
- cd build.%BDIR%
- cmake .. -G"%PRJ_GEN%" -DCMAKE_USE_OPENSSL=%OPENSSL%
- cmake --build . --config %PRJ_CFG% --clean-first

View File

@ -10,7 +10,7 @@
# #
# This software is licensed as described in the file COPYING, which # This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms # you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html. # are also available at http://curl.haxx.se/docs/copyright.html.
# #
# You may opt to use, copy, modify, merge, publish, distribute and/or sell # 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 # copies of the Software, and permit persons to whom the Software is
@ -318,8 +318,6 @@ for fname in .deps \
ltsugar.m4 \ ltsugar.m4 \
ltversion.m4 \ ltversion.m4 \
lt~obsolete.m4 \ lt~obsolete.m4 \
missing \
install-sh \
stamp-h1 \ stamp-h1 \
stamp-h2 \ stamp-h2 \
stamp-h3 ; do stamp-h3 ; do
@ -331,7 +329,7 @@ done
# #
echo "buildconf: running libtoolize" echo "buildconf: running libtoolize"
${libtoolize} --copy --force || die "libtoolize command failed" ${libtoolize} --copy --automake --force || die "libtoolize command failed"
# When using libtool 1.5.X (X < 26) we copy libtool.m4 to our local m4 # When using libtool 1.5.X (X < 26) we copy libtool.m4 to our local m4
# subdirectory and this local copy is patched to fix some warnings that # subdirectory and this local copy is patched to fix some warnings that

View File

@ -1,350 +1,38 @@
@echo off @echo off
rem *************************************************************************** REM
rem * _ _ ____ _ REM
rem * Project ___| | | | _ \| | REM This batch file must be used to set up a git tree to build on
rem * / __| | | | |_) | | REM systems where there is no autotools support (i.e. Microsoft).
rem * | (__| |_| | _ <| |___ REM
rem * \___|\___/|_| \_\_____| REM This file is not included nor needed for curl's release
rem * REM archives, neither for curl's daily snapshot archives.
rem * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
rem *
rem * This software is licensed as described in the file COPYING, which
rem * you should have received as part of this distribution. The terms
rem * are also available at https://curl.haxx.se/docs/copyright.html.
rem *
rem * You may opt to use, copy, modify, merge, publish, distribute and/or sell
rem * copies of the Software, and permit persons to whom the Software is
rem * furnished to do so, under the terms of the COPYING file.
rem *
rem * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
rem * KIND, either express or implied.
rem *
rem ***************************************************************************
rem NOTES if exist GIT-INFO goto start_doing
rem ECHO ERROR: This file shall only be used with a curl git tree checkout.
rem This batch file must be used to set up a git tree to build on systems where goto end_all
rem there is no autotools support (i.e. DOS and Windows). :start_doing
rem
:begin REM create tool_hugehelp.c
rem Set our variables if not exist src\tool_hugehelp.c.cvs goto end_hugehelp_c
if "%OS%" == "Windows_NT" setlocal copy /Y src\tool_hugehelp.c.cvs src\tool_hugehelp.c
set MODE=GENERATE :end_hugehelp_c
rem Switch to this batch file's directory REM create Makefile
cd /d "%~0\.." 1>NUL 2>&1 if not exist Makefile.dist goto end_makefile
copy /Y Makefile.dist Makefile
:end_makefile
rem Check we are running from a curl git repository REM create curlbuild.h
if not exist GIT-INFO goto norepo if not exist include\curl\curlbuild.h.dist goto end_curlbuild_h
copy /Y include\curl\curlbuild.h.dist include\curl\curlbuild.h
:end_curlbuild_h
rem Detect programs. HAVE_<PROGNAME> REM setup c-ares git tree
rem When not found the variable is set undefined. The undefined pattern if not exist ares\buildconf.bat goto end_c_ares
rem allows for statements like "if not defined HAVE_PERL (command)" cd ares
groff --version <NUL 1>NUL 2>&1 call buildconf.bat
if errorlevel 1 (set HAVE_GROFF=) else (set HAVE_GROFF=Y) cd ..
nroff --version <NUL 1>NUL 2>&1 :end_c_ares
if errorlevel 1 (set HAVE_NROFF=) else (set HAVE_NROFF=Y)
perl --version <NUL 1>NUL 2>&1
if errorlevel 1 (set HAVE_PERL=) else (set HAVE_PERL=Y)
gzip --version <NUL 1>NUL 2>&1
if errorlevel 1 (set HAVE_GZIP=) else (set HAVE_GZIP=Y)
:parseArgs :end_all
if "%~1" == "" goto start
if /i "%~1" == "-clean" (
set MODE=CLEAN
) else if /i "%~1" == "-?" (
goto syntax
) else if /i "%~1" == "-h" (
goto syntax
) else if /i "%~1" == "-help" (
goto syntax
) else (
goto unknown
)
shift & goto parseArgs
:start
if "%MODE%" == "GENERATE" (
echo.
echo Generating prerequisite files
call :generate
if errorlevel 4 goto nogencurlbuild
if errorlevel 3 goto nogenhugehelp
if errorlevel 2 goto nogenmakefile
if errorlevel 1 goto warning
) else (
echo.
echo Removing prerequisite files
call :clean
if errorlevel 3 goto nocleancurlbuild
if errorlevel 2 goto nocleanhugehelp
if errorlevel 1 goto nocleanmakefile
)
goto success
rem Main generate function.
rem
rem Returns:
rem
rem 0 - success
rem 1 - success with simplified tool_hugehelp.c
rem 2 - failed to generate Makefile
rem 3 - failed to generate tool_hugehelp.c
rem 4 - failed to generate curlbuild.h
rem
:generate
if "%OS%" == "Windows_NT" setlocal
set BASIC_HUGEHELP=0
rem Create Makefile
echo * %CD%\Makefile
if exist Makefile.dist (
copy /Y Makefile.dist Makefile 1>NUL 2>&1
if errorlevel 1 (
if "%OS%" == "Windows_NT" endlocal
exit /B 2
)
)
rem Create tool_hugehelp.c
echo * %CD%\src\tool_hugehelp.c
call :genHugeHelp
if errorlevel 2 (
if "%OS%" == "Windows_NT" endlocal
exit /B 3
)
if errorlevel 1 (
set BASIC_HUGEHELP=1
)
cmd /c exit 0
rem Create curlbuild.h
echo * %CD%\include\curl\curlbuild.h
if exist include\curl\curlbuild.h.dist (
copy /Y include\curl\curlbuild.h.dist include\curl\curlbuild.h 1>NUL 2>&1
if errorlevel 1 (
if "%OS%" == "Windows_NT" endlocal
exit /B 4
)
)
rem Setup c-ares git tree
if exist ares\buildconf.bat (
echo.
echo Configuring c-ares build environment
cd ares
call buildconf.bat
cd ..
)
if "%BASIC_HUGEHELP%" == "1" (
if "%OS%" == "Windows_NT" endlocal
exit /B 1
)
if "%OS%" == "Windows_NT" endlocal
exit /B 0
rem Main clean function.
rem
rem Returns:
rem
rem 0 - success
rem 1 - failed to clean Makefile
rem 2 - failed to clean tool_hugehelp.c
rem 3 - failed to clean curlbuild.h
rem
:clean
rem Remove Makefile
echo * %CD%\Makefile
if exist Makefile (
del Makefile 2>NUL
if exist Makefile (
exit /B 1
)
)
rem Remove tool_hugehelp.c
echo * %CD%\src\tool_hugehelp.c
if exist src\tool_hugehelp.c (
del src\tool_hugehelp.c 2>NUL
if exist src\tool_hugehelp.c (
exit /B 2
)
)
rem Remove curlbuild.h
echo * %CD%\include\curl\curlbuild.h
if exist include\curl\curlbuild.h (
del include\curl\curlbuild.h 2>NUL
if exist include\curl\curlbuild.h (
exit /B 3
)
)
exit /B
rem Function to generate src\tool_hugehelp.c
rem
rem Returns:
rem
rem 0 - full tool_hugehelp.c generated
rem 1 - simplified tool_hugehelp.c
rem 2 - failure
rem
:genHugeHelp
if "%OS%" == "Windows_NT" setlocal
set LC_ALL=C
set ROFFCMD=
set BASIC=1
if defined HAVE_PERL (
if defined HAVE_GROFF (
set ROFFCMD=groff -mtty-char -Tascii -P-c -man
) else if defined HAVE_NROFF (
set ROFFCMD=nroff -c -Tascii -man
)
)
if defined ROFFCMD (
echo #include "tool_setup.h"> src\tool_hugehelp.c
echo #include "tool_hugehelp.h">> src\tool_hugehelp.c
if defined HAVE_GZIP (
echo #ifndef HAVE_LIBZ>> src\tool_hugehelp.c
)
%ROFFCMD% docs\curl.1 2>NUL | perl src\mkhelp.pl docs\MANUAL >> src\tool_hugehelp.c
if defined HAVE_GZIP (
echo #else>> src\tool_hugehelp.c
%ROFFCMD% docs\curl.1 2>NUL | perl src\mkhelp.pl -c docs\MANUAL >> src\tool_hugehelp.c
echo #endif /^* HAVE_LIBZ ^*/>> src\tool_hugehelp.c
)
set BASIC=0
) else (
if exist src\tool_hugehelp.c.cvs (
copy /Y src\tool_hugehelp.c.cvs src\tool_hugehelp.c 1>NUL 2>&1
) else (
echo #include "tool_setup.h"> src\tool_hugehelp.c
echo #include "tool_hugehelp.hd">> src\tool_hugehelp.c
echo.>> src\tool_hugehelp.c
echo void hugehelp(void^)>> src\tool_hugehelp.c
echo {>> src\tool_hugehelp.c
echo #ifdef USE_MANUAL>> src\tool_hugehelp.c
echo fputs("Built-in manual not included\n", stdout^);>> src\tool_hugehelp.c
echo #endif>> src\tool_hugehelp.c
echo }>> src\tool_hugehelp.c
)
)
findstr "/C:void hugehelp(void)" src\tool_hugehelp.c 1>NUL 2>&1
if errorlevel 1 (
if "%OS%" == "Windows_NT" endlocal
exit /B 2
)
if "%BASIC%" == "1" (
if "%OS%" == "Windows_NT" endlocal
exit /B 1
)
if "%OS%" == "Windows_NT" endlocal
exit /B 0
rem Function to clean-up local variables under DOS, Windows 3.x and
rem Windows 9x as setlocal isn't available until Windows NT
rem
:dosCleanup
set MODE=
set HAVE_GROFF=
set HAVE_NROFF=
set HAVE_PERL=
set HAVE_GZIP=
set BASIC_HUGEHELP=
set LC_ALL
set ROFFCMD=
set BASIC=
exit /B
:syntax
rem Display the help
echo.
echo Usage: buildconf [-clean]
echo.
echo -clean - Removes the files
goto error
:unknown
echo.
echo Error: Unknown argument '%1'
goto error
:norepo
echo.
echo Error: This batch file should only be used with a curl git repository
goto error
:nogenmakefile
echo.
echo Error: Unable to generate Makefile
goto error
:nogenhugehelp
echo.
echo Error: Unable to generate src\tool_hugehelp.c
goto error
:nogencurlbuild
echo.
echo Error: Unable to generate include\curl\curlbuild.h
goto error
:nocleanmakefile
echo.
echo Error: Unable to clean Makefile
goto error
:nocleanhugehelp
echo.
echo Error: Unable to clean src\tool_hugehelp.c
goto error
:nocleancurlbuild
echo.
echo Error: Unable to clean include\curl\curlbuild.h
goto error
:warning
echo.
echo Warning: The curl manual could not be integrated in the source. This means when
echo you build curl the manual will not be available (curl --man^). Integration of
echo the manual is not required and a summary of the options will still be available
echo (curl --help^). To integrate the manual your PATH is required to have
echo groff/nroff, perl and optionally gzip for compression.
goto success
:error
if "%OS%" == "Windows_NT" (
endlocal
) else (
call :dosCleanup
)
exit /B 1
:success
if "%OS%" == "Windows_NT" (
endlocal
) else (
call :dosCleanup
)
exit /B 0

View File

@ -5,11 +5,11 @@
# | (__| |_| | _ <| |___ # | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____| # \___|\___/|_| \_\_____|
# #
# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. # Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
# #
# This software is licensed as described in the file COPYING, which # This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms # you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html. # are also available at http://curl.haxx.se/docs/copyright.html.
# #
# You may opt to use, copy, modify, merge, publish, distribute and/or sell # 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 # copies of the Software, and permit persons to whom the Software is
@ -24,14 +24,14 @@ dnl Process this file with autoconf to produce a configure script.
AC_PREREQ(2.57) AC_PREREQ(2.57)
dnl We don't know the version number "statically" so we use a dash here dnl We don't know the version number "statically" so we use a dash here
AC_INIT([curl], [-], [a suitable curl mailing list: https://curl.haxx.se/mail/]) AC_INIT([curl], [-], [a suitable curl mailing list: http://curl.haxx.se/mail/])
XC_OVR_ZZ50 XC_OVR_ZZ50
XC_OVR_ZZ60 XC_OVR_ZZ60
CURL_OVERRIDE_AUTOCONF CURL_OVERRIDE_AUTOCONF
dnl configure script copyright dnl configure script copyright
AC_COPYRIGHT([Copyright (c) 1998 - 2016 Daniel Stenberg, <daniel@haxx.se> AC_COPYRIGHT([Copyright (c) 1998 - 2014 Daniel Stenberg, <daniel@haxx.se>
This configure script may be copied, distributed and modified under the This configure script may be copied, distributed and modified under the
terms of the curl license; see COPYING for more details]) terms of the curl license; see COPYING for more details])
@ -39,7 +39,6 @@ AC_CONFIG_SRCDIR([lib/urldata.h])
AC_CONFIG_HEADERS(lib/curl_config.h include/curl/curlbuild.h) AC_CONFIG_HEADERS(lib/curl_config.h include/curl/curlbuild.h)
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
AM_MAINTAINER_MODE AM_MAINTAINER_MODE
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
CURL_CHECK_OPTION_DEBUG CURL_CHECK_OPTION_DEBUG
CURL_CHECK_OPTION_OPTIMIZE CURL_CHECK_OPTION_OPTIMIZE
@ -48,7 +47,6 @@ CURL_CHECK_OPTION_WERROR
CURL_CHECK_OPTION_CURLDEBUG CURL_CHECK_OPTION_CURLDEBUG
CURL_CHECK_OPTION_SYMBOL_HIDING CURL_CHECK_OPTION_SYMBOL_HIDING
CURL_CHECK_OPTION_ARES CURL_CHECK_OPTION_ARES
CURL_CHECK_OPTION_RT
XC_CHECK_PATH_SEPARATOR XC_CHECK_PATH_SEPARATOR
@ -149,7 +147,7 @@ AC_SUBST(PKGADD_VENDOR)
dnl dnl
dnl initialize all the info variables dnl initialize all the info variables
curl_ssl_msg="no (--with-{ssl,gnutls,nss,polarssl,mbedtls,cyassl,axtls,winssl,darwinssl} )" curl_ssl_msg="no (--with-{ssl,gnutls,nss,polarssl,cyassl,axtls,winssl,darwinssl} )"
curl_ssh_msg="no (--with-libssh2)" curl_ssh_msg="no (--with-libssh2)"
curl_zlib_msg="no (--with-zlib)" curl_zlib_msg="no (--with-zlib)"
curl_gss_msg="no (--with-gssapi)" curl_gss_msg="no (--with-gssapi)"
@ -167,7 +165,6 @@ curl_verbose_msg="enabled (--disable-verbose)"
curl_rtsp_msg="no (--enable-rtsp)" curl_rtsp_msg="no (--enable-rtsp)"
curl_rtmp_msg="no (--with-librtmp)" curl_rtmp_msg="no (--with-librtmp)"
curl_mtlnk_msg="no (--with-libmetalink)" curl_mtlnk_msg="no (--with-libmetalink)"
curl_psl_msg="no (--with-libpsl)"
init_ssl_msg=${curl_ssl_msg} init_ssl_msg=${curl_ssl_msg}
@ -1083,11 +1080,7 @@ AC_HELP_STRING([--disable-ipv6],[Disable IPv6 support]),
AC_TRY_RUN([ /* is AF_INET6 available? */ AC_TRY_RUN([ /* is AF_INET6 available? */
#include <sys/types.h> #include <sys/types.h>
#ifdef HAVE_WINSOCK2_H
#include <winsock2.h>
#else
#include <sys/socket.h> #include <sys/socket.h>
#endif
#include <stdlib.h> /* for exit() */ #include <stdlib.h> /* for exit() */
main() main()
{ {
@ -1101,8 +1094,8 @@ main()
ipv6=yes, ipv6=yes,
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
ipv6=no, ipv6=no,
AC_MSG_RESULT(yes) AC_MSG_RESULT(no)
ipv6=yes ipv6=no
)) ))
if test "$ipv6" = "yes"; then if test "$ipv6" = "yes"; then
@ -1114,12 +1107,7 @@ if test "$ipv6" = yes; then
AC_MSG_CHECKING([if struct sockaddr_in6 has sin6_scope_id member]) AC_MSG_CHECKING([if struct sockaddr_in6 has sin6_scope_id member])
AC_TRY_COMPILE([ AC_TRY_COMPILE([
#include <sys/types.h> #include <sys/types.h>
#ifdef HAVE_WINSOCK2_H #include <netinet/in.h>] ,
#include <winsock2.h>
#include <ws2tcpip.h>
#else
#include <netinet/in.h>
#endif] ,
struct sockaddr_in6 s; s.sin6_scope_id = 0; , have_sin6_scope_id=yes) struct sockaddr_in6 s; s.sin6_scope_id = 0; , have_sin6_scope_id=yes)
if test "$have_sin6_scope_id" = yes; then if test "$have_sin6_scope_id" = yes; then
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])
@ -1196,8 +1184,6 @@ AC_ARG_WITH(gssapi,
fi fi
]) ])
: ${KRB5CONFIG:="$GSSAPI_ROOT/bin/krb5-config"}
save_CPPFLAGS="$CPPFLAGS" save_CPPFLAGS="$CPPFLAGS"
AC_MSG_CHECKING([if GSS-API support is requested]) AC_MSG_CHECKING([if GSS-API support is requested])
if test x"$want_gss" = xyes; then if test x"$want_gss" = xyes; then
@ -1206,8 +1192,8 @@ if test x"$want_gss" = xyes; then
if test -z "$GSSAPI_INCS"; then if test -z "$GSSAPI_INCS"; then
if test -n "$host_alias" -a -f "$GSSAPI_ROOT/bin/$host_alias-krb5-config"; then if test -n "$host_alias" -a -f "$GSSAPI_ROOT/bin/$host_alias-krb5-config"; then
GSSAPI_INCS=`$GSSAPI_ROOT/bin/$host_alias-krb5-config --cflags gssapi` GSSAPI_INCS=`$GSSAPI_ROOT/bin/$host_alias-krb5-config --cflags gssapi`
elif test -f "$KRB5CONFIG"; then elif test -f "$GSSAPI_ROOT/bin/krb5-config"; then
GSSAPI_INCS=`$KRB5CONFIG --cflags gssapi` GSSAPI_INCS=`$GSSAPI_ROOT/bin/krb5-config --cflags gssapi`
elif test "$GSSAPI_ROOT" != "yes"; then elif test "$GSSAPI_ROOT" != "yes"; then
GSSAPI_INCS="-I$GSSAPI_ROOT/include" GSSAPI_INCS="-I$GSSAPI_ROOT/include"
fi fi
@ -1297,10 +1283,10 @@ if test x"$want_gss" = xyes; then
dnl into LIBS dnl into LIBS
gss_libs=`$GSSAPI_ROOT/bin/$host_alias-krb5-config --libs gssapi` gss_libs=`$GSSAPI_ROOT/bin/$host_alias-krb5-config --libs gssapi`
LIBS="$gss_libs $LIBS" LIBS="$gss_libs $LIBS"
elif test -f "$KRB5CONFIG"; then elif test -f "$GSSAPI_ROOT/bin/krb5-config"; then
dnl krb5-config doesn't have --libs-only-L or similar, put everything dnl krb5-config doesn't have --libs-only-L or similar, put everything
dnl into LIBS dnl into LIBS
gss_libs=`$KRB5CONFIG --libs gssapi` gss_libs=`$GSSAPI_ROOT/bin/krb5-config --libs gssapi`
LIBS="$gss_libs $LIBS" LIBS="$gss_libs $LIBS"
else else
case $host in case $host in
@ -1408,24 +1394,6 @@ if test "$curl_ssl_msg" = "$init_ssl_msg" && test X"$OPT_SSL" != Xno; then
CLEANCPPFLAGS="$CPPFLAGS" CLEANCPPFLAGS="$CPPFLAGS"
CLEANLIBS="$LIBS" CLEANLIBS="$LIBS"
dnl This is for Msys/Mingw
case $host in
*-*-msys* | *-*-mingw*)
AC_MSG_CHECKING([for gdi32])
my_ac_save_LIBS=$LIBS
LIBS="-lgdi32 $LIBS"
AC_TRY_LINK([#include <windef.h>
#include <wingdi.h>],
[GdiFlush();],
[ dnl worked!
AC_MSG_RESULT([yes])],
[ dnl failed, restore LIBS
LIBS=$my_ac_save_LIBS
AC_MSG_RESULT(no)]
)
;;
esac
case "$OPT_SSL" in case "$OPT_SSL" in
yes) yes)
dnl --with-ssl (without path) used dnl --with-ssl (without path) used
@ -1483,7 +1451,6 @@ if test "$curl_ssl_msg" = "$init_ssl_msg" && test X"$OPT_SSL" != Xno; then
SSL_CPPFLAGS=`CURL_EXPORT_PCDIR([$OPENSSL_PCDIR]) dnl SSL_CPPFLAGS=`CURL_EXPORT_PCDIR([$OPENSSL_PCDIR]) dnl
$PKGCONFIG --cflags-only-I openssl 2>/dev/null` $PKGCONFIG --cflags-only-I openssl 2>/dev/null`
AC_SUBST(SSL_LIBS)
AC_MSG_NOTICE([pkg-config: SSL_LIBS: "$SSL_LIBS"]) AC_MSG_NOTICE([pkg-config: SSL_LIBS: "$SSL_LIBS"])
AC_MSG_NOTICE([pkg-config: SSL_LDFLAGS: "$SSL_LDFLAGS"]) AC_MSG_NOTICE([pkg-config: SSL_LDFLAGS: "$SSL_LDFLAGS"])
AC_MSG_NOTICE([pkg-config: SSL_CPPFLAGS: "$SSL_CPPFLAGS"]) AC_MSG_NOTICE([pkg-config: SSL_CPPFLAGS: "$SSL_CPPFLAGS"])
@ -1504,13 +1471,31 @@ if test "$curl_ssl_msg" = "$init_ssl_msg" && test X"$OPT_SSL" != Xno; then
CPPFLAGS="$CPPFLAGS $SSL_CPPFLAGS" CPPFLAGS="$CPPFLAGS $SSL_CPPFLAGS"
LDFLAGS="$LDFLAGS $SSL_LDFLAGS" LDFLAGS="$LDFLAGS $SSL_LDFLAGS"
AC_CHECK_LIB(crypto, HMAC_Update,[ dnl This is for Msys/Mingw
case $host in
*-*-msys* | *-*-mingw*)
AC_MSG_CHECKING([for gdi32])
my_ac_save_LIBS=$LIBS
LIBS="-lgdi32 $LIBS"
AC_TRY_LINK([#include <windef.h>
#include <wingdi.h>],
[GdiFlush();],
[ dnl worked!
AC_MSG_RESULT([yes])],
[ dnl failed, restore LIBS
LIBS=$my_ac_save_LIBS
AC_MSG_RESULT(no)]
)
;;
esac
AC_CHECK_LIB(crypto, CRYPTO_lock,[
HAVECRYPTO="yes" HAVECRYPTO="yes"
LIBS="-lcrypto $LIBS" LIBS="-lcrypto $LIBS"
],[ ],[
LDFLAGS="$CLEANLDFLAGS -L$LIB_OPENSSL" LDFLAGS="$CLEANLDFLAGS -L$LIB_OPENSSL"
CPPFLAGS="$CLEANCPPFLAGS -I$PREFIX_OPENSSL/include/openssl -I$PREFIX_OPENSSL/include" CPPFLAGS="$CLEANCPPFLAGS -I$PREFIX_OPENSSL/include/openssl -I$PREFIX_OPENSSL/include"
AC_CHECK_LIB(crypto, HMAC_Init_ex,[ AC_CHECK_LIB(crypto, CRYPTO_add_lock,[
HAVECRYPTO="yes" HAVECRYPTO="yes"
LIBS="-lcrypto $LIBS"], [ LIBS="-lcrypto $LIBS"], [
LDFLAGS="$CLEANLDFLAGS" LDFLAGS="$CLEANLDFLAGS"
@ -1520,46 +1505,6 @@ if test "$curl_ssl_msg" = "$init_ssl_msg" && test X"$OPT_SSL" != Xno; then
]) ])
if test X"$HAVECRYPTO" = X"yes"; then
AC_MSG_CHECKING([OpenSSL linking without -ldl])
saved_libs=$LIBS
AC_TRY_LINK(
[
#include <openssl/evp.h>
],
[
SSLeay_add_all_algorithms();
],
[
AC_MSG_RESULT(yes)
LIBS="$saved_libs"
],
[
AC_MSG_RESULT(no)
AC_MSG_CHECKING([OpenSSL linking with -ldl])
LIBS="-ldl $LIBS"
AC_TRY_LINK(
[
#include <openssl/evp.h>
],
[
SSLeay_add_all_algorithms();
],
[
AC_MSG_RESULT(yes)
LIBS="$saved_libs -ldl"
],
[
AC_MSG_RESULT(no)
LIBS="$saved_libs"
]
)
]
)
fi
if test X"$HAVECRYPTO" = X"yes"; then if test X"$HAVECRYPTO" = X"yes"; then
dnl This is only reasonable to do if crypto actually is there: check for dnl This is only reasonable to do if crypto actually is there: check for
dnl SSL libs NOTE: it is important to do this AFTER the crypto lib dnl SSL libs NOTE: it is important to do this AFTER the crypto lib
@ -1582,7 +1527,7 @@ if test "$curl_ssl_msg" = "$init_ssl_msg" && test X"$OPT_SSL" != Xno; then
else else
dnl Have the libraries--check for OpenSSL headers dnl Have the libraries--check for SSLeay/OpenSSL headers
AC_CHECK_HEADERS(openssl/x509.h openssl/rsa.h openssl/crypto.h \ AC_CHECK_HEADERS(openssl/x509.h openssl/rsa.h openssl/crypto.h \
openssl/pem.h openssl/ssl.h openssl/err.h, openssl/pem.h openssl/ssl.h openssl/err.h,
curl_ssl_msg="enabled (OpenSSL)" curl_ssl_msg="enabled (OpenSSL)"
@ -1606,11 +1551,17 @@ if test "$curl_ssl_msg" = "$init_ssl_msg" && test X"$OPT_SSL" != Xno; then
fi fi
if test X"$OPENSSL_ENABLED" = X"1"; then if test X"$OPENSSL_ENABLED" = X"1"; then
AC_DEFINE(USE_SSLEAY, 1, [if SSL is enabled])
dnl is there a pkcs12.h header present? dnl is there a pkcs12.h header present?
AC_CHECK_HEADERS(openssl/pkcs12.h) AC_CHECK_HEADERS(openssl/pkcs12.h)
else else
LIBS="$CLEANLIBS" LIBS="$CLEANLIBS"
fi fi
dnl USE_SSLEAY is the historical name for what configure calls
dnl OPENSSL_ENABLED; the names should really be unified
USE_SSLEAY="$OPENSSL_ENABLED"
AC_SUBST(USE_SSLEAY)
if test X"$OPT_SSL" != Xoff && if test X"$OPT_SSL" != Xoff &&
test "$OPENSSL_ENABLED" != "1"; then test "$OPENSSL_ENABLED" != "1"; then
@ -1627,10 +1578,9 @@ if test "$curl_ssl_msg" = "$init_ssl_msg" && test X"$OPT_SSL" != Xno; then
AC_CHECK_FUNCS( ENGINE_load_builtin_engines ) AC_CHECK_FUNCS( ENGINE_load_builtin_engines )
]) ])
dnl These can only exist if OpenSSL exists dnl these can only exist if openssl exists
dnl Older versions of Cyassl (some time before 2.9.4) don't have dnl Cyassl doesn't have SSL_get_shutdown
dnl SSL_get_shutdown (but this check won't actually detect it there dnl BoringSSL doesn't have DES_set_odd_parity
dnl as it's a macro that needs the header files be included)
AC_CHECK_FUNCS( RAND_status \ AC_CHECK_FUNCS( RAND_status \
RAND_screen \ RAND_screen \
@ -1638,26 +1588,18 @@ if test "$curl_ssl_msg" = "$init_ssl_msg" && test X"$OPT_SSL" != Xno; then
ENGINE_cleanup \ ENGINE_cleanup \
CRYPTO_cleanup_all_ex_data \ CRYPTO_cleanup_all_ex_data \
SSL_get_shutdown \ SSL_get_shutdown \
SSLv2_client_method ) SSLv2_client_method \
DES_set_odd_parity )
AC_MSG_CHECKING([for BoringSSL]) AC_MSG_CHECKING([for BoringSSL])
AC_COMPILE_IFELSE([ if test "x$ac_cv_func_DES_set_odd_parity" != "xyes"; then
AC_LANG_PROGRAM([[ curl_ssl_msg="enabled (BoringSSL)"
#include <openssl/base.h> AC_DEFINE_UNQUOTED(HAVE_BORINGSSL, 1,
]],[[ [Define to 1 if using BoringSSL.])
#ifndef OPENSSL_IS_BORINGSSL AC_MSG_RESULT([yes])
#error not boringssl else
#endif AC_MSG_RESULT([no])
]]) fi
],[
AC_MSG_RESULT([yes])
AC_DEFINE_UNQUOTED(HAVE_BORINGSSL, 1,
[Define to 1 if using BoringSSL.])
curl_ssl_msg="enabled (BoringSSL)"
],[
AC_MSG_RESULT([no])
])
AC_MSG_CHECKING([for libressl]) AC_MSG_CHECKING([for libressl])
AC_COMPILE_IFELSE([ AC_COMPILE_IFELSE([
AC_LANG_PROGRAM([[ AC_LANG_PROGRAM([[
@ -1733,8 +1675,8 @@ dnl ---
if test "$OPENSSL_ENABLED" = "1"; then if test "$OPENSSL_ENABLED" = "1"; then
AC_CHECK_LIB(crypto, SRP_Calc_client_key, AC_CHECK_LIB(crypto, SRP_Calc_client_key,
[ [
AC_DEFINE(HAVE_OPENSSL_SRP, 1, [if you have the function SRP_Calc_client_key]) AC_DEFINE(HAVE_SSLEAY_SRP, 1, [if you have the function SRP_Calc_client_key])
AC_SUBST(HAVE_OPENSSL_SRP, [1]) AC_SUBST(HAVE_SSLEAY_SRP, [1])
]) ])
fi fi
@ -1845,7 +1787,6 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
AC_MSG_NOTICE([Added $gtlslib to LD_LIBRARY_PATH]) AC_MSG_NOTICE([Added $gtlslib to LD_LIBRARY_PATH])
fi fi
fi fi
AC_CHECK_FUNCS(gnutls_certificate_set_x509_key_file2)
fi fi
fi fi
@ -1983,93 +1924,6 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
fi fi
dnl ----------------------------------------------------
dnl check for mbedTLS
dnl ----------------------------------------------------
OPT_MBEDTLS=no
_cppflags=$CPPFLAGS
_ldflags=$LDFLAGS
AC_ARG_WITH(mbedtls,dnl
AC_HELP_STRING([--with-mbedtls=PATH],[where to look for mbedTLS, PATH points to the installation root])
AC_HELP_STRING([--without-mbedtls], [disable mbedTLS detection]),
OPT_MBEDTLS=$withval)
if test "$curl_ssl_msg" = "$init_ssl_msg"; then
if test X"$OPT_MBEDTLS" != Xno; then
if test "$OPT_MBEDTLS" = "yes"; then
OPT_MBEDTLS=""
fi
if test -z "$OPT_MBEDTLS" ; then
dnl check for lib first without setting any new path
AC_CHECK_LIB(mbedtls, mbedtls_havege_init,
dnl libmbedtls found, set the variable
[
AC_DEFINE(USE_MBEDTLS, 1, [if mbedTLS is enabled])
AC_SUBST(USE_MBEDTLS, [1])
MBEDTLS_ENABLED=1
USE_MBEDTLS="yes"
curl_ssl_msg="enabled (mbedTLS)"
], [], -lmbedx509 -lmbedcrypto)
fi
addld=""
addlib=""
addcflags=""
mbedtlslib=""
if test "x$USE_MBEDTLS" != "xyes"; then
dnl add the path and test again
addld=-L$OPT_MBEDTLS/lib$libsuff
addcflags=-I$OPT_MBEDTLS/include
mbedtlslib=$OPT_MBEDTLS/lib$libsuff
LDFLAGS="$LDFLAGS $addld"
if test "$addcflags" != "-I/usr/include"; then
CPPFLAGS="$CPPFLAGS $addcflags"
fi
AC_CHECK_LIB(mbedtls, mbedtls_ssl_init,
[
AC_DEFINE(USE_MBEDTLS, 1, [if mbedTLS is enabled])
AC_SUBST(USE_MBEDTLS, [1])
MBEDTLS_ENABLED=1
USE_MBEDTLS="yes"
curl_ssl_msg="enabled (mbedTLS)"
],
[
CPPFLAGS=$_cppflags
LDFLAGS=$_ldflags
], -lmbedx509 -lmbedcrypto)
fi
if test "x$USE_MBEDTLS" = "xyes"; then
AC_MSG_NOTICE([detected mbedTLS])
LIBS="-lmbedtls -lmbedx509 -lmbedcrypto $LIBS"
if test -n "$mbedtlslib"; then
dnl when shared libs were found in a path that the run-time
dnl linker doesn't search through, we need to add it to
dnl LD_LIBRARY_PATH to prevent further configure tests to fail
dnl due to this
if test "x$cross_compiling" != "xyes"; then
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$mbedtlslib"
export LD_LIBRARY_PATH
AC_MSG_NOTICE([Added $mbedtlslib to LD_LIBRARY_PATH])
fi
fi
fi
fi dnl mbedTLS not disabled
fi
dnl ---------------------------------------------------- dnl ----------------------------------------------------
dnl check for CyaSSL dnl check for CyaSSL
dnl ---------------------------------------------------- dnl ----------------------------------------------------
@ -2092,10 +1946,6 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
OPT_CYASSL="" OPT_CYASSL=""
fi fi
dnl This should be reworked to use pkg-config instead
cyassllibname=cyassl
if test -z "$OPT_CYASSL" ; then if test -z "$OPT_CYASSL" ; then
dnl check for lib in system default first dnl check for lib in system default first
@ -2137,80 +1987,19 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
[ [
CPPFLAGS=$_cppflags CPPFLAGS=$_cppflags
LDFLAGS=$_ldflags LDFLAGS=$_ldflags
cyassllib=""
]) ])
fi fi
addld=""
addlib=""
addcflags=""
if test "x$USE_CYASSL" != "xyes"; then
dnl libcyassl renamed to libwolfssl as of 3.4.0
addld=-L$OPT_CYASSL/lib$libsuff
addcflags=-I$OPT_CYASSL/include
cyassllib=$OPT_CYASSL/lib$libsuff
LDFLAGS="$LDFLAGS $addld"
if test "$addcflags" != "-I/usr/include"; then
CPPFLAGS="$CPPFLAGS $addcflags"
fi
cyassllibname=wolfssl
my_ac_save_LIBS="$LIBS"
LIBS="-l$cyassllibname -lm $LIBS"
AC_MSG_CHECKING([for CyaSSL_Init in -lwolfssl])
AC_LINK_IFELSE([
AC_LANG_PROGRAM([[
/* These aren't needed for detection and confuse WolfSSL.
They are set up properly later if it is detected. */
#undef SIZEOF_LONG
#undef SIZEOF_LONG_LONG
#include <cyassl/ssl.h>
]],[[
return CyaSSL_Init();
]])
],[
AC_MSG_RESULT(yes)
AC_DEFINE(USE_CYASSL, 1, [if CyaSSL/WolfSSL is enabled])
AC_SUBST(USE_CYASSL, [1])
CYASSL_ENABLED=1
USE_CYASSL="yes"
curl_ssl_msg="enabled (WolfSSL)"
],
[
AC_MSG_RESULT(no)
CPPFLAGS=$_cppflags
LDFLAGS=$_ldflags
cyassllib=""
])
LIBS="$my_ac_save_LIBS"
fi
if test "x$USE_CYASSL" = "xyes"; then if test "x$USE_CYASSL" = "xyes"; then
AC_MSG_NOTICE([detected $cyassllibname]) AC_MSG_NOTICE([detected CyaSSL])
dnl cyassl/ctaocrypt/types.h needs SIZEOF_LONG_LONG defined! dnl cyassl/ctaocrypt/types.h needs SIZEOF_LONG_LONG defined!
AC_CHECK_SIZEOF(long long) AC_CHECK_SIZEOF(long long)
dnl Versions since at least 2.6.0 may have options.h
AC_CHECK_HEADERS(cyassl/options.h)
dnl Versions since at least 2.9.4 renamed error.h to error-ssl.h dnl Versions since at least 2.9.4 renamed error.h to error-ssl.h
AC_CHECK_HEADERS(cyassl/error-ssl.h) AC_CHECK_HEADERS(cyassl/error-ssl.h)
LIBS="-l$cyassllibname -lm $LIBS" LIBS="-lcyassl -lm $LIBS"
if test "x$cyassllibname" = "xwolfssl"; then
dnl Recent WolfSSL versions build without SSLv3 by default
dnl WolfSSL needs configure --enable-opensslextra to have *get_peer*
AC_CHECK_FUNCS(wolfSSLv3_client_method \
wolfSSL_get_peer_certificate)
else
dnl Cyassl needs configure --enable-opensslextra to have *get_peer*
AC_CHECK_FUNCS(CyaSSL_get_peer_certificate)
fi
if test -n "$cyassllib"; then if test -n "$cyassllib"; then
dnl when shared libs were found in a path that the run-time dnl when shared libs were found in a path that the run-time
@ -2277,73 +2066,57 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
fi fi
fi fi
else else
NSS_PCDIR="$OPT_NSS/lib/pkgconfig" # Without pkg-config, we'll kludge in some defaults
if test -f "$NSS_PCDIR/nss.pc"; then addlib="-L$OPT_NSS/lib -lssl3 -lsmime3 -lnss3 -lplds4 -lplc4 -lnspr4 -lpthread -ldl"
CURL_CHECK_PKGCONFIG(nss, [$NSS_PCDIR]) addcflags="-I$OPT_NSS/include"
if test "$PKGCONFIG" != "no" ; then version="unknown"
addld=`CURL_EXPORT_PCDIR([$NSS_PCDIR]) $PKGCONFIG --libs-only-L nss` nssprefix=$OPT_NSS
addlib=`CURL_EXPORT_PCDIR([$NSS_PCDIR]) $PKGCONFIG --libs-only-l nss` fi
addcflags=`CURL_EXPORT_PCDIR([$NSS_PCDIR]) $PKGCONFIG --cflags nss`
version=`CURL_EXPORT_PCDIR([$NSS_PCDIR]) $PKGCONFIG --modversion nss` if test -n "$addlib"; then
nssprefix=`CURL_EXPORT_PCDIR([$NSS_PCDIR]) $PKGCONFIG --variable=prefix nss`
CLEANLIBS="$LIBS"
CLEANCPPFLAGS="$CPPFLAGS"
LIBS="$addlib $LIBS"
if test "$addcflags" != "-I/usr/include"; then
CPPFLAGS="$CPPFLAGS $addcflags"
fi
dnl The function SSL_VersionRangeSet() is needed to enable TLS > 1.0
AC_CHECK_LIB(nss3, SSL_VersionRangeSet,
[
AC_DEFINE(USE_NSS, 1, [if NSS is enabled])
AC_SUBST(USE_NSS, [1])
USE_NSS="yes"
NSS_ENABLED=1
curl_ssl_msg="enabled (NSS)"
],
[
LIBS="$CLEANLIBS"
CPPFLAGS="$CLEANCPPFLAGS"
])
if test "x$USE_NSS" = "xyes"; then
AC_MSG_NOTICE([detected NSS version $version])
dnl needed when linking the curl tool without USE_EXPLICIT_LIB_DEPS
NSS_LIBS=$addlib
AC_SUBST([NSS_LIBS])
dnl when shared libs were found in a path that the run-time
dnl linker doesn't search through, we need to add it to
dnl LD_LIBRARY_PATH to prevent further configure tests to fail
dnl due to this
if test "x$cross_compiling" != "xyes"; then
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$nssprefix/lib$libsuff"
export LD_LIBRARY_PATH
AC_MSG_NOTICE([Added $nssprefix/lib$libsuff to LD_LIBRARY_PATH])
fi fi
fi fi
fi fi
if test -z "$addlib"; then
# Without pkg-config, we'll kludge in some defaults
AC_MSG_WARN([Using hard-wired libraries and compilation flags for NSS.])
addld="-L$OPT_NSS/lib"
addlib="-lssl3 -lsmime3 -lnss3 -lplds4 -lplc4 -lnspr4"
addcflags="-I$OPT_NSS/include"
version="unknown"
nssprefix=$OPT_NSS
fi
CLEANLDFLAGS="$LDFLAGS"
CLEANLIBS="$LIBS"
CLEANCPPFLAGS="$CPPFLAGS"
LDFLAGS="$addld $LDFLAGS"
LIBS="$addlib $LIBS"
if test "$addcflags" != "-I/usr/include"; then
CPPFLAGS="$CPPFLAGS $addcflags"
fi
dnl The function SSL_VersionRangeSet() is needed to enable TLS > 1.0
AC_CHECK_LIB(nss3, SSL_VersionRangeSet,
[
AC_DEFINE(USE_NSS, 1, [if NSS is enabled])
AC_SUBST(USE_NSS, [1])
USE_NSS="yes"
NSS_ENABLED=1
curl_ssl_msg="enabled (NSS)"
],
[
LDFLAGS="$CLEANLDFLAGS"
LIBS="$CLEANLIBS"
CPPFLAGS="$CLEANCPPFLAGS"
])
if test "x$USE_NSS" = "xyes"; then
AC_MSG_NOTICE([detected NSS version $version])
dnl needed when linking the curl tool without USE_EXPLICIT_LIB_DEPS
NSS_LIBS=$addlib
AC_SUBST([NSS_LIBS])
dnl when shared libs were found in a path that the run-time
dnl linker doesn't search through, we need to add it to
dnl LD_LIBRARY_PATH to prevent further configure tests to fail
dnl due to this
if test "x$cross_compiling" != "xyes"; then
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$nssprefix/lib$libsuff"
export LD_LIBRARY_PATH
AC_MSG_NOTICE([Added $nssprefix/lib$libsuff to LD_LIBRARY_PATH])
fi
fi dnl NSS found
fi dnl NSS not disabled fi dnl NSS not disabled
fi dnl curl_ssl_msg = init_ssl_msg fi dnl curl_ssl_msg = init_ssl_msg
@ -2404,7 +2177,7 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
fi fi
fi fi
if test "x$OPENSSL_ENABLED$GNUTLS_ENABLED$NSS_ENABLED$POLARSSL_ENABLED$MBEDTLS_ENABLED$AXTLS_ENABLED$CYASSL_ENABLED$WINSSL_ENABLED$DARWINSSL_ENABLED" = "x"; then if test "x$OPENSSL_ENABLED$GNUTLS_ENABLED$NSS_ENABLED$POLARSSL_ENABLED$AXTLS_ENABLED$CYASSL_ENABLED$WINSSL_ENABLED$DARWINSSL_ENABLED" = "x"; then
AC_MSG_WARN([SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more.]) AC_MSG_WARN([SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more.])
AC_MSG_WARN([Use --with-ssl, --with-gnutls, --with-polarssl, --with-cyassl, --with-nss, --with-axtls, --with-winssl, or --with-darwinssl to address this.]) AC_MSG_WARN([Use --with-ssl, --with-gnutls, --with-polarssl, --with-cyassl, --with-nss, --with-axtls, --with-winssl, or --with-darwinssl to address this.])
else else
@ -2419,27 +2192,6 @@ dnl **********************************************************************
CURL_CHECK_CA_BUNDLE CURL_CHECK_CA_BUNDLE
dnl **********************************************************************
dnl Check for libpsl
dnl **********************************************************************
AC_ARG_WITH(libpsl,
AS_HELP_STRING([--without-libpsl],
[disable support for libpsl cookie checking]),
with_libpsl=$withval,
with_libpsl=yes)
if test $with_libpsl != "no"; then
AC_SEARCH_LIBS(psl_builtin, psl,
[curl_psl_msg="yes";
AC_DEFINE([USE_LIBPSL], [1], [PSL support enabled])
],
[curl_psl_msg="no (libpsl not found)";
AC_MSG_WARN([libpsl was not found])
]
)
fi
AM_CONDITIONAL([USE_LIBPSL], [test "$curl_psl_msg" = "yes"])
dnl ********************************************************************** dnl **********************************************************************
dnl Check for libmetalink dnl Check for libmetalink
dnl ********************************************************************** dnl **********************************************************************
@ -3019,9 +2771,7 @@ if test X"$want_h2" != Xno; then
CPPFLAGS="$CPPFLAGS $CPP_H2" CPPFLAGS="$CPPFLAGS $CPP_H2"
LIBS="$LIB_H2 $LIBS" LIBS="$LIB_H2 $LIBS"
# use nghttp2_option_set_no_recv_client_magic to require nghttp2 AC_CHECK_LIB(nghttp2, nghttp2_session_callbacks_set_send_callback,
# >= 1.0.0
AC_CHECK_LIB(nghttp2, nghttp2_option_set_no_recv_client_magic,
[ [
AC_CHECK_HEADERS(nghttp2/nghttp2.h, AC_CHECK_HEADERS(nghttp2/nghttp2.h,
curl_h2_msg="enabled (nghttp2)" curl_h2_msg="enabled (nghttp2)"
@ -3047,31 +2797,6 @@ if test X"$want_h2" != Xno; then
fi fi
dnl **********************************************************************
dnl Check for zsh completion path
dnl **********************************************************************
OPT_ZSH_FPATH=default
AC_ARG_WITH(zsh-functions-dir,
AC_HELP_STRING([--with-zsh-functions-dir=PATH],[Install zsh completions to PATH])
AC_HELP_STRING([--without-zsh-functions-dir],[Do not install zsh completions]),
[OPT_ZSH_FPATH=$withval])
case "$OPT_ZSH_FPATH" in
no)
dnl --without-zsh-functions-dir option used
;;
default|yes)
dnl --with-zsh-functions-dir option used without path
ZSH_FUNCTIONS_DIR="$datarootdir/zsh/site-functions"
AC_SUBST(ZSH_FUNCTIONS_DIR)
;;
*)
dnl --with-zsh-functions-dir option used with path
ZSH_FUNCTIONS_DIR="$withval"
AC_SUBST(ZSH_FUNCTIONS_DIR)
;;
esac
dnl ********************************************************************** dnl **********************************************************************
dnl Back to "normal" configuring dnl Back to "normal" configuring
dnl ********************************************************************** dnl **********************************************************************
@ -3420,7 +3145,7 @@ if test "x$want_thres" = xyes && test "x$want_ares" = xyes; then
[Options --enable-threaded-resolver and --enable-ares are mutually exclusive]) [Options --enable-threaded-resolver and --enable-ares are mutually exclusive])
fi fi
if test "$want_thres" = "yes" && test "$dontwant_rt" = "no"; then if test "$want_thres" = "yes"; then
AC_CHECK_HEADER(pthread.h, AC_CHECK_HEADER(pthread.h,
[ AC_DEFINE(HAVE_PTHREAD_H, 1, [if you have <pthread.h>]) [ AC_DEFINE(HAVE_PTHREAD_H, 1, [if you have <pthread.h>])
save_CFLAGS="$CFLAGS" save_CFLAGS="$CFLAGS"
@ -3546,7 +3271,7 @@ AC_HELP_STRING([--disable-tls-srp],[Disable TLS-SRP authentication]),
want_tls_srp=yes want_tls_srp=yes
) )
if test "$want_tls_srp" = "yes" && ( test "x$HAVE_GNUTLS_SRP" = "x1" || test "x$HAVE_OPENSSL_SRP" = "x1") ; then if test "$want_tls_srp" = "yes" && ( test "x$HAVE_GNUTLS_SRP" = "x1" || test "x$HAVE_SSLEAY_SRP" = "x1") ; then
AC_DEFINE(USE_TLS_SRP, 1, [Use TLS-SRP authentication]) AC_DEFINE(USE_TLS_SRP, 1, [Use TLS-SRP authentication])
USE_TLS_SRP=1 USE_TLS_SRP=1
curl_tls_srp_msg="enabled" curl_tls_srp_msg="enabled"
@ -3660,7 +3385,7 @@ dnl For keeping supported features and protocols also in pkg-config file
dnl since it is more cross-compile friendly than curl-config dnl since it is more cross-compile friendly than curl-config
dnl dnl
if test "x$OPENSSL_ENABLED" = "x1"; then if test "x$USE_SSLEAY" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES SSL" SUPPORT_FEATURES="$SUPPORT_FEATURES SSL"
elif test -n "$SSL_ENABLED"; then elif test -n "$SSL_ENABLED"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES SSL" SUPPORT_FEATURES="$SUPPORT_FEATURES SSL"
@ -3688,10 +3413,6 @@ if test "x$HAVE_GSSAPI" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES GSS-API" SUPPORT_FEATURES="$SUPPORT_FEATURES GSS-API"
fi fi
if test "x$curl_psl_msg" = "xyes"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES PSL"
fi
if test "x$CURL_DISABLE_CRYPTO_AUTH" != "x1" -a \ if test "x$CURL_DISABLE_CRYPTO_AUTH" != "x1" -a \
\( "x$HAVE_GSSAPI" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \); then \( "x$HAVE_GSSAPI" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \); then
SUPPORT_FEATURES="$SUPPORT_FEATURES SPNEGO" SUPPORT_FEATURES="$SUPPORT_FEATURES SPNEGO"
@ -3703,7 +3424,7 @@ if test "x$CURL_DISABLE_CRYPTO_AUTH" != "x1" -a \
fi fi
if test "x$CURL_DISABLE_CRYPTO_AUTH" != "x1"; then if test "x$CURL_DISABLE_CRYPTO_AUTH" != "x1"; then
if test "x$OPENSSL_ENABLED" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \ if test "x$USE_SSLEAY" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \
-o "x$GNUTLS_ENABLED" = "x1" -o "x$NSS_ENABLED" = "x1" \ -o "x$GNUTLS_ENABLED" = "x1" -o "x$NSS_ENABLED" = "x1" \
-o "x$DARWINSSL_ENABLED" = "x1"; then -o "x$DARWINSSL_ENABLED" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES NTLM" SUPPORT_FEATURES="$SUPPORT_FEATURES NTLM"
@ -3776,7 +3497,7 @@ if test "x$CURL_DISABLE_IMAP" != "x1"; then
fi fi
if test "x$CURL_DISABLE_SMB" != "x1" \ if test "x$CURL_DISABLE_SMB" != "x1" \
-a "x$CURL_DISABLE_CRYPTO_AUTH" != "x1" \ -a "x$CURL_DISABLE_CRYPTO_AUTH" != "x1" \
-a \( "x$OPENSSL_ENABLED" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \ -a \( "x$USE_SSLEAY" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \
-o "x$GNUTLS_ENABLED" = "x1" -o "x$NSS_ENABLED" = "x1" \ -o "x$GNUTLS_ENABLED" = "x1" -o "x$NSS_ENABLED" = "x1" \
-o "x$DARWINSSL_ENABLED" = "x1" \); then -o "x$DARWINSSL_ENABLED" = "x1" \); then
SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SMB" SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SMB"
@ -3839,7 +3560,6 @@ AC_CONFIG_FILES([Makefile \
include/curl/Makefile \ include/curl/Makefile \
src/Makefile \ src/Makefile \
lib/Makefile \ lib/Makefile \
scripts/Makefile \
lib/libcurl.vers \ lib/libcurl.vers \
tests/Makefile \ tests/Makefile \
tests/certs/Makefile \ tests/certs/Makefile \
@ -3891,15 +3611,13 @@ AC_MSG_NOTICE([Configured to build curl/libcurl:
--libcurl option: ${curl_libcurl_msg} --libcurl option: ${curl_libcurl_msg}
Verbose errors: ${curl_verbose_msg} Verbose errors: ${curl_verbose_msg}
SSPI support: ${curl_sspi_msg} SSPI support: ${curl_sspi_msg}
ca cert bundle: ${ca}${ca_warning} ca cert bundle: ${ca}
ca cert path: ${capath}${capath_warning} ca cert path: ${capath}
ca fallback: ${with_ca_fallback}
LDAP support: ${curl_ldap_msg} LDAP support: ${curl_ldap_msg}
LDAPS support: ${curl_ldaps_msg} LDAPS support: ${curl_ldaps_msg}
RTSP support: ${curl_rtsp_msg} RTSP support: ${curl_rtsp_msg}
RTMP support: ${curl_rtmp_msg} RTMP support: ${curl_rtmp_msg}
metalink support: ${curl_mtlnk_msg} metalink support: ${curl_mtlnk_msg}
PSL support: ${curl_psl_msg}
HTTP2 support: ${curl_h2_msg} HTTP2 support: ${curl_h2_msg}
Protocols: ${SUPPORT_PROTOCOLS} Protocols: ${SUPPORT_PROTOCOLS}
]) ])

View File

@ -6,11 +6,11 @@
# | (__| |_| | _ <| |___ # | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____| # \___|\___/|_| \_\_____|
# #
# Copyright (C) 2013-2016, Daniel Stenberg, <daniel@haxx.se>, et al. # Copyright (C) 2013-2014, Daniel Stenberg, <daniel@haxx.se>, et al.
# #
# This software is licensed as described in the file COPYING, which # This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms # you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html. # are also available at http://curl.haxx.se/docs/copyright.html.
# #
# You may opt to use, copy, modify, merge, publish, distribute and/or sell # 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 # copies of the Software, and permit persons to whom the Software is
@ -33,8 +33,7 @@
start=$1 start=$1
if test -z "$start"; then if test -z "$start"; then
echo "Usage: $0 <since this tag/hash> [--releasenotes]" echo "Usage: $0 <since this tag/hash>"
exit
fi fi
# filter out Author:, Commit: and *by: lines # filter out Author:, Commit: and *by: lines
@ -60,7 +59,7 @@ if echo "$*" | grep -qw -- '--releasenotes';then
# grep out the list of names from RELEASE-NOTES # grep out the list of names from RELEASE-NOTES
# split on ", " # split on ", "
# remove leading white spaces # remove leading white spaces
grep "^ [^ \(]" RELEASE-NOTES| \ grep "^ [^ ]" RELEASE-NOTES| \
sed 's/, */\n/g'| \ sed 's/, */\n/g'| \
sed 's/^ *//' sed 's/^ *//'
fi fi
@ -72,7 +71,7 @@ awk '{
num++; num++;
n = sprintf("%s%s%s,", n, length(n)?" ":"", $0); n = sprintf("%s%s%s,", n, length(n)?" ":"", $0);
#print n; #print n;
if(length(n) > 77) { if(length(n) > 78) {
printf(" %s\n", p); printf(" %s\n", p);
n=sprintf("%s,", $0); n=sprintf("%s,", $0);
} }

View File

@ -10,7 +10,7 @@
# #
# This software is licensed as described in the file COPYING, which # This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms # you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html. # are also available at http://curl.haxx.se/docs/copyright.html.
# #
# You may opt to use, copy, modify, merge, publish, distribute and/or sell # 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 # copies of the Software, and permit persons to whom the Software is
@ -71,7 +71,7 @@ while test $# -gt 0; do
;; ;;
--ca) --ca)
echo @CURL_CA_BUNDLE@ echo "@CURL_CA_BUNDLE@"
;; ;;
--cc) --cc)

View File

@ -27,7 +27,7 @@ Basic
C C
libcurl is a C library in itself! libcurl is a C library in itself!
https://curl.haxx.se/libcurl/ http://curl.haxx.se/libcurl/
C++ C++
@ -50,7 +50,7 @@ Cocoa
D D
Written by Kenneth Bogert Written by Kenneth Bogert
http://dlang.org/library/std/net/curl.html http://curl.haxx.se/libcurl/d/
Dylan Dylan
@ -60,7 +60,7 @@ Dylan
Eiffel Eiffel
Written by Eiffel Software Written by Eiffel Software
https://room.eiffel.com/library/curl http://curl.haxx.se/libcurl/eiffel/
Euphoria Euphoria
@ -78,7 +78,7 @@ Ferite
Gambas Gambas
http://gambas.sourceforge.net/ http://gambas.sourceforge.net
glib/GTK+ glib/GTK+
@ -90,11 +90,6 @@ Guile:
Written by Michael L. Gran Written by Michael L. Gran
http://www.lonelycactus.com/guile-curl.html http://www.lonelycactus.com/guile-curl.html
Harbour
Written by Viktor Szakáts
https://github.com/vszakats/harbour-core/tree/master/contrib/hbcurl
Haskell Haskell
Written by Galois, Inc Written by Galois, Inc
@ -102,7 +97,8 @@ Haskell
Java Java
https://github.com/pjlegato/curl-java Maintained by [blank]
http://curl.haxx.se/libcurl/java/
Julia Julia
@ -119,7 +115,7 @@ Lua
luacurl by Alexander Marinov luacurl by Alexander Marinov
http://luacurl.luaforge.net/ http://luacurl.luaforge.net/
Lua-cURL by Jürgen Hötzel Lua-cURL by Jürgen Hötzel
http://luaforge.net/projects/lua-curl/ http://luaforge.net/projects/lua-curl/
Mono Mono
@ -130,7 +126,7 @@ Mono
.NET .NET
libcurl-net by Jeffrey Phillips libcurl-net by Jeffrey Phillips
https://sourceforge.net/projects/libcurl-net/ http://sourceforge.net/projects/libcurl-net/
node.js node.js
@ -145,7 +141,7 @@ Object-Pascal
O'Caml O'Caml
Written by Lars Nilsson Written by Lars Nilsson
https://sourceforge.net/projects/ocurl/ http://sourceforge.net/projects/ocurl/
Pascal Pascal
@ -154,13 +150,13 @@ Pascal
Perl Perl
Maintained by Cris Bailiff and Bálint Szilakszi Maintained by Cris Bailiff
https://github.com/szbalint/WWW--Curl http://curl.haxx.se/libcurl/perl/
PHP PHP
Written by Sterling Hughes Written by Sterling Hughes
https://php.net/curl http://curl.haxx.se/libcurl/php/
PostgreSQL PostgreSQL
@ -174,7 +170,8 @@ Python
R R
http://cran.r-project.org/package=curl RCurl by Duncan Temple Lang
http://www.omegahat.org/RCurl/
Rexx Rexx
@ -184,7 +181,7 @@ Rexx
RPG RPG
Support for ILE/RPG on OS/400 is included in source distribution Support for ILE/RPG on OS/400 is included in source distribution
https://curl.haxx.se/libcurl/ http://curl.haxx.se/libcurl/
See packages/OS400/README.OS400 and packages/OS400/curl.inc.in See packages/OS400/README.OS400 and packages/OS400/curl.inc.in
Ruby Ruby
@ -195,15 +192,10 @@ Ruby
ruby-curl-multi - written by Kristjan Petursson and Keith Rarick ruby-curl-multi - written by Kristjan Petursson and Keith Rarick
http://curl-multi.rubyforge.org/ http://curl-multi.rubyforge.org/
Rust
curl-rust - by Carl Lerche
https://github.com/carllerche/curl-rust
Scheme Scheme
Bigloo binding by Kirill Lisovsky Bigloo binding by Kirill Lisovsky
http://www.metapaper.net/lisovsky/web/curl/ http://curl.haxx.se/libcurl/scheme/
S-Lang S-Lang
@ -227,13 +219,13 @@ SPL
Tcl Tcl
Tclcurl by Andrés García Tclcurl by Andrés García
http://mirror.yellow5.com/tclcurl/ http://personal1.iddeo.es/andresgarci/tclcurl/english/docs.html
Visual Basic Visual Basic
libcurl-vb by Jeffrey Phillips libcurl-vb by Jeffrey Phillips
https://sourceforge.net/projects/libcurl-vb/ http://sourceforge.net/projects/libcurl-vb/
Visual Foxpro Visual Foxpro
@ -253,8 +245,3 @@ XBLite
Written by David Szafranski Written by David Szafranski
http://perso.wanadoo.fr/xblite/libraries.html http://perso.wanadoo.fr/xblite/libraries.html
Xojo
Written by Andrew Lambert
https://github.com/charonn0/RB-libcURL

View File

@ -35,12 +35,14 @@ BUGS
have a go at a solution. You can optionally also post your bug/problem at have a go at a solution. You can optionally also post your bug/problem at
curl's bug tracking system over at curl's bug tracking system over at
https://github.com/curl/curl/issues https://sourceforge.net/p/curl/bugs/
Please read the rest of this document below first before doing that! Please read the rest of this document below first before doing that! Also,
you need to login to your sourceforge account before being able to submit a
bug report (necessary evil done to avoid spam).
If you feel you need to ask around first, find a suitable mailing list and 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/ post there. The lists are available on http://curl.haxx.se/mail/
1.3 What to report 1.3 What to report

View File

@ -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](http://contributor-covenant.org), version 1.1.0, available at
[http://contributor-covenant.org/version/1/1/0/](http://contributor-covenant.org/version/1/1/0/)

View File

@ -1,185 +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 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 `/*` and `*/` comments:
/* this is a comment */
## Long lines
Source code in curl may never be wider than 80 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 */
}
When we write functions however, the opening brace should be in the first
column of the first 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;
## 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 style 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);

View File

@ -15,13 +15,18 @@
1.2 License 1.2 License
1.3 What To Read 1.3 What To Read
2. Write a good patch 2. cURL Coding Standards
2.1 Follow code style 2.1 Naming
2.2 Non-clobbering All Over 2.2 Indenting
2.3 Write Separate Patches 2.3 Commenting
2.4 Patch Against Recent Sources 2.4 Line Lengths
2.5 Document 2.5 General Style
2.6 Test Cases 2.6 Non-clobbering All Over
2.7 Platform Dependent Code
2.8 Write Separate Patches
2.9 Patch Against Recent Sources
2.10 Document
2.11 Test Cases
3. Pushing Out Your Changes 3. Pushing Out Your Changes
3.1 Write Access to git Repository 3.1 Write Access to git Repository
@ -29,7 +34,7 @@
3.3 How To Make a Patch without git 3.3 How To Make a Patch without git
3.4 How to get your changes into the main sources 3.4 How to get your changes into the main sources
3.5 Write good commit messages 3.5 Write good commit messages
3.6 About pull requests 3.6 Please don't send pull requests
============================================================================== ==============================================================================
@ -37,20 +42,16 @@
1.1 Join the Community 1.1 Join the Community
Skip over to https://curl.haxx.se/mail/ and join the appropriate mailing Skip over to http://curl.haxx.se/mail/ and join the appropriate mailing
list(s). Read up on details before you post questions. Read this file before list(s). Read up on details before you post questions. Read this file before
you start sending patches! We prefer patches and discussions being held on you start sending patches! We prefer patches and discussions being held on
the mailing list(s), not sent to individuals. the mailing list(s), not sent to individuals.
Before posting to one of the curl mailing lists, please read up on the mailing Before posting to one of the curl mailing lists, please read up on the mailing
list etiquette: https://curl.haxx.se/mail/etiquette.html list etiquette: http://curl.haxx.se/mail/etiquette.html
We also hang out on IRC in #curl on irc.freenode.net 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 at github to get notified on pull requests and new
issues posted there.
1.2. License 1.2. License
When contributing with code, you agree to put your changes and new code under When contributing with code, you agree to put your changes and new code under
@ -77,20 +78,53 @@
1.3 What To Read 1.3 What To Read
Source code, the man pages, the INTERNALS document, TODO, KNOWN_BUGS and the Source code, the man pages, the INTERNALS document, TODO, KNOWN_BUGS, the
most recent changes in the git log. Just lurking on the curl-library mailing most recent CHANGES. Just lurking on the curl-library mailing list is gonna
list is gonna give you a lot of insights on what's going on right now. Asking give you a lot of insights on what's going on right now. Asking there is a
there is a good idea too. good idea too.
2. Write a good patch 2. cURL Coding Standards
2.1 Follow code style 2.1 Naming
When writing C code, follow the CODE_STYLE already established in the Try using a non-confusing naming scheme for your new functions and variable
project. Consistent style makes code easier to read and mistakes less likely names. It doesn't necessarily have to mean that you should use the same as in
to happen. 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.
2.2 Non-clobbering All Over See the INTERNALS document on how we name non-exported library-global
symbols.
2.2 Indenting
Use the same indenting levels and bracing method as all the other code
already does. It makes the source code easier to follow if all of it is
written using the same style. We don't ask you to like it, we just ask you to
follow the tradition! ;-) This mainly means: 2-level indents, using spaces
only (no tabs) and having the opening brace ({) on the same line as the if()
or while().
Also note that we use if() and while() with no space before the parenthesis.
2.3 Commenting
Comment your source code extensively using C comments (/* comment */), DO NOT
use C++ comments (// this style). Commented code is quality code and enables
future modifications much more. Uncommented code risk having to be completely
replaced when someone wants to extend things, since other persons' source
code can get quite hard to read.
2.4 Line Lengths
We write source lines shorter than 80 columns.
2.5 General Style
Keep your functions small. If they're small you avoid a lot of mistakes and
you don't accidentally mix up variables etc.
2.6 Non-clobbering All Over
When you write new functionality or fix bugs, it is important that you don't 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 fiddle all over the source files and functions. Remember that it is likely
@ -99,7 +133,14 @@
functionality, try writing it in a new source file. If you fix bugs, try to 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. fix one bug at a time and send them as separate patches.
2.3 Write Separate Patches 2.7 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.
2.8 Write Separate Patches
It is annoying when you get a huge patch from someone that is said to fix 511 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 odd problems, but discussions and opinions don't agree with 510 of them - or
@ -113,14 +154,14 @@
Also, separate patches enable bisecting much better when we track problems in Also, separate patches enable bisecting much better when we track problems in
the future. the future.
2.4 Patch Against Recent Sources 2.9 Patch Against Recent Sources
Please try to get the latest available sources to make your patches Please try to get the latest available sources to make your patches
against. It makes the life of the developers so much easier. The very best is against. It makes the life 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 if you get the most up-to-date sources from the git repository, but the
latest release archive is quite OK as well! latest release archive is quite OK as well!
2.5 Document 2.10 Document
Writing docs is dead boring and one of the big problems with many open source Writing docs is dead boring and one of the big problems with many open source
projects. Someone's gotta do it. It makes it a lot easier if you submit a projects. Someone's gotta do it. It makes it a lot easier if you submit a
@ -131,7 +172,7 @@
ASCII files. All HTML files on the web site and in the release archives are ASCII files. All HTML files on the web site and in the release archives are
generated from the nroff/ASCII versions. generated from the nroff/ASCII versions.
2.6 Test Cases 2.11 Test Cases
Since the introduction of the test suite, we can quickly verify that the main 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 features are working as they're supposed to. To maintain this situation and
@ -158,7 +199,7 @@
You need to first checkout the repository: You need to first checkout the repository:
git clone https://github.com/curl/curl.git git clone git://github.com/bagder/curl.git
You then proceed and edit all the files you like and you commit them to your You then proceed and edit all the files you like and you commit them to your
local repository: local repository:
@ -200,8 +241,8 @@
For unix-like operating systems: For unix-like operating systems:
https://savannah.gnu.org/projects/patch/ http://www.gnu.org/software/patch/patch.html
https://www.gnu.org/software/diffutils/ http://www.gnu.org/directory/diffutils.html
For Windows: For Windows:
@ -247,15 +288,27 @@
and make sure that you have your own user and email setup correctly in git and make sure that you have your own user and email setup correctly in git
before you commit before you commit
3.6 About pull requests 3.6 Please don't send pull requests
With git (and especially github) it is easy and tempting to send a pull With git (and especially github) it is easy and tempting to send a pull
request to the curl project to have changes merged this way instead of request to one or more people in the curl project to have changes merged this
mailing patches to the curl-library mailing list. way instead of mailing patches to the curl-library mailing list.
We used to dislike this but we're trying to change that and accept that this We don't like that. We want them mailed for these reasons:
is a frictionless way for people to contribute to the project. We now welcome
pull requests!
We will continue to avoid using github's merge tools to make the history - Peer review. Anyone and everyone on the list can review, comment and
linear and to make sure commits follow our style guidelines. improve on the patch. Pull requests limit this ability.
- Anyone can merge the patch into their own trees for testing and those who
have push rights can push it to the main repo. It doesn't have to be anyone
the patch author knows beforehand.
- Commit messages can be tweaked and changed if merged locally instead of
using github. Merges directly on github requires the changes to be perfect
already, which they seldom are.
- Merges on github prevents rebases and even enforces --no-ff which is a git
style we don't otherwise use in the project
However: once patches have been reviewed and deemed fine on list they are
perfectly OK to be pulled from a published git tree.

176
docs/DISTRO-DILEMMA Normal file
View File

@ -0,0 +1,176 @@
Date: February 11, 2007
Author: Daniel Stenberg <daniel@haxx.se>
URL: http://curl.haxx.se/legal/distro-dilemma.html
Condition
This document is written to describe the situation as it is right now.
libcurl 7.16.1 is currently the latest version available. Things may of
course change in the future.
This document reflects my view and understanding of these things. Please tell
me where and how you think I'm wrong, and I'll try to correct my mistakes.
Background
The Free Software Foundation has deemed the Original BSD license[1] to be
"incompatible"[2] with GPL[3]. I'd rather say it is the other way around, but
the point is the same: if you distribute a binary version of a GPL program,
it MUST NOT be linked with any Original BSD-licensed parts or libraries.
Doing so will violate the GPL license. For a long time, very many GPL
licensed programs have avoided this license mess by adding an exception[8] to
their license. And many others have just closed their eyes for this problem.
libcurl is MIT-style[4] licensed - how on earth did this dilemma fall onto
our plates?
libcurl is only a little library. libcurl can be built to use OpenSSL for its
SSL/TLS capabilities. OpenSSL is basically Original BSD licensed[5].
If libcurl built to use OpenSSL is used by a GPL-licensed application and you
decide to distribute a binary version of it (Linux distros - for example -
tend to), you have a clash. GPL vs Original BSD.
This dilemma is not libcurl-specific nor is it specific to any particular
Linux distro. (This article mentions and refers to Debian several times, but
only because Debian seems to be the only Linux distro to have faced this
issue yet since no other distro is shipping libcurl built with two SSL
libraries.)
Part of the Operating System
This would not be a problem if the used lib would be considered part of the
underlying operating system, as then the GPL license has an exception
clause[6] that allows applications to use such libs without having to be
allowed to distribute it or its sources. Possibly some distros will claim
that OpenSSL is part of their operating system.
Debian does however not take this stance and has officially(?) claimed that
OpenSSL is not a required part of the Debian operating system
Some people claim that this paragraph cannot be exploited this way by a Linux
distro, but I am not a lawyer and that is a discussion left outside of this
document.
GnuTLS
Since May 2005 libcurl can get built to use GnuTLS instead of OpenSSL. GnuTLS
is an LGPL[7] licensed library that offers a matching set of features as
OpenSSL does. Now, you can build and distribute an TLS/SSL capable libcurl
without including any Original BSD licensed code.
I believe Debian is the first (only?) distro that provides libcurl/GnuTLS
packages.
yassl
libcurl can get also get built to use yassl for the TLS/SSL layer. yassl is a
GPL[3] licensed library.
GnuTLS vs OpenSSL vs yassl
While these three libraries offer similar features, they are not equal.
libcurl does not (yet) offer a standardized stable ABI if you decide to
switch from using libcurl-openssl to libcurl-gnutls or vice-versa. The GnuTLS
and yassl support is very recent in libcurl and it has not been tested nor
used very extensively, while the OpenSSL equivalent code has been used and
thus matured since 1999.
GnuTLS
- LGPL licensed
- supports SRP
- lacks SSLv2 support
- lacks MD2 support (used by at least some CA certs)
- lacks the crypto functions libcurl uses for NTLM
OpenSSL
- Original BSD licensed
- lacks SRP
- supports SSLv2
- older and more widely used
- provides crypto functions libcurl uses for NTLM
- libcurl can do non-blocking connects with it in 7.15.4 and later
yassl
- GPL licensed
- much untested and unproven in the real work by (lib)curl users so we don't
know a lot about restrictions or benefits from using this
The Better License, Original BSD, GPL or LGPL?
It isn't obvious or without debate to any objective interested party that
either of these licenses are the "better" or even the "preferred" one in a
generic situation.
Instead, I think we should accept the fact that the SSL/TLS libraries and
their different licenses will fit different applications and their authors
differently depending on the applications' licenses and their general usage
pattern (considering how GPL and LGPL libraries for example can be burdensome
for embedded systems usage).
In Debian land, there seems to be a common opinion that LGPL is "maximally
compatible" with apps while Original BSD is not. Like this:
http://lists.debian.org/debian-devel/2005/09/msg01417.html
More SSL Libraries
In libcurl, there's no stopping us here. There are more Open Source/Free
SSL/TLS libraries out there and we would very much like to support them as
well, to offer application authors an even wider scope of choice.
Application Angle of this Problem
libcurl is built to use one SSL/TLS library. It uses a single fixed name (by
default) on the built/created lib file, and applications are built/linked to
use that single lib. Replacing one libcurl instance with another one that
uses the other SSL/TLS library might break one or more applications (due to
ABI differences and/or different feature set). You want your application to
use the libcurl it was built for.
Project cURL Angle of this Problem
We distribute libcurl and everyone may build libcurl with either library at
their choice. This problem is not directly a problem of ours. It merely
affects users - GPL application authors only - of our lib as it comes
included and delivered on some distros.
libcurl has different ABI when built with different SSL/TLS libraries due to
these reasons:
1. No one has worked on fixing this. The mutex/lock callbacks should be set
with a generic libcurl function that should use the proper underlying
functions.
2. The CURLOPT_SSL_CTX_FUNCTION option is not possible to "emulate" on GnuTLS
but simply requires OpenSSL.
3. There might be some other subtle differences just because nobody has yet
tried to make a fixed ABI like this.
Distro Angle of this Problem
To my knowledge there is only one distro that ships libcurl built with either
OpenSSL or GnuTLS.
Debian Linux is now (since mid September 2005) providing two different
libcurl packages, one for libcurl built with OpenSSL and one built with
GnuTLS. They use different .so names and can this both be installed in a
single system simultaneously. This has been said to be a transitional system
not desired to keep in the long run.
Footnotes
[1] = http://www.xfree86.org/3.3.6/COPYRIGHT2.html#6
[2] = http://www.fsf.org/licensing/essays/bsd.html
[3] = http://www.fsf.org/licensing/licenses/gpl.html
[4] = http://curl.haxx.se/docs/copyright.html
[5] = http://www.openssl.org/source/license.html
[6] = http://www.fsf.org/licensing/licenses/gpl.html end of section 3
[7] = http://www.fsf.org/licensing/licenses/lgpl.html
[8] = http://en.wikipedia.org/wiki/OpenSSL_exception
Feedback/Updates provided by
Eric Cooper

117
docs/FAQ
View File

@ -21,7 +21,6 @@ FAQ
1.12 I have a problem who can I chat with? 1.12 I have a problem who can I chat with?
1.13 curl's ECCN number? 1.13 curl's ECCN number?
1.14 How do I submit my patch? 1.14 How do I submit my patch?
1.15 How do I port libcurl to my OS?
2. Install Related Problems 2. Install Related Problems
2.1 configure doesn't find OpenSSL even when it is installed 2.1 configure doesn't find OpenSSL even when it is installed
@ -30,7 +29,6 @@ FAQ
2.2 Does curl work/build with other SSL libraries? 2.2 Does curl work/build with other SSL libraries?
2.3 Where can I find a copy of LIBEAY32.DLL? 2.3 Where can I find a copy of LIBEAY32.DLL?
2.4 Does curl support SOCKS (RFC 1928) ? 2.4 Does curl support SOCKS (RFC 1928) ?
2.5 Install libcurl for both 32bit and 64bit?
3. Usage Problems 3. Usage Problems
3.1 curl: (1) SSL is disabled, https: not supported 3.1 curl: (1) SSL is disabled, https: not supported
@ -83,7 +81,6 @@ FAQ
4.18 file:// URLs containing drive letters (Windows, NetWare) 4.18 file:// URLs containing drive letters (Windows, NetWare)
4.19 Why doesn't cURL return an error when the network cable is unplugged? 4.19 Why doesn't cURL return an error when the network cable is unplugged?
4.20 curl doesn't return error for HTTP non-200 responses! 4.20 curl doesn't return error for HTTP non-200 responses!
4.21 Why is there a HTTP/1.1 in my HTTP/2 request?
5. libcurl Issues 5. libcurl Issues
5.1 Is libcurl thread-safe? 5.1 Is libcurl thread-safe?
@ -226,9 +223,7 @@ FAQ
implement it for you, that is not a very friendly attitude. We spend a implement it for you, that is not a very friendly attitude. We spend a
considerable time already on maintaining and developing curl. In order to considerable time already on maintaining and developing curl. In order to
get more out of us, you should consider trading in some of your time and get more out of us, you should consider trading in some of your time and
efforts in return. Simply go to the GitHub repo which resides at efforts in return.
https://github.com/curl/curl, fork the project, and create pull requests
with your proposed changes.
If you write the code, chances are bigger that it will get into curl faster. If you write the code, chances are bigger that it will get into curl faster.
@ -254,10 +249,9 @@ FAQ
We still get help from companies. Haxx provides web site, bandwidth, mailing We still get help from companies. Haxx provides web site, bandwidth, mailing
lists etc, sourceforge.net hosts project services we take advantage from, lists etc, sourceforge.net hosts project services we take advantage from,
like the bug tracker, and GitHub hosts the primary git repository at like the bug tracker and github hosts the primary git repository. Also
https://github.com/curl/curl. Also again, some companies have sponsored again, some companies have sponsored certain parts of the development in the
certain parts of the development in the past and I hope some will continue to past and I hope some will continue to do so in the future.
do so in the future.
If you want to support our project, consider a donation or a banner-program If you want to support our project, consider a donation or a banner-program
or even better: by helping us coding, documenting, testing etc. or even better: by helping us coding, documenting, testing etc.
@ -282,7 +276,7 @@ FAQ
Please do not mail any single individual unless you really need to. Keep Please do not mail any single individual unless you really need to. Keep
curl-related questions on a suitable mailing list. All available mailing curl-related questions on a suitable mailing list. All available mailing
lists are listed in the MANUAL document and online at lists are listed in the MANUAL document and online at
https://curl.haxx.se/mail/ http://curl.haxx.se/mail/
Keeping curl-related questions and discussions on mailing lists allows Keeping curl-related questions and discussions on mailing lists allows
others to join in and help, to share their ideas, contribute their others to join in and help, to share their ideas, contribute their
@ -303,7 +297,7 @@ FAQ
your curl-related problems. your curl-related problems.
We list available alternatives on the curl web site: We list available alternatives on the curl web site:
https://curl.haxx.se/support.html http://curl.haxx.se/support.html
1.10 How many are using curl? 1.10 How many are using curl?
@ -320,7 +314,7 @@ FAQ
In May 2012 Daniel did a counting game and came up with a number that may In May 2012 Daniel did a counting game and came up with a number that may
be completely wrong or somewhat accurate. Over 500 million! be completely wrong or somewhat accurate. Over 500 million!
See https://daniel.haxx.se/blog/2012/05/16/300m-users/ See http://daniel.haxx.se/blog/2012/05/16/300m-users/
1.11 Why don't you update ca-bundle.crt 1.11 Why don't you update ca-bundle.crt
@ -342,7 +336,7 @@ FAQ
If you want the most recent collection of ca certs that Mozilla Firefox If you want the most recent collection of ca certs that Mozilla Firefox
uses, we recommend that you extract the collection yourself from Mozilla uses, we recommend that you extract the collection yourself from Mozilla
Firefox (by running 'make ca-bundle), or by using our online service setup Firefox (by running 'make ca-bundle), or by using our online service setup
for this purpose: https://curl.haxx.se/docs/caextract.html for this purpose: http://curl.haxx.se/docs/caextract.html
1.12 I have a problem who can I chat with? 1.12 I have a problem who can I chat with?
@ -356,15 +350,13 @@ FAQ
cryptography. When doing so, the Export Control Classification Number (ECCN) cryptography. When doing so, the Export Control Classification Number (ECCN)
is used to identify the level of export control etc. is used to identify the level of export control etc.
Apache Software Foundation gives a good explanation of ECCNs at ASF gives a good explanation at http://www.apache.org/dev/crypto.html
https://www.apache.org/dev/crypto.html
We believe curl's number might be ECCN 5D002, another possibility is We believe curl's number might be ECCN 5D002, another possibility is
5D992. It seems necessary to write them (the authority that administers ECCN 5D992. It seems necessary to write them, asking to confirm.
numbers), asking to confirm.
Comprehensible explanations of the meaning of such numbers and how to obtain Comprehensible explanations of the meaning of such numbers and how to
them (resp.) are here obtain them (resp.) are here
http://www.bis.doc.gov/licensing/exportingbasics.htm http://www.bis.doc.gov/licensing/exportingbasics.htm
http://www.bis.doc.gov/licensing/do_i_needaneccn.html http://www.bis.doc.gov/licensing/do_i_needaneccn.html
@ -387,19 +379,6 @@ FAQ
Lots of more details are found in the CONTRIBUTE and INTERNALS docs. Lots of more details are found in the CONTRIBUTE and INTERNALS docs.
1.15 How do I port libcurl to my OS?
Here's a rough step-by-step:
1. copy a suitable lib/config-*.h file as a start to lib/config-[youros].h
2. edit lib/config-[youros].h to match your OS and setup
3. edit lib/curl_setup.h to include config-[youros].h when your OS is
detected by the preprocessor, in the style others already exist
4. compile lib/*.c and make them into a library
2. Install Related Problems 2. Install Related Problems
@ -450,7 +429,7 @@ FAQ
GnuTLS, yassl, NSS, PolarSSL, axTLS, Secure Transport (native iOS/OS X), GnuTLS, yassl, NSS, PolarSSL, axTLS, Secure Transport (native iOS/OS X),
WinSSL (native Windows) or GSKit (native IBM i). They all have their pros WinSSL (native Windows) or GSKit (native IBM i). They all have their pros
and cons, and we try to maintain a comparison of them here: and cons, and we try to maintain a comparison of them here:
https://curl.haxx.se/docs/ssl-compared.html http://curl.haxx.se/docs/ssl-compared.html
2.3 Where can I find a copy of LIBEAY32.DLL? 2.3 Where can I find a copy of LIBEAY32.DLL?
@ -465,32 +444,6 @@ FAQ
Yes, SOCKS 4 and 5 are supported. Yes, SOCKS 4 and 5 are supported.
2.5 Install libcurl for both 32bit and 64bit?
In curl's configure procedure one of the regular include files get created
with platform specific information. The file 'curl/curlbuild.h' in the
installed libcurl file tree is therefore somewhat tied to that particular
platform.
To allow applications to get built for either 32bit or 64bit you need to
install libcurl headers for both setups and unfortunately curl doesn't do
this automatically.
A commonly used procedure is this:
$ ./configure [32bit platform]
$ mv curl/curlbuild.h curl/curlbuild-32bit.h
$ ./configure [64bit platform]
$ mv curl/curlbuild.h curl/curlbuild-64bit.h
Then you make a toplevel curl/curlbuild.h replacement that only does this:
#ifdef IS_32BIT
#include "curlbuild-32bit.h"
else
#include "curlbuild-64bit.h"
#endif
3. Usage problems 3. Usage problems
@ -588,7 +541,7 @@ FAQ
Find out more about which languages that support curl directly, and how to Find out more about which languages that support curl directly, and how to
install and use them, in the libcurl section of the curl web site: install and use them, in the libcurl section of the curl web site:
https://curl.haxx.se/libcurl/ http://curl.haxx.se/libcurl/
All the various bindings to libcurl are made by other projects and people, All the various bindings to libcurl are made by other projects and people,
outside of the cURL project. The cURL project itself only produces libcurl outside of the cURL project. The cURL project itself only produces libcurl
@ -721,7 +674,7 @@ FAQ
certificate. Server certificate verification is enabled by default in curl certificate. Server certificate verification is enabled by default in curl
and libcurl and is often the reason for problems as explained in FAQ entry and libcurl and is often the reason for problems as explained in FAQ entry
4.12 and the SSLCERTS document 4.12 and the SSLCERTS document
(https://curl.haxx.se/docs/sslcerts.html). Server certificates that are (http://curl.haxx.se/docs/sslcerts.html). Server certificates that are
"self-signed" or otherwise signed by a CA that you do not have a CA cert "self-signed" or otherwise signed by a CA that you do not have a CA cert
for, cannot be verified. If the verification during a connect fails, you are for, cannot be verified. If the verification during a connect fails, you are
refused access. You then need to explicitly disable the verification to refused access. You then need to explicitly disable the verification to
@ -1012,7 +965,7 @@ FAQ
this check. this check.
Details are also in the SSLCERTS file in the release archives, found online Details are also in the SSLCERTS file in the release archives, found online
here: https://curl.haxx.se/docs/sslcerts.html here: http://curl.haxx.se/docs/sslcerts.html
4.13 Why is curl -R on Windows one hour off? 4.13 Why is curl -R on Windows one hour off?
@ -1074,7 +1027,7 @@ FAQ
timeout is set. timeout is set.
See option TcpMaxConnectRetransmissions on this page: See option TcpMaxConnectRetransmissions on this page:
https://support.microsoft.com/en-us/kb/175523/en-us http://support.microsoft.com/?scid=kb%3Ben-us%3B175523&x=6&y=7
Also, even on non-Windows systems there may run a firewall or anti-virus Also, even on non-Windows systems there may run a firewall or anti-virus
software or similar that accepts the connection but does not actually do software or similar that accepts the connection but does not actually do
@ -1091,7 +1044,7 @@ FAQ
You'll find that even if D:\blah.txt does exist, cURL returns a 'file You'll find that even if D:\blah.txt does exist, cURL returns a 'file
not found' error. not found' error.
According to RFC 1738 (https://www.ietf.org/rfc/rfc1738.txt), According to RFC 1738 (http://www.faqs.org/rfcs/rfc1738.html),
file:// URLs must contain a host component, but it is ignored by file:// URLs must contain a host component, but it is ignored by
most implementations. In the above example, 'D:' is treated as the most implementations. In the above example, 'D:' is treated as the
host component, and is taken away. Thus, cURL tries to open '/blah.txt'. host component, and is taken away. Thus, cURL tries to open '/blah.txt'.
@ -1119,7 +1072,7 @@ FAQ
In such cases, the TCP/IP stack is responsible for detecting when the In such cases, the TCP/IP stack is responsible for detecting when the
network connection is irrevocably lost. Since with some protocols it is network connection is irrevocably lost. Since with some protocols it is
perfectly legal for the client to wait indefinitely for data, the stack may perfectly legal for the client wait indefinitely for data, the stack may
never report a problem, and even when it does, it can take up to 20 minutes never report a problem, and even when it does, it can take up to 20 minutes
for it to detect an issue. The curl option --keepalive-time enables for it to detect an issue. The curl option --keepalive-time enables
keep-alive support in the TCP/IP stack which makes it periodically probe the keep-alive support in the TCP/IP stack which makes it periodically probe the
@ -1163,16 +1116,6 @@ FAQ
You can also use the -w option and the variable %{response_code} to extract You can also use the -w option and the variable %{response_code} to extract
the exact response code that was return in the response. the exact response code that was return in the response.
4.21 Why is there a HTTP/1.1 in my HTTP/2 request?
If you use verbose to see the HTTP request when you send off a HTTP/2
request, it will still say 1.1.
The reason for this is that we first generate the request to send using the
old 1.1 style and show that request in the verbose output, and then we
convert it over to the binary header-compressed HTTP/2 style. The actual
"1.1" part from that request is then not actually used in the transfer. The
binary HTTP/2 headers are not human readable.
5. libcurl Issues 5. libcurl Issues
@ -1195,13 +1138,13 @@ FAQ
If you use a OpenSSL-powered libcurl in a multi-threaded environment, you If you use a OpenSSL-powered libcurl in a multi-threaded environment, you
need to provide one or two locking functions: need to provide one or two locking functions:
https://www.openssl.org/docs/crypto/threads.html http://www.openssl.org/docs/crypto/threads.html
If you use a GnuTLS-powered libcurl in a multi-threaded environment, you If you use a GnuTLS-powered libcurl in a multi-threaded environment, you
need to provide locking function(s) for libgcrypt (which is used by GnuTLS need to provide locking function(s) for libgcrypt (which is used by GnuTLS
for the crypto functions). for the crypto functions).
https://web.archive.org/web/20111103083330/http://www.gnu.org/software/gnutls/manual/html_node/Multi_002dthreaded-applications.html http://www.gnu.org/software/gnutls/manual/html_node/Multi_002dthreaded-applications.html
No special locking is needed with a NSS-powered libcurl. NSS is thread-safe. No special locking is needed with a NSS-powered libcurl. NSS is thread-safe.
@ -1377,7 +1320,7 @@ FAQ
Also note that on many networks NATs or other IP-munging techniques are used Also note that on many networks NATs or other IP-munging techniques are used
that makes you see and use a different IP address locally than what the that makes you see and use a different IP address locally than what the
remote server will see you coming from. You may also consider using remote server will see you coming from. You may also consider using
https://www.torproject.org/ . http://www.torproject.org .
5.13 How do I stop an ongoing transfer? 5.13 How do I stop an ongoing transfer?
@ -1429,7 +1372,7 @@ FAQ
to do "LIST -a" or similar to see them. to do "LIST -a" or similar to see them.
The application thus needs to parse the LIST output. One such existing The application thus needs to parse the LIST output. One such existing
list parser is available at https://cr.yp.to/ftpparse.html Versions of list parser is available at http://cr.yp.to/ftpparse.html Versions of
libcurl since 7.21.0 also provide the ability to specify a wildcard to libcurl since 7.21.0 also provide the ability to specify a wildcard to
download multiple files from one FTP directory. download multiple files from one FTP directory.
@ -1548,7 +1491,7 @@ FAQ
notice" somewhere. Most probably like in the documentation or in the section notice" somewhere. Most probably like in the documentation or in the section
where other third party dependencies already are mentioned and acknowledged. where other third party dependencies already are mentioned and acknowledged.
As can be seen here: https://curl.haxx.se/docs/companies.html and elsewhere, As can be seen here: http://curl.haxx.se/docs/companies.html and elsewhere,
more and more companies are discovering the power of libcurl and take more and more companies are discovering the power of libcurl and take
advantage of it even in commercial environments. advantage of it even in commercial environments.
@ -1568,7 +1511,9 @@ FAQ
7.2 Who wrote PHP/CURL? 7.2 Who wrote PHP/CURL?
PHP/CURL was initially written by Sterling Hughes. PHP/CURL is a module that comes with the regular PHP package. It depends and
uses libcurl, so you need to have libcurl installed properly first before
PHP/CURL can be used. PHP/CURL was initially written by Sterling Hughes.
7.3 Can I perform multiple requests using the same handle? 7.3 Can I perform multiple requests using the same handle?
@ -1577,10 +1522,4 @@ FAQ
unknown to me). unknown to me).
After a transfer, you just set new options in the handle and make another After a transfer, you just set new options in the handle and make another
transfer. This will make libcurl re-use the same connection if it can. transfer. This will make libcurl to re-use the same connection if it can.
7.4 Does PHP/CURL have dependencies?
PHP/CURL is a module that comes with the regular PHP package. It depends on
and uses libcurl, so you need to have libcurl installed properly before
PHP/CURL can be used.

View File

@ -65,7 +65,7 @@ OpenSSL took over where SSLeay was abandoned.
May, first Debian package. May, first Debian package.
August, LDAP:// and FILE:// support added. The curl web site gets 1300 visits August, LDAP:// and FILE:// support added. The curl web site gets 1300 visits
weekly. Moved site to curl.haxx.nu. weekly.
Released curl 6.0 in September. 15000 lines of code. Released curl 6.0 in September. 15000 lines of code.
@ -81,8 +81,6 @@ the easy interface and turned out to be the beginning of actually getting
other software and programs to get based on and powered by libcurl. Almost other software and programs to get based on and powered by libcurl. Almost
20000 lines of code. 20000 lines of code.
June 2000: the curl site moves to "curl.haxx.se"
August, the curl web site gets 4000 visits weekly. August, the curl web site gets 4000 visits weekly.
The PHP guys adopted libcurl already the same month, when the first ever third The PHP guys adopted libcurl already the same month, when the first ever third

View File

@ -1,4 +1,4 @@
Updated: July 3, 2012 (https://curl.haxx.se/docs/http-cookies.html) Updated: July 3, 2012 (http://curl.haxx.se/docs/http-cookies.html)
_ _ ____ _ _ _ ____ _
___| | | | _ \| | ___| | | | _ \| |
/ __| | | | |_) | | / __| | | | |_) | |
@ -34,9 +34,9 @@ HTTP Cookies
servers with the Cookie: header. servers with the Cookie: header.
For a very long time, the only spec explaining how to use cookies was the For a very long time, the only spec explaining how to use cookies was the
original Netscape spec from 1994: https://curl.haxx.se/rfc/cookie_spec.html original Netscape spec from 1994: http://curl.haxx.se/rfc/cookie_spec.html
In 2011, RFC6265 (https://www.ietf.org/rfc/rfc6265.txt) was finally published In 2011, RFC6265 (http://www.ietf.org/rfc/rfc6265.txt) was finally published
and details how cookies work within HTTP. and details how cookies work within HTTP.
1.2 Cookies saved to disk 1.2 Cookies saved to disk

View File

@ -1,111 +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, NSS, GnutTLS or PolarSSL with a new enough version
[nghttp2](https://nghttp2.org/)
-------------------------------
libcurl uses this 3rd party library for the low level protocol handling
parts. The reason for this is that HTTP/2 is much more complex at that layer
than HTTP/1.1 (which we implement on our own) and that nghttp2 is an already
existing and well functional library.
We require at least version 1.0.0.
Over an http:// URL
-------------------
If `CURLOPT_HTTP_VERSION` is set to `CURL_HTTP_VERSION_2_0`, libcurl will
include an upgrade header in the initial request to the host to allow
upgrading to HTTP/2.
Possibly we can later introduce an option that will cause libcurl to fail if
not possible to upgrade. Possibly we introduce an option that makes libcurl
use HTTP/2 at once over http://
Over an https:// URL
--------------------
If `CURLOPT_HTTP_VERSION` is set to `CURL_HTTP_VERSION_2_0`, libcurl will use
ALPN (or NPN) to negotiate which protocol to continue with. Possibly introduce
an option that will cause libcurl to fail if not possible to use HTTP/2.
`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
- NSS: ALPN and NPN
- GnuTLS: ALPN
- PolarSSL: ALPN
Multiplexing
------------
Starting in 7.43.0, libcurl fully supports HTTP/2 multiplexing, which is the
term for doing multiple independent transfers over the same physical TCP
connection.
To take advantage of multiplexing, you need to use the multi interface and set
`CURLMOPT_PIPELINING` to `CURLPIPE_MULTIPLEX`. With that bit set, libcurl will
attempt to re-use existing HTTP/2 connections and just add a new stream over
that when doing subsequent parallel requests.
While libcurl sets up a connection to a HTTP server there is a period during
which it doesn't know if it can pipeline or do multiplexing and if you add new
transfers in that period, libcurl will default to start new connections for
those transfers. With the new option `CURLOPT_PIPEWAIT` (added in 7.43.0), you
can ask that a transfer should rather wait and see in case there's a
connection for the same host in progress that might end up being possible to
multiplex on. It favours keeping the number of connections low to the cost of
slightly longer time to first byte transferred.
Applications
------------
We hide HTTP/2's binary nature and convert received HTTP/2 traffic to headers
in HTTP 1.1 style. This allows applications to work unmodified.
curl tool
---------
curl offers the `--http2` command line option to enable use of HTTP/2.
Since 7.47.0, the curl tool enables HTTP/2 by default for HTTPS connections.
HTTP Alternative Services
-------------------------
Alt-Svc is a suggested extension with a corresponding frame (ALTSVC) in HTTP/2
that tells the client about an alternative "route" to the same content for the
same origin server that you get the response from. A browser or long-living
client can use that hint to create a new connection asynchronously. For
libcurl, we may introduce a way to bring such clues to the applicaton and/or
let a subsequent request use the alternate route
automatically. [Spec](https://tools.ietf.org/html/draft-ietf-httpbis-alt-svc-14)
TODO
----
- Implement "prior-knowledge" HTTP/2 connections over clear text so that
curl can connect with HTTP/2 at once without 1.1+Upgrade.

View File

@ -173,13 +173,13 @@ Win32
advice given above. advice given above.
KB94248 - How To Use the C Run-Time KB94248 - How To Use the C Run-Time
https://support.microsoft.com/kb/94248/en-us http://support.microsoft.com/kb/94248/en-us
KB140584 - How to link with the correct C Run-Time (CRT) library KB140584 - How to link with the correct C Run-Time (CRT) library
https://support.microsoft.com/kb/140584/en-us http://support.microsoft.com/kb/140584/en-us
KB190799 - Potential Errors Passing CRT Objects Across DLL Boundaries KB190799 - Potential Errors Passing CRT Objects Across DLL Boundaries
https://msdn.microsoft.com/en-us/library/ms235460 http://msdn.microsoft.com/en-us/library/ms235460
If your app is misbehaving in some strange way, or it is suffering If your app is misbehaving in some strange way, or it is suffering
from memory corruption, before asking for further help, please try from memory corruption, before asking for further help, please try
@ -209,8 +209,8 @@ Win32
environment variables, for example: environment variables, for example:
set ZLIB_PATH=c:\zlib-1.2.8 set ZLIB_PATH=c:\zlib-1.2.8
set OPENSSL_PATH=c:\openssl-1.0.2c set OPENSSL_PATH=c:\openssl-0.9.8zc
set LIBSSH2_PATH=c:\libssh2-1.6.0 set LIBSSH2_PATH=c:\libssh2-1.4.3
ATTENTION: if you want to build with libssh2 support you have to use latest ATTENTION: if you want to build with libssh2 support you have to use latest
version 0.17 - previous versions will NOT work with 7.17.0 and later! version 0.17 - previous versions will NOT work with 7.17.0 and later!
@ -232,7 +232,7 @@ Win32
- optional MingW32-built OpenLDAP SDK available from: - optional MingW32-built OpenLDAP SDK available from:
http://www.gknw.net/mirror/openldap/ http://www.gknw.net/mirror/openldap/
- optional recent Novell CLDAP SDK available from: - optional recent Novell CLDAP SDK available from:
https://www.novell.com/developer/ndk/ldap_libraries_for_c.html http://developer.novell.com/ndk/cldap.htm
Cygwin Cygwin
------ ------
@ -254,7 +254,7 @@ Win32
If you use MSVC 6 it is required that you use the February 2003 edition of If you use MSVC 6 it is required that you use the February 2003 edition of
the 'Platform SDK' which can be downloaded from: the 'Platform SDK' which can be downloaded from:
https://www.microsoft.com/en-us/download/details.aspx?id=12261 http://www.microsoft.com/en-us/download/details.aspx?id=12261
Building any software with MSVC 6 without having PSDK installed is just Building any software with MSVC 6 without having PSDK installed is just
asking for trouble down the road once you have released it, you might notice asking for trouble down the road once you have released it, you might notice
@ -263,7 +263,7 @@ Win32
software built in such way will at some point regret having done so. software built in such way will at some point regret having done so.
If the compiler has been updated with the installation of a service pack as If the compiler has been updated with the installation of a service pack as
those mentioned in https://support.microsoft.com/kb/194022 the compiler can be those mentioned in http://support.microsoft.com/kb/194022 the compiler can be
safely used to read source code, translate and make it object code. safely used to read source code, translate and make it object code.
But, even with the service packs mentioned above installed, the resulting But, even with the service packs mentioned above installed, the resulting
@ -299,7 +299,7 @@ Win32
Then run 'nmake vc' in curl's root directory. Then run 'nmake vc' in curl's root directory.
If you want to compile with zlib support, you will need to build If you want to compile with zlib support, you will need to build
zlib (http://www.zlib.net/) as well. Please read the zlib zlib (http://www.gzip.org/zlib/) as well. Please read the zlib
documentation on how to compile zlib. Define the ZLIB_PATH environment documentation on how to compile zlib. Define the ZLIB_PATH environment
variable to the location of zlib.h and zlib.lib, for example: variable to the location of zlib.h and zlib.lib, for example:
@ -471,15 +471,6 @@ Win32
add '-DCURL_STATICLIB' to your CFLAGS. Otherwise the linker will look for add '-DCURL_STATICLIB' to your CFLAGS. Otherwise the linker will look for
dynamic import symbols. dynamic import symbols.
Legacy Windows and SSL
----------------------
WinSSL (specifically SChannel from Windows SSPI), is the native SSL library
in Windows. However, WinSSL 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 Mac OS X Apple iOS and Mac OS X
====================== ======================
@ -674,10 +665,12 @@ NetWare
- gnu make and awk running on the platform you compile on; - gnu make and awk running on the platform you compile on;
native Win32 versions can be downloaded from: native Win32 versions can be downloaded from:
http://www.gknw.net/development/prgtools/ http://www.gknw.net/development/prgtools/
- recent Novell LibC or Novell CLib SDK available from: - recent Novell LibC SDK available from:
https://www.novell.com/developer/ndk/ http://developer.novell.com/ndk/libc.htm
- or recent Novell CLib SDK available from:
http://developer.novell.com/ndk/clib.htm
- optional recent Novell CLDAP SDK available from: - optional recent Novell CLDAP SDK available from:
https://www.novell.com/developer/ndk/ldap_libraries_for_c.html http://developer.novell.com/ndk/cldap.htm
- optional zlib sources (static or dynamic linking with zlib.imp); - optional zlib sources (static or dynamic linking with zlib.imp);
sources with NetWare Makefile can be obtained from: sources with NetWare Makefile can be obtained from:
http://www.gknw.net/mirror/zlib/ http://www.gknw.net/mirror/zlib/
@ -706,7 +699,7 @@ NetWare
Builds automatically created 8 times a day from current git are here: Builds automatically created 8 times a day from current git are here:
http://www.gknw.net/mirror/curl/autobuilds/ http://www.gknw.net/mirror/curl/autobuilds/
the status of these builds can be viewed at the autobuild table: the status of these builds can be viewed at the autobuild table:
https://curl.haxx.se/dev/builds.html http://curl.haxx.se/dev/builds.html
eCos eCos
==== ====
@ -832,7 +825,7 @@ VxWorks
To build libcurl for VxWorks you need: To build libcurl for VxWorks you need:
- CYGWIN (free, https://cygwin.com/) - CYGWIN (free, http://cygwin.com/)
- Wind River Workbench (commercial) - Wind River Workbench (commercial)
If you have CYGWIN and Workbench installed on you machine If you have CYGWIN and Workbench installed on you machine
@ -950,10 +943,9 @@ REDUCING SIZE
important factor. First, be sure to set the CFLAGS variable when important factor. First, be sure to set the CFLAGS variable when
configuring with any relevant compiler optimization flags to reduce the configuring with any relevant compiler optimization flags to reduce the
size of the binary. For gcc, this would mean at minimum the -Os option, 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, and potentially the -march=X and -mdynamic-no-pic options as well, e.g.
e.g.
./configure CFLAGS='-Os' LDFLAGS='-Wl,-Bsymbolic'... ./configure CFLAGS='-Os' ...
Note that newer compilers often produce smaller code than older versions Note that newer compilers often produce smaller code than older versions
due to improved optimization. due to improved optimization.
@ -971,9 +963,7 @@ REDUCING SIZE
--disable-ipv6 (disables support for IPv6) --disable-ipv6 (disables support for IPv6)
--disable-manual (disables support for the built-in documentation) --disable-manual (disables support for the built-in documentation)
--disable-proxy (disables support for HTTP and SOCKS proxies) --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-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) --enable-hidden-symbols (eliminates unneeded symbols in the shared library)
--without-libidn (disables support for the libidn DNS library) --without-libidn (disables support for the libidn DNS library)
--without-librtmp (disables support for RTMP) --without-librtmp (disables support for RTMP)
@ -986,7 +976,7 @@ REDUCING SIZE
configure command-line, e.g. configure command-line, e.g.
CFLAGS="-Os -ffunction-sections -fdata-sections \ CFLAGS="-Os -ffunction-sections -fdata-sections \
-fno-unwind-tables -fno-asynchronous-unwind-tables -flto" \ -fno-unwind-tables -fno-asynchronous-unwind-tables" \
LDFLAGS="-Wl,-s -Wl,-Bsymbolic -Wl,--gc-sections" LDFLAGS="-Wl,-s -Wl,-Bsymbolic -Wl,--gc-sections"
Be sure also to strip debugging symbols from your binaries after Be sure also to strip debugging symbols from your binaries after
@ -996,9 +986,9 @@ REDUCING SIZE
.comment section). .comment section).
Using these techniques it is possible to create a basic HTTP-only shared Using these techniques it is possible to create a basic HTTP-only shared
libcurl library for i386 Linux platforms that is only 109 KiB in size, and libcurl library for i386 Linux platforms that is only 114 KiB in size, and
an FTP-only library that is 109 KiB in size (as of libcurl version 7.45.0, an FTP-only library that is 115 KiB in size (as of libcurl version 7.35.0,
using gcc 4.9.2). using gcc 4.8.2).
You may find that statically linking libcurl to your application will You may find that statically linking libcurl to your application will
result in a lower total size than dynamically linking. result in a lower total size than dynamically linking.
@ -1096,18 +1086,18 @@ Useful URLs
axTLS http://axtls.sourceforge.net/ axTLS http://axtls.sourceforge.net/
c-ares http://c-ares.haxx.se/ c-ares http://c-ares.haxx.se/
GNU GSS https://www.gnu.org/software/gss/ GNU GSS http://www.gnu.org/software/gss/
GnuTLS https://www.gnu.org/software/gnutls/ GnuTLS http://www.gnu.org/software/gnutls/
Heimdal http://www.h5l.org/ Heimdal http://www.pdc.kth.se/heimdal/
libidn https://www.gnu.org/software/libidn/ libidn http://www.gnu.org/software/libidn/
libmetalink https://launchpad.net/libmetalink/ libmetalink https://launchpad.net/libmetalink/
libssh2 http://www.libssh2.org/ libssh2 http://www.libssh2.org/
MIT Kerberos http://web.mit.edu/kerberos/www/dist/ MIT Kerberos http://web.mit.edu/kerberos/www/dist/
NSS https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS NSS http://www.mozilla.org/projects/security/pki/nss/
OpenLDAP http://www.openldap.org/ OpenLDAP http://www.openldap.org/
OpenSSL https://www.openssl.org/ OpenSSL http://www.openssl.org/
PolarSSL https://tls.mbed.org/ PolarSSL http://polarssl.org/
wolfSSL https://www.wolfssl.com/wolfSSL/ yassl http://www.yassl.com/
Zlib http://www.zlib.net/ Zlib http://www.zlib.net/
MingW http://www.mingw.org/ MingW http://www.mingw.org/

View File

@ -95,7 +95,7 @@ install instructions may produce erratic behaviour in DevCpp. For further info
check the following sites check the following sites
http://aditsu.freeunixhost.com/dev-cpp-faq.html http://aditsu.freeunixhost.com/dev-cpp-faq.html
https://sourceforge.net/p/dev-cpp/discussion/48211/thread/2a85ea46 http://sourceforge.net/forum/message.php?msg_id=3252213
As I have mentioned before I will confine this to the SSL Library compilations As I have mentioned before I will confine this to the SSL Library compilations
but the process is very similar for compilation of the executable - curl.exe; but the process is very similar for compilation of the executable - curl.exe;
@ -248,7 +248,7 @@ SSL Files
openssl-0.9.7e-win32-bin.zip for the minimalist package of the openssl-0.9.7e openssl-0.9.7e-win32-bin.zip for the minimalist package of the openssl-0.9.7e
binaries ported to MS Windows 95/98/NT/XP using the MingW32/GCC-3.1 binaries ported to MS Windows 95/98/NT/XP using the MingW32/GCC-3.1
development environment. The file may be downloaded at development environment. The file may be downloaded at
https://curl.haxx.se/download/. http://curl.haxx.se/download/.
2- Open the above zip file. You will find two files - SDL.dll, 2- Open the above zip file. You will find two files - SDL.dll,
SDL_mixer.dll. Install them in the directory C:\WINDOWS\SYSTEM32 for Win 9x SDL_mixer.dll. Install them in the directory C:\WINDOWS\SYSTEM32 for Win 9x

File diff suppressed because it is too large Load Diff

View File

@ -3,36 +3,6 @@ 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 changelog of the current development status, as one or more of these problems
may have been fixed since this was written! may have been fixed since this was written!
93. 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
92. curl tool 7.47.1 in Windows will not --output to literal paths \\?\ or to
reserved dos device names unless the device prefix \\.\ is used. To send
output to a device that has a reserved dos device name you can use the
Windows device prefix (eg: --output \\.\NUL). You can also use the
redirection operator to send output to a literal path or a reserved device
name (eg: > NUL).
The next release of curl will support --output in Windows to literal paths
and to reserved device names without the device prefix.
https://github.com/curl/curl/commit/c3aac48
https://github.com/curl/curl/commit/4fc80f3
91. "curl_easy_perform hangs with imap and PolarSSL"
https://github.com/curl/curl/issues/334
90. 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
89. Disabling HTTP Pipelining when there are ongoing transfers can lead to
heap corruption and crash. https://curl.haxx.se/bug/view.cgi?id=1411
88. libcurl doesn't support CURLINFO_FILETIME for SFTP transfers and thus 88. libcurl doesn't support CURLINFO_FILETIME for SFTP transfers and thus
curl's -R option also doesn't work then. curl's -R option also doesn't work then.
@ -42,7 +12,7 @@ may have been fixed since this was written!
mention that decoding also means that we need to check for nastiness that is 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 attempted, like "../" sequences and the like. Probably everything to the left
of any embedded slashes should be cut off. of any embedded slashes should be cut off.
https://curl.haxx.se/bug/view.cgi?id=1294 http://curl.haxx.se/bug/view.cgi?id=1294
86. The disconnect commands (LOGOUT and QUIT) may not be sent by IMAP, POP3 86. 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 and SMTP if a failure occurs during the authentication phase of a
@ -53,8 +23,7 @@ may have been fixed since this was written!
CURLINFO_STARTTRANSFER_TIME is wrong. While using POST CURLINFO_STARTTRANSFER_TIME is wrong. While using POST
CURLINFO_STARTTRANSFER_TIME minus CURLINFO_PRETRANSFER_TIME is near to zero CURLINFO_STARTTRANSFER_TIME minus CURLINFO_PRETRANSFER_TIME is near to zero
every time. every time.
https://github.com/curl/curl/issues/218 http://curl.haxx.se/bug/view.cgi?id=1213
https://curl.haxx.se/bug/view.cgi?id=1213
84. CURLINFO_SSL_VERIFYRESULT is only implemented for the OpenSSL and NSS 84. CURLINFO_SSL_VERIFYRESULT is only implemented for the OpenSSL and NSS
backends, so relying on this information in a generic app is flaky. backends, so relying on this information in a generic app is flaky.
@ -62,57 +31,67 @@ may have been fixed since this was written!
82. When building with the Windows Borland compiler, it fails because the 82. When building with the Windows Borland compiler, it fails because the
"tlib" tool doesn't support hyphens (minus signs) in file names and we have "tlib" tool doesn't support hyphens (minus signs) in file names and we have
such in the build. such in the build.
https://curl.haxx.se/bug/view.cgi?id=1222 http://curl.haxx.se/bug/view.cgi?id=1222
81. When using -J (with -O), automatically resumed downloading together with 81. When using -J (with -O), automatically resumed downloading together with
"-C -" fails. Without -J the same command line works! This happens because "-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 the resume logic is worked out before the target file name (and thus its
pre-transfer size) has been figured out! pre-transfer size) has been figured out!
https://curl.haxx.se/bug/view.cgi?id=1169 http://curl.haxx.se/bug/view.cgi?id=1169
80. Curl doesn't recognize certificates in DER format in keychain, but it 80. Curl doesn't recognize certificates in DER format in keychain, but it
works with PEM. works with PEM.
https://curl.haxx.se/bug/view.cgi?id=1065 http://curl.haxx.se/bug/view.cgi?id=1065
79. SMTP. When sending data to multiple recipients, curl will abort and return 79. SMTP. When sending data to multiple recipients, curl will abort and return
failure if one of the recipients indicate failure (on the "RCPT TO" failure if one of the recipients indicate failure (on the "RCPT TO"
command). Ordinary mail programs would proceed and still send to the ones command). Ordinary mail programs would proceed and still send to the ones
that can receive data. This is subject for change in the future. that can receive data. This is subject for change in the future.
https://curl.haxx.se/bug/view.cgi?id=1116 http://curl.haxx.se/bug/view.cgi?id=1116
78. curl and libcurl don't always signal the client properly when "sending"
zero bytes files - it makes for example the command line client not creating
any file at all. Like when using FTP.
http://curl.haxx.se/bug/view.cgi?id=1063
76. The SOCKET type in Win64 is 64 bits large (and thus so is curl_socket_t on
that platform), and long is only 32 bits. It makes it impossible for
curl_easy_getinfo() to return a socket properly with the CURLINFO_LASTSOCKET
option as for all other operating systems.
75. NTLM authentication involving unicode user name or password only works 75. NTLM authentication involving unicode user name or password only works
properly if built with UNICODE defined together with the WinSSL/schannel properly if built with UNICODE defined together with the WinSSL/schannel
backend. The original problem was mentioned in: backend. The original problem was mentioned in:
https://curl.haxx.se/mail/lib-2009-10/0024.html http://curl.haxx.se/mail/lib-2009-10/0024.html
https://curl.haxx.se/bug/view.cgi?id=896 http://curl.haxx.se/bug/view.cgi?id=896
The WinSSL/schannel version verified to work as mentioned in The WinSSL/schannel version verified to work as mentioned in
https://curl.haxx.se/mail/lib-2012-07/0073.html http://curl.haxx.se/mail/lib-2012-07/0073.html
73. if a connection is made to a FTP server but the server then just never 73. 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 sends the 220 response or otherwise is dead slow, libcurl will not
acknowledge the connection timeout during that phase but only the "real" acknowledge the connection timeout during that phase but only the "real"
timeout - which may surprise users as it is probably considered to be the 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: connect phase to most people. Brought up (and is being misunderstood) in:
https://curl.haxx.se/bug/view.cgi?id=856 http://curl.haxx.se/bug/view.cgi?id=856
72. "Pausing pipeline problems." 72. "Pausing pipeline problems."
https://curl.haxx.se/mail/lib-2009-07/0214.html http://curl.haxx.se/mail/lib-2009-07/0214.html
70. Problem re-using easy handle after call to curl_multi_remove_handle 70. Problem re-using easy handle after call to curl_multi_remove_handle
https://curl.haxx.se/mail/lib-2009-07/0249.html http://curl.haxx.se/mail/lib-2009-07/0249.html
68. "More questions about ares behavior". 68. "More questions about ares behavior".
https://curl.haxx.se/mail/lib-2009-08/0012.html http://curl.haxx.se/mail/lib-2009-08/0012.html
67. When creating multipart formposts. The file name part can be encoded with 67. When creating multipart formposts. The file name part can be encoded with
something beyond ascii but currently libcurl will only pass in the verbatim something beyond ascii but currently libcurl will only pass in the verbatim
string the app provides. There are several browsers that already do this string the app provides. There are several browsers that already do this
encoding. The key seems to be the updated draft to RFC2231: encoding. The key seems to be the updated draft to RFC2231:
https://tools.ietf.org/html/draft-reschke-rfc2231-in-http-02 http://tools.ietf.org/html/draft-reschke-rfc2231-in-http-02
66. When using telnet, the time limitation options don't work. 66. When using telnet, the time limitation options don't work.
https://curl.haxx.se/bug/view.cgi?id=846 http://curl.haxx.se/bug/view.cgi?id=846
65. When doing FTP over a socks proxy or CONNECT through HTTP proxy and the 65. 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 multi interface is used, libcurl will fail if the (passive) TCP connection
@ -123,27 +102,27 @@ may have been fixed since this was written!
63. When CURLOPT_CONNECT_ONLY is used, the handle cannot reliably be re-used 63. When CURLOPT_CONNECT_ONLY is used, the handle cannot reliably be re-used
for any further requests or transfers. The work-around is then to close that for any further requests or transfers. The work-around is then to close that
handle with curl_easy_cleanup() and create a new. Some more details: handle with curl_easy_cleanup() and create a new. Some more details:
https://curl.haxx.se/mail/lib-2009-04/0300.html http://curl.haxx.se/mail/lib-2009-04/0300.html
61. If an upload using Expect: 100-continue receives an HTTP 417 response, 61. If an upload using Expect: 100-continue receives an HTTP 417 response,
it ought to be automatically resent without the Expect:. A workaround is it ought to be automatically resent without the Expect:. A workaround is
for the client application to redo the transfer after disabling Expect:. for the client application to redo the transfer after disabling Expect:.
https://curl.haxx.se/mail/archive-2008-02/0043.html http://curl.haxx.se/mail/archive-2008-02/0043.html
60. libcurl closes the connection if an HTTP 401 reply is received while it 60. libcurl closes the connection if an HTTP 401 reply is received while it
is waiting for the the 100-continue response. is waiting for the the 100-continue response.
https://curl.haxx.se/mail/lib-2008-08/0462.html http://curl.haxx.se/mail/lib-2008-08/0462.html
58. It seems sensible to be able to use CURLOPT_NOBODY and 58. 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 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 not working: http://curl.haxx.se/mail/lib-2008-07/0295.html
56. When libcurl sends CURLOPT_POSTQUOTE commands when connected to a SFTP 56. When libcurl sends CURLOPT_POSTQUOTE commands when connected to a SFTP
server using the multi interface, the commands are not being sent correctly server using the multi interface, the commands are not being sent correctly
and instead the connection is "cancelled" (the operation is considered done) and instead the connection is "cancelled" (the operation is considered done)
prematurely. There is a half-baked (busy-looping) patch provided in the bug prematurely. There is a half-baked (busy-looping) patch provided in the bug
report but it cannot be accepted as-is. See report but it cannot be accepted as-is. See
https://curl.haxx.se/bug/view.cgi?id=748 http://curl.haxx.se/bug/view.cgi?id=748
55. libcurl fails to build with MIT Kerberos for Windows (KfW) due to KfW's 55. 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 library header files exporting symbols/macros that should be kept private
@ -152,13 +131,13 @@ may have been fixed since this was written!
52. Gautam Kachroo's issue that identifies a problem with the multi interface 52. Gautam Kachroo's issue that identifies a problem with the multi interface
where a connection can be re-used without actually being properly where a connection can be re-used without actually being properly
SSL-negotiated: SSL-negotiated:
https://curl.haxx.se/mail/lib-2008-01/0277.html http://curl.haxx.se/mail/lib-2008-01/0277.html
49. If using --retry and the transfer timeouts (possibly due to using -m or 49. 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 -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 downloaded in the previous attempt but will truncate and restart at the
original position where it was at before the previous failed attempt. See 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 http://curl.haxx.se/mail/lib-2008-01/0080.html and Mandriva bug report
https://qa.mandriva.com/show_bug.cgi?id=22565 https://qa.mandriva.com/show_bug.cgi?id=22565
48. If a CONNECT response-headers are larger than BUFSIZE (16KB) when the 48. If a CONNECT response-headers are larger than BUFSIZE (16KB) when the
@ -167,25 +146,25 @@ may have been fixed since this was written!
protocol code. This should be very rare. protocol code. This should be very rare.
43. There seems to be a problem when connecting to the Microsoft telnet server. 43. There seems to be a problem when connecting to the Microsoft telnet server.
https://curl.haxx.se/bug/view.cgi?id=649 http://curl.haxx.se/bug/view.cgi?id=649
41. When doing an operation over FTP that requires the ACCT command (but not 41. 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 when logging in), the operation will fail since libcurl doesn't detect this
and thus fails to issue the correct command: and thus fails to issue the correct command:
https://curl.haxx.se/bug/view.cgi?id=635 http://curl.haxx.se/bug/view.cgi?id=635
39. Steffen Rumler's Race Condition in Curl_proxyCONNECT: 39. Steffen Rumler's Race Condition in Curl_proxyCONNECT:
https://curl.haxx.se/mail/lib-2007-01/0045.html http://curl.haxx.se/mail/lib-2007-01/0045.html
38. Kumar Swamy Bhatt's problem in ftp/ssl "LIST" operation: 38. Kumar Swamy Bhatt's problem in ftp/ssl "LIST" operation:
https://curl.haxx.se/mail/lib-2007-01/0103.html http://curl.haxx.se/mail/lib-2007-01/0103.html
35. Both SOCKS5 and SOCKS4 proxy connections are done blocking, which is very 35. Both SOCKS5 and SOCKS4 proxy connections are done blocking, which is very
bad when used with the multi interface. bad when used with the multi interface.
34. The SOCKS4 connection codes don't properly acknowledge (connect) timeouts. 34. The SOCKS4 connection codes don't properly acknowledge (connect) timeouts.
Also see #12. According to bug #1556528, even the SOCKS5 connect code does Also see #12. According to bug #1556528, even the SOCKS5 connect code does
not do it right: https://curl.haxx.se/bug/view.cgi?id=604 not do it right: http://curl.haxx.se/bug/view.cgi?id=604
31. "curl-config --libs" will include details set in LDFLAGS when configure is 31. "curl-config --libs" will include details set in LDFLAGS when configure is
run that might be needed only for building libcurl. Further, curl-config run that might be needed only for building libcurl. Further, curl-config
@ -193,7 +172,7 @@ may have been fixed since this was written!
26. NTLM authentication using SSPI (on Windows) when (lib)curl is running in 26. 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 "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 to what winhttp does. See http://curl.haxx.se/bug/view.cgi?id=535
23. SOCKS-related problems: 23. SOCKS-related problems:
B) libcurl doesn't support FTPS over a SOCKS proxy. B) libcurl doesn't support FTPS over a SOCKS proxy.
@ -239,8 +218,8 @@ may have been fixed since this was written!
10. To get HTTP Negotiate (SPNEGO) authentication to work fine, you need to 10. To get HTTP Negotiate (SPNEGO) authentication to work fine, you need to
provide a (fake) user name (this concerns both curl and the lib) because the 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. code wrongly only considers authentication if there's a user name provided.
https://curl.haxx.se/bug/view.cgi?id=440 How? http://curl.haxx.se/bug/view.cgi?id=440 How?
https://curl.haxx.se/mail/lib-2004-08/0182.html http://curl.haxx.se/mail/lib-2004-08/0182.html
8. Doing resumed upload over HTTP does not work with '-C -', because curl 8. Doing resumed upload over HTTP does not work with '-C -', because curl
doesn't do a HEAD first to get the initial size. This needs to be done doesn't do a HEAD first to get the initial size. This needs to be done
@ -256,4 +235,14 @@ may have been fixed since this was written!
5. libcurl doesn't treat the content-length of compressed data properly, as 5. libcurl doesn't treat the content-length of compressed data properly, as
it seems HTTP servers send the *uncompressed* length in that header and it seems HTTP servers send the *uncompressed* length in that header and
libcurl thinks of it as the *compressed* length. Some explanations are here: libcurl thinks of it as the *compressed* length. Some explanations are here:
https://curl.haxx.se/mail/lib-2003-06/0146.html http://curl.haxx.se/mail/lib-2003-06/0146.html
2. If a HTTP server responds to a HEAD request and includes a body (thus
violating the RFC2616), curl won't wait to read the response but just stop
reading and return back. If a second request (let's assume a GET) is then
immediately made to the same server again, the connection will be re-used
fine of course, and the second request will be sent off but when the
response is to get read, the previous response-body is what curl will read
and havoc is what happens.
More details on this is found in this libcurl mailing list thread:
http://curl.haxx.se/mail/lib-2002-08/0000.html

245
docs/LIBCURL-STRUCTS Normal file
View File

@ -0,0 +1,245 @@
_ _ ____ _
___| | | | _ \| |
/ __| | | | |_) | |
| (__| |_| | _ <| |___
\___|\___/|_| \_\_____|
Structs in libcurl
This document should cover 7.32.0 pretty accurately, but will make sense even
for older and later versions as things don't change drastically that often.
1. The main structs in libcurl
1.1 SessionHandle
1.2 connectdata
1.3 Curl_multi
1.4 Curl_handler
1.5 conncache
1.6 Curl_share
1.7 CookieInfo
==============================================================================
1. The main structs in libcurl
1.1 SessionHandle
The SessionHandle handle struct is the one returned to the outside in the
external API as a "CURL *". This is usually known as an easy handle in API
documentations and examples.
Information and state that is related to the actual connection is in the
'connectdata' struct. When a transfer is about to be made, libcurl will
either create a new connection or re-use an existing one. The particular
connectdata that is used by this handle is pointed out by
SessionHandle->easy_conn.
Data and information that regard this particular single transfer is put in
the SingleRequest sub-struct.
When the SessionHandle struct is added to a multi handle, as it must be in
order to do any transfer, the ->multi member will point to the Curl_multi
struct it belongs to. The ->prev and ->next members will then be used by the
multi code to keep a linked list of SessionHandle structs that are added to
that same multi handle. libcurl always uses multi so ->multi *will* point to
a Curl_multi when a transfer is in progress.
->mstate is the multi state of this particular SessionHandle. When
multi_runsingle() is called, it will act on this handle according to which
state it is in. The mstate is also what tells which sockets to return for a
specific SessionHandle when curl_multi_fdset() is called etc.
The libcurl source code generally use the name 'data' for the variable that
points to the SessionHandle.
1.2 connectdata
A general idea in libcurl is to keep connections around in a connection
"cache" after they have been used in case they will be used again and then
re-use an existing one instead of creating a new as it creates a significant
performance boost.
Each 'connectdata' identifies a single physical connection to a server. If
the connection can't be kept alive, the connection will be closed after use
and then this struct can be removed from the cache and freed.
Thus, the same SessionHandle can be used multiple times and each time select
another connectdata struct to use for the connection. Keep this in mind, as
it is then important to consider if options or choices are based on the
connection or the SessionHandle.
Functions in libcurl will assume that connectdata->data points to the
SessionHandle that uses this connection.
As a special complexity, some protocols supported by libcurl require a
special disconnect procedure that is more than just shutting down the
socket. It can involve sending one or more commands to the server before
doing so. Since connections are kept in the connection cache after use, the
original SessionHandle may no longer be around when the time comes to shut
down a particular connection. For this purpose, libcurl holds a special
dummy 'closure_handle' SessionHandle in the Curl_multi struct to
FTP uses two TCP connections for a typical transfer but it keeps both in
this single struct and thus can be considered a single connection for most
internal concerns.
The libcurl source code generally use the name 'conn' for the variable that
points to the connectdata.
1.3 Curl_multi
Internally, the easy interface is implemented as a wrapper around multi
interface functions. This makes everything multi interface.
Curl_multi is the multi handle struct exposed as "CURLM *" in external APIs.
This struct holds a list of SessionHandle structs that have been added to
this handle with curl_multi_add_handle(). The start of the list is ->easyp
and ->num_easy is a counter of added SessionHandles.
->msglist is a linked list of messages to send back when
curl_multi_info_read() is called. Basically a node is added to that list
when an individual SessionHandle's transfer has completed.
->hostcache points to the name cache. It is a hash table for looking up name
to IP. The nodes have a limited life time in there and this cache is meant
to reduce the time for when the same name is wanted within a short period of
time.
->timetree points to a tree of SessionHandles, sorted by the remaining time
until it should be checked - normally some sort of timeout. Each
SessionHandle has one node in the tree.
->sockhash is a hash table to allow fast lookups of socket descriptor to
which SessionHandle that uses that descriptor. This is necessary for the
multi_socket API.
->conn_cache points to the connection cache. It keeps track of all
connections that are kept after use. The cache has a maximum size.
->closure_handle is described in the 'connectdata' section.
The libcurl source code generally use the name 'multi' for the variable that
points to the Curl_multi struct.
1.4 Curl_handler
Each unique protocol that is supported by libcurl needs to provide at least
one Curl_handler struct. It defines what the protocol is called and what
functions the main code should call to deal with protocol specific issues.
In general, there's a source file named [protocol].c in which there's a
"struct Curl_handler Curl_handler_[protocol]" declared. In url.c there's
then the main array with all individual Curl_handler structs pointed to from
a single array which is scanned through when a URL is given to libcurl to
work with.
->scheme is the URL scheme name, usually spelled out in uppercase. That's
"HTTP" or "FTP" etc. SSL versions of the protcol need its own Curl_handler
setup so HTTPS separate from HTTP.
->setup_connection is called to allow the protocol code to allocate protocol
specific data that then gets associated with that SessionHandle for the rest
of this transfer. It gets freed again at the end of the transfer. It will be
called before the 'connectdata' for the transfer has been selected/created.
Most protocols will allocate its private 'struct [PROTOCOL]' here and assign
SessionHandle->req.protop to point to it.
->connect_it allows a protocol to do some specific actions after the TCP
connect is done, that can still be considered part of the connection phase.
Some protocols will alter the connectdata->recv[] and connectdata->send[]
function pointers in this function.
->connecting is similarly a function that keeps getting called as long as the
protocol considers itself still in the connecting phase.
->do_it is the function called to issue the transfer request. What we call
the DO action internally. If the DO is not enough and things need to be kept
getting done for the entire DO sequence to complete, ->doing is then usually
also provided. Each protocol that needs to do multiple commands or similar
for do/doing need to implement their own state machines (see SCP, SFTP,
FTP). Some protocols (only FTP and only due to historical reasons) has a
separate piece of the DO state called DO_MORE.
->doing keeps getting called while issuing the transfer request command(s)
->done gets called when the transfer is complete and DONE. That's after the
main data has been transferred.
->do_more gets called during the DO_MORE state. The FTP protocol uses this
state when setting up the second connection.
->proto_getsock
->doing_getsock
->domore_getsock
->perform_getsock
Functions that return socket information. Which socket(s) to wait for which
action(s) during the particular multi state.
->disconnect is called immediately before the TCP connection is shutdown.
->readwrite gets called during transfer to allow the protocol to do extra
reads/writes
->defport is the default report TCP or UDP port this protocol uses
->protocol is one or more bits in the CURLPROTO_* set. The SSL versions have
their "base" protocol set and then the SSL variation. Like "HTTP|HTTPS".
->flags is a bitmask with additional information about the protocol that will
make it get treated differently by the generic engine:
PROTOPT_SSL - will make it connect and negotiate SSL
PROTOPT_DUAL - this protocol uses two connections
PROTOPT_CLOSEACTION - this protocol has actions to do before closing the
connection. This flag is no longer used by code, yet still set for a bunch
protocol handlers.
PROTOPT_DIRLOCK - "direction lock". The SSH protocols set this bit to
limit which "direction" of socket actions that the main engine will
concern itself about.
PROTOPT_NONETWORK - a protocol that doesn't use network (read file:)
PROTOPT_NEEDSPWD - this protocol needs a password and will use a default
one unless one is provided
PROTOPT_NOURLQUERY - this protocol can't handle a query part on the URL
(?foo=bar)
1.5 conncache
Is a hash table with connections for later re-use. Each SessionHandle has
a pointer to its connection cache. Each multi handle sets up a connection
cache that all added SessionHandles share by default.
1.6 Curl_share
The libcurl share API allocates a Curl_share struct, exposed to the external
API as "CURLSH *".
The idea is that the struct can have a set of own versions of caches and
pools and then by providing this struct in the CURLOPT_SHARE option, those
specific SessionHandles will use the caches/pools that this share handle
holds.
Then individual SessionHandle structs can be made to share specific things
that they otherwise wouldn't, such as cookies.
The Curl_share struct can currently hold cookies, DNS cache and the SSL
session cache.
1.7 CookieInfo
This is the main cookie struct. It holds all known cookies and related
information. Each SessionHandle has its own private CookieInfo even when
they are added to a multi handle. They can be made to share cookies by using
the share API.

View File

@ -18,34 +18,34 @@ accompany your license with an exception[2]. This particular problem was
addressed when the Modified BSD license was created, which does not have the addressed when the Modified BSD license was created, which does not have the
announcement clause that collides with GPL. announcement clause that collides with GPL.
libcurl https://curl.haxx.se/docs/copyright.html libcurl http://curl.haxx.se/docs/copyright.html
Uses an MIT (or Modified BSD)-style license that is as liberal as Uses an MIT (or Modified BSD)-style license that is as liberal as
possible. possible.
OpenSSL https://www.openssl.org/source/license.html OpenSSL http://www.openssl.org/source/license.html
(May be used for SSL/TLS support) Uses an Original BSD-style license (May be used for SSL/TLS support) Uses an Original BSD-style license
with an announcement clause that makes it "incompatible" with GPL. You with an announcement clause that makes it "incompatible" with GPL. You
are not allowed to ship binaries that link with OpenSSL that includes are not allowed to ship binaries that link with OpenSSL that includes
GPL code (unless that specific GPL code includes an exception for GPL code (unless that specific GPL code includes an exception for
OpenSSL - a habit that is growing more and more common). If OpenSSL's OpenSSL - a habit that is growing more and more common). If OpenSSL's
licensing is a problem for you, consider using another TLS library. licensing is a problem for you, consider using GnuTLS or yassl
instead.
GnuTLS http://www.gnutls.org/ GnuTLS http://www.gnutls.org/
(May be used for SSL/TLS support) Uses the LGPL[3] license. If this is (May be used for SSL/TLS support) Uses the LGPL[3] license. If this is
a problem for you, consider using another TLS library. Also note that a problem for you, consider using OpenSSL instead. Also note that
GnuTLS itself depends on and uses other libs (libgcrypt and GnuTLS itself depends on and uses other libs (libgcrypt and
libgpg-error) and they too are LGPL- or GPL-licensed. libgpg-error) and they too are LGPL- or GPL-licensed.
WolfSSL https://www.wolfssl.com/ yassl http://www.yassl.com/
(May be used for SSL/TLS support) Uses the GPL[1] license or a (May be used for SSL/TLS support) Uses the GPL[1] license. If this is
propietary license. If this is a problem for you, consider using a problem for you, consider using OpenSSL or GnuTLS instead.
another TLS library.
NSS https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS NSS http://www.mozilla.org/projects/security/pki/nss/
(May be used for SSL/TLS support) Is covered by the MPL[4] license, (May be used for SSL/TLS support) Is covered by the MPL[4] license,
the GPL[1] license and the LGPL[3] license. You may choose to license the GPL[1] license and the LGPL[3] license. You may choose to license
@ -57,29 +57,13 @@ axTLS http://axtls.sourceforge.net/
(May be used for SSL/TLS support) Uses a Modified BSD-style license. (May be used for SSL/TLS support) Uses a Modified BSD-style license.
mbedTLS https://tls.mbed.org/ c-ares http://daniel.haxx.se/projects/c-ares/license.html
(May be used for SSL/TLS support) Uses the GPL[1] license or a
propietary license. If this is a problem for you, consider using
another TLS library.
BoringSSL https://boringssl.googlesource.com/
(May be used for SSL/TLS support) As an OpenSSL fork, it has the same
license as that.
libressl http://www.libressl.org/
(May be used for SSL/TLS support) As an OpenSSL fork, it has the same
license as that.
c-ares https://daniel.haxx.se/projects/c-ares/license.html
(Used for asynchronous name resolves) Uses an MIT license that is very (Used for asynchronous name resolves) Uses an MIT license that is very
liberal and imposes no restrictions on any other library or part you liberal and imposes no restrictions on any other library or part you
may link with. may link with.
zlib http://www.zlib.net/zlib_license.html zlib http://www.gzip.org/zlib/zlib_license.html
(Used for compressed Transfer-Encoding support) Uses an MIT-style (Used for compressed Transfer-Encoding support) Uses an MIT-style
license that shouldn't collide with any other library. license that shouldn't collide with any other library.
@ -89,12 +73,12 @@ MIT Kerberos http://web.mit.edu/kerberos/www/dist/
(May be used for GSS support) MIT licensed, that shouldn't collide (May be used for GSS support) MIT licensed, that shouldn't collide
with any other parts. with any other parts.
Heimdal http://www.h5l.org Heimdal http://www.pdc.kth.se/heimdal/
(May be used for GSS support) Heimdal is Original BSD licensed with (May be used for GSS support) Heimdal is Original BSD licensed with
the announcement clause. the announcement clause.
GNU GSS https://www.gnu.org/software/gss/ GNU GSS http://www.gnu.org/software/gss/
(May be used for GSS support) GNU GSS is GPL licensed. Note that you (May be used for GSS support) GNU GSS is GPL licensed. Note that you
may not distribute binary curl packages that uses this if you build may not distribute binary curl packages that uses this if you build
@ -121,10 +105,10 @@ libssh2 http://www.libssh2.org/
(Used for scp and sftp support) libssh2 uses a Modified BSD-style (Used for scp and sftp support) libssh2 uses a Modified BSD-style
license. license.
[1] = GPL - GNU General Public License: https://www.gnu.org/licenses/gpl.html [1] = GPL - GNU General Public License: http://www.gnu.org/licenses/gpl.html
[2] = https://www.gnu.org/licenses/gpl-faq.html#GPLIncompatibleLibs details on [2] = http://www.fsf.org/licenses/gpl-faq.html#GPLIncompatibleLibs details on
how to write such an exception to the GPL how to write such an exception to the GPL
[3] = LGPL - GNU Lesser General Public License: [3] = LGPL - GNU Lesser General Public License:
https://www.gnu.org/licenses/lgpl.html http://www.gnu.org/licenses/lgpl.html
[4] = MPL - Mozilla Public License: [4] = MPL - Mozilla Public License:
https://www.mozilla.org/MPL/ http://www.mozilla.org/MPL/

View File

@ -33,7 +33,7 @@ MAIL ETIQUETTE
1.1 Mailing Lists 1.1 Mailing Lists
The mailing lists we have are all listed and described at The mailing lists we have are all listed and described at
https://curl.haxx.se/mail/ http://curl.haxx.se/mail/
Each mailing list is targeted to a specific set of users and subjects, 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. please use the one or the ones that suit you the most.
@ -230,7 +230,7 @@ MAIL ETIQUETTE
Quote as little as possible. Just enough to provide the context you cannot Quote as little as possible. Just enough to provide the context you cannot
leave out. A lengthy description can be found here: leave out. A lengthy description can be found here:
https://www.netmeister.org/news/learn2quote.html http://www.netmeister.org/news/learn2quote.html
2.7 Digest 2.7 Digest

View File

@ -3,7 +3,7 @@ LATEST VERSION
You always find news about what's going on as well as the latest versions You always find news about what's going on as well as the latest versions
from the curl web pages, located at: from the curl web pages, located at:
https://curl.haxx.se http://curl.haxx.se
SIMPLE USAGE SIMPLE USAGE
@ -470,8 +470,8 @@ COOKIES
stored cookies which match the request as it follows the location. The stored cookies which match the request as it follows the location. The
file "empty.txt" may be a nonexistent file. file "empty.txt" may be a nonexistent file.
To read and write cookies from a netscape cookie file, you can set both -b Alas, to both read and write cookies from a netscape cookie file, you can
and -c to use the same file: set both -b and -c to use the same file:
curl -b cookies.txt -c cookies.txt www.example.com curl -b cookies.txt -c cookies.txt www.example.com
@ -824,7 +824,7 @@ LDAP
Working with LDAP URLs": Working with LDAP URLs":
http://developer.netscape.com/docs/manuals/dirsdk/csdk30/url.htm http://developer.netscape.com/docs/manuals/dirsdk/csdk30/url.htm
RFC 2255, "The LDAP URL Format" https://curl.haxx.se/rfc/rfc2255.txt RFC 2255, "The LDAP URL Format" http://curl.haxx.se/rfc/rfc2255.txt
To show you an example, this is how I can get all people from my local LDAP To show you an example, this is how I can get all people from my local LDAP
server that has a certain sub-domain in their email address: server that has a certain sub-domain in their email address:
@ -1011,7 +1011,7 @@ MAILING LISTS
For your convenience, we have several open mailing lists to discuss curl, For your convenience, we have several open mailing lists to discuss curl,
its development and things relevant to this. Get all info at its development and things relevant to this. Get all info at
https://curl.haxx.se/mail/. Some of the lists available are: http://curl.haxx.se/mail/. Some of the lists available are:
curl-users curl-users

View File

@ -5,11 +5,11 @@
# | (__| |_| | _ <| |___ # | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____| # \___|\___/|_| \_\_____|
# #
# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. # Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
# #
# This software is licensed as described in the file COPYING, which # This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms # you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html. # are also available at http://curl.haxx.se/docs/copyright.html.
# #
# You may opt to use, copy, modify, merge, publish, distribute and/or sell # 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 # copies of the Software, and permit persons to whom the Software is
@ -33,22 +33,22 @@ SUBDIRS = examples libcurl
CLEANFILES = $(GENHTMLPAGES) $(PDFPAGES) CLEANFILES = $(GENHTMLPAGES) $(PDFPAGES)
EXTRA_DIST = MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS SSLCERTS \ EXTRA_DIST = MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS SSLCERTS \
README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS VERSIONS \ README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS VERSIONS \
KNOWN_BUGS BINDINGS $(man_MANS) $(HTMLPAGES) HISTORY INSTALL \ KNOWN_BUGS BINDINGS $(man_MANS) $(HTMLPAGES) HISTORY INSTALL \
$(PDFPAGES) LICENSE-MIXING README.netware INSTALL.devcpp \ $(PDFPAGES) LICENSE-MIXING README.netware DISTRO-DILEMMA INSTALL.devcpp \
MAIL-ETIQUETTE HTTP-COOKIES SECURITY RELEASE-PROCEDURE SSL-PROBLEMS \ MAIL-ETIQUETTE HTTP-COOKIES LIBCURL-STRUCTS SECURITY RELEASE-PROCEDURE \
HTTP2.md ROADMAP.md CODE_OF_CONDUCT.md CODE_STYLE.md SSL-PROBLEMS
MAN2HTML= roffit < $< >$@ MAN2HTML= roffit < $< >$@
SUFFIXES = .1 .html .pdf SUFFIXES = .1 .html .pdf
html: $(HTMLPAGES) html: $(HTMLPAGES)
cd libcurl && make html cd libcurl; make html
pdf: $(PDFPAGES) pdf: $(PDFPAGES)
cd libcurl && make pdf cd libcurl; make pdf
.1.html: .1.html:
$(MAN2HTML) $(MAN2HTML)

View File

@ -1,3 +1,9 @@
_ _ ____ _
___| | | | _ \| |
/ __| | | | |_) | |
| (__| |_| | _ <| |___
\___|\___/|_| \_\_____|
curl release procedure - how to do a release curl release procedure - how to do a release
============================================ ============================================
@ -11,8 +17,8 @@ in the source code repo
- make sure all relevant changes are committed on the master branch - 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 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. tag and we use underscores instead of dots in the version number.
- run "./maketgz 7.34.0" to build the release tarballs. It is important that - 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 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 as this is what then will be shipped and used by most users on *nix like
@ -78,10 +84,11 @@ Coming dates
Based on the description above, here are some planned release dates (at the Based on the description above, here are some planned release dates (at the
time of this writing): time of this writing):
- October 7, 2015 (version 7.45.0) - November 5, 2014 (version 7.39.0)
- December 31, 2014
- February 25, 2015
- April 22, 2015
- June 17, 2015
- August 12, 2015
- October 7, 2015
- December 2, 2015 - December 2, 2015
- January 27, 2016
- March 23, 2016
- May 18, 2016
- July 13, 2016
- September 7, 2016

View File

@ -36,7 +36,7 @@ This document lists documents and standards used by curl.
RFC 2109 - HTTP State Management Mechanism (cookie stuff) RFC 2109 - HTTP State Management Mechanism (cookie stuff)
- Also, read Netscape's specification at - Also, read Netscape's specification at
https://curl.haxx.se/rfc/cookie_spec.html http://curl.haxx.se/rfc/cookie_spec.html
RFC 2183 - The Content-Disposition Header Field RFC 2183 - The Content-Disposition Header Field

View File

@ -5,94 +5,44 @@ Roadmap of things Daniel Stenberg and Steve Holme want to work on next. It is
intended to serve as a guideline for others for information, feedback and intended to serve as a guideline for others for information, feedback and
possible participation. possible participation.
HTTP/2 New stuff - libcurl
------
- test suite
Base this on existing nghttp2 server to start with to make functional
tests. Later on we can adopt that code or work with nghttp2 to provide ways
to have the http2 server respond with broken responses to make sure we deal
with that nicely as well.
To decide: if we need to bundle parts of the nghttp2 stuff that probably
won't be shipped by many distros.
- provide option for HTTP/2 "prior knowledge" over clear text
As it would avoid the roundtrip-heavy Upgrade: procedures when you _know_
it speaks HTTP/2.
HTTP cookies
------------
Two cookie drafts have been adopted by the httpwg in IETF and we should
support them as the popular browsers will as well:
[Deprecate modification of 'secure' cookies from non-secure
origins](https://tools.ietf.org/html/draft-ietf-httpbis-cookie-alone-00)
[Cookie Prefixes](https://tools.ietf.org/html/draft-ietf-httpbis-cookie-prefixes-00)
[Firefox bug report about secure cookies](https://bugzilla.mozilla.org/show_bug.cgi?id=976073)
SRV records
-----------
How to find services for specific domains/hosts.
HTTPS to proxy
--------------
To avoid network traffic to/from the proxy getting snooped on. There's a git
branch in the public git repository for this that we need to make sure works
for all TLS backends and then merge!
curl_formadd()
--------------
make sure there's an easy handle passed in to `curl_formadd()`,
`curl_formget()` and `curl_formfree()` by adding replacement functions and
deprecating the old ones to allow custom mallocs and more
third-party SASL
----------------
add support for third-party SASL libraries such as Cyrus SASL - may need to
move existing native and SSPI based authentication into vsasl folder after
reworking HTTP and SASL code
SASL authentication in LDAP
---------------------------
...
Simplify the SMTP email
-----------------------
Simplify the SMTP email interface so that programmers don't have to
construct the body of an email that contains all the headers, alternative
content, images and attachments - maintain raw interface so that
programmers that want to do this can
email capabilities
------------------
Allow the email protocols to return the capabilities before
authenticating. This will allow an application to decide on the best
authentication mechanism
Win32 pthreads
--------------
Allow Windows threading model to be replaced by Win32 pthreads port
dynamic buffer size
------------------- -------------------
Implement a dynamic buffer size to allow SFTP to use much larger buffers and 1. HTTP/2
possibly allow the size to be customizable by applications. Use less memory
when handles are not in use? - test suite
- http2 multiplexing/pipelining
- provide option for HTTP/2 "prior knowledge" over clear text
- provide option to allow curl to default to HTTP/2 only when using HTTPS
2. SRV records
3. HTTPS to proxy
4. make sure there's an easy handle passed in to `curl_formadd()`,
`curl_formget()` and `curl_formfree()` by adding replacement functions and
deprecating the old ones to allow custom mallocs and more
5. add support for third-party SASL libraries such as Cyrus SASL - may need to
move existing native and SSPI based authentication into vsasl folder after
reworking HTTP and SASL code
6. SASL authentication in LDAP
7. Simplify the SMTP email interface so that programmers don't have to
construct the body of an email that contains all the headers, alternative
content, images and attachments - maintain raw interface so that
programmers that want to do this can
8. Allow the email protocols to return the capabilities before
authenticating. This will allow an application to decide on the best
authentication mechanism
9. Allow Windows threading model to be replaced by Win32 pthreads port
10. Implement a dynamic buffer size to allow SFTP to use much larger buffers
and possibly allow the size to be customizable by applications. Use less
memory when handles are not in use?
New stuff - curl New stuff - curl
---------------- ----------------
@ -111,7 +61,7 @@ Improve
2. curl -h output (considered overwhelming to users) 2. curl -h output (considered overwhelming to users)
3. we have > 170 command line options, is there a way to redo things to 3. we have > 160 command line options, is there a way to redo things to
simplify or improve the situation as we are likely to keep adding simplify or improve the situation as we are likely to keep adding
features/options in the future too features/options in the future too

View File

@ -14,7 +14,7 @@ Publishing Information
---------------------- ----------------------
All known and public curl or libcurl related vulnerabilities are listed on 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). [the curl web site security page](http://curl.haxx.se/docs/security.html).
Security vulnerabilities should not be entered in the project's public bug Security vulnerabilities should not be entered in the project's public bug
tracker unless the necessary configuration is in place to limit access to the tracker unless the necessary configuration is in place to limit access to the

View File

@ -26,7 +26,7 @@ CA bundle missing intermediate certificates
problems if your CA cert does not have the certificates for the problems if your CA cert does not have the certificates for the
intermediates in the whole trust chain. intermediates in the whole trust chain.
Protocol version SSL version
Some broken servers fail to support the protocol negotiation properly that Some broken servers fail to support the protocol negotiation properly that
SSL servers are supposed to handle. This may cause the connection to fail SSL servers are supposed to handle. This may cause the connection to fail
@ -36,9 +36,7 @@ Protocol version
An additional complication can be that modern SSL libraries sometimes are An additional complication can be that modern SSL libraries sometimes are
built with support for older SSL and TLS versions disabled! built with support for older SSL and TLS versions disabled!
All versions of SSL are considered insecure and should be avoided. Use TLS. SSL ciphers
Ciphers
Clients give servers a list of ciphers to select from. If the list doesn't 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 include any ciphers the server wants/can use, the connection handshake
@ -53,14 +51,10 @@ Ciphers
Note that these weak ciphers are identified as flawed. For example, this Note that these weak ciphers are identified as flawed. For example, this
includes symmetric ciphers with less than 128 bit keys and RC4. includes symmetric ciphers with less than 128 bit keys and RC4.
WinSSL 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 WinSSL on really old Windows versions.
References: References:
https://tools.ietf.org/html/draft-popov-tls-prohibiting-rc4-01 http://tools.ietf.org/html/draft-popov-tls-prohibiting-rc4-01
Allow BEAST Allow BEAST
BEAST is the name of a TLS 1.0 attack that surfaced 2011. When adding means BEAST is the name of a TLS 1.0 attack that surfaced 2011. When adding means
@ -71,17 +65,3 @@ Allow BEAST
introduced. Exactly as it sounds, it re-introduces the BEAST vulnerability 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 but on the other hand it allows curl to connect to that kind of strange
servers. 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 WinSSL (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

View File

@ -20,8 +20,8 @@ support.
It is about trust It is about trust
----------------- -----------------
This system is about trust. In your local CA certificate store you have certs This system is about trust. In your local CA cert bundle you have certs from
from *trusted* Certificate Authorities that you then can use to verify that the *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 server certificates you see are valid. They're signed by one of the CAs you
trust. trust.
@ -35,16 +35,16 @@ Certificate Verification
------------------------ ------------------------
libcurl performs peer SSL certificate verification by default. This is done 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 by using CA cert bundle that the SSL library can use to make sure the peer's
peer's server certificate is valid. server certificate is valid.
If you communicate with HTTPS, FTPS or other TLS-using servers using 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 certificates that are signed by CAs present in the bundle, you can be sure
that the remote server really is the one it claims to be. 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 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 cert bundle, 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 included in the bundle you use or if the remote host is an impostor
impersonating your favorite site, and you want to transfer files from this impersonating your favorite site, and you want to transfer files from this
server, do one of the following: server, do one of the following:
@ -59,22 +59,12 @@ server, do one of the following:
With the curl command line tool: --cacert [file] With the curl command line tool: --cacert [file]
3. Add the CA cert for your server to the existing default CA certificate 3. Add the CA cert for your server to the existing default CA cert bundle.
store. The default CA certificate store can changed at compile time with the The default path of the CA bundle used can be changed by running configure
following configure options: with the --with-ca-bundle option pointing out the path of your choice.
--with-ca-bundle=FILE: use the specified file as CA certificate store. CA To do this, you need to get the CA cert for your server in PEM format and
certificates need to be concatenated in PEM format into this file. then append that to your CA cert bundle.
--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 If you use Internet Explorer, this is one way to get extract the CA cert
for a particular server: for a particular server:
@ -86,7 +76,7 @@ server, do one of the following:
- Convert it from crt to PEM using the openssl tool: - Convert it from crt to PEM using the openssl tool:
openssl x509 -inform DES -in yourdownloaded.crt \ openssl x509 -inform DES -in yourdownloaded.crt \
-out outcert.pem -text -out outcert.pem -text
- Add the 'outcert.pem' to the CA certificate store or use it stand-alone - Append the 'outcert.pem' to the CA cert bundle or use it stand-alone
as described below. as described below.
If you use the 'openssl' tool, this is one way to get extract the CA cert If you use the 'openssl' tool, this is one way to get extract the CA cert
@ -99,9 +89,9 @@ server, do one of the following:
- If you want to see the data in the certificate, you can do: "openssl - 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 x509 -inform PEM -in certfile -text -out certdata" where certfile is
the cert you extracted from logfile. Look in certdata. the cert you extracted from logfile. Look in certdata.
- If you want to trust the certificate, you can add it to your CA - If you want to trust the certificate, you can append it to your
certificate store or use it stand-alone as described. Just remember that cert bundle or use it stand-alone as described. Just remember that the
the security is no better than the way you obtained the certificate. 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 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 cert path by setting the environment variable `CURL_CA_BUNDLE` to the path
@ -119,13 +109,13 @@ server, do one of the following:
5. Get a better/different/newer CA cert bundle! One option is to extract the 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 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 build tree root, or possibly download a version that was generated this
way for you: [CA Extract](https://curl.haxx.se/docs/caextract.html) way for you: [CA Extract](http://curl.haxx.se/docs/caextract.html)
Neglecting to use one of the above methods when dealing with a server using a 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 that isn't signed by one of the certificates in the installed CA
certificate store, will cause SSL to report an error ("certificate verify cert bundle, will cause SSL to report an error ("certificate verify failed")
failed") during the handshake and SSL will then refuse further communication during the handshake and SSL will then refuse further communication with that
with that server. server.
Certificate Verification with NSS Certificate Verification with NSS
--------------------------------- ---------------------------------
@ -133,8 +123,8 @@ Certificate Verification with NSS
If libcurl was built with NSS support, then depending on the OS distribution, 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 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 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 enables NSS to read the OpenSSL PEM CA bundle. This library is missing in
p11-kit-nss-trust which makes NSS use the system wide CA certificate store. NSS OpenSuSE, and without it, NSS can only work with its own internal formats. NSS
also has a new [database format](https://wiki.mozilla.org/NSS_Shared_DB). 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 Starting with version 7.19.7, libcurl automatically adds the 'sql:' prefix to

View File

@ -36,13 +36,10 @@ Alex Suykov
Alex Vinnik Alex Vinnik
Alex aka WindEagle Alex aka WindEagle
Alexander Beedie Alexander Beedie
Alexander Dyagilev
Alexander Elgert
Alexander Klauer Alexander Klauer
Alexander Kourakos Alexander Kourakos
Alexander Krasnostavsky Alexander Krasnostavsky
Alexander Lazic Alexander Lazic
Alexander Pepper
Alexander Peslyak Alexander Peslyak
Alexander Zhuravlev Alexander Zhuravlev
Alexey Borzov Alexey Borzov
@ -56,7 +53,6 @@ Alona Rossen
Amol Pattekar Amol Pattekar
Amr Shahin Amr Shahin
Anatoli Tubman Anatoli Tubman
Anders Bakken
Anders Gustafsson Anders Gustafsson
Anders Havn Anders Havn
Andi Jahja Andi Jahja
@ -92,7 +88,6 @@ Andy Serpa
Andy Tsouladze Andy Tsouladze
Angus Mackay Angus Mackay
Anthon Pang Anthon Pang
Anthony Avina
Anthony Bryan Anthony Bryan
Anthony G. Basile Anthony G. Basile
Antoine Calando Antoine Calando
@ -107,7 +102,6 @@ Arnaud Ebalard
Arthur Murray Arthur Murray
Arve Knudsen Arve Knudsen
Arvid Norberg Arvid Norberg
Ashish Shukla
Ask Bjørn Hansen Ask Bjørn Hansen
Askar Safin Askar Safin
Ates Goral Ates Goral
@ -131,15 +125,11 @@ Benbuck Nason
Benjamin Gerard Benjamin Gerard
Benjamin Gilbert Benjamin Gilbert
Benjamin Johnson Benjamin Johnson
Benjamin Kircher
Benoit Neil Benoit Neil
Benoit Sigoure Benoit Sigoure
Bernard Leak Bernard Leak
Bernard Spil
Bernhard Reutner-Fischer Bernhard Reutner-Fischer
Bert Huijben
Bertrand Demiddelaer Bertrand Demiddelaer
Bertrand Simonnet
Bill Doyle Bill Doyle
Bill Egert Bill Egert
Bill Hoffman Bill Hoffman
@ -155,7 +145,6 @@ Bob Richmond
Bob Schader Bob Schader
Bogdan Nicula Bogdan Nicula
Brad Burdick Brad Burdick
Brad Fitzpatrick
Brad Harder Brad Harder
Brad Hards Brad Hards
Brad King Brad King
@ -166,10 +155,8 @@ Brandon Wang
Brendan Jurd Brendan Jurd
Brent Beardsley Brent Beardsley
Brian Akins Brian Akins
Brian Chrisman
Brian Dessent Brian Dessent
Brian J. Murrell Brian J. Murrell
Brian Prodoehl
Brian R Duffy Brian R Duffy
Brian Ulm Brian Ulm
Brock Noland Brock Noland
@ -189,11 +176,9 @@ Catalin Patulea
Chad Monroe Chad Monroe
Chandrakant Bagul Chandrakant Bagul
Charles Kerr Charles Kerr
Charles Romestant
Chen Prog Chen Prog
Chih-Chung Chang Chih-Chung Chang
Chris "Bob Bob" Chris "Bob Bob"
Chris Araman
Chris Combes Chris Combes
Chris Conlon Chris Conlon
Chris Deidun Chris Deidun
@ -209,7 +194,6 @@ Christian Krause
Christian Kurz Christian Kurz
Christian Robottom Reis Christian Robottom Reis
Christian Schmitz Christian Schmitz
Christian Stewart
Christian Vogt Christian Vogt
Christian Weisgerber Christian Weisgerber
Christophe Demory Christophe Demory
@ -223,7 +207,6 @@ Claes Jakobsson
Clarence Gardner Clarence Gardner
Clemens Gruber Clemens Gruber
Clifford Wolf Clifford Wolf
Clint Clayton
Cody Jones Cody Jones
Cody Mack Cody Mack
Colby Ranger Colby Ranger
@ -240,10 +223,8 @@ Cris Bailiff
Cristian Rodríguez Cristian Rodríguez
Curt Bogmine Curt Bogmine
Cyrill Osterwalder Cyrill Osterwalder
Cédric Connes
Cédric Deltheil Cédric Deltheil
D. Flinkmann D. Flinkmann
Da-Yoon Chung
Dag Ekengren Dag Ekengren
Dagobert Michelsen Dagobert Michelsen
Damian Dixon Damian Dixon
@ -259,15 +240,8 @@ Dan Zitter
Daniel Black Daniel Black
Daniel Cater Daniel Cater
Daniel Egger Daniel Egger
Daniel Hwang
Daniel Johnson Daniel Johnson
Daniel Kahn Gillmor
Daniel Lee Hwang
Daniel Melani
Daniel Mentz Daniel Mentz
Daniel Schauenberg
Daniel Seither
Daniel Shahaf
Daniel Steinberg Daniel Steinberg
Daniel Stenberg Daniel Stenberg
Daniel Theron Daniel Theron
@ -281,9 +255,7 @@ Dave May
Dave Reisner Dave Reisner
Dave Thompson Dave Thompson
Dave Vasilevsky Dave Vasilevsky
Davey Shafik
David Bau David Bau
David Benjamin
David Binderman David Binderman
David Blaikie David Blaikie
David Byron David Byron
@ -312,7 +284,6 @@ David Woodhouse
David Wright David Wright
David Yan David Yan
Dengminwen Dengminwen
Denis Feklushkin
Dennis Clarke Dennis Clarke
Derek Higgins Derek Higgins
Detlef Schmier Detlef Schmier
@ -331,25 +302,21 @@ Dirk Manske
Dmitri Shubin Dmitri Shubin
Dmitriy Sergeyev Dmitriy Sergeyev
Dmitry Bartsevich Dmitry Bartsevich
Dmitry Eremin-Solenikov
Dmitry Falko Dmitry Falko
Dmitry Kurochkin Dmitry Kurochkin
Dmitry Popov Dmitry Popov
Dmitry Rechkin Dmitry Rechkin
Dmitry S. Baikov
Dolbneff A.V Dolbneff A.V
Domenico Andreoli Domenico Andreoli
Dominick Meglio Dominick Meglio
Dominique Leuenberger Dominique Leuenberger
Doug Kaufman Doug Kaufman
Doug Porter Doug Porter
Douglas Creager
Douglas E. Wegscheid Douglas E. Wegscheid
Douglas Kilpatrick Douglas Kilpatrick
Douglas R. Horner Douglas R. Horner
Douglas Steinwand Douglas Steinwand
Dov Murik Dov Murik
Drake Arconis
Duane Cathey Duane Cathey
Duncan Mac-Vicar Prett Duncan Mac-Vicar Prett
Dustin Boswell Dustin Boswell
@ -364,12 +331,10 @@ Edward Rudd
Edward Sheldrake Edward Sheldrake
Eelco Dolstra Eelco Dolstra
Eetu Ojanen Eetu Ojanen
Egon Eckert
Eldar Zaitov Eldar Zaitov
Ellis Pritchard Ellis Pritchard
Elmira A Semenova Elmira A Semenova
Emanuele Bovisio Emanuele Bovisio
Emil Lerner
Emil Romanus Emil Romanus
Emiliano Ida Emiliano Ida
Enrico Scholz Enrico Scholz
@ -382,14 +347,12 @@ Eric Lubin
Eric Melville Eric Melville
Eric Mertens Eric Mertens
Eric Rautman Eric Rautman
Eric Ridge
Eric S. Raymond Eric S. Raymond
Eric Thelin Eric Thelin
Eric Vergnaud Eric Vergnaud
Eric Wong Eric Wong
Eric Young Eric Young
Erick Nuwendam Erick Nuwendam
Erik Janssen
Erik Johansson Erik Johansson
Ernest Beinrohr Ernest Beinrohr
Erwan Legrand Erwan Legrand
@ -404,15 +367,12 @@ Fabian Hiernaux
Fabian Keil Fabian Keil
Fabrizio Ammollo Fabrizio Ammollo
Fedor Karpelevitch Fedor Karpelevitch
Feist Josselin
Felix Yan Felix Yan
Felix von Leitner Felix von Leitner
Feng Tu Feng Tu
Flavio Medeiros
Florian Schoppmann Florian Schoppmann
Florian Weimer Florian Weimer
Forrest Cahoon Forrest Cahoon
Francisco Moraes
Frank Gevaerts Frank Gevaerts
Frank Hempel Frank Hempel
Frank Keeney Frank Keeney
@ -425,7 +385,6 @@ François Charlier
Fred Machado Fred Machado
Fred New Fred New
Fred Noz Fred Noz
Fred Stluka
Frederic Lepied Frederic Lepied
Fredrik Thulin Fredrik Thulin
Gabriel Kuri Gabriel Kuri
@ -460,11 +419,9 @@ Glen A Johnson Jr.
Glen Nakamura Glen Nakamura
Glen Scott Glen Scott
Glenn Sheridan Glenn Sheridan
Google Inc.
Gordon Marler Gordon Marler
Gorilla Maguila Gorilla Maguila
Grant Erickson Grant Erickson
Grant Pannell
Greg Hewgill Greg Hewgill
Greg Morse Greg Morse
Greg Onufer Greg Onufer
@ -477,14 +434,12 @@ Guido Berhoerster
Guillaume Arluison Guillaume Arluison
Gunter Knauf Gunter Knauf
Gustaf Hui Gustaf Hui
Gustavo Grieco
Gwenole Beauchesne Gwenole Beauchesne
Gökhan Şengün Gökhan Şengün
Götz Babin-Ebell Götz Babin-Ebell
Hamish Mackenzie Hamish Mackenzie
Hang Kin Lau Hang Kin Lau
Hang Su Hang Su
Hanno Böck
Hanno Kranzhoff Hanno Kranzhoff
Hans Steegers Hans Steegers
Hans-Jurgen May Hans-Jurgen May
@ -522,20 +477,16 @@ Iida Yosiaki
Ilguiz Latypov Ilguiz Latypov
Ilja van Sprundel Ilja van Sprundel
Immanuel Gregoire Immanuel Gregoire
Inca R
Ingmar Runge Ingmar Runge
Ingo Ralf Blum Ingo Ralf Blum
Ingo Wilken Ingo Wilken
Isaac Boukris
Ishan SinghLevett Ishan SinghLevett
Ivo Bellin Salarin Ivo Bellin Salarin
Jack Zhang Jack Zhang
Jacky Lam Jacky Lam
Jacob Meuser Jacob Meuser
Jacob Moshenko Jacob Moshenko
Jactry Zeng
Jad Chamcham Jad Chamcham
Jaime Fullaondo
Jakub Zakrzewski Jakub Zakrzewski
James Bursa James Bursa
James Cheng James Cheng
@ -563,7 +514,6 @@ Jason Liu
Jason McDonald Jason McDonald
Jason S. Priebe Jason S. Priebe
Javier Barroso Javier Barroso
Javier G. Sogo
Jay Austin Jay Austin
Jayesh A Shah Jayesh A Shah
Jaz Fresh Jaz Fresh
@ -583,13 +533,10 @@ Jeff Lawson
Jeff Phillips Jeff Phillips
Jeff Pohlmeyer Jeff Pohlmeyer
Jeff Weber Jeff Weber
Jeffrey Walton
Jens Rantil
Jeremy Friesner Jeremy Friesner
Jeremy Huddleston Jeremy Huddleston
Jeremy Lin Jeremy Lin
Jeroen Koekkoek Jeroen Koekkoek
Jeroen Ooms
Jerome Muffat-Meridol Jerome Muffat-Meridol
Jerome Robert Jerome Robert
Jerome Vouillon Jerome Vouillon
@ -598,13 +545,11 @@ Jerry Wu
Jes Badwal Jes Badwal
Jesper Jensen Jesper Jensen
Jesse Noller Jesse Noller
Jesse Tan
Jie He Jie He
Jim Drash Jim Drash
Jim Freeman Jim Freeman
Jim Hollinger Jim Hollinger
Jim Meyering Jim Meyering
Jiri Dvorak
Jiri Hruska Jiri Hruska
Jiri Jaburek Jiri Jaburek
Jiri Malak Jiri Malak
@ -613,7 +558,6 @@ Joe Halpin
Joe Malicki Joe Malicki
Joe Mason Joe Mason
Joel Chen Joel Chen
Joel Depooter
Jofell Gallardo Jofell Gallardo
Johan Anderson Johan Anderson
Johan Lantz Johan Lantz
@ -621,7 +565,6 @@ Johan Nilsson
Johan van Selst Johan van Selst
Johannes Bauer Johannes Bauer
Johannes Ernst Johannes Ernst
Johannes Schindelin
John Bradshaw John Bradshaw
John Coffey John Coffey
John Crow John Crow
@ -632,12 +575,9 @@ John Gardiner Myers
John Janssen John Janssen
John Joseph Bachir John Joseph Bachir
John Kelly John Kelly
John Kohl
John Lask John Lask
John Levon
John Lightsey John Lightsey
John Marino John Marino
John Marshall
John McGowan John McGowan
John P. McCaskey John P. McCaskey
John Suprock John Suprock
@ -653,12 +593,10 @@ Jon Torrey
Jon Travis Jon Travis
Jon Turner Jon Turner
Jonas Forsman Jonas Forsman
Jonas Minnberg
Jonas Schnelli Jonas Schnelli
Jonatan Lander Jonatan Lander
Jonatan Vela Jonatan Vela
Jonathan Cardoso Machado Jonathan Cardoso Machado
Jonathan Cardoso Machado Machado
Jonathan Hseu Jonathan Hseu
Jonathan Nieder Jonathan Nieder
Jongki Suwandi Jongki Suwandi
@ -682,7 +620,6 @@ Julien Nabet
Julien Royer Julien Royer
Jun-ichiro itojun Hagino Jun-ichiro itojun Hagino
Jurij Smakov Jurij Smakov
Justin Ehlert
Justin Fletcher Justin Fletcher
Justin Karneges Justin Karneges
Justin Maggard Justin Maggard
@ -694,13 +631,11 @@ Kai Sommerfeld
Kai-Uwe Rommel Kai-Uwe Rommel
Kalle Vahlman Kalle Vahlman
Kamil Dudka Kamil Dudka
Kang Lin
Kang-Jin Lee Kang-Jin Lee
Karl Moerder Karl Moerder
Karol Pietrzak Karol Pietrzak
Kaspar Brand Kaspar Brand
Katie Wang Katie Wang
Kazuho Oku
Kees Cook Kees Cook
Keith MacDonald Keith MacDonald
Keith McGuigan Keith McGuigan
@ -727,7 +662,6 @@ Krishnendu Majumdar
Krister Johansen Krister Johansen
Kristian Gunstone Kristian Gunstone
Kristian Köhntopp Kristian Köhntopp
Kurt Fankhauser
Kyle J. McKay Kyle J. McKay
Kyle L. Huff Kyle L. Huff
Kyle Sallee Kyle Sallee
@ -744,7 +678,6 @@ Lars Nilsson
Lars Torben Wilson Lars Torben Wilson
Lau Hang Kin Lau Hang Kin
Laurent Rabret Laurent Rabret
Lauri Kasanen
Legoff Vincent Legoff Vincent
Lehel Bernadt Lehel Bernadt
Leif W Leif W
@ -760,9 +693,7 @@ Linas Vepstas
Lindley French Lindley French
Ling Thio Ling Thio
Linus Nielsen Feltzing Linus Nielsen Feltzing
Lior Kaplan
Lisa Xu Lisa Xu
Liviu Chircu
Liza Alenchery Liza Alenchery
Lluís Batlle i Rossell Lluís Batlle i Rossell
Loic Dachary Loic Dachary
@ -773,8 +704,6 @@ Lucas Adamski
Lucas Pardue Lucas Pardue
Ludek Finstrle Ludek Finstrle
Ludovico Cavedon Ludovico Cavedon
Ludwig Nussel
Lukas Ruzicka
Lukasz Czekierda Lukasz Czekierda
Luke Amery Luke Amery
Luke Call Luke Call
@ -785,8 +714,6 @@ Maciej Karpiuk
Maciej Puzio Maciej Puzio
Maciej W. Rozycki Maciej W. Rozycki
Maks Naumov Maks Naumov
Maksim Kuzevanov
Maksim Stsepanenka
Mamoru Tasaka Mamoru Tasaka
Mandy Wu Mandy Wu
Manfred Schwarb Manfred Schwarb
@ -820,7 +747,6 @@ Mark Salisbury
Mark Snelling Mark Snelling
Mark Tully Mark Tully
Markus Duft Markus Duft
Markus Elfring
Markus Koetter Markus Koetter
Markus Moeller Markus Moeller
Markus Oberhumer Markus Oberhumer
@ -849,7 +775,6 @@ Matt Wixson
Matteo Rocco Matteo Rocco
Matthew Blain Matthew Blain
Matthew Clarke Matthew Clarke
Matthew Hall
Matthias Bolte Matthias Bolte
Maurice Barnum Maurice Barnum
Mauro Iorio Mauro Iorio
@ -870,23 +795,17 @@ Michael Day
Michael Goffioul Michael Goffioul
Michael Jahn Michael Jahn
Michael Jerris Michael Jerris
Michael Kalinin
Michael Kaufmann Michael Kaufmann
Michael König
Michael Mealling Michael Mealling
Michael Mueller Michael Mueller
Michael Osipov Michael Osipov
Michael Smith Michael Smith
Michael Stapelberg
Michael Stillwell Michael Stillwell
Michael Wallner Michael Wallner
Michal Bonino Michal Bonino
Michal Marek Michal Marek
Michał Fita
Michał Górny Michał Górny
Michał Kowalczyk Michał Kowalczyk
Michał Piechowski
Michel Promonet
Michele Bini Michele Bini
Miguel Angel Miguel Angel
Miguel Diaz Miguel Diaz
@ -910,14 +829,12 @@ Mitz Wark
Mohamed Lrhazi Mohamed Lrhazi
Mohammad AlSaleh Mohammad AlSaleh
Mohun Biswas Mohun Biswas
Mostyn Bramley-Moore
Myk Taylor Myk Taylor
Nach M. S. Nach M. S.
Nagai H Nagai H
Nathan Coulter Nathan Coulter
Nathan O'Sullivan Nathan O'Sullivan
Nathanael Nerode Nathanael Nerode
Nathaniel Waisbrot
Naveen Chandran Naveen Chandran
Naveen Noel Naveen Noel
Neil Bowers Neil Bowers
@ -944,22 +861,16 @@ Nis Jorgensen
Nobuhiro Ban Nobuhiro Ban
Nodak Sodak Nodak Sodak
Norbert Frese Norbert Frese
Norbert Kett
Norbert Novotny Norbert Novotny
Octavio Schroeder
Ofer Ofer
Ola Mork Ola Mork
Olaf Flebbe Olaf Flebbe
Olaf Stüben Olaf Stüben
Oliver Gondža Oliver Gondža
Oliver Graute
Oliver Kuckertz Oliver Kuckertz
Oliver Schindler Oliver Schindler
Olivier Berger Olivier Berger
Orange Tsai
Oren Souroujon
Oren Tirosh Oren Tirosh
Orgad Shaneh
Ori Avtalion Ori Avtalion
Oscar Koeroo Oscar Koeroo
Oscar Norlander Oscar Norlander
@ -975,7 +886,6 @@ Patricia Muscalu
Patrick Bihan-Faou Patrick Bihan-Faou
Patrick McManus Patrick McManus
Patrick Monnerat Patrick Monnerat
Patrick Rapin
Patrick Scott Patrick Scott
Patrick Smith Patrick Smith
Patrick Watson Patrick Watson
@ -988,7 +898,6 @@ Paul Marks
Paul Marquis Paul Marquis
Paul Moore Paul Moore
Paul Nolan Paul Nolan
Paul Oliver
Paul Querna Paul Querna
Paul Saab Paul Saab
Pavel Cenek Pavel Cenek
@ -1005,7 +914,6 @@ Peter Heuchert
Peter Hjalmarsson Peter Hjalmarsson
Peter Korsgaard Peter Korsgaard
Peter Lamberg Peter Lamberg
Peter Laser
Peter O'Gorman Peter O'Gorman
Peter Pentchev Peter Pentchev
Peter Silva Peter Silva
@ -1045,15 +953,12 @@ Quanah Gibson-Mount
Quinn Slack Quinn Slack
Radu Simionescu Radu Simionescu
Rafa Muyo Rafa Muyo
Rafael Antonio
Rafael Sagula Rafael Sagula
Rafayel Mkrtchyan
Rafaël Carré Rafaël Carré
Rainer Canavan Rainer Canavan
Rainer Jung Rainer Jung
Rainer Koenig Rainer Koenig
Rajesh Naganathan Rajesh Naganathan
Rajkumar Mandal
Ralf S. Engelschall Ralf S. Engelschall
Ralph Beckmann Ralph Beckmann
Ralph Mitchell Ralph Mitchell
@ -1063,7 +968,6 @@ Ravi Pratap
Ray Dassen Ray Dassen
Ray Pekowski Ray Pekowski
Ray Satiro Ray Satiro
Razvan Cojocaru
Reinout van Schouwen Reinout van Schouwen
Remi Gacogne Remi Gacogne
Renato Botelho Renato Botelho
@ -1084,12 +988,10 @@ Richard Bramante
Richard Clayton Richard Clayton
Richard Cooper Richard Cooper
Richard Gorton Richard Gorton
Richard Hosking
Richard Michael Richard Michael
Richard Moore Richard Moore
Richard Prescott Richard Prescott
Richard Silverman Richard Silverman
Richard van den Berg
Rick Jones Rick Jones
Rick Richardson Rick Richardson
Rob Crittenden Rob Crittenden
@ -1113,7 +1015,6 @@ Robson Braga Araujo
Rodney Simmons Rodney Simmons
Rodric Glaser Rodric Glaser
Rodrigo Silva Rodrigo Silva
Roger Leigh
Roland Blom Roland Blom
Roland Krikava Roland Krikava
Roland Zimmermann Roland Zimmermann
@ -1138,7 +1039,6 @@ Salvador Dávila
Salvatore Sorrentino Salvatore Sorrentino
Sam Deane Sam Deane
Sam Hurst Sam Hurst
Sam Roth
Sam Schanken Sam Schanken
Sampo Kellomaki Sampo Kellomaki
Samuel Díaz García Samuel Díaz García
@ -1157,22 +1057,18 @@ Scott Barrett
Scott Cantor Scott Cantor
Scott Davis Scott Davis
Scott McCreary Scott McCreary
Sean Boudreau
Sebastian Pohlschmidt
Sebastian Rasmussen Sebastian Rasmussen
Senthil Raja Velu Senthil Raja Velu
Sergei Nikulov Sergei Nikulov
Sergey Tatarincev Sergey Tatarincev
Sergio Ballestrero Sergio Ballestrero
Seshubabu Pasam Seshubabu Pasam
Seth Mos
Sh Diao Sh Diao
Shao Shuchao Shao Shuchao
Sharad Gupta Sharad Gupta
Shard Shard
Shawn Landden Shawn Landden
Shawn Poulson Shawn Poulson
Shine Fan
Shmulik Regev Shmulik Regev
Siddhartha Prakash Jain Siddhartha Prakash Jain
Sidney San Martin Sidney San Martin
@ -1189,7 +1085,6 @@ Stadler Stephan
Stan van de Burgt Stan van de Burgt
Stanislav Ivochkin Stanislav Ivochkin
Stefan Bühler Stefan Bühler
Stefan Eissing
Stefan Esser Stefan Esser
Stefan Krause Stefan Krause
Stefan Neis Stefan Neis
@ -1204,7 +1099,6 @@ Stephen More
Sterling Hughes Sterling Hughes
Steve Green Steve Green
Steve H Truong Steve H Truong
Steve Havelka
Steve Holme Steve Holme
Steve Lhomme Steve Lhomme
Steve Little Steve Little
@ -1221,28 +1115,22 @@ Sune Ahlgren
Sven Anders Sven Anders
Sven Neuhaus Sven Neuhaus
Sven Wegener Sven Wegener
Svyatoslav Mishyn
Symeon Paraschoudis Symeon Paraschoudis
Sébastien Willemijns Sébastien Willemijns
T. Bharath T. Bharath
T. Yamada T. Yamada
TJ Saunders
Tae Hyoung Ahn Tae Hyoung Ahn
Taneli Vahakangas Taneli Vahakangas
Tanguy Fautre Tanguy Fautre
Tatsuhiro Tsujikawa Tatsuhiro Tsujikawa
Temprimus Temprimus
Terri Oda
Thomas Braun Thomas Braun
Thomas Glanzmann
Thomas J. Moore Thomas J. Moore
Thomas Klausner Thomas Klausner
Thomas L. Shinnick Thomas L. Shinnick
Thomas Lopatic Thomas Lopatic
Thomas Ruecker
Thomas Schwinge Thomas Schwinge
Thomas Tonino Thomas Tonino
Thorsten Schöning
Tiit Pikma Tiit Pikma
Till Maas Till Maas
Tim Ansell Tim Ansell
@ -1253,19 +1141,17 @@ Tim Costello
Tim Harder Tim Harder
Tim Heckman Tim Heckman
Tim Newsome Tim Newsome
Tim Rühsen Tim Ruehsen
Tim Sneddon Tim Sneddon
Tim Stack
Tim Starling Tim Starling
Timo Sirainen Timo Sirainen
Timotej Lazar
Tinus van den Berg Tinus van den Berg
Tobias Markus Tobias Markus
Tobias Rundström Tobias Rundström
Tobias Stoeckmann
Toby Peterson Toby Peterson
Todd A Ouska Todd A Ouska
Todd Kulesza Todd Kulesza
Todd Ouska
Todd Vierling Todd Vierling
Tom Benoist Tom Benoist
Tom Donovan Tom Donovan
@ -1282,7 +1168,6 @@ Tomas Hoger
Tomas Mlcoch Tomas Mlcoch
Tomas Pospisek Tomas Pospisek
Tomas Szepe Tomas Szepe
Tomas Tomecek
Tomasz Kojm Tomasz Kojm
Tomasz Lacki Tomasz Lacki
Tommie Gannert Tommie Gannert
@ -1310,7 +1195,6 @@ Victor Snezhko
Vijay Panghal Vijay Panghal
Vikram Saxena Vikram Saxena
Viktor Szakáts Viktor Szakáts
Ville Skyttä
Vilmos Nebehaj Vilmos Nebehaj
Vincent Bronner Vincent Bronner
Vincent Le Normand Vincent Le Normand
@ -1325,7 +1209,6 @@ Vojtech Janota
Vojtech Minarik Vojtech Minarik
Vojtěch Král Vojtěch Král
Vsevolod Novikov Vsevolod Novikov
W. Mark Kubacki
Waldek Kozba Waldek Kozba
Walter J. Mack Walter J. Mack
Ward Willats Ward Willats
@ -1343,9 +1226,7 @@ Wojciech Zwiefka
Wouter Van Rooy Wouter Van Rooy
Wu Yongzheng Wu Yongzheng
Xavier Bouchoux Xavier Bouchoux
Xiangbin Li
Yaakov Selkowitz Yaakov Selkowitz
Yamada Yasuharu
Yang Tse Yang Tse
Yarram Sunil Yarram Sunil
Yasuharu Yamada Yasuharu Yamada
@ -1366,5 +1247,4 @@ Zvi Har'El
nk nk
swalkaus at yahoo.com swalkaus at yahoo.com
tommink[at]post.pl tommink[at]post.pl
Štefan Kremeň
Никита Дорохин Никита Дорохин

View File

@ -33,8 +33,7 @@ s/Nick Zitzmann (originally)/Nick Zitzmann/
s/product-security at Apple// s/product-security at Apple//
s/IT DOES NOT WORK// s/IT DOES NOT WORK//
s/Albert Chin/Albert Chin-A-Young/ s/Albert Chin/Albert Chin-A-Young/
s/Paras S\z/Paras Sethia/ s/Paras S/Paras Sethia/
s/Paras Sethiaethia/Paras Sethia/
s/Дмитрий Фалько/Dmitry Falko/ s/Дмитрий Фалько/Dmitry Falko/
s/byte_bucket in the #curl IRC channel// s/byte_bucket in the #curl IRC channel//
s/Michal Górny and Anthony G. Basile// s/Michal Górny and Anthony G. Basile//
@ -48,8 +47,3 @@ s/Rodrigo Silva (MestreLion)/Rodrigo Silva/
s/tetetest tetetest// s/tetetest tetetest//
s/Jiří Hruška/Jiri Hruska/ s/Jiří Hruška/Jiri Hruska/
s/Viktor Szakats/Viktor Szakáts/ s/Viktor Szakats/Viktor Szakáts/
s/Jonathan Cardoso/Jonathan Cardoso Machado/
s/Linus Nielsen/Linus Nielsen Feltzing/
s/Todd Ouska$/Todd A Ouska/
s/Tim Ruehsen/Tim Rühsen/
s/Michael Koenig/Michael König/

270
docs/TODO
View File

@ -9,11 +9,6 @@
Things to do in project cURL. Please tell us what you think, contribute and Things to do in project cURL. Please tell us what you think, contribute and
send us patches that improve things! send us patches that improve things!
Be aware that these are things that we could do, or have once been considered
things we could do. If you want to work on any of these areas, please
consider bringing it up for discussions first on the mailing list so that we
all agree it is still a good idea for the project!
All bugs documented in the KNOWN_BUGS document are subject for fixing! All bugs documented in the KNOWN_BUGS document are subject for fixing!
1. libcurl 1. libcurl
@ -25,19 +20,11 @@
1.7 Detect when called from within callbacks 1.7 Detect when called from within callbacks
1.8 Allow SSL (HTTPS) to proxy 1.8 Allow SSL (HTTPS) to proxy
1.9 Cache negative name resolves 1.9 Cache negative name resolves
1.10 Support IDNA2008
1.11 minimize dependencies with dynamicly loaded modules
1.12 have form functions use CURL handle argument
1.13 Add CURLOPT_MAIL_CLIENT option
1.14 Typesafe curl_easy_setopt()
1.15 TCP Fast Open
1.16 Try to URL encode given URL
2. libcurl - multi interface 2. libcurl - multi interface
2.1 More non-blocking 2.1 More non-blocking
2.2 Better support for same name resolves 2.2 Fix HTTP Pipelining for PUT
2.3 Non-blocking curl_multi_remove_handle() 2.3 Better support for same name resolves
2.4 Split connect and authentication process
3. Documentation 3. Documentation
3.1 Update date and version in man pages 3.1 Update date and version in man pages
@ -57,8 +44,6 @@
5.3 Rearrange request header order 5.3 Rearrange request header order
5.4 SPDY 5.4 SPDY
5.5 auth= in URLs 5.5 auth= in URLs
5.6 Refuse "downgrade" redirects
5.7 More compressions
6. TELNET 6. TELNET
6.1 ditch stdin 6.1 ditch stdin
@ -69,23 +54,22 @@
7. SMTP 7. SMTP
7.1 Pipelining 7.1 Pipelining
7.2 Enhanced capability support 7.2 Enhanced capability support
8. POP3 8. POP3
8.1 Pipelining 8.1 Pipelining
8.2 Enhanced capability support 8.2 Enhanced capability support
9. IMAP 9. IMAP
9.1 Enhanced capability support 9.1 Enhanced capability support
10. LDAP 10. LDAP
10.1 SASL based authentication mechanisms 10.1 SASL based authentication mechanisms
11. SMB 11. SMB
11.1 File listing support 11.1 File listing support
11.2 Honor file timestamps 11.2 Honor file timestamps
11.3 Use NTLMv2 11.3 Use NTLMv2
11.4 Create remote directories
12. New protocols 12. New protocols
12.1 RSYNC 12.1 RSYNC
@ -111,20 +95,14 @@
16. SASL 16. SASL
16.1 Other authentication mechanisms 16.1 Other authentication mechanisms
16.2 Add QOP support to GSSAPI authentication 16.2 Add QOP support to GSSAPI authentication
17. Command line tool 17. Client
17.1 sync 17.1 sync
17.2 glob posts 17.2 glob posts
17.3 prevent file overwriting 17.3 prevent file overwriting
17.4 simultaneous parallel transfers 17.4 simultaneous parallel transfers
17.5 provide formpost headers 17.5 provide formpost headers
17.6 warning when setting an option 17.6 warning when setting an option
17.7 warning when sending binary output to terminal
17.8 offer color-coded HTTP header output
17.9 Choose the name of file in braces for complex URLs
17.10 improve how curl works in a windows console window
17.11 -w output to stderr
17.12 keep running, read instructions from pipe/socket
18. Build 18. Build
18.1 roffit 18.1 roffit
@ -135,7 +113,6 @@
19.3 more protocols supported 19.3 more protocols supported
19.4 more platforms supported 19.4 more platforms supported
19.5 Add support for concurrent connections 19.5 Add support for concurrent connections
19.6 Use the RFC6265 test suite
20. Next SONAME bump 20. Next SONAME bump
20.1 http-style HEAD output for FTP 20.1 http-style HEAD output for FTP
@ -151,6 +128,8 @@
21.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE 21.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE
21.7 remove progress meter from libcurl 21.7 remove progress meter from libcurl
21.8 remove 'curl_httppost' from public 21.8 remove 'curl_httppost' from public
21.9 have form functions use CURL handle argument
21.10 Add CURLOPT_MAIL_CLIENT option
============================================================================== ==============================================================================
@ -175,7 +154,7 @@
signal handler back into the library with a sigsetjmp, which effectively signal handler back into the library with a sigsetjmp, which effectively
causes libcurl to continue running within the signal handler. This is causes libcurl to continue running within the signal handler. This is
non-portable and could cause problems on some platforms. A discussion on the non-portable and could cause problems on some platforms. A discussion on the
problem is available at https://curl.haxx.se/mail/lib-2008-09/0197.html problem is available at http://curl.haxx.se/mail/lib-2008-09/0197.html
Also, alarm() provides timeout resolution only to the nearest second. alarm Also, alarm() provides timeout resolution only to the nearest second. alarm
ought to be replaced by setitimer on systems that support it. ought to be replaced by setitimer on systems that support it.
@ -220,7 +199,7 @@
To prevent local users from snooping on your traffic to the proxy. Supported To prevent local users from snooping on your traffic to the proxy. Supported
by Chrome already: by Chrome already:
https://www.chromium.org/developers/design-documents/secure-web-proxy http://www.chromium.org/developers/design-documents/secure-web-proxy
...and by Firefox soon: ...and by Firefox soon:
https://bugzilla.mozilla.org/show_bug.cgi?id=378637 https://bugzilla.mozilla.org/show_bug.cgi?id=378637
@ -230,72 +209,6 @@
A name resolve that has failed is likely to fail when made again within a A name resolve that has failed is likely to fail when made again within a
short period of time. Currently we only cache positive responses. short period of time. Currently we only cache positive responses.
1.10 Support IDNA2008
International Domain Names are supported in libcurl since years back, powered
by libidn. libidn implements IDNA2003 which has been superseded by IDNA2008.
libidn2 is an existing library offering support for IDNA2008.
1.11 minimize dependencies with dynamicly loaded modules
We can create a system with loadable modules/plug-ins, where these modules
would be the ones that link to 3rd party libs. That would allow us to avoid
having to load ALL dependencies since only the necessary ones for this
app/invoke/used protocols would be necessary to load. See
https://github.com/curl/curl/issues/349
1.12 have form functions use CURL handle argument
curl_formadd() and curl_formget() both currently have no CURL handle
argument, but both can use a callback that is set in the easy handle, and
thus curl_formget() with callback cannot function without first having
curl_easy_perform() (or similar) called - which is hard to grasp and a design
mistake.
The curl_formadd() design can probably also be reconsidered to make it easier
to use and less error-prone. Probably easiest by splitting it into several
function calls.
1.13 Add CURLOPT_MAIL_CLIENT option
Rather than use the URL to specify the mail client string to present in the
HELO and EHLO commands, libcurl should support a new CURLOPT specifically for
specifying this data as the URL is non-standard and to be honest a bit of a
hack ;-)
Please see the following thread for more information:
https://curl.haxx.se/mail/lib-2012-05/0178.html
1.14 Typesafe curl_easy_setopt()
One of the most common problems in libcurl using applications is the lack of
type checks for curl_easy_setopt() which happens because it accepts varargs
and thus can take any type.
One possible solution to this is to introduce a few different versions of the
setopt version for the different kinds of data you can set.
curl_easy_set_num() - sets a long value
curl_easy_set_large() - sets a curl_off_t value
curl_easy_set_ptr() - sets a pointer
curl_easy_set_cb() - sets a callback PLUS its callback data
1.15 TCP Fast Open
RFC 7413 defines how to include data already in the TCP SYN handshake to
reduce latency.
1.16 Try to URL encode given URL
Given a URL that for example contains spaces, libcurl could have an option
that would try somewhat harder than it does now and convert spaces to %20 and
perhaps URL encoded byte values over 128 etc (basically do what the redirect
following code already does).
https://github.com/curl/curl/issues/514
2. libcurl - multi interface 2. libcurl - multi interface
@ -313,7 +226,13 @@
- The "DONE" operation (post transfer protocol-specific actions) for the - The "DONE" operation (post transfer protocol-specific actions) for the
protocols SFTP, SMTP, FTP. Fixing Curl_done() for this is a worthy task. protocols SFTP, SMTP, FTP. Fixing Curl_done() for this is a worthy task.
2.2 Better support for same name resolves 2.2 Fix HTTP Pipelining for PUT
HTTP Pipelining can be a way to greatly enhance performance for multiple
serial requests and currently libcurl only supports that for HEAD and GET
requests but it should also be possible for PUT.
2.3 Better support for same name resolves
If a name resolve has been initiated for name NN and a second easy handle If a name resolve has been initiated for name NN and a second easy handle
wants to resolve that name as well, make it wait for the first resolve to end wants to resolve that name as well, make it wait for the first resolve to end
@ -321,20 +240,6 @@
especially needed when adding many simultaneous handles using the same host especially needed when adding many simultaneous handles using the same host
name when the DNS resolver can get flooded. name when the DNS resolver can get flooded.
2.3 Non-blocking curl_multi_remove_handle()
The multi interface has a few API calls that assume a blocking behavior, like
add_handle() and remove_handle() which limits what we can do internally. The
multi API need to be moved even more into a single function that "drives"
everything in a non-blocking manner and signals when something is done. A
remove or add would then only ask for the action to get started and then
multi_perform() etc still be called until the add/remove is completed.
2.4 Split connect and authentication process
The multi interface treats the authentication process as part of the connect
phase. As such any failures during authentication won't trigger the relevant
QUIT or LOGOFF for protocols such as IMAP, POP3 and SMTP.
3. Documentation 3. Documentation
@ -351,14 +256,14 @@
HOST is a command for a client to tell which host name to use, to offer FTP HOST is a command for a client to tell which host name to use, to offer FTP
servers named-based virtual hosting: servers named-based virtual hosting:
https://tools.ietf.org/html/rfc7151 http://tools.ietf.org/html/rfc7151
4.2 Alter passive/active on failure and retry 4.2 Alter passive/active on failure and retry
When trying to connect passively to a server which only supports active When trying to connect passively to a server which only supports active
connections, libcurl returns CURLE_FTP_WEIRD_PASV_REPLY and closes the connections, libcurl returns CURLE_FTP_WEIRD_PASV_REPLY and closes the
connection. There could be a way to fallback to an active connection (and connection. There could be a way to fallback to an active connection (and
vice versa). https://curl.haxx.se/bug/feature.cgi?id=1754793 vice versa). http://curl.haxx.se/bug/feature.cgi?id=1754793
4.3 Earlier bad letter detection 4.3 Earlier bad letter detection
@ -395,13 +300,13 @@ This is not detailed in any FTP specification.
5.1 Better persistency for HTTP 1.0 5.1 Better persistency for HTTP 1.0
"Better" support for persistent connections over HTTP 1.0 "Better" support for persistent connections over HTTP 1.0
https://curl.haxx.se/bug/feature.cgi?id=1089001 http://curl.haxx.se/bug/feature.cgi?id=1089001
5.2 support FF3 sqlite cookie files 5.2 support FF3 sqlite cookie files
Firefox 3 is changing from its former format to a a sqlite database instead. Firefox 3 is changing from its former format to a a sqlite database instead.
We should consider how (lib)curl can/should support this. We should consider how (lib)curl can/should support this.
https://curl.haxx.se/bug/feature.cgi?id=1871388 http://curl.haxx.se/bug/feature.cgi?id=1871388
5.3 Rearrange request header order 5.3 Rearrange request header order
@ -431,26 +336,10 @@ This is not detailed in any FTP specification.
For example: For example:
http://test:pass;auth=NTLM@example.com would be equivalent to specifying --user http://test:pass;auth=NTLM@example.com would be equivalent to specifying --user
test:pass;auth=NTLM or --user test:pass --ntlm from the command line. test:pass;auth=NTLM or --user test:pass --ntlm from the command line.
Additionally this should be implemented for proxy base URLs as well. Additionally this should be implemented for proxy base URLs as well.
5.6 Refuse "downgrade" redirects
See https://github.com/curl/curl/issues/226
Consider a way to tell curl to refuse to "downgrade" protocol with a redirect
and/or possibly a bit that refuses redirect to change protocol completely.
5.7 More compressions
Compression algorithms that perform better than gzip are being considered for
use and inclusion in existing browsers. For example 'brotli'. If servers
follow along it is a good reason for us to also allow users to take advantage
of this. The algorithm: https://github.com/google/brotli The Firefox bug:
https://bugzilla.mozilla.org/show_bug.cgi?id=366559
6. TELNET 6. TELNET
6.1 ditch stdin 6.1 ditch stdin
@ -523,17 +412,12 @@ be the same as/similar to FTP.
11.2 Honor file timestamps 11.2 Honor file timestamps
The timestamp of the transferred file should reflect that of the original file. The timestamp of the transfered file should reflect that of the original file.
11.3 Use NTLMv2 11.3 Use NTLMv2
Currently the SMB authentication uses NTLMv1. Currently the SMB authentication uses NTLMv1.
11.4 Create remote directories
Support for creating remote directories when uploading a file to a directory
that doesn't exist on the server, just like --ftp-create-dirs.
12. New protocols 12. New protocols
12.1 RSYNC 12.1 RSYNC
@ -546,7 +430,7 @@ that doesn't exist on the server, just like --ftp-create-dirs.
13.1 Disable specific versions 13.1 Disable specific versions
Provide an option that allows for disabling specific SSL versions, such as Provide an option that allows for disabling specific SSL versions, such as
SSLv2 https://curl.haxx.se/bug/feature.cgi?id=1767276 SSLv2 http://curl.haxx.se/bug/feature.cgi?id=1767276
13.2 Provide mutex locking API 13.2 Provide mutex locking API
@ -557,7 +441,7 @@ that doesn't exist on the server, just like --ftp-create-dirs.
13.3 Evaluate SSL patches 13.3 Evaluate SSL patches
Evaluate/apply Gertjan van Wingerde's SSL patches: Evaluate/apply Gertjan van Wingerde's SSL patches:
https://curl.haxx.se/mail/lib-2004-03/0087.html http://curl.haxx.se/mail/lib-2004-03/0087.html
13.4 Cache OpenSSL contexts 13.4 Cache OpenSSL contexts
@ -592,12 +476,12 @@ that doesn't exist on the server, just like --ftp-create-dirs.
DNS-Based Authentication of Named Entities (DANE) is a way to provide SSL DNS-Based Authentication of Named Entities (DANE) is a way to provide SSL
keys and certs over DNS using DNSSEC as an alternative to the CA model. keys and certs over DNS using DNSSEC as an alternative to the CA model.
https://www.rfc-editor.org/rfc/rfc6698.txt http://www.rfc-editor.org/rfc/rfc6698.txt
An initial patch was posted by Suresh Krishnaswamy on March 7th 2013 An initial patch was posted by Suresh Krishnaswamy on March 7th 2013
(https://curl.haxx.se/mail/lib-2013-03/0075.html) but it was a too simple (http://curl.haxx.se/mail/lib-2013-03/0075.html) but it was a too simple
approach. See Daniel's comments: approach. See Daniel's comments:
https://curl.haxx.se/mail/lib-2013-03/0103.html . libunbound may be the http://curl.haxx.se/mail/lib-2013-03/0103.html . libunbound may be the
correct library to base this development on. correct library to base this development on.
14. GnuTLS 14. GnuTLS
@ -622,7 +506,7 @@ that doesn't exist on the server, just like --ftp-create-dirs.
Therefore support for the existing -E/--cert and --key options should be Therefore support for the existing -E/--cert and --key options should be
implemented by supplying a custom certificate to the SChannel APIs, see: implemented by supplying a custom certificate to the SChannel APIs, see:
- Getting a Certificate for Schannel - Getting a Certificate for Schannel
https://msdn.microsoft.com/en-us/library/windows/desktop/aa375447.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/aa375447.aspx
15.2 Add support for custom server certificate validation 15.2 Add support for custom server certificate validation
@ -633,7 +517,7 @@ that doesn't exist on the server, just like --ftp-create-dirs.
Therefore support for the existing --cacert or --capath options should be Therefore support for the existing --cacert or --capath options should be
implemented by supplying a custom certificate to the SChannel APIs, see: implemented by supplying a custom certificate to the SChannel APIs, see:
- Getting a Certificate for Schannel - Getting a Certificate for Schannel
https://msdn.microsoft.com/en-us/library/windows/desktop/aa375447.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/aa375447.aspx
15.3 Add support for the --ciphers option 15.3 Add support for the --ciphers option
@ -644,7 +528,7 @@ that doesn't exist on the server, just like --ftp-create-dirs.
Therefore support for the existing --ciphers option should be implemented Therefore support for the existing --ciphers option should be implemented
by mapping the OpenSSL/GnuTLS cipher suites to the SChannel APIs, see by mapping the OpenSSL/GnuTLS cipher suites to the SChannel APIs, see
- Specifying Schannel Ciphers and Cipher Strengths - Specifying Schannel Ciphers and Cipher Strengths
https://msdn.microsoft.com/en-us/library/windows/desktop/aa380161.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/aa380161.aspx
16. SASL 16. SASL
@ -652,7 +536,7 @@ that doesn't exist on the server, just like --ftp-create-dirs.
Add support for other authentication mechanisms such as OLP, Add support for other authentication mechanisms such as OLP,
GSS-SPNEGO and others. GSS-SPNEGO and others.
16.2 Add QOP support to GSSAPI authentication 16.2 Add QOP support to GSSAPI authentication
Currently the GSSAPI authentication only supports the default QOP of auth Currently the GSSAPI authentication only supports the default QOP of auth
@ -660,7 +544,7 @@ that doesn't exist on the server, just like --ftp-create-dirs.
with integrity protection) and auth-conf (Authentication with integrity and with integrity protection) and auth-conf (Authentication with integrity and
privacy protection). privacy protection).
17. Command line tool 17. Client
17.1 sync 17.1 sync
@ -689,7 +573,7 @@ that doesn't exist on the server, just like --ftp-create-dirs.
The client could be told to use maximum N simultaneous parallel transfers and The client could be told to use maximum N simultaneous parallel transfers and
then just make sure that happens. It should of course not make more than one then just make sure that happens. It should of course not make more than one
connection to the same remote host. This would require the client to use the connection to the same remote host. This would require the client to use the
multi interface. https://curl.haxx.se/bug/feature.cgi?id=1558595 multi interface. http://curl.haxx.se/bug/feature.cgi?id=1558595
17.5 provide formpost headers 17.5 provide formpost headers
@ -707,54 +591,9 @@ that doesn't exist on the server, just like --ftp-create-dirs.
17.6 warning when setting an option 17.6 warning when setting an option
Display a warning when libcurl returns an error when setting an option. Display a warning when libcurl returns an error when setting an option.
This can be useful to tell when support for a particular feature hasn't been This can be useful to tell when support for a particular feature hasn't been
compiled into the library. compiled into the library.
17.7 warning when sending binary output to terminal
Provide a way that prompts the user for confirmation before binary data is
sent to the terminal, much in the style 'less' does it.
17.8 offer color-coded HTTP header output
By offering different color output on the header name and the header
contents, they could be made more readable and thus help users working on
HTTP services.
17.9 Choose the name of file in braces for complex URLs
When using braces to download a list of URLs and you use complicated names
in the list of alternatives, it could be handy to allow curl to use other
names when saving.
Consider a way to offer that. Possibly like
{partURL1:name1,partURL2:name2,partURL3:name3} where the name following the
colon is the output name.
See https://github.com/curl/curl/issues/221
17.10 improve how curl works in a windows console window
If you pull the scrollbar when transferring with curl in a Windows console
window, the transfer is interrupted and can get disconnected. This can
probably be improved. See https://github.com/curl/curl/issues/322
17.11 -w output to stderr
-w is quite useful, but not to those of us who use curl without -o or -O
(such as for scripting through a higher level language). It would be nice to
have an option that is exactly like -w but sends it to stderr
instead. Proposed name: --write-stderr. See
https://github.com/curl/curl/issues/613
17.12 keep running, read instructions from pipe/socket
Provide an option that makes curl not exit after the last URL (or even work
without a given URL), and then make it read instructions passed on a pipe or
over a socket to make further instructions so that a second subsequent curl
invoke can talk to the still running instance and ask for transfers to get
done, and thus maintain its connection pool, DNS cache and more.
18. Build 18. Build
@ -800,16 +639,6 @@ that doesn't exist on the server, just like --ftp-create-dirs.
and thus the wait for connections loop is never entered to receive the second and thus the wait for connections loop is never entered to receive the second
connection. connection.
19.6 Use the RFC6265 test suite
A test suite made for HTTP cookies (RFC 6265) by Adam Barth is available at
https://github.com/abarth/http-state/tree/master/tests
It'd be really awesome if someone would write a script/setup that would run
curl with that test suite and detect deviances. Ideally, that would even be
incorporated into our regular test suite.
20. Next SONAME bump 20. Next SONAME bump
20.1 http-style HEAD output for FTP 20.1 http-style HEAD output for FTP
@ -914,3 +743,22 @@ that doesn't exist on the server, just like --ftp-create-dirs.
Changing them to return a private handle will benefit the implementation and Changing them to return a private handle will benefit the implementation and
allow us much greater freedoms while still maintaining a solid API and ABI. allow us much greater freedoms while still maintaining a solid API and ABI.
21.9 have form functions use CURL handle argument
curl_formadd() and curl_formget() both currently have no CURL handle
argument, but both can use a callback that is set in the easy handle, and
thus curl_formget() with callback cannot function without first having
curl_easy_perform() (or similar) called - which is hard to grasp and a design
mistake.
21.10 Add CURLOPT_MAIL_CLIENT option
Rather than use the URL to specify the mail client string to present in the
HELO and EHLO commands, libcurl should support a new CURLOPT specifically for
specifying this data as the URL is non-standard and to be honest a bit of a
hack ;-)
Please see the following thread for more information:
http://curl.haxx.se/mail/lib-2012-05/0178.html

View File

@ -22,8 +22,6 @@ The Art Of Scripting HTTP Requests Using Curl
3. Fetch a page 3. Fetch a page
3.1 GET 3.1 GET
3.2 HEAD 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. HTML forms
4.1 Forms explained 4.1 Forms explained
4.2 GET 4.2 GET
@ -136,8 +134,8 @@ The Art Of Scripting HTTP Requests Using Curl
The Uniform Resource Locator format is how you specify the address of a 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 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 http://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. canonical spec.
2.2 Host 2.2 Host
@ -194,6 +192,7 @@ The Art Of Scripting HTTP Requests Using Curl
the associated response. The path is what is to the right side of the slash the associated response. The path is what is to the right side of the slash
that follows the host name and possibly port number. that follows the host name and possibly port number.
3. Fetch a page 3. Fetch a page
3.1 GET 3.1 GET
@ -203,7 +202,7 @@ The Art Of Scripting HTTP Requests Using Curl
issues a GET request to the server and receives the document it asked for. issues a GET request to the server and receives the document it asked for.
If you issue the command line If you issue the command line
curl https://curl.haxx.se curl http://curl.haxx.se
you get a web page returned in your terminal window. The entire HTML document you get a web page returned in your terminal window. The entire HTML document
that that URL holds. that that URL holds.
@ -224,46 +223,6 @@ The Art Of Scripting HTTP Requests Using Curl
may see a Content-Length: in the response headers, but there must not be an may see a Content-Length: in the response headers, but there must not be an
actual body in the HEAD response. 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. HTML forms
4.1 Forms explained 4.1 Forms explained
@ -342,10 +301,6 @@ The Art Of Scripting HTTP Requests Using Curl
curl --data-urlencode "name=I am Daniel" http://www.example.com 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 4.4 File Upload POST
Back in late 1995 they defined an additional way to post data over HTTP. It Back in late 1995 they defined an additional way to post data over HTTP. It
@ -628,13 +583,7 @@ The Art Of Scripting HTTP Requests Using Curl
More about server certificate verification and ca cert bundles can be read More about server certificate verification and ca cert bundles can be read
in the SSLCERTS document, available online here: in the SSLCERTS document, available online here:
https://curl.haxx.se/docs/sslcerts.html http://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. Custom Request Elements
@ -744,7 +693,7 @@ The Art Of Scripting HTTP Requests Using Curl
14.1 Standards 14.1 Standards
RFC 7230 is a must to read if you want in-depth understanding of the HTTP RFC 2616 is a must to read if you want in-depth understanding of the HTTP
protocol protocol
RFC 3986 explains the URL syntax RFC 3986 explains the URL syntax
@ -755,4 +704,4 @@ The Art Of Scripting HTTP Requests Using Curl
14.2 Sites 14.2 Sites
https://curl.haxx.se is the home of the cURL project http://curl.haxx.se is the home of the cURL project

View File

@ -1,18 +1,22 @@
_ _ ____ _
___| | | | _ \| |
/ __| | | | |_) | |
| (__| |_| | _ <| |___
\___|\___/|_| \_\_____|
Version Numbers and Releases Version Numbers and Releases
============================
Curl is not only curl. Curl is also libcurl. They're actually individually Curl is not only curl. Curl is also libcurl. They're actually individually
versioned, but they mostly follow each other rather closely. versioned, but they mostly follow each other rather closely.
The version numbering is always built up using the same system: The version numbering is always built up using the same system:
X.Y.Z X.Y[.Z]
- X is main version number Where
- Y is release number X is main version number
- Z is patch number Y is release number
Z is patch number
## Bumping numbers
One of these numbers will get bumped in each new release. The numbers to the One of these numbers will get bumped in each new release. The numbers to the
right of a bumped number will be reset to zero. If Z is zero, it may not be right of a bumped number will be reset to zero. If Z is zero, it may not be
@ -53,4 +57,4 @@ Version Numbers and Releases
release. It makes comparisons with greater than and less than work. release. It makes comparisons with greater than and less than work.
This number is also available as three separate defines: This number is also available as three separate defines:
`LIBCURL_VERSION_MAJOR`, `LIBCURL_VERSION_MINOR` and `LIBCURL_VERSION_PATCH`. LIBCURL_VERSION_MAJOR, LIBCURL_VERSION_MINOR and LIBCURL_VERSION_PATCH.

View File

@ -9,7 +9,7 @@
.\" * .\" *
.\" * This software is licensed as described in the file COPYING, which .\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms .\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html. .\" * are also available at http://curl.haxx.se/docs/copyright.html.
.\" * .\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell .\" * 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 .\" * copies of the Software, and permit persons to whom the Software is

View File

@ -5,11 +5,11 @@
.\" * | (__| |_| | _ <| |___ .\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____| .\" * \___|\___/|_| \_\_____|
.\" * .\" *
.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. .\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" * .\" *
.\" * This software is licensed as described in the file COPYING, which .\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms .\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html. .\" * are also available at http://curl.haxx.se/docs/copyright.html.
.\" * .\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell .\" * 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 .\" * copies of the Software, and permit persons to whom the Software is
@ -39,7 +39,8 @@ resume, Metalink, and more. As you will see below, the number of features will
make your head spin! make your head spin!
curl is powered by libcurl for all transfer-related features. See curl is powered by libcurl for all transfer-related features. See
\fIlibcurl(3)\fP for details. .BR libcurl (3)
for details.
.SH URL .SH URL
The URL syntax is protocol-dependent. You'll find a detailed description in The URL syntax is protocol-dependent. You'll find a detailed description in
RFC 3986. RFC 3986.
@ -171,11 +172,10 @@ a level of control).
.IP "-2, --sslv2" .IP "-2, --sslv2"
(SSL) Forces curl to use SSL version 2 when negotiating with a remote SSL (SSL) Forces curl to use SSL version 2 when negotiating with a remote SSL
server. Sometimes curl is built without SSLv2 support. SSLv2 is widely server. Sometimes curl is built without SSLv2 support. SSLv2 is widely
considered insecure (see RFC 6176). considered insecure.
.IP "-3, --sslv3" .IP "-3, --sslv3"
(SSL) Forces curl to use SSL version 3 when negotiating with a remote SSL (SSL) Forces curl to use SSL version 3 when negotiating with a remote SSL
server. Sometimes curl is built without SSLv3 support. SSLv3 is widely server. Sometimes curl is built without SSLv3 support.
considered insecure (see RFC 7568).
.IP "-4, --ipv4" .IP "-4, --ipv4"
This option tells curl to resolve names to IPv4 addresses only, and not for This option tells curl to resolve names to IPv4 addresses only, and not for
example try IPv6. example try IPv6.
@ -213,25 +213,16 @@ be in the format "NAME1=VALUE1; NAME2=VALUE2".
If no '=' symbol is used in the line, it is treated as a filename to use to If no '=' symbol is used in the line, it is treated as a filename to use to
read previously stored cookie lines from, which should be used in this session read previously stored cookie lines from, which should be used in this session
if they match. Using this method also activates the cookie engine which will if they match. Using this method also activates the "cookie parser" which will
make curl record incoming cookies too, which may be handy if you're using this make curl record incoming cookies too, which may be handy if you're using this
in combination with the \fI-L, --location\fP option. The file format of the in combination with the \fI-L, --location\fP option. The file format of the
file to read cookies from should be plain HTTP headers (Set-Cookie style) or file to read cookies from should be plain HTTP headers or the Netscape/Mozilla
the Netscape/Mozilla cookie file format. cookie file format.
The file specified with \fI-b, --cookie\fP is only used as input. No cookies The file specified with \fI-b, --cookie\fP is only used as input. No cookies
will be written to the file. To store cookies, use the \fI-c, --cookie-jar\fP will be written to the file. To store cookies, use the \fI-c, --cookie-jar\fP
option. option.
Exercise caution if you are using this option and multiple transfers may occur.
If you use the NAME1=VALUE1; format, or in a file use the Set-Cookie format and
don't specify a domain, then the cookie is sent for any domain (even after
redirects are followed) and cannot be modified by a server-set cookie. If the
cookie engine is enabled and a server sets a cookie of the same name then both
will be sent on a future transfer to that server, likely not what you intended.
To address these issues set a domain in Set-Cookie (doing that will include
sub-domains) or use the Netscape format.
If this option is used several times, the last one will be used. If this option is used several times, the last one will be used.
.IP "-B, --use-ascii" .IP "-B, --use-ascii"
(FTP/LDAP) Enable ASCII transfer. For FTP, this can also be enforced by using (FTP/LDAP) Enable ASCII transfer. For FTP, this can also be enforced by using
@ -263,9 +254,6 @@ won't fail or even report an error clearly. Using -v will get a warning
displayed, but that is the only visible feedback you get about this possibly displayed, but that is the only visible feedback you get about this possibly
lethal situation. lethal situation.
Since 7.43.0 cookies that were imported in the Set-Cookie format without a
domain name are not exported by this option.
If this option is used several times, the last specified file name will be If this option is used several times, the last specified file name will be
used. used.
.IP "-C, --continue-at <offset>" .IP "-C, --continue-at <offset>"
@ -281,11 +269,11 @@ If this option is used several times, the last one will be used.
.IP "--ciphers <list of ciphers>" .IP "--ciphers <list of ciphers>"
(SSL) Specifies which ciphers to use in the connection. The list of ciphers (SSL) Specifies which ciphers to use in the connection. The list of ciphers
must specify valid ciphers. Read up on SSL cipher list details on this URL: must specify valid ciphers. Read up on SSL cipher list details on this URL:
\fIhttps://www.openssl.org/docs/apps/ciphers.html\fP \fIhttp://www.openssl.org/docs/apps/ciphers.html\fP
NSS ciphers are done differently than OpenSSL and GnuTLS. The full list of NSS NSS ciphers are done differently than OpenSSL and GnuTLS. The full list of NSS
ciphers is in the NSSCipherSuite entry at this URL: ciphers is in the NSSCipherSuite entry at this URL:
\fIhttps://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html#Directives\fP \fIhttp://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html#Directives\fP
If this option is used several times, the last one will be used. If this option is used several times, the last one will be used.
.IP "--compressed" .IP "--compressed"
@ -327,10 +315,9 @@ presses the submit button. This will cause curl to pass the data to the server
using the content-type application/x-www-form-urlencoded. Compare to using the content-type application/x-www-form-urlencoded. Compare to
\fI-F, --form\fP. \fI-F, --form\fP.
\fI-d, --data\fP is the same as \fI--data-ascii\fP. \fI--data-raw\fP is almost \fI-d, --data\fP is the same as \fI--data-ascii\fP. To post data purely binary,
the same but does not have a special interpretation of the @ character. To you should instead use the \fI--data-binary\fP option. To URL-encode the value
post data purely binary, you should instead use the \fI--data-binary\fP option. of a form field you may use \fI--data-urlencode\fP.
To URL-encode the value of a form field you may use \fI--data-urlencode\fP.
If any of these options is used more than once on the same command line, the If any of these options is used more than once on the same command line, the
data pieces specified will be merged together with a separating data pieces specified will be merged together with a separating
@ -342,8 +329,7 @@ read the data from, or - if you want curl to read the data from
stdin. Multiple files can also be specified. Posting data from a file stdin. Multiple files can also be specified. Posting data from a file
named 'foobar' would thus be done with \fI--data\fP @foobar. When --data is named 'foobar' would thus be done with \fI--data\fP @foobar. When --data is
told to read from a file like that, carriage returns and newlines will be told to read from a file like that, carriage returns and newlines will be
stripped out. If you don't want the @ character to have a special stripped out.
interpretation use \fI--data-raw\fP instead.
.IP "-D, --dump-header <file>" .IP "-D, --dump-header <file>"
Write the protocol headers to the specified file. Write the protocol headers to the specified file.
@ -368,10 +354,6 @@ and carriage returns are preserved and conversions are never done.
If this option is used several times, the ones following the first will append If this option is used several times, the ones following the first will append
data as described in \fI-d, --data\fP. data as described in \fI-d, --data\fP.
.IP "--data-raw <data>"
(HTTP) This posts data similarly to \fI--data\fP but without the special
interpretation of the @ character. See \fI-d, --data\fP.
(Added in 7.43.0)
.IP "--data-urlencode <data>" .IP "--data-urlencode <data>"
(HTTP) This posts data, similar to the other --data options with the exception (HTTP) This posts data, similar to the other --data options with the exception
that this performs URL-encoding. (Added in 7.18.0) that this performs URL-encoding. (Added in 7.18.0)
@ -430,9 +412,6 @@ the traditional PORT command.
\fB--eprt\fP can be used to explicitly enable EPRT again and \fB--no-eprt\fP \fB--eprt\fP can be used to explicitly enable EPRT again and \fB--no-eprt\fP
is an alias for \fB--disable-eprt\fP. is an alias for \fB--disable-eprt\fP.
If the server is an IPv6 host, this option will have no effect as EPRT is
necessary then.
Disabling EPRT only changes the active behavior. If you want to switch to Disabling EPRT only changes the active behavior. If you want to switch to
passive mode you need to not use \fI-P, --ftp-port\fP or force it with passive mode you need to not use \fI-P, --ftp-port\fP or force it with
\fI--ftp-pasv\fP. \fI--ftp-pasv\fP.
@ -444,9 +423,6 @@ but with this option, it will not try using EPSV.
\fB--epsv\fP can be used to explicitly enable EPSV again and \fB--no-epsv\fP \fB--epsv\fP can be used to explicitly enable EPSV again and \fB--no-epsv\fP
is an alias for \fB--disable-epsv\fP. is an alias for \fB--disable-epsv\fP.
If the server is an IPv6 host, this option will have no effect as EPSV is
necessary then.
Disabling EPSV only changes the passive behavior. If you want to switch to Disabling EPSV only changes the passive behavior. If you want to switch to
active mode you need to use \fI-P, --ftp-port\fP. active mode you need to use \fI-P, --ftp-port\fP.
.IP "--dns-interface <interface>" .IP "--dns-interface <interface>"
@ -494,10 +470,10 @@ If this option is used several times, the last one will be used.
(SSL) Tells curl to use the specified client certificate file when getting a (SSL) Tells curl to use the specified client certificate file when getting a
file with HTTPS, FTPS or another SSL-based protocol. The certificate must be file with HTTPS, FTPS or another SSL-based protocol. The certificate must be
in PKCS#12 format if using Secure Transport, or PEM format if using any other in PKCS#12 format if using Secure Transport, or PEM format if using any other
engine. If the optional password isn't specified, it will be queried for on engine. If the optional password isn't specified, it will be queried
the terminal. Note that this option assumes a \&"certificate" file that is the for on the terminal. Note that this option assumes a \&"certificate" file that
private key and the client certificate concatenated! See \fI--cert\fP and is the private key and the private certificate concatenated! See \fI--cert\fP
\fI--key\fP to specify them independently. and \fI--key\fP to specify them independently.
If curl is built against the NSS SSL library then this option can tell If curl is built against the NSS SSL library then this option can tell
curl the nickname of the certificate to use within the NSS database defined curl the nickname of the certificate to use within the NSS database defined
@ -529,13 +505,6 @@ after having run curl.
(SSL) Specify the path name to the Entropy Gathering Daemon socket. The socket (SSL) Specify the path name to the Entropy Gathering Daemon socket. The socket
is used to seed the random engine for SSL connections. See also the is used to seed the random engine for SSL connections. See also the
\fI--random-file\fP option. \fI--random-file\fP option.
.IP "--expect100-timeout <seconds>"
(HTTP) Maximum time in seconds that you allow curl to wait for a 100-continue
response when curl emits an Expects: 100-continue header in its request. By
default curl will wait one second. This option accepts decimal values! When
curl stops waiting, it will continue as if the response has been received.
(Added in 7.47.0)
.IP "--cert-type <type>" .IP "--cert-type <type>"
(SSL) Tells curl what certificate type the provided certificate is in. PEM, (SSL) Tells curl what certificate type the provided certificate is in. PEM,
DER and ENG are recognized types. If not specified, PEM is assumed. DER and ENG are recognized types. If not specified, PEM is assumed.
@ -570,22 +539,19 @@ OpenSSL-powered curl to make SSL-connections much more efficiently than using
If this option is set, the default capath value will be ignored, and if it is If this option is set, the default capath value will be ignored, and if it is
used several times, the last one will be used. used several times, the last one will be used.
.IP "--pinnedpubkey <pinned public key (hashes)>" .IP "--pinnedpubkey <pinned public key>"
(SSL) Tells curl to use the specified public key file (or hashes) to verify the (SSL) Tells curl to use the specified public key file to verify the peer. The
peer. This can be a path to a file which contains a single public key in PEM or file must contain a single public key in PEM or DER format.
DER format, or any number of base64 encoded sha256 hashes preceded by
\'sha256//\' and separated by \';\'
When negotiating a TLS or SSL connection, the server sends a certificate When negotiating a TLS or SSL connection, the server sends a certificate
indicating its identity. A public key is extracted from this certificate and indicating its identity. A public key is extracted from this certificate and
if it does not exactly match the public key provided to this option, curl will if it does not exactly match the public key provided to this option, curl will
abort the connection before sending or receiving any data. abort the connection before sending or receiving any data.
Added in 7.39.0 for OpenSSL, GnuTLS and GSKit. Added in 7.43.0 for NSS and This is currently only implemented in the OpenSSL, GnuTLS and GSKit backends.
wolfSSL/CyaSSL. sha256 support added in 7.44.0 for OpenSSL,
GnuTLS, NSS and wolfSSL/CyaSSL. Other SSL backends not supported.
If this option is used several times, the last one will be used. If this option is used several times, the last one will be used.
(Added in 7.39.0)
.IP "--cert-status" .IP "--cert-status"
(SSL) Tells curl to verify the status of the server certificate by using the (SSL) Tells curl to verify the status of the server certificate by using the
Certificate Status Request (aka. OCSP stapling) TLS extension. Certificate Status Request (aka. OCSP stapling) TLS extension.
@ -594,18 +560,8 @@ If this option is enabled and the server sends an invalid (e.g. expired)
response, if the response suggests that the server certificate has been revoked, response, if the response suggests that the server certificate has been revoked,
or no response at all is received, the verification fails. or no response at all is received, the verification fails.
This is currently only implemented in the OpenSSL, GnuTLS and NSS backends. This is currently only implemented in the OpenSSL, GnuTLS and NSS backends.
(Added in 7.41.0) (Added in 7.41.0)
.IP "--false-start"
(SSL) Tells curl to use false start during the TLS handshake. False start is a
mode where a TLS client will start sending application data before verifying
the server's Finished message, thus saving a round trip when performing a full
handshake.
This is currently only implemented in the NSS and Secure Transport (on iOS 7.0
or later, or OS X 10.9 or later) backends.
(Added in 7.42.0)
.IP "-f, --fail" .IP "-f, --fail"
(HTTP) Fail silently (no output at all) on server errors. This is mostly done (HTTP) Fail silently (no output at all) on server errors. This is mostly done
to better enable scripts etc to better deal with failed attempts. In normal to better enable scripts etc to better deal with failed attempts. In normal
@ -633,9 +589,7 @@ input:
\fBcurl\fP -F password=@/etc/passwd www.mypasswords.com \fBcurl\fP -F password=@/etc/passwd www.mypasswords.com
To read content from stdin instead of a file, use - as the filename. This goes To read content from stdin instead of a file, use - as the filename. This goes
for both @ and < constructs. Unfortunately it does not support reading the for both @ and < constructs.
file from a named pipe or similar, as it needs the full size before the
transfer starts.
You can also tell curl what Content-Type to use by using 'type=', in a manner You can also tell curl what Content-Type to use by using 'type=', in a manner
similar to: similar to:
@ -697,7 +651,6 @@ curl does one CWD with the full target directory and then operates on the file
\&"normally" (like in the multicwd case). This is somewhat more standards \&"normally" (like in the multicwd case). This is somewhat more standards
compliant than 'nocwd' but without the full penalty of 'multicwd'. compliant than 'nocwd' but without the full penalty of 'multicwd'.
.RE .RE
.IP
(Added in 7.15.1) (Added in 7.15.1)
.IP "--ftp-pasv" .IP "--ftp-pasv"
(FTP) Use passive mode for the data connection. Passive is the internal default (FTP) Use passive mode for the data connection. Passive is the internal default
@ -802,12 +755,10 @@ This option can be used multiple times to add/replace/remove multiple headers.
be the 128 bit MD5 checksum of the remote host's public key, curl will refuse be the 128 bit MD5 checksum of the remote host's public key, curl will refuse
the connection with the host unless the md5sums match. (Added in 7.17.1) the connection with the host unless the md5sums match. (Added in 7.17.1)
.IP "--ignore-content-length" .IP "--ignore-content-length"
For HTTP, Ignore the Content-Length header. This is particularly useful for (HTTP)
servers running Apache 1.x, which will report incorrect Content-Length for Ignore the Content-Length header. This is particularly useful for servers
files larger than 2 gigabytes. running Apache 1.x, which will report incorrect Content-Length for files
larger than 2 gigabytes.
For FTP (since 7.46.0), skip the RETR command to figure out the size before
downloading a file.
.IP "-i, --include" .IP "-i, --include"
(HTTP) Include the HTTP-header in the output. The HTTP-header includes things (HTTP) Include the HTTP-header in the output. The HTTP-header includes things
like server-name, date of the document, HTTP-version and more... like server-name, date of the document, HTTP-version and more...
@ -834,17 +785,8 @@ cookies when they're closed down.
server-specified Content-Disposition filename instead of extracting a filename server-specified Content-Disposition filename instead of extracting a filename
from the URL. from the URL.
If the server specifies a file name and a file with that name already exists
in the current working directory it will not be overwritten and an error will
occur. If the server doesn't specify a file name then this option has no
effect.
There's no attempt to decode %-sequences (yet) in the provided file name, so There's no attempt to decode %-sequences (yet) in the provided file name, so
this option may provide you with rather unexpected file names. this option may provide you with rather unexpected file names.
\fBWARNING\fP: Exercise judicious use of this option, especially on Windows. A
rogue server could send you the name of a DLL or other file that could possibly
be loaded automatically by Windows or some third party software.
.IP "-k, --insecure" .IP "-k, --insecure"
(SSL) This option explicitly allows curl to perform "insecure" SSL connections (SSL) This option explicitly allows curl to perform "insecure" SSL connections
and transfers. All SSL connections are attempted to be made secure by using and transfers. All SSL connections are attempted to be made secure by using
@ -852,7 +794,7 @@ the CA certificate bundle installed by default. This makes all connections
considered "insecure" fail unless \fI-k, --insecure\fP is used. considered "insecure" fail unless \fI-k, --insecure\fP is used.
See this online resource for further details: See this online resource for further details:
\fBhttps://curl.haxx.se/docs/sslcerts.html\fP \fBhttp://curl.haxx.se/docs/sslcerts.html\fP
.IP "-K, --config <config file>" .IP "-K, --config <config file>"
Specify which config file to read curl arguments from. The config file is a Specify which config file to read curl arguments from. The config file is a
text file in which command line arguments can be written which then will be text file in which command line arguments can be written which then will be
@ -879,7 +821,7 @@ Note that to be able to specify a URL in the config file, you need to specify
it using the \fI--url\fP option, and not by simply writing the URL on its own it using the \fI--url\fP option, and not by simply writing the URL on its own
line. So, it could look similar to this: line. So, it could look similar to this:
url = "https://curl.haxx.se/docs/" url = "http://curl.haxx.se/docs/"
When curl is invoked, it always (unless \fI-q\fP is used) checks for a default When curl is invoked, it always (unless \fI-q\fP is used) checks for a default
config file and uses it if found. The default config file is checked for in config file and uses it if found. The default config file is checked for in
@ -977,7 +919,7 @@ re-send the following request using the same unmodified method.
You can tell curl to not change the non-GET request method to GET after a 30x You can tell curl to not change the non-GET request method to GET after a 30x
response by using the dedicated options for that: \fI--post301\fP, response by using the dedicated options for that: \fI--post301\fP,
\fI--post302\fP and \fI--post303\fP. \fI--post302\fP and \fI-post303\fP.
.IP "--libcurl <file>" .IP "--libcurl <file>"
Append this option to any ordinary curl command line, and you will get a Append this option to any ordinary curl command line, and you will get a
libcurl-using C source code written to the file that does the equivalent libcurl-using C source code written to the file that does the equivalent
@ -1101,10 +1043,13 @@ in Metalink file, hash check will fail.
Makes curl scan the \fI.netrc\fP (\fI_netrc\fP on Windows) file in the user's Makes curl scan the \fI.netrc\fP (\fI_netrc\fP on Windows) file in the user's
home directory for login name and password. This is typically used for FTP on home directory for login name and password. This is typically used for FTP on
Unix. If used with HTTP, curl will enable user authentication. See Unix. If used with HTTP, curl will enable user authentication. See
\fInetrc(5)\fP \fIftp(1)\fP for details on the file format. Curl will not .BR netrc(4)
complain if that file doesn't have the right permissions (it should not be or
either world- or group-readable). The environment variable "HOME" is used to .BR ftp(1)
find the home directory. for details on the file format. Curl will not complain if that file
doesn't have the right permissions (it should not be either world- or
group-readable). The environment variable "HOME" is used to find the home
directory.
A quick and very simple example of how to setup a \fI.netrc\fP to allow curl A quick and very simple example of how to setup a \fI.netrc\fP to allow curl
to FTP to the machine host.domain.com with user name \&'myself' and password to FTP to the machine host.domain.com with user name \&'myself' and password
@ -1205,15 +1150,12 @@ output to be done to stdout.
Write output to a local file named like the remote file we get. (Only the file Write output to a local file named like the remote file we get. (Only the file
part of the remote file is used, the path is cut off.) part of the remote file is used, the path is cut off.)
The file will be saved in the current working directory. If you want the file The remote file name to use for saving is extracted from the given URL,
saved in a different directory, make sure you change the current working nothing else.
directory before invoking curl with this option.
The remote file name to use for saving is extracted from the given URL, nothing Consequentially, the file will be saved in the current working directory. If
else, and if it already exists it will be overwritten. If you want the server you want the file saved in a different directory, make sure you change current
to be able to choose the file name refer to \fI-J, --remote-header-name\fP working directory before you invoke curl with the \fB-O, --remote-name\fP flag!
which can be used in addition to this option. If the server chooses a file name
and that name already exists it will not be overwritten.
There is no URL decoding done on the file name. If it has %20 or other URL There is no URL decoding done on the file name. If it has %20 or other URL
encoded parts of the name, they will end up as-is as file name. encoded parts of the name, they will end up as-is as file name.
@ -1269,7 +1211,7 @@ i.e "my.host.domain" to specify the machine
make curl pick the same IP address that is already used for the control make curl pick the same IP address that is already used for the control
connection connection
.RE .RE
.IP
If this option is used several times, the last one will be used. Disable the If this option is used several times, the last one will be used. Disable the
use of PORT with \fI--ftp-pasv\fP. Disable the attempt to use the EPRT command use of PORT with \fI--ftp-pasv\fP. Disable the attempt to use the EPRT command
instead of PORT by using \fI--disable-eprt\fP. EPRT is really PORT++. instead of PORT by using \fI--disable-eprt\fP. EPRT is really PORT++.
@ -1283,28 +1225,22 @@ available.
(SSL/SSH) Passphrase for the private key (SSL/SSH) Passphrase for the private key
If this option is used several times, the last one will be used. If this option is used several times, the last one will be used.
.IP "--path-as-is"
Tell curl to not handle sequences of /../ or /./ in the given URL
path. Normally curl will squash or merge them according to standards but with
this option set you tell it not to do that.
(Added in 7.42.0)
.IP "--post301" .IP "--post301"
(HTTP) Tells curl to respect RFC 7230/6.4.2 and not convert POST requests (HTTP) Tells curl to respect RFC 2616/10.3.2 and not convert POST requests
into GET requests when following a 301 redirection. The non-RFC behaviour is into GET requests when following a 301 redirection. The non-RFC behaviour is
ubiquitous in web browsers, so curl does the conversion by default to maintain ubiquitous in web browsers, so curl does the conversion by default to maintain
consistency. However, a server may require a POST to remain a POST after such consistency. However, a server may require a POST to remain a POST after such
a redirection. This option is meaningful only when using \fI-L, --location\fP a redirection. This option is meaningful only when using \fI-L, --location\fP
(Added in 7.17.1) (Added in 7.17.1)
.IP "--post302" .IP "--post302"
(HTTP) Tells curl to respect RFC 7230/6.4.3 and not convert POST requests (HTTP) Tells curl to respect RFC 2616/10.3.2 and not convert POST requests
into GET requests when following a 302 redirection. The non-RFC behaviour is into GET requests when following a 302 redirection. The non-RFC behaviour is
ubiquitous in web browsers, so curl does the conversion by default to maintain ubiquitous in web browsers, so curl does the conversion by default to maintain
consistency. However, a server may require a POST to remain a POST after such consistency. However, a server may require a POST to remain a POST after such
a redirection. This option is meaningful only when using \fI-L, --location\fP a redirection. This option is meaningful only when using \fI-L, --location\fP
(Added in 7.19.1) (Added in 7.19.1)
.IP "--post303" .IP "--post303"
(HTTP) Tells curl to respect RFC 7230/6.4.4 and not convert POST requests (HTTP) Tells curl to respect RFC 2616/10.3.2 and not convert POST requests
into GET requests when following a 303 redirection. The non-RFC behaviour is into GET requests when following a 303 redirection. The non-RFC behaviour is
ubiquitous in web browsers, so curl does the conversion by default to maintain ubiquitous in web browsers, so curl does the conversion by default to maintain
consistency. However, a server may require a POST to remain a POST after such consistency. However, a server may require a POST to remain a POST after such
@ -1351,40 +1287,9 @@ This option can be used multiple times, in which case the effect is the same
as concatenating the protocols into one instance of the option. as concatenating the protocols into one instance of the option.
(Added in 7.20.2) (Added in 7.20.2)
.IP "--proto-default <protocol>"
Tells curl to use \fIprotocol\fP for any URL missing a scheme name.
Example:
.RS
.IP "--proto-default https ftp.mozilla.org"
https://ftp.mozilla.org
.RE
An unknown or unsupported protocol causes error
\fICURLE_UNSUPPORTED_PROTOCOL\fP.
This option does not change the default proxy protocol (http).
Without this option curl would make a guess based on the host, see \fI--url\fP
for details.
(Added in 7.45.0)
.IP "--proto-redir <protocols>" .IP "--proto-redir <protocols>"
Tells curl to use the listed protocols on redirect. See --proto for how Tells curl to use the listed protocols after a redirect. See --proto for
protocols are represented. how protocols are represented.
Example:
.RS
.IP "--proto-redir -all,http,https"
Allow only HTTP and HTTPS on redirect.
.RE
By default curl will allow all protocols on redirect except several disabled
for security reasons: Since 7.19.4 FILE and SCP are disabled, and since 7.40.0
SMB and SMBS are also disabled. Specifying \fIall\fP or \fI+all\fP enables all
protocols on redirect, including those disabled for security.
(Added in 7.20.2) (Added in 7.20.2)
.IP "--proxy-anyauth" .IP "--proxy-anyauth"
@ -1405,11 +1310,6 @@ with a remote host. (Added in 7.17.1)
.IP "--proxy-ntlm" .IP "--proxy-ntlm"
Tells curl to use HTTP NTLM authentication when communicating with the given Tells curl to use HTTP NTLM authentication when communicating with the given
proxy. Use \fI--ntlm\fP for enabling NTLM with a remote host. proxy. Use \fI--ntlm\fP for enabling NTLM with a remote host.
.IP "--proxy-service-name <servicename>"
This option allows you to change the service name for proxy negotiation.
Examples: --proxy-negotiate proxy-name \fI--proxy-service-name\fP sockd would use
sockd/proxy-name. (Added in 7.43.0).
.IP "--proxy1.0 <proxyhost[:port]>" .IP "--proxy1.0 <proxyhost[:port]>"
Use the specified HTTP 1.0 proxy. If the port number is not specified, it is Use the specified HTTP 1.0 proxy. If the port number is not specified, it is
assumed at port 1080. assumed at port 1080.
@ -1499,12 +1399,15 @@ specifies the last 500 bytes
specifies the bytes from offset 9500 and forward specifies the bytes from offset 9500 and forward
.TP .TP
.B 0-0,-1 .B 0-0,-1
specifies the first and last byte only(*)(HTTP) specifies the first and last byte only(*)(H)
.TP
.B 500-700,600-799
specifies 300 bytes from offset 500(H)
.TP .TP
.B 100-199,500-599 .B 100-199,500-599
specifies two separate 100-byte ranges(*) (HTTP) specifies two separate 100-byte ranges(*)(H)
.RE .RE
.IP
(*) = NOTE that this will cause the server to reply with a multipart (*) = NOTE that this will cause the server to reply with a multipart
response! response!
@ -1588,11 +1491,6 @@ terminal/stdout unless you redirect it.
.IP "--sasl-ir" .IP "--sasl-ir"
Enable initial response in SASL authentication. Enable initial response in SASL authentication.
(Added in 7.31.0) (Added in 7.31.0)
.IP "--service-name <servicename>"
This option allows you to change the service name for SPNEGO.
Examples: --negotiate \fI--service-name\fP sockd would use
sockd/server-name. (Added in 7.43.0).
.IP "-S, --show-error" .IP "-S, --show-error"
When used with \fI-s\fP it makes curl show an error message if it fails. When used with \fI-s\fP it makes curl show an error message if it fails.
.IP "--ssl" .IP "--ssl"
@ -1615,10 +1513,6 @@ and TLS1.0 protocols known as BEAST. If this option isn't used, the SSL layer
may use workarounds known to cause interoperability problems with some older may use workarounds known to cause interoperability problems with some older
SSL implementations. WARNING: this option loosens the SSL security, and by SSL implementations. WARNING: this option loosens the SSL security, and by
using this flag you ask for exactly that. (Added in 7.25.0) using this flag you ask for exactly that. (Added in 7.25.0)
.IP "--ssl-no-revoke"
(WinSSL) This option tells curl to disable certificate revocation checks.
WARNING: this option loosens the SSL security, and by using this flag you ask
for exactly that. (Added in 7.44.0)
.IP "--socks4 <host[:port]>" .IP "--socks4 <host[:port]>"
Use the specified SOCKS4 proxy. If the port number is not specified, it is Use the specified SOCKS4 proxy. If the port number is not specified, it is
assumed at port 1080. (Added in 7.15.2) assumed at port 1080. (Added in 7.15.2)
@ -1730,14 +1624,6 @@ default 512 bytes will be used.
If this option is used several times, the last one will be used. If this option is used several times, the last one will be used.
(Added in 7.20.0) (Added in 7.20.0)
.IP "--tftp-no-options"
(TFTP) Tells curl not to send TFTP options requests.
This option improves interop with some legacy servers that do not acknowledge
or properly implement TFTP options. When this option is used
\fI--tftp-blksize\fP is ignored.
(Added in 7.48.0)
.IP "--tlsauthtype <authtype>" .IP "--tlsauthtype <authtype>"
Set TLS authentication type. Currently, the only supported option is "SRP", Set TLS authentication type. Currently, the only supported option is "SRP",
for TLS-SRP (RFC 5054). If \fI--tlsuser\fP and \fI--tlspassword\fP are for TLS-SRP (RFC 5054). If \fI--tlsuser\fP and \fI--tlspassword\fP are
@ -1806,7 +1692,7 @@ impossible to use a colon in the user name with this option. The password can,
still. still.
When using Kerberos V5 with a Windows based server you should include the When using Kerberos V5 with a Windows based server you should include the
Windows domain name in the user name, in order for the server to successfully Windows domain name in the user name, in order for the server to succesfully
obtain a Kerberos Ticket. If you don't then the initial authentication obtain a Kerberos Ticket. If you don't then the initial authentication
handshake may fail. handshake may fail.
@ -1836,12 +1722,6 @@ If this option is used several times, the last one will be used.
Specify a URL to fetch. This option is mostly handy when you want to specify Specify a URL to fetch. This option is mostly handy when you want to specify
URL(s) in a config file. URL(s) in a config file.
If the given URL is missing a scheme name (such as "http://" or "ftp://" etc)
then curl will make a guess based on the host. If the outermost sub-domain name
matches DICT, FTP, IMAP, LDAP, POP3 or SMTP then that protocol will be used,
otherwise HTTP will be used. Since 7.45.0 guessing can be disabled by setting a
default protocol, see \fI--proto-default\fP for details.
This option may be used any number of times. To control where this URL is This option may be used any number of times. To control where this URL is
written, use the \fI-o, --output\fP or the \fI-O, --remote-name\fP options. written, use the \fI-o, --output\fP or the \fI-O, --remote-name\fP options.
.IP "-v, --verbose" .IP "-v, --verbose"
@ -1986,7 +1866,7 @@ displayed with millisecond resolution.
The URL that was fetched last. This is most meaningful if you've told curl The URL that was fetched last. This is most meaningful if you've told curl
to follow location: headers. to follow location: headers.
.RE .RE
.IP
If this option is used several times, the last one will be used. If this option is used several times, the last one will be used.
.IP "-x, --proxy <[protocol://][user:password@]proxyhost[:port]>" .IP "-x, --proxy <[protocol://][user:password@]proxyhost[:port]>"
Use the specified proxy. Use the specified proxy.
@ -2034,10 +1914,10 @@ alter the way curl behaves. So for example if you want to make a proper HEAD
request, using -X HEAD will not suffice. You need to use the \fI-I, --head\fP request, using -X HEAD will not suffice. You need to use the \fI-I, --head\fP
option. option.
The method string you set with -X will be used for all requests, which if you The the method string you set with -X will be used for all requests, which if
for example use \fB-L, --location\fP may cause unintended side-effects when you for example use \fB-L, --location\fP may cause unintended side-effects
curl doesn't change request method according to the HTTP 30x response codes - when curl doesn't change request method according to the HTTP 30x response
and similar. codes - and similar.
(FTP) (FTP)
Specifies a custom FTP command to use instead of LIST when doing file lists Specifies a custom FTP command to use instead of LIST when doing file lists
@ -2361,7 +2241,7 @@ are meant to never change.
Daniel Stenberg is the main author, but the whole list of contributors is Daniel Stenberg is the main author, but the whole list of contributors is
found in the separate THANKS file. found in the separate THANKS file.
.SH WWW .SH WWW
https://curl.haxx.se http://curl.haxx.se
.SH FTP .SH FTP
ftp://ftp.sunet.se/pub/www/utilities/curl/ ftp://ftp.sunet.se/pub/www/utilities/curl/
.SH "SEE ALSO" .SH "SEE ALSO"

View File

@ -73,7 +73,3 @@ smtp-vrfy
url2file url2file
usercertinmem usercertinmem
xmlstream xmlstream
http2-download
http2-serverpush
http2-upload
imap-lsub

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -19,10 +19,9 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
***************************************************************************/ ***************************************************************************/
/* <DESC> /* Example application source code using the multi interface to download many
* Source code using the multi interface to download many * files, but with a capped maximum amount of simultaneous transfers.
* files, with a capped maximum amount of simultaneous transfers. *
* </DESC>
* Written by Michael Wallner * Written by Michael Wallner
*/ */
@ -127,42 +126,41 @@ int main(void)
uses */ uses */
curl_multi_setopt(cm, CURLMOPT_MAXCONNECTS, (long)MAX); curl_multi_setopt(cm, CURLMOPT_MAXCONNECTS, (long)MAX);
for(C = 0; C < MAX; ++C) { for (C = 0; C < MAX; ++C) {
init(cm, C); init(cm, C);
} }
while(U) { while (U) {
curl_multi_perform(cm, &U); curl_multi_perform(cm, &U);
if(U) { if (U) {
FD_ZERO(&R); FD_ZERO(&R);
FD_ZERO(&W); FD_ZERO(&W);
FD_ZERO(&E); FD_ZERO(&E);
if(curl_multi_fdset(cm, &R, &W, &E, &M)) { if (curl_multi_fdset(cm, &R, &W, &E, &M)) {
fprintf(stderr, "E: curl_multi_fdset\n"); fprintf(stderr, "E: curl_multi_fdset\n");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
if(curl_multi_timeout(cm, &L)) { if (curl_multi_timeout(cm, &L)) {
fprintf(stderr, "E: curl_multi_timeout\n"); fprintf(stderr, "E: curl_multi_timeout\n");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
if(L == -1) if (L == -1)
L = 100; L = 100;
if(M == -1) { if (M == -1) {
#ifdef WIN32 #ifdef WIN32
Sleep(L); Sleep(L);
#else #else
sleep((unsigned int)L / 1000); sleep(L / 1000);
#endif #endif
} } else {
else {
T.tv_sec = L/1000; T.tv_sec = L/1000;
T.tv_usec = (L%1000)*1000; T.tv_usec = (L%1000)*1000;
if(0 > select(M+1, &R, &W, &E, &T)) { if (0 > select(M+1, &R, &W, &E, &T)) {
fprintf(stderr, "E: select(%i,,,,%li): %i: %s\n", fprintf(stderr, "E: select(%i,,,,%li): %i: %s\n",
M+1, L, errno, strerror(errno)); M+1, L, errno, strerror(errno));
return EXIT_FAILURE; return EXIT_FAILURE;
@ -170,8 +168,8 @@ int main(void)
} }
} }
while((msg = curl_multi_info_read(cm, &Q))) { while ((msg = curl_multi_info_read(cm, &Q))) {
if(msg->msg == CURLMSG_DONE) { if (msg->msg == CURLMSG_DONE) {
char *url; char *url;
CURL *e = msg->easy_handle; CURL *e = msg->easy_handle;
curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, &url); curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, &url);
@ -183,7 +181,7 @@ int main(void)
else { else {
fprintf(stderr, "E: CURLMsg (%d)\n", msg->msg); fprintf(stderr, "E: CURLMsg (%d)\n", msg->msg);
} }
if(C < CNT) { if (C < CNT) {
init(cm, C++); init(cm, C++);
U++; /* just to prevent it from remaining at 0 if there are more U++; /* just to prevent it from remaining at 0 if there are more
URLs to get */ URLs to get */

View File

@ -5,11 +5,11 @@
# | (__| |_| | _ <| |___ # | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____| # \___|\___/|_| \_\_____|
# #
# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. # Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
# #
# This software is licensed as described in the file COPYING, which # This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms # you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html. # are also available at http://curl.haxx.se/docs/copyright.html.
# #
# You may opt to use, copy, modify, merge, publish, distribute and/or sell # 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 # copies of the Software, and permit persons to whom the Software is
@ -61,6 +61,3 @@ endif
include Makefile.inc include Makefile.inc
all: $(check_PROGRAMS) all: $(check_PROGRAMS)
checksrc:
@@PERL@ $(top_srcdir)/lib/checksrc.pl -D$(top_srcdir)/docs/examples *.c

View File

@ -9,7 +9,7 @@
# #
# This software is licensed as described in the file COPYING, which # This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms # you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html. # are also available at http://curl.haxx.se/docs/copyright.html.
# #
# You may opt to use, copy, modify, merge, publish, distribute and/or sell # 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 # copies of the Software, and permit persons to whom the Software is

View File

@ -5,11 +5,11 @@
# | (__| |_| | _ <| |___ # | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____| # \___|\___/|_| \_\_____|
# #
# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. # Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
# #
# This software is licensed as described in the file COPYING, which # This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms # you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html. # are also available at http://curl.haxx.se/docs/copyright.html.
# #
# You may opt to use, copy, modify, merge, publish, distribute and/or sell # 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 # copies of the Software, and permit persons to whom the Software is
@ -31,8 +31,7 @@ check_PROGRAMS = 10-at-a-time anyauthput cookie_interface debug fileupload \
pop3-dele pop3-top pop3-stat pop3-noop pop3-ssl pop3-tls pop3-multi \ pop3-dele pop3-top pop3-stat pop3-noop pop3-ssl pop3-tls pop3-multi \
imap-list imap-lsub imap-fetch imap-store imap-append imap-examine \ imap-list imap-lsub imap-fetch imap-store imap-append imap-examine \
imap-search imap-create imap-delete imap-copy imap-noop imap-ssl \ imap-search imap-create imap-delete imap-copy imap-noop imap-ssl \
imap-tls imap-multi url2file sftpget ftpsget postinmemory http2-download \ imap-tls imap-multi url2file sftpget ftpsget postinmemory
http2-upload http2-serverpush getredirect
# These examples require external dependencies that may not be commonly # These examples require external dependencies that may not be commonly
# available on POSIX systems, so don't bother attempting to compile them here. # available on POSIX systems, so don't bother attempting to compile them here.

View File

@ -5,11 +5,11 @@
# | (__| |_| | _ <| |___ # | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____| # \___|\___/|_| \_\_____|
# #
# Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. # Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
# #
# This software is licensed as described in the file COPYING, which # This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms # you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html. # are also available at http://curl.haxx.se/docs/copyright.html.
# #
# You may opt to use, copy, modify, merge, publish, distribute and/or sell # 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 # copies of the Software, and permit persons to whom the Software is
@ -21,7 +21,7 @@
########################################################################### ###########################################################################
# #
## Makefile for building curl examples with MingW (GCC-3.2 or later) ## Makefile for building curl examples with MingW (GCC-3.2 or later)
## and optionally OpenSSL (1.0.2a), libssh2 (1.5), zlib (1.2.8), librtmp (2.4) ## and optionally OpenSSL (0.9.8), libssh2 (1.3), zlib (1.2.5), librtmp (2.3)
## ##
## Usage: mingw32-make -f Makefile.m32 CFG=-feature1[-feature2][-feature3][...] ## Usage: mingw32-make -f Makefile.m32 CFG=-feature1[-feature2][-feature3][...]
## Example: mingw32-make -f Makefile.m32 CFG=-zlib-ssl-spi-winidn ## Example: mingw32-make -f Makefile.m32 CFG=-zlib-ssl-spi-winidn
@ -38,23 +38,23 @@ ZLIB_PATH = ../../../zlib-1.2.8
endif endif
# Edit the path below to point to the base of your OpenSSL package. # Edit the path below to point to the base of your OpenSSL package.
ifndef OPENSSL_PATH ifndef OPENSSL_PATH
OPENSSL_PATH = ../../../openssl-1.0.2a OPENSSL_PATH = ../../../openssl-0.9.8zc
endif endif
# Edit the path below to point to the base of your LibSSH2 package. # Edit the path below to point to the base of your LibSSH2 package.
ifndef LIBSSH2_PATH ifndef LIBSSH2_PATH
LIBSSH2_PATH = ../../../libssh2-1.5.0 LIBSSH2_PATH = ../../../libssh2-1.4.3
endif endif
# Edit the path below to point to the base of your librtmp package. # Edit the path below to point to the base of your librtmp package.
ifndef LIBRTMP_PATH ifndef LIBRTMP_PATH
LIBRTMP_PATH = ../../../librtmp-2.4 LIBRTMP_PATH = ../../../librtmp-2.3
endif endif
# Edit the path below to point to the base of your libidn package. # Edit the path below to point to the base of your libidn package.
ifndef LIBIDN_PATH ifndef LIBIDN_PATH
LIBIDN_PATH = ../../../libidn-1.32 LIBIDN_PATH = ../../../libidn-1.18
endif endif
# Edit the path below to point to the base of your MS IDN package. # Edit the path below to point to the base of your MS IDN package.
# Microsoft Internationalized Domain Names (IDN) Mitigation APIs 1.1 # Microsoft Internationalized Domain Names (IDN) Mitigation APIs 1.1
# https://www.microsoft.com/en-us/download/details.aspx?id=734 # http://www.microsoft.com/downloads/en/details.aspx?FamilyID=ad6158d7-ddba-416a-9109-07607425a815
ifndef WINIDN_PATH ifndef WINIDN_PATH
WINIDN_PATH = ../../../Microsoft IDN Mitigation APIs WINIDN_PATH = ../../../Microsoft IDN Mitigation APIs
endif endif
@ -62,10 +62,6 @@ endif
ifndef LDAP_SDK ifndef LDAP_SDK
LDAP_SDK = c:/novell/ndk/cldapsdk/win32 LDAP_SDK = c:/novell/ndk/cldapsdk/win32
endif endif
# Edit the path below to point to the base of your nghttp2 package.
ifndef NGHTTP2_PATH
NGHTTP2_PATH = ../../../nghttp2-1.0.0
endif
PROOT = ../.. PROOT = ../..
@ -76,24 +72,14 @@ endif
# Edit the var below to set to your architecture or set environment var. # Edit the var below to set to your architecture or set environment var.
ifndef ARCH ifndef ARCH
ifeq ($(findstring x86_64,$(shell $(CC) -dumpmachine)),x86_64) ARCH = w32
ARCH = w64
else
ARCH = w32
endif
endif endif
CC = $(CROSSPREFIX)gcc CC = $(CROSSPREFIX)gcc
CFLAGS = -g -O2 -Wall CFLAGS = -g -O2 -Wall
CFLAGS += -fno-strict-aliasing CFLAGS += -fno-strict-aliasing
ifeq ($(ARCH),w64) ifeq ($(ARCH),w64)
CFLAGS += -m64 -D_AMD64_ CFLAGS += -D_AMD64_
LDFLAGS += -m64
RCFLAGS += -F pe-x86-64
else
CFLAGS += -m32
LDFLAGS += -m32
RCFLAGS += -F pe-i386
endif endif
# comment LDFLAGS below to keep debug info # comment LDFLAGS below to keep debug info
LDFLAGS = -s LDFLAGS = -s
@ -172,12 +158,9 @@ ifeq ($(findstring -metalink,$(CFG)),-metalink)
METALINK = 1 METALINK = 1
endif endif
ifeq ($(findstring -winssl,$(CFG)),-winssl) ifeq ($(findstring -winssl,$(CFG)),-winssl)
WINSSL = 1 SCHANNEL = 1
SSPI = 1 SSPI = 1
endif endif
ifeq ($(findstring -nghttp2,$(CFG)),-nghttp2)
NGHTTP2 = 1
endif
INCLUDES = -I. -I$(PROOT) -I$(PROOT)/include -I$(PROOT)/lib INCLUDES = -I. -I$(PROOT) -I$(PROOT)/include -I$(PROOT)/lib
@ -201,10 +184,6 @@ ifdef RTMP
CFLAGS += -DUSE_LIBRTMP CFLAGS += -DUSE_LIBRTMP
curl_LDADD += -L"$(LIBRTMP_PATH)/librtmp" -lrtmp -lwinmm curl_LDADD += -L"$(LIBRTMP_PATH)/librtmp" -lrtmp -lwinmm
endif endif
ifdef NGHTTP2
CFLAGS += -DUSE_NGHTTP2
curl_LDADD += -L"$(NGHTTP2_PATH)/lib" -lnghttp2
endif
ifdef SSH2 ifdef SSH2
CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H
curl_LDADD += -L"$(LIBSSH2_PATH)/win32" -lssh2 curl_LDADD += -L"$(LIBSSH2_PATH)/win32" -lssh2
@ -225,7 +204,7 @@ ifdef SSL
ifndef DYN ifndef DYN
OPENSSL_LIBS += -lgdi32 -lcrypt32 OPENSSL_LIBS += -lgdi32 -lcrypt32
endif endif
CFLAGS += -DUSE_OPENSSL CFLAGS += -DUSE_SSLEAY
curl_LDADD += -L"$(OPENSSL_LIBPATH)" $(OPENSSL_LIBS) curl_LDADD += -L"$(OPENSSL_LIBPATH)" $(OPENSSL_LIBS)
endif endif
ifdef ZLIB ifdef ZLIB
@ -244,7 +223,7 @@ endif
endif endif
ifdef SSPI ifdef SSPI
CFLAGS += -DUSE_WINDOWS_SSPI CFLAGS += -DUSE_WINDOWS_SSPI
ifdef WINSSL ifdef SCHANNEL
CFLAGS += -DUSE_SCHANNEL CFLAGS += -DUSE_SCHANNEL
endif endif
endif endif

View File

@ -19,12 +19,12 @@ endif
# Edit the path below to point to the base of your OpenSSL package. # Edit the path below to point to the base of your OpenSSL package.
ifndef OPENSSL_PATH ifndef OPENSSL_PATH
OPENSSL_PATH = ../../../openssl-1.0.2a OPENSSL_PATH = ../../../openssl-0.9.8zc
endif endif
# Edit the path below to point to the base of your LibSSH2 package. # Edit the path below to point to the base of your LibSSH2 package.
ifndef LIBSSH2_PATH ifndef LIBSSH2_PATH
LIBSSH2_PATH = ../../../libssh2-1.5.0 LIBSSH2_PATH = ../../../libssh2-1.4.3
endif endif
# Edit the path below to point to the base of your axTLS package. # Edit the path below to point to the base of your axTLS package.
@ -34,12 +34,12 @@ endif
# Edit the path below to point to the base of your libidn package. # Edit the path below to point to the base of your libidn package.
ifndef LIBIDN_PATH ifndef LIBIDN_PATH
LIBIDN_PATH = ../../../libidn-1.32 LIBIDN_PATH = ../../../libidn-1.18
endif endif
# Edit the path below to point to the base of your librtmp package. # Edit the path below to point to the base of your librtmp package.
ifndef LIBRTMP_PATH ifndef LIBRTMP_PATH
LIBRTMP_PATH = ../../../librtmp-2.4 LIBRTMP_PATH = ../../../librtmp-2.3
endif endif
# Edit the path below to point to the base of your fbopenssl package. # Edit the path below to point to the base of your fbopenssl package.

View File

@ -32,7 +32,51 @@ actually torture our web site with your tests! Thanks.
EXAMPLES EXAMPLES
Each example source code file is designed to be and work stand-alone and anyauthput.c - HTTP PUT using "any" authentication method
rather self-explanatory. The examples may at times lack the level of error cacertinmem.c - Use a built-in PEM certificate to retrieve a https page
checks you need in a real world, but that is then only for the sake of cookie_interface.c - shows usage of simple cookie interface
readability: to make the code smaller and easier to follow. curlgtk.c - download using a GTK progress bar
curlx.c - getting file info from the remote cert data
debug.c - showing how to use the debug callback
fileupload.c - uploading to a file:// URL
fopen.c - fopen() layer that supports opening URLs and files
ftpget.c - simple getting a file from FTP
ftpgetresp.c - get the response strings from the FTP server
ftpupload.c - upload a file to an FTP server
ftpuploadresume.c - resume an upload to an FTP server
getinfo.c - get the Content-Type from the recent transfer
getinmemory.c - download a file to memory only
ghiper.c - curl_multi_socket() using code with glib-2
hiperfifo.c - downloads all URLs written to the fifo, using
curl_multi_socket() and libevent
htmltidy.c - download a document and use libtidy to parse the HTML
htmltitle.cc - download a HTML file and extract the <title> tag from a HTML
page using libxml
http-post.c - HTTP POST
httpput.c - HTTP PUT a local file
https.c - simple HTTPS transfer
imap.c - simple IMAP transfer
multi-app.c - a multi-interface app
multi-debugcallback.c - a multi-interface app using the debug callback
multi-double.c - a multi-interface app doing two simultaneous transfers
multi-post.c - a multi-interface app doing a multipart formpost
multi-single.c - a multi-interface app getting a single file
multi-uv.c - a multi-interface app using libuv
multithread.c - an example using multi-treading transferring multiple files
opensslthreadlock.c - show how to do locking when using OpenSSL multi-threaded
persistant.c - request two URLs with a persistent connection
pop3s.c - POP3S transfer
pop3slist.c - POP3S LIST
post-callback.c - send a HTTP POST using a callback
postit2.c - send a HTTP multipart formpost
sampleconv.c - showing how a program on a non-ASCII platform would invoke
callbacks to do its own codeset conversions instead of using
the built-in iconv functions in libcurl
sepheaders.c - download headers to a separate file
simple.c - the most simple download a URL source
simplepost.c - HTTP POST
simplessl.c - HTTPS example with certificates many options set
synctime.c - Sync local time by extracting date from remote HTTP servers
url2file.c - download a document and store it in a file
xmlstream.c - Stream-parse a document using the streaming Expat parser
10-at-a-time.c - Download many files simultaneously, 10 at a time.

View File

@ -2,7 +2,7 @@
# pass files as argument(s) # pass files as argument(s)
my $docroot="https://curl.haxx.se/libcurl/c"; my $docroot="http://curl.haxx.se/libcurl/c";
for $f (@ARGV) { for $f (@ARGV) {
open(NEW, ">$f.new"); open(NEW, ">$f.new");

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -19,11 +19,6 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
***************************************************************************/ ***************************************************************************/
/* <DESC>
* HTTP PUT upload with authentiction using "any" method. libcurl picks the
* one the server supports/wants.
* </DESC>
*/
#include <stdio.h> #include <stdio.h>
#include <fcntl.h> #include <fcntl.h>
#ifdef WIN32 #ifdef WIN32
@ -78,8 +73,7 @@
/* ioctl callback function */ /* ioctl callback function */
static curlioerr my_ioctl(CURL *handle, curliocmd cmd, void *userp) static curlioerr my_ioctl(CURL *handle, curliocmd cmd, void *userp)
{ {
int *fdp = (int *)userp; intptr_t fd = (intptr_t)userp;
int fd = *fdp;
(void)handle; /* not used in here */ (void)handle; /* not used in here */
@ -101,11 +95,10 @@ static curlioerr my_ioctl(CURL *handle, curliocmd cmd, void *userp)
/* read callback function, fread() look alike */ /* read callback function, fread() look alike */
static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream) static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
{ {
ssize_t retcode; size_t retcode;
curl_off_t nread; curl_off_t nread;
int *fdp = (int *)stream; intptr_t fd = (intptr_t)stream;
int fd = *fdp;
retcode = read(fd, ptr, size * nmemb); retcode = read(fd, ptr, size * nmemb);
@ -121,7 +114,7 @@ int main(int argc, char **argv)
{ {
CURL *curl; CURL *curl;
CURLcode res; CURLcode res;
int hd; intptr_t hd ;
struct stat file_info; struct stat file_info;
char *file; char *file;
@ -134,7 +127,7 @@ int main(int argc, char **argv)
url = argv[2]; url = argv[2];
/* get the file size of the local file */ /* get the file size of the local file */
hd = open(file, O_RDONLY); hd = open(file, O_RDONLY) ;
fstat(hd, &file_info); fstat(hd, &file_info);
/* In windows, this will init the winsock stuff */ /* In windows, this will init the winsock stuff */
@ -147,20 +140,20 @@ int main(int argc, char **argv)
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback); curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
/* which file to upload */ /* which file to upload */
curl_easy_setopt(curl, CURLOPT_READDATA, (void*)&hd); curl_easy_setopt(curl, CURLOPT_READDATA, (void*)hd);
/* set the ioctl function */ /* set the ioctl function */
curl_easy_setopt(curl, CURLOPT_IOCTLFUNCTION, my_ioctl); curl_easy_setopt(curl, CURLOPT_IOCTLFUNCTION, my_ioctl);
/* pass the file descriptor to the ioctl callback as well */ /* pass the file descriptor to the ioctl callback as well */
curl_easy_setopt(curl, CURLOPT_IOCTLDATA, (void*)&hd); curl_easy_setopt(curl, CURLOPT_IOCTLDATA, (void*)hd);
/* enable "uploading" (which means PUT when doing HTTP) */ /* enable "uploading" (which means PUT when doing HTTP) */
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L) ;
/* specify target URL, and note that this URL should also include a file /* specify target URL, and note that this URL should also include a file
name, not only a directory (as you can do with GTP uploads) */ name, not only a directory (as you can do with GTP uploads) */
curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl,CURLOPT_URL, url);
/* and give the size of the upload, this supports large file sizes /* and give the size of the upload, this supports large file sizes
on systems that have general support for it */ on systems that have general support for it */

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 2012 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 2012 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -20,11 +20,11 @@
* *
***************************************************************************/ ***************************************************************************/
/* <DESC>
* demonstrate the use of multi socket interface with boost::asio
* </DESC>
*/
/* /*
* file: asiohiper.cpp
* Example program to demonstrate the use of multi socket interface
* with boost::asio
*
* This program is in c++ and uses boost::asio instead of libevent/libev. * This program is in c++ and uses boost::asio instead of libevent/libev.
* Requires boost::asio, boost::bind and boost::system * Requires boost::asio, boost::bind and boost::system
* *
@ -48,7 +48,6 @@
#include <curl/curl.h> #include <curl/curl.h>
#include <boost/asio.hpp> #include <boost/asio.hpp>
#include <boost/bind.hpp> #include <boost/bind.hpp>
#include <iostream>
#define MSG_OUT stdout /* Send info to stdout, change to stderr if you want */ #define MSG_OUT stdout /* Send info to stdout, change to stderr if you want */
@ -379,9 +378,9 @@ static curl_socket_t opensocket(void *clientp, curlsocktype purpose,
} }
/* CURLOPT_CLOSESOCKETFUNCTION */ /* CURLOPT_CLOSESOCKETFUNCTION */
static int close_socket(void *clientp, curl_socket_t item) static int closesocket(void *clientp, curl_socket_t item)
{ {
fprintf(MSG_OUT, "\nclose_socket : %d", item); fprintf(MSG_OUT, "\nclosesocket : %d", item);
std::map<curl_socket_t, boost::asio::ip::tcp::socket *>::iterator it = socket_map.find(item); std::map<curl_socket_t, boost::asio::ip::tcp::socket *>::iterator it = socket_map.find(item);
@ -428,7 +427,7 @@ static void new_conn(char *url, GlobalInfo *g)
curl_easy_setopt(conn->easy, CURLOPT_OPENSOCKETFUNCTION, opensocket); curl_easy_setopt(conn->easy, CURLOPT_OPENSOCKETFUNCTION, opensocket);
/* call this function to close a socket */ /* call this function to close a socket */
curl_easy_setopt(conn->easy, CURLOPT_CLOSESOCKETFUNCTION, close_socket); curl_easy_setopt(conn->easy, CURLOPT_CLOSESOCKETFUNCTION, closesocket);
fprintf(MSG_OUT, fprintf(MSG_OUT,
"\nAdding easy %p to multi %p (%s)", conn->easy, g->multi, url); "\nAdding easy %p to multi %p (%s)", conn->easy, g->multi, url);
@ -442,6 +441,7 @@ static void new_conn(char *url, GlobalInfo *g)
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
GlobalInfo g; GlobalInfo g;
CURLMcode rc;
(void)argc; (void)argc;
(void)argv; (void)argv;

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -19,19 +19,25 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
***************************************************************************/ ***************************************************************************/
/* <DESC> /* Example using a "in core" PEM certificate to retrieve a https page.
* CA cert in memory with OpenSSL to get a HTTPS page. * Written by Theo Borm
* </DESC>
*/ */
/* on a netBSD system with OPENSSL& LIBCURL installed from
* pkgsrc (using default paths) this program can be compiled using:
* gcc -I/usr/pkg/include -L/usr/pkg/lib -lcurl -Wl,-R/usr/pkg/lib -lssl
* -lcrypto -lz -o curlcacerttest curlcacerttest.c
* on other operating systems you may want to change paths to headers
* and libraries
*/
#include <openssl/ssl.h> #include <openssl/ssl.h>
#include <curl/curl.h> #include <curl/curl.h>
#include <stdio.h> #include <stdio.h>
size_t writefunction( void *ptr, size_t size, size_t nmemb, void *stream) size_t writefunction( void *ptr, size_t size, size_t nmemb, void *stream)
{ {
fwrite(ptr, size, nmemb, stream); fwrite(ptr,size,nmemb,stream);
return (nmemb*size); return(nmemb*size);
} }
static CURLcode sslctx_function(CURL * curl, void * sslctx, void * parm) static CURLcode sslctx_function(CURL * curl, void * sslctx, void * parm)
@ -87,14 +93,14 @@ static CURLcode sslctx_function(CURL * curl, void * sslctx, void * parm)
* structure that SSL can use * structure that SSL can use
*/ */
PEM_read_bio_X509(bio, &cert, 0, NULL); PEM_read_bio_X509(bio, &cert, 0, NULL);
if(cert == NULL) if (cert == NULL)
printf("PEM_read_bio_X509 failed...\n"); printf("PEM_read_bio_X509 failed...\n");
/* get a pointer to the X509 certificate store (which may be empty!) */ /* get a pointer to the X509 certificate store (which may be empty!) */
store=SSL_CTX_get_cert_store((SSL_CTX *)sslctx); store=SSL_CTX_get_cert_store((SSL_CTX *)sslctx);
/* add our certificate to this store */ /* add our certificate to this store */
if(X509_STORE_add_cert(store, cert)==0) if (X509_STORE_add_cert(store, cert)==0)
printf("error adding certificate\n"); printf("error adding certificate\n");
/* decrease reference counts */ /* decrease reference counts */
@ -102,7 +108,7 @@ static CURLcode sslctx_function(CURL * curl, void * sslctx, void * parm)
BIO_free(bio); BIO_free(bio);
/* all set to go */ /* all set to go */
return CURLE_OK; return CURLE_OK ;
} }
int main(void) int main(void)
@ -112,22 +118,22 @@ int main(void)
rv=curl_global_init(CURL_GLOBAL_ALL); rv=curl_global_init(CURL_GLOBAL_ALL);
ch=curl_easy_init(); ch=curl_easy_init();
rv=curl_easy_setopt(ch, CURLOPT_VERBOSE, 0L); rv=curl_easy_setopt(ch,CURLOPT_VERBOSE, 0L);
rv=curl_easy_setopt(ch, CURLOPT_HEADER, 0L); rv=curl_easy_setopt(ch,CURLOPT_HEADER, 0L);
rv=curl_easy_setopt(ch, CURLOPT_NOPROGRESS, 1L); rv=curl_easy_setopt(ch,CURLOPT_NOPROGRESS, 1L);
rv=curl_easy_setopt(ch, CURLOPT_NOSIGNAL, 1L); rv=curl_easy_setopt(ch,CURLOPT_NOSIGNAL, 1L);
rv=curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, *writefunction); rv=curl_easy_setopt(ch,CURLOPT_WRITEFUNCTION, *writefunction);
rv=curl_easy_setopt(ch, CURLOPT_WRITEDATA, stdout); rv=curl_easy_setopt(ch,CURLOPT_WRITEDATA, stdout);
rv=curl_easy_setopt(ch, CURLOPT_HEADERFUNCTION, *writefunction); rv=curl_easy_setopt(ch,CURLOPT_HEADERFUNCTION, *writefunction);
rv=curl_easy_setopt(ch, CURLOPT_HEADERDATA, stderr); rv=curl_easy_setopt(ch,CURLOPT_HEADERDATA, stderr);
rv=curl_easy_setopt(ch, CURLOPT_SSLCERTTYPE, "PEM"); rv=curl_easy_setopt(ch,CURLOPT_SSLCERTTYPE,"PEM");
rv=curl_easy_setopt(ch, CURLOPT_SSL_VERIFYPEER, 1L); rv=curl_easy_setopt(ch,CURLOPT_SSL_VERIFYPEER,1L);
rv=curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/"); rv=curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/");
/* first try: retrieve page without cacerts' certificate -> will fail /* first try: retrieve page without cacerts' certificate -> will fail
*/ */
rv=curl_easy_perform(ch); rv=curl_easy_perform(ch);
if(rv==CURLE_OK) if (rv==CURLE_OK)
printf("*** transfer succeeded ***\n"); printf("*** transfer succeeded ***\n");
else else
printf("*** transfer failed ***\n"); printf("*** transfer failed ***\n");
@ -136,9 +142,9 @@ int main(void)
* load the certificate by installing a function doing the nescessary * load the certificate by installing a function doing the nescessary
* "modifications" to the SSL CONTEXT just before link init * "modifications" to the SSL CONTEXT just before link init
*/ */
rv=curl_easy_setopt(ch, CURLOPT_SSL_CTX_FUNCTION, *sslctx_function); rv=curl_easy_setopt(ch,CURLOPT_SSL_CTX_FUNCTION, *sslctx_function);
rv=curl_easy_perform(ch); rv=curl_easy_perform(ch);
if(rv==CURLE_OK) if (rv==CURLE_OK)
printf("*** transfer succeeded ***\n"); printf("*** transfer succeeded ***\n");
else else
printf("*** transfer failed ***\n"); printf("*** transfer failed ***\n");

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -19,10 +19,6 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
***************************************************************************/ ***************************************************************************/
/* <DESC>
* Extract lots of TLS certificate info.
* </DESC>
*/
#include <stdio.h> #include <stdio.h>
#include <curl/curl.h> #include <curl/curl.h>

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -19,10 +19,6 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
***************************************************************************/ ***************************************************************************/
/* <DESC>
* Show transfer timing info after download completes.
* </DESC>
*/
/* Example source code to show how the callback function can be used to /* Example source code to show how the callback function can be used to
* download data into a chunk of memory instead of storing it in a file. * download data into a chunk of memory instead of storing it in a file.
* After successful download we use curl_easy_getinfo() calls to get the * After successful download we use curl_easy_getinfo() calls to get the
@ -68,78 +64,63 @@ int main(int argc, char *argv[])
const char *url = URL_1M; const char *url = URL_1M;
char *appname = argv[0]; char *appname = argv[0];
if(argc > 1) { if (argc > 1) {
/* parse input parameters */ /* parse input parameters */
for(argc--, argv++; *argv; argc--, argv++) { for (argc--, argv++; *argv; argc--, argv++) {
if(strncasecmp(*argv, "-", 1) == 0) { if (strncasecmp(*argv, "-", 1) == 0) {
if(strncasecmp(*argv, "-H", 2) == 0) { if (strncasecmp(*argv, "-H", 2) == 0) {
fprintf(stderr, fprintf(stderr,
"\rUsage: %s [-m=1|2|5|10|20|50|100] [-t] [-x] [url]\n", "\rUsage: %s [-m=1|2|5|10|20|50|100] [-t] [-x] [url]\n",
appname); appname);
exit(1); exit(1);
} } else if (strncasecmp(*argv, "-V", 2) == 0) {
else if(strncasecmp(*argv, "-V", 2) == 0) {
fprintf(stderr, "\r%s %s - %s\n", fprintf(stderr, "\r%s %s - %s\n",
appname, CHKSPEED_VERSION, curl_version()); appname, CHKSPEED_VERSION, curl_version());
exit(1); exit(1);
} } else if (strncasecmp(*argv, "-A", 2) == 0) {
else if(strncasecmp(*argv, "-A", 2) == 0) {
prtall = 1; prtall = 1;
} } else if (strncasecmp(*argv, "-X", 2) == 0) {
else if(strncasecmp(*argv, "-X", 2) == 0) {
prtsep = 1; prtsep = 1;
} } else if (strncasecmp(*argv, "-T", 2) == 0) {
else if(strncasecmp(*argv, "-T", 2) == 0) {
prttime = 1; prttime = 1;
} } else if (strncasecmp(*argv, "-M=", 3) == 0) {
else if(strncasecmp(*argv, "-M=", 3) == 0) {
long m = strtol((*argv)+3, NULL, 10); long m = strtol((*argv)+3, NULL, 10);
switch(m) { switch(m) {
case 1: case 1: url = URL_1M;
url = URL_1M; break;
break; case 2: url = URL_2M;
case 2: break;
url = URL_2M; case 5: url = URL_5M;
break; break;
case 5: case 10: url = URL_10M;
url = URL_5M; break;
break; case 20: url = URL_20M;
case 10: break;
url = URL_10M; case 50: url = URL_50M;
break; break;
case 20: case 100: url = URL_100M;
url = URL_20M; break;
break; default: fprintf(stderr, "\r%s: invalid parameter %s\n",
case 50: appname, *argv + 3);
url = URL_50M; exit(1);
break;
case 100:
url = URL_100M;
break;
default:
fprintf(stderr, "\r%s: invalid parameter %s\n",
appname, *argv + 3);
exit(1);
} }
} } else {
else {
fprintf(stderr, "\r%s: invalid or unknown option %s\n", fprintf(stderr, "\r%s: invalid or unknown option %s\n",
appname, *argv); appname, *argv);
exit(1); exit(1);
} }
} } else {
else {
url = *argv; url = *argv;
} }
} }
} }
/* print separator line */ /* print separator line */
if(prtsep) { if (prtsep) {
printf("-------------------------------------------------\n"); printf("-------------------------------------------------\n");
} }
/* print localtime */ /* print localtime */
if(prttime) { if (prttime) {
time_t t = time(NULL); time_t t = time(NULL);
printf("Localtime: %s", ctime(&t)); printf("Localtime: %s", ctime(&t));
} }
@ -182,7 +163,7 @@ int main(int argc, char *argv[])
if((CURLE_OK == res) && (val>0)) if((CURLE_OK == res) && (val>0))
printf("Average download speed: %0.3f kbyte/sec.\n", val / 1024); printf("Average download speed: %0.3f kbyte/sec.\n", val / 1024);
if(prtall) { if (prtall) {
/* check for name resolution time */ /* check for name resolution time */
res = curl_easy_getinfo(curl_handle, CURLINFO_NAMELOOKUP_TIME, &val); res = curl_easy_getinfo(curl_handle, CURLINFO_NAMELOOKUP_TIME, &val);
if((CURLE_OK == res) && (val>0)) if((CURLE_OK == res) && (val>0))
@ -193,8 +174,8 @@ int main(int argc, char *argv[])
if((CURLE_OK == res) && (val>0)) if((CURLE_OK == res) && (val>0))
printf("Connect time: %0.3f sec.\n", val); printf("Connect time: %0.3f sec.\n", val);
} }
}
else { } else {
fprintf(stderr, "Error while fetching '%s' : %s\n", fprintf(stderr, "Error while fetching '%s' : %s\n",
url, curl_easy_strerror(res)); url, curl_easy_strerror(res));
} }

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -19,10 +19,7 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
***************************************************************************/ ***************************************************************************/
/* <DESC> /* This example shows usage of simple cookie interface. */
* Import and export cookies with COOKIELIST.
* </DESC>
*/
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
@ -42,18 +39,17 @@ print_cookies(CURL *curl)
printf("Cookies, curl knows:\n"); printf("Cookies, curl knows:\n");
res = curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies); res = curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies);
if(res != CURLE_OK) { if (res != CURLE_OK) {
fprintf(stderr, "Curl curl_easy_getinfo failed: %s\n", fprintf(stderr, "Curl curl_easy_getinfo failed: %s\n", curl_easy_strerror(res));
curl_easy_strerror(res));
exit(1); exit(1);
} }
nc = cookies, i = 1; nc = cookies, i = 1;
while(nc) { while (nc) {
printf("[%d]: %s\n", i, nc->data); printf("[%d]: %s\n", i, nc->data);
nc = nc->next; nc = nc->next;
i++; i++;
} }
if(i == 1) { if (i == 1) {
printf("(none)\n"); printf("(none)\n");
} }
curl_slist_free_all(cookies); curl_slist_free_all(cookies);
@ -67,14 +63,14 @@ main(void)
curl_global_init(CURL_GLOBAL_ALL); curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init(); curl = curl_easy_init();
if(curl) { if (curl) {
char nline[256]; char nline[256];
curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/"); curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/");
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, ""); /* start cookie engine */ curl_easy_setopt(curl, CURLOPT_COOKIEFILE, ""); /* just to start the cookie engine */
res = curl_easy_perform(curl); res = curl_easy_perform(curl);
if(res != CURLE_OK) { if (res != CURLE_OK) {
fprintf(stderr, "Curl perform failed: %s\n", curl_easy_strerror(res)); fprintf(stderr, "Curl perform failed: %s\n", curl_easy_strerror(res));
return 1; return 1;
} }
@ -93,41 +89,30 @@ main(void)
#endif #endif
/* Netscape format cookie */ /* Netscape format cookie */
snprintf(nline, sizeof(nline), "%s\t%s\t%s\t%s\t%lu\t%s\t%s", snprintf(nline, sizeof(nline), "%s\t%s\t%s\t%s\t%lu\t%s\t%s",
".google.com", "TRUE", "/", "FALSE", ".google.com", "TRUE", "/", "FALSE", (unsigned long)time(NULL) + 31337UL, "PREF", "hello google, i like you very much!");
(unsigned long)time(NULL) + 31337UL,
"PREF", "hello google, i like you very much!");
res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline); res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline);
if(res != CURLE_OK) { if (res != CURLE_OK) {
fprintf(stderr, "Curl curl_easy_setopt failed: %s\n", fprintf(stderr, "Curl curl_easy_setopt failed: %s\n", curl_easy_strerror(res));
curl_easy_strerror(res));
return 1; return 1;
} }
/* HTTP-header style cookie. If you use the Set-Cookie format and don't /* HTTP-header style cookie */
specify a domain then the cookie is sent for any domain and will not be
modified, likely not what you intended. Starting in 7.43.0 any-domain
cookies will not be exported either. For more information refer to the
CURLOPT_COOKIELIST documentation.
*/
snprintf(nline, sizeof(nline), snprintf(nline, sizeof(nline),
"Set-Cookie: OLD_PREF=3d141414bf4209321; " "Set-Cookie: OLD_PREF=3d141414bf4209321; "
"expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com"); "expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com");
res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline); res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline);
if(res != CURLE_OK) { if (res != CURLE_OK) {
fprintf(stderr, "Curl curl_easy_setopt failed: %s\n", fprintf(stderr, "Curl curl_easy_setopt failed: %s\n", curl_easy_strerror(res));
curl_easy_strerror(res));
return 1; return 1;
} }
print_cookies(curl); print_cookies(curl);
res = curl_easy_perform(curl); res = curl_easy_perform(curl);
if(res != CURLE_OK) { if (res != CURLE_OK) {
fprintf(stderr, "Curl perform failed: %s\n", curl_easy_strerror(res)); fprintf(stderr, "Curl perform failed: %s\n", curl_easy_strerror(res));
return 1; return 1;
} }
curl_easy_cleanup(curl);
} }
else { else {
fprintf(stderr, "Curl init failed!\n"); fprintf(stderr, "Curl init failed!\n");

View File

@ -5,12 +5,9 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (c) 2000 David Odin (aka DindinX) for MandrakeSoft
*/
/* <DESC>
* use the libcurl in a gtk-threaded application
* </DESC>
*/ */
/* Copyright (c) 2000 David Odin (aka DindinX) for MandrakeSoft */
/* an attempt to use the curl library in concert with a gtk-threaded application */
#include <stdio.h> #include <stdio.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
@ -50,9 +47,9 @@ void *my_thread(void *ptr)
gchar *url = ptr; gchar *url = ptr;
curl = curl_easy_init(); curl = curl_easy_init();
if(curl) { if(curl)
const char *filename = "test.curl"; {
outfile = fopen(filename, "wb"); outfile = fopen("test.curl", "w");
curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile); curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile);
@ -97,7 +94,7 @@ int main(int argc, char **argv)
gtk_container_add(GTK_CONTAINER(Frame2), Bar); gtk_container_add(GTK_CONTAINER(Frame2), Bar);
gtk_widget_show_all(Window); gtk_widget_show_all(Window);
if(!g_thread_create(&my_thread, argv[1], FALSE, NULL) != 0) if (!g_thread_create(&my_thread, argv[1], FALSE, NULL) != 0)
g_warning("can't create the thread"); g_warning("can't create the thread");

View File

@ -9,10 +9,7 @@
certificate presented during ssl session establishment. certificate presented during ssl session establishment.
*/ */
/* <DESC>
* demonstrates use of SSL context callback, requires OpenSSL
* </DESC>
*/
/* /*
* Copyright (c) 2003 The OpenEvidence Project. All rights reserved. * Copyright (c) 2003 The OpenEvidence Project. All rights reserved.
@ -36,7 +33,7 @@
* "This product includes software developed by the Openevidence Project * "This product includes software developed by the Openevidence Project
* for use in the OpenEvidence Toolkit. (http://www.openevidence.org/)" * for use in the OpenEvidence Toolkit. (http://www.openevidence.org/)"
* This product includes software developed by the OpenSSL Project * This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (https://www.openssl.org/)" * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
* This product includes cryptographic software written by Eric Young * This product includes cryptographic software written by Eric Young
* (eay@cryptsoft.com). This product includes software written by Tim * (eay@cryptsoft.com). This product includes software written by Tim
* Hudson (tjh@cryptsoft.com)." * Hudson (tjh@cryptsoft.com)."
@ -55,7 +52,7 @@
* "This product includes software developed by the OpenEvidence Project * "This product includes software developed by the OpenEvidence Project
* for use in the OpenEvidence Toolkit (http://www.openevidence.org/) * for use in the OpenEvidence Toolkit (http://www.openevidence.org/)
* This product includes software developed by the OpenSSL Project * This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (https://www.openssl.org/)" * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
* This product includes cryptographic software written by Eric Young * This product includes cryptographic software written by Eric Young
* (eay@cryptsoft.com). This product includes software written by Tim * (eay@cryptsoft.com). This product includes software written by Tim
* Hudson (tjh@cryptsoft.com)." * Hudson (tjh@cryptsoft.com)."
@ -75,7 +72,7 @@
* ==================================================================== * ====================================================================
* *
* This product includes software developed by the OpenSSL Project * This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (https://www.openssl.org/) * for use in the OpenSSL Toolkit (http://www.openssl.org/)
* This product includes cryptographic software written by Eric Young * This product includes cryptographic software written by Eric Young
* (eay@cryptsoft.com). This product includes software written by Tim * (eay@cryptsoft.com). This product includes software written by Tim
* Hudson (tjh@cryptsoft.com). * Hudson (tjh@cryptsoft.com).
@ -101,18 +98,13 @@
static const char *curlx_usage[]={ static const char *curlx_usage[]={
"usage: curlx args\n", "usage: curlx args\n",
" -p12 arg - tia file ", " -p12 arg - tia file ",
" -envpass arg - environement variable which content the tia private" " -envpass arg - environement variable which content the tia private key password",
" key password",
" -out arg - output file (response)- default stdout", " -out arg - output file (response)- default stdout",
" -in arg - input file (request)- default stdin", " -in arg - input file (request)- default stdin",
" -connect arg - URL of the server for the connection ex:" " -connect arg - URL of the server for the connection ex: www.openevidence.org",
" www.openevidence.org", " -mimetype arg - MIME type for data in ex : application/timestamp-query or application/dvcs -default application/timestamp-query",
" -mimetype arg - MIME type for data in ex : application/timestamp-query" " -acceptmime arg - MIME type acceptable for the response ex : application/timestamp-response or application/dvcs -default none",
" or application/dvcs -default application/timestamp-query", " -accesstype arg - an Object identifier in an AIA/SIA method, e.g. AD_DVCS or ad_timestamping",
" -acceptmime arg - MIME type acceptable for the response ex : "
"application/timestamp-response or application/dvcs -default none",
" -accesstype arg - an Object identifier in an AIA/SIA method, e.g."
" AD_DVCS or ad_timestamping",
NULL NULL
}; };
@ -133,22 +125,22 @@ static const char *curlx_usage[]={
/* This is a context that we pass to all callbacks */ /* This is a context that we pass to all callbacks */
typedef struct sslctxparm_st { typedef struct sslctxparm_st {
unsigned char * p12file; unsigned char * p12file ;
const char * pst; const char * pst ;
PKCS12 * p12; PKCS12 * p12 ;
EVP_PKEY * pkey; EVP_PKEY * pkey ;
X509 * usercert; X509 * usercert ;
STACK_OF(X509) * ca; STACK_OF(X509) * ca ;
CURL * curl; CURL * curl;
BIO * errorbio; BIO * errorbio;
int accesstype; int accesstype ;
int verbose; int verbose;
} sslctxparm; } sslctxparm;
/* some helper function. */ /* some helper function. */
static char *ia5string(ASN1_IA5STRING *ia5) static char *i2s_ASN1_IA5STRING( ASN1_IA5STRING *ia5)
{ {
char *tmp; char *tmp;
if(!ia5 || !ia5->length) if(!ia5 || !ia5->length)
@ -160,20 +152,20 @@ static char *ia5string(ASN1_IA5STRING *ia5)
} }
/* A conveniance routine to get an access URI. */ /* A conveniance routine to get an access URI. */
static unsigned char *my_get_ext(X509 *cert, const int type,
int extensiontype)
{
int i;
STACK_OF(ACCESS_DESCRIPTION) * accessinfo;
accessinfo = X509_get_ext_d2i(cert, extensiontype, NULL, NULL);
if(!sk_ACCESS_DESCRIPTION_num(accessinfo)) static unsigned char *my_get_ext(X509 * cert, const int type, int extensiontype) {
int i;
STACK_OF(ACCESS_DESCRIPTION) * accessinfo ;
accessinfo = X509_get_ext_d2i(cert, extensiontype, NULL, NULL) ;
if (!sk_ACCESS_DESCRIPTION_num(accessinfo))
return NULL; return NULL;
for(i = 0; i < sk_ACCESS_DESCRIPTION_num(accessinfo); i++) { for (i = 0; i < sk_ACCESS_DESCRIPTION_num(accessinfo); i++) {
ACCESS_DESCRIPTION * ad = sk_ACCESS_DESCRIPTION_value(accessinfo, i); ACCESS_DESCRIPTION * ad = sk_ACCESS_DESCRIPTION_value(accessinfo, i);
if(OBJ_obj2nid(ad->method) == type) { if (OBJ_obj2nid(ad->method) == type) {
if(ad->location->type == GEN_URI) { if (ad->location->type == GEN_URI) {
return ia5string(ad->location->d.ia5); return i2s_ASN1_IA5STRING(ad->location->d.ia5);
} }
return NULL; return NULL;
} }
@ -192,86 +184,84 @@ static int ssl_app_verify_callback(X509_STORE_CTX *ctx, void *arg)
sslctxparm * p = (sslctxparm *) arg; sslctxparm * p = (sslctxparm *) arg;
int ok; int ok;
if(p->verbose > 2) if (p->verbose > 2)
BIO_printf(p->errorbio, "entering ssl_app_verify_callback\n"); BIO_printf(p->errorbio,"entering ssl_app_verify_callback\n");
if((ok= X509_verify_cert(ctx)) && ctx->cert) { if ((ok= X509_verify_cert(ctx)) && ctx->cert) {
unsigned char * accessinfo; unsigned char * accessinfo ;
if(p->verbose > 1) if (p->verbose > 1)
X509_print_ex(p->errorbio, ctx->cert, 0, 0); X509_print_ex(p->errorbio,ctx->cert,0,0);
if(accessinfo = my_get_ext(ctx->cert, p->accesstype, NID_sinfo_access)) { if (accessinfo = my_get_ext(ctx->cert,p->accesstype ,NID_sinfo_access)) {
if(p->verbose) if (p->verbose)
BIO_printf(p->errorbio, "Setting URL from SIA to: %s\n", accessinfo); BIO_printf(p->errorbio,"Setting URL from SIA to: %s\n", accessinfo);
curl_easy_setopt(p->curl, CURLOPT_URL, accessinfo); curl_easy_setopt(p->curl, CURLOPT_URL,accessinfo);
} }
else if(accessinfo = my_get_ext(ctx->cert, p->accesstype, else if (accessinfo = my_get_ext(ctx->cert,p->accesstype,
NID_info_access)) { NID_info_access)) {
if(p->verbose) if (p->verbose)
BIO_printf(p->errorbio, "Setting URL from AIA to: %s\n", accessinfo); BIO_printf(p->errorbio,"Setting URL from AIA to: %s\n", accessinfo);
curl_easy_setopt(p->curl, CURLOPT_URL, accessinfo); curl_easy_setopt(p->curl, CURLOPT_URL,accessinfo);
} }
} }
if(p->verbose > 2) if (p->verbose > 2)
BIO_printf(p->errorbio, "leaving ssl_app_verify_callback with %d\n", ok); BIO_printf(p->errorbio,"leaving ssl_app_verify_callback with %d\n", ok);
return(ok);
return ok;
} }
/* The SSL initialisation callback. The callback sets: /* This is an example of an curl SSL initialisation call back. The callback sets:
- a private key and certificate - a private key and certificate
- a trusted ca certificate - a trusted ca certificate
- a preferred cipherlist - a preferred cipherlist
- an application verification callback (the function above) - an application verification callback (the function above)
*/ */
static CURLcode sslctxfun(CURL * curl, void * sslctx, void * parm) static CURLcode sslctxfun(CURL * curl, void * sslctx, void * parm) {
{
sslctxparm * p = (sslctxparm *) parm; sslctxparm * p = (sslctxparm *) parm;
SSL_CTX * ctx = (SSL_CTX *) sslctx; SSL_CTX * ctx = (SSL_CTX *) sslctx ;
if(!SSL_CTX_use_certificate(ctx, p->usercert)) { if (!SSL_CTX_use_certificate(ctx,p->usercert)) {
BIO_printf(p->errorbio, "SSL_CTX_use_certificate problem\n"); BIO_printf(p->errorbio, "SSL_CTX_use_certificate problem\n"); goto err;
goto err;
} }
if(!SSL_CTX_use_PrivateKey(ctx, p->pkey)) { if (!SSL_CTX_use_PrivateKey(ctx,p->pkey)) {
BIO_printf(p->errorbio, "SSL_CTX_use_PrivateKey\n"); BIO_printf(p->errorbio, "SSL_CTX_use_PrivateKey\n"); goto err;
goto err;
} }
if(!SSL_CTX_check_private_key(ctx)) { if (!SSL_CTX_check_private_key(ctx)) {
BIO_printf(p->errorbio, "SSL_CTX_check_private_key\n"); BIO_printf(p->errorbio, "SSL_CTX_check_private_key\n"); goto err;
goto err;
} }
SSL_CTX_set_quiet_shutdown(ctx, 1); SSL_CTX_set_quiet_shutdown(ctx,1);
SSL_CTX_set_cipher_list(ctx, "RC4-MD5"); SSL_CTX_set_cipher_list(ctx,"RC4-MD5");
SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY); SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);
X509_STORE_add_cert(SSL_CTX_get_cert_store(ctx), X509_STORE_add_cert(SSL_CTX_get_cert_store(ctx), sk_X509_value(p->ca, sk_X509_num(p->ca)-1));
sk_X509_value(p->ca, sk_X509_num(p->ca)-1));
SSL_CTX_set_verify_depth(ctx,2);
SSL_CTX_set_verify(ctx,SSL_VERIFY_PEER,ZERO_NULL);
SSL_CTX_set_verify_depth(ctx, 2);
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, ZERO_NULL);
SSL_CTX_set_cert_verify_callback(ctx, ssl_app_verify_callback, parm); SSL_CTX_set_cert_verify_callback(ctx, ssl_app_verify_callback, parm);
return CURLE_OK;
return CURLE_OK ;
err: err:
ERR_print_errors(p->errorbio); ERR_print_errors(p->errorbio);
return CURLE_SSL_CERTPROBLEM; return CURLE_SSL_CERTPROBLEM;
} }
int main(int argc, char **argv) int main(int argc, char **argv) {
{
BIO* in=NULL; BIO* in=NULL;
BIO* out=NULL; BIO* out=NULL;
char * outfile = NULL; char * outfile = NULL;
char * infile = NULL; char * infile = NULL ;
int tabLength=100; int tabLength=100;
char *binaryptr; char *binaryptr;
@ -280,7 +270,7 @@ int main(int argc, char **argv)
char* contenttype; char* contenttype;
const char** pp; const char** pp;
unsigned char* hostporturl = NULL; unsigned char* hostporturl = NULL;
BIO * p12bio; BIO * p12bio ;
char **args = argv + 1; char **args = argv + 1;
unsigned char * serverurl; unsigned char * serverurl;
sslctxparm p; sslctxparm p;
@ -303,91 +293,66 @@ int main(int argc, char **argv)
OpenSSL_add_all_digests(); OpenSSL_add_all_digests();
ERR_load_crypto_strings(); ERR_load_crypto_strings();
while(*args && *args[0] == '-') {
if(!strcmp (*args, "-in")) {
if(args[1]) { while (*args && *args[0] == '-') {
if (!strcmp (*args, "-in")) {
if (args[1]) {
infile=*(++args); infile=*(++args);
} } else badarg=1;
else } else if (!strcmp (*args, "-out")) {
badarg=1; if (args[1]) {
}
else if(!strcmp (*args, "-out")) {
if(args[1]) {
outfile=*(++args); outfile=*(++args);
} } else badarg=1;
else } else if (!strcmp (*args, "-p12")) {
badarg=1; if (args[1]) {
}
else if(!strcmp (*args, "-p12")) {
if(args[1]) {
p.p12file = *(++args); p.p12file = *(++args);
} } else badarg=1;
else } else if (strcmp(*args,"-envpass") == 0) {
badarg=1; if (args[1]) {
}
else if(strcmp(*args, "-envpass") == 0) {
if(args[1]) {
p.pst = getenv(*(++args)); p.pst = getenv(*(++args));
} } else badarg=1;
else } else if (strcmp(*args,"-connect") == 0) {
badarg=1; if (args[1]) {
}
else if(strcmp(*args, "-connect") == 0) {
if(args[1]) {
hostporturl = *(++args); hostporturl = *(++args);
} } else badarg=1;
else } else if (strcmp(*args,"-mimetype") == 0) {
badarg=1; if (args[1]) {
}
else if(strcmp(*args, "-mimetype") == 0) {
if(args[1]) {
mimetype = *(++args); mimetype = *(++args);
} } else badarg=1;
else } else if (strcmp(*args,"-acceptmime") == 0) {
badarg=1; if (args[1]) {
}
else if(strcmp(*args, "-acceptmime") == 0) {
if(args[1]) {
mimetypeaccept = *(++args); mimetypeaccept = *(++args);
} } else badarg=1;
else } else if (strcmp(*args,"-accesstype") == 0) {
badarg=1; if (args[1]) {
} if ((p.accesstype = OBJ_obj2nid(OBJ_txt2obj(*++args,0))) == 0) badarg=1;
else if(strcmp(*args, "-accesstype") == 0) { } else badarg=1;
if(args[1]) { } else if (strcmp(*args,"-verbose") == 0) {
if((p.accesstype = OBJ_obj2nid(OBJ_txt2obj(*++args, 0))) == 0)
badarg=1;
}
else
badarg=1;
}
else if(strcmp(*args, "-verbose") == 0) {
p.verbose++; p.verbose++;
} } else badarg=1;
else
badarg=1;
args++; args++;
} }
if(mimetype==NULL || mimetypeaccept == NULL) if (mimetype==NULL || mimetypeaccept == NULL) badarg = 1;
badarg = 1;
if(badarg) { if (badarg) {
for(pp=curlx_usage; (*pp != NULL); pp++) for (pp=curlx_usage; (*pp != NULL); pp++)
BIO_printf(p.errorbio, "%s\n", *pp); BIO_printf(p.errorbio,"%s\n",*pp);
BIO_printf(p.errorbio, "\n"); BIO_printf(p.errorbio,"\n");
goto err; goto err;
} }
/* set input */ /* set input */
if((in=BIO_new(BIO_s_file())) == NULL) { if ((in=BIO_new(BIO_s_file())) == NULL) {
BIO_printf(p.errorbio, "Error setting input bio\n"); BIO_printf(p.errorbio, "Error setting input bio\n");
goto err; goto err;
} } else if (infile == NULL)
else if(infile == NULL) BIO_set_fp(in,stdin,BIO_NOCLOSE|BIO_FP_TEXT);
BIO_set_fp(in, stdin, BIO_NOCLOSE|BIO_FP_TEXT); else if (BIO_read_filename(in,infile) <= 0) {
else if(BIO_read_filename(in, infile) <= 0) {
BIO_printf(p.errorbio, "Error opening input file %s\n", infile); BIO_printf(p.errorbio, "Error opening input file %s\n", infile);
BIO_free(in); BIO_free(in);
goto err; goto err;
@ -395,13 +360,12 @@ int main(int argc, char **argv)
/* set output */ /* set output */
if((out=BIO_new(BIO_s_file())) == NULL) { if ((out=BIO_new(BIO_s_file())) == NULL) {
BIO_printf(p.errorbio, "Error setting output bio.\n"); BIO_printf(p.errorbio, "Error setting output bio.\n");
goto err; goto err;
} } else if (outfile == NULL)
else if(outfile == NULL) BIO_set_fp(out,stdout,BIO_NOCLOSE|BIO_FP_TEXT);
BIO_set_fp(out, stdout, BIO_NOCLOSE|BIO_FP_TEXT); else if (BIO_write_filename(out,outfile) <= 0) {
else if(BIO_write_filename(out, outfile) <= 0) {
BIO_printf(p.errorbio, "Error opening output file %s\n", outfile); BIO_printf(p.errorbio, "Error opening output file %s\n", outfile);
BIO_free(out); BIO_free(out);
goto err; goto err;
@ -410,66 +374,62 @@ int main(int argc, char **argv)
p.errorbio = BIO_new_fp (stderr, BIO_NOCLOSE); p.errorbio = BIO_new_fp (stderr, BIO_NOCLOSE);
if(!(p.curl = curl_easy_init())) { if (!(p.curl = curl_easy_init())) {
BIO_printf(p.errorbio, "Cannot init curl lib\n"); BIO_printf(p.errorbio, "Cannot init curl lib\n");
goto err; goto err;
} }
if(!(p12bio = BIO_new_file(p.p12file , "rb"))) {
BIO_printf(p.errorbio, "Error opening P12 file %s\n", p.p12file);
goto err; if (!(p12bio = BIO_new_file(p.p12file , "rb"))) {
BIO_printf(p.errorbio, "Error opening P12 file %s\n", p.p12file); goto err;
} }
if(!(p.p12 = d2i_PKCS12_bio (p12bio, NULL))) { if (!(p.p12 = d2i_PKCS12_bio (p12bio, NULL))) {
BIO_printf(p.errorbio, "Cannot decode P12 structure %s\n", p.p12file); BIO_printf(p.errorbio, "Cannot decode P12 structure %s\n", p.p12file); goto err;
goto err;
} }
p.ca= NULL; p.ca= NULL;
if(!(PKCS12_parse (p.p12, p.pst, &(p.pkey), &(p.usercert), &(p.ca) ) )) { if (!(PKCS12_parse (p.p12, p.pst, &(p.pkey), &(p.usercert), &(p.ca) ) )) {
BIO_printf(p.errorbio, "Invalid P12 structure in %s\n", p.p12file); BIO_printf(p.errorbio,"Invalid P12 structure in %s\n", p.p12file); goto err;
goto err;
} }
if(sk_X509_num(p.ca) <= 0) { if (sk_X509_num(p.ca) <= 0) {
BIO_printf(p.errorbio, "No trustworthy CA given.%s\n", p.p12file); BIO_printf(p.errorbio,"No trustworthy CA given.%s\n", p.p12file); goto err;
goto err;
} }
if(p.verbose > 1) if (p.verbose > 1)
X509_print_ex(p.errorbio, p.usercert, 0, 0); X509_print_ex(p.errorbio,p.usercert,0,0);
/* determine URL to go */ /* determine URL to go */
if(hostporturl) { if (hostporturl) {
size_t len = strlen(hostporturl) + 9; serverurl = malloc(9+strlen(hostporturl));
serverurl = malloc(len); sprintf(serverurl,"https://%s",hostporturl);
snprintf(serverurl, len, "https://%s", hostporturl);
} }
else if(p.accesstype != 0) { /* see whether we can find an AIA or SIA for a else if (p.accesstype != 0) { /* see whether we can find an AIA or SIA for a given access type */
given access type */ if (!(serverurl = my_get_ext(p.usercert,p.accesstype,NID_info_access))) {
if(!(serverurl = my_get_ext(p.usercert, p.accesstype, NID_info_access))) {
int j=0; int j=0;
BIO_printf(p.errorbio, "no service URL in user cert " BIO_printf(p.errorbio,"no service URL in user cert "
"cherching in others certificats\n"); "cherching in others certificats\n");
for(j=0; j<sk_X509_num(p.ca); j++) { for (j=0;j<sk_X509_num(p.ca);j++) {
if((serverurl = my_get_ext(sk_X509_value(p.ca, j), p.accesstype, if ((serverurl = my_get_ext(sk_X509_value(p.ca,j),p.accesstype,
NID_info_access))) NID_info_access)))
break; break;
if((serverurl = my_get_ext(sk_X509_value(p.ca, j), p.accesstype, if ((serverurl = my_get_ext(sk_X509_value(p.ca,j),p.accesstype,
NID_sinfo_access))) NID_sinfo_access)))
break; break;
} }
} }
} }
if(!serverurl) { if (!serverurl) {
BIO_printf(p.errorbio, "no service URL in certificats," BIO_printf(p.errorbio, "no service URL in certificats,"
" check '-accesstype (AD_DVCS | ad_timestamping)'" " check '-accesstype (AD_DVCS | ad_timestamping)'"
" or use '-connect'\n"); " or use '-connect'\n");
goto err; goto err;
} }
if(p.verbose) if (p.verbose)
BIO_printf(p.errorbio, "Service URL: <%s>\n", serverurl); BIO_printf(p.errorbio, "Service URL: <%s>\n", serverurl);
curl_easy_setopt(p.curl, CURLOPT_URL, serverurl); curl_easy_setopt(p.curl, CURLOPT_URL, serverurl);
@ -477,39 +437,38 @@ int main(int argc, char **argv)
/* Now specify the POST binary data */ /* Now specify the POST binary data */
curl_easy_setopt(p.curl, CURLOPT_POSTFIELDS, binaryptr); curl_easy_setopt(p.curl, CURLOPT_POSTFIELDS, binaryptr);
curl_easy_setopt(p.curl, CURLOPT_POSTFIELDSIZE, (long)tabLength); curl_easy_setopt(p.curl, CURLOPT_POSTFIELDSIZE,(long)tabLength);
/* pass our list of custom made headers */ /* pass our list of custom made headers */
contenttype = malloc(15+strlen(mimetype)); contenttype = malloc(15+strlen(mimetype));
snprintf(contenttype, 15+strlen(mimetype), "Content-type: %s", mimetype); sprintf(contenttype,"Content-type: %s",mimetype);
headers = curl_slist_append(headers, contenttype); headers = curl_slist_append(headers,contenttype);
curl_easy_setopt(p.curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(p.curl, CURLOPT_HTTPHEADER, headers);
if(p.verbose) if (p.verbose)
BIO_printf(p.errorbio, "Service URL: <%s>\n", serverurl); BIO_printf(p.errorbio, "Service URL: <%s>\n", serverurl);
{ {
FILE *outfp; FILE *outfp;
BIO_get_fp(out, &outfp); BIO_get_fp(out,&outfp);
curl_easy_setopt(p.curl, CURLOPT_WRITEDATA, outfp); curl_easy_setopt(p.curl, CURLOPT_WRITEDATA, outfp);
} }
res = curl_easy_setopt(p.curl, CURLOPT_SSL_CTX_FUNCTION, sslctxfun); res = curl_easy_setopt(p.curl, CURLOPT_SSL_CTX_FUNCTION, sslctxfun) ;
if(res != CURLE_OK) if (res != CURLE_OK)
BIO_printf(p.errorbio, "%d %s=%d %d\n", __LINE__, BIO_printf(p.errorbio,"%d %s=%d %d\n", __LINE__, "CURLOPT_SSL_CTX_FUNCTION",CURLOPT_SSL_CTX_FUNCTION,res);
"CURLOPT_SSL_CTX_FUNCTION", CURLOPT_SSL_CTX_FUNCTION, res);
curl_easy_setopt(p.curl, CURLOPT_SSL_CTX_DATA, &p); curl_easy_setopt(p.curl, CURLOPT_SSL_CTX_DATA, &p);
{ {
int lu; int i=0; int lu; int i=0;
while((lu = BIO_read (in, &binaryptr[i], tabLength-i)) >0 ) { while ((lu = BIO_read (in,&binaryptr[i],tabLength-i)) >0 ) {
i+=lu; i+=lu;
if(i== tabLength) { if (i== tabLength) {
tabLength+=100; tabLength+=100;
binaryptr=realloc(binaryptr, tabLength); /* should be more careful */ binaryptr=realloc(binaryptr,tabLength); /* should be more careful */
} }
} }
tabLength = i; tabLength = i;
@ -517,23 +476,23 @@ int main(int argc, char **argv)
/* Now specify the POST binary data */ /* Now specify the POST binary data */
curl_easy_setopt(p.curl, CURLOPT_POSTFIELDS, binaryptr); curl_easy_setopt(p.curl, CURLOPT_POSTFIELDS, binaryptr);
curl_easy_setopt(p.curl, CURLOPT_POSTFIELDSIZE, (long)tabLength); curl_easy_setopt(p.curl, CURLOPT_POSTFIELDSIZE,(long)tabLength);
/* Perform the request, res will get the return code */ /* Perform the request, res will get the return code */
BIO_printf(p.errorbio, "%d %s %d\n", __LINE__, "curl_easy_perform", BIO_printf(p.errorbio,"%d %s %d\n", __LINE__, "curl_easy_perform",
res = curl_easy_perform(p.curl)); res = curl_easy_perform(p.curl));
{ {
int result =curl_easy_getinfo(p.curl, CURLINFO_CONTENT_TYPE, &response); int result =curl_easy_getinfo(p.curl,CURLINFO_CONTENT_TYPE,&response);
if(mimetypeaccept && p.verbose) if( mimetypeaccept && p.verbose)
if(!strcmp(mimetypeaccept, response)) if(!strcmp(mimetypeaccept,response))
BIO_printf(p.errorbio, "the response has a correct mimetype : %s\n", BIO_printf(p.errorbio,"the response has a correct mimetype : %s\n",
response); response);
else else
BIO_printf(p.errorbio, "the response doesn\'t have an acceptable " BIO_printf(p.errorbio,"the reponse doesn\'t has an acceptable "
"mime type, it is %s instead of %s\n", "mime type, it is %s instead of %s\n",
response, mimetypeaccept); response,mimetypeaccept);
} }
/*** code d'erreur si accept mime ***, egalement code return HTTP != 200 ***/ /*** code d'erreur si accept mime ***, egalement code return HTTP != 200 ***/
@ -549,6 +508,6 @@ int main(int argc, char **argv)
BIO_free(out); BIO_free(out);
return (EXIT_SUCCESS); return (EXIT_SUCCESS);
err: BIO_printf(p.errorbio, "error"); err: BIO_printf(p.errorbio,"error");
exit(1); exit(1);
} }

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -19,10 +19,6 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
***************************************************************************/ ***************************************************************************/
/* <DESC>
* Show how CURLOPT_DEBUGFUNCTION can be used.
* </DESC>
*/
#include <stdio.h> #include <stdio.h>
#include <curl/curl.h> #include <curl/curl.h>
@ -62,14 +58,14 @@ void dump(const char *text,
for(c = 0; (c < width) && (i+c < size); c++) { for(c = 0; (c < width) && (i+c < size); c++) {
/* check for 0D0A; if found, skip past and start a new line of output */ /* check for 0D0A; if found, skip past and start a new line of output */
if(nohex && (i+c+1 < size) && ptr[i+c]==0x0D && ptr[i+c+1]==0x0A) { if (nohex && (i+c+1 < size) && ptr[i+c]==0x0D && ptr[i+c+1]==0x0A) {
i+=(c+2-width); i+=(c+2-width);
break; break;
} }
fprintf(stream, "%c", fprintf(stream, "%c",
(ptr[i+c]>=0x20) && (ptr[i+c]<0x80)?ptr[i+c]:'.'); (ptr[i+c]>=0x20) && (ptr[i+c]<0x80)?ptr[i+c]:'.');
/* check again for 0D0A, to avoid an extra \n if it's at width */ /* check again for 0D0A, to avoid an extra \n if it's at width */
if(nohex && (i+c+2 < size) && ptr[i+c+1]==0x0D && ptr[i+c+2]==0x0A) { if (nohex && (i+c+2 < size) && ptr[i+c+1]==0x0D && ptr[i+c+2]==0x0A) {
i+=(c+3-width); i+=(c+3-width);
break; break;
} }

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -19,10 +19,6 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
***************************************************************************/ ***************************************************************************/
/* <DESC>
* multi socket interface together with libev
* </DESC>
*/
/* Example application source code using the multi socket interface to /* Example application source code using the multi socket interface to
* download many files at once. * download many files at once.
* *
@ -119,12 +115,12 @@ static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g)
{ {
DPRINT("%s %li\n", __PRETTY_FUNCTION__, timeout_ms); DPRINT("%s %li\n", __PRETTY_FUNCTION__, timeout_ms);
ev_timer_stop(g->loop, &g->timer_event); ev_timer_stop(g->loop, &g->timer_event);
if(timeout_ms > 0) { if (timeout_ms > 0)
{
double t = timeout_ms / 1000; double t = timeout_ms / 1000;
ev_timer_init(&g->timer_event, timer_cb, t, 0.); ev_timer_init(&g->timer_event, timer_cb, t, 0.);
ev_timer_start(g->loop, &g->timer_event); ev_timer_start(g->loop, &g->timer_event);
} }else
else
timer_cb(g->loop, &g->timer_event, 0); timer_cb(g->loop, &g->timer_event, 0);
return 0; return 0;
} }
@ -132,32 +128,20 @@ static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g)
/* Die if we get a bad CURLMcode somewhere */ /* Die if we get a bad CURLMcode somewhere */
static void mcode_or_die(const char *where, CURLMcode code) static void mcode_or_die(const char *where, CURLMcode code)
{ {
if(CURLM_OK != code) { if ( CURLM_OK != code )
{
const char *s; const char *s;
switch (code) { switch ( code )
case CURLM_BAD_HANDLE: {
s="CURLM_BAD_HANDLE"; case CURLM_BAD_HANDLE: s="CURLM_BAD_HANDLE"; break;
case CURLM_BAD_EASY_HANDLE: s="CURLM_BAD_EASY_HANDLE"; break;
case CURLM_OUT_OF_MEMORY: s="CURLM_OUT_OF_MEMORY"; break;
case CURLM_INTERNAL_ERROR: s="CURLM_INTERNAL_ERROR"; break;
case CURLM_UNKNOWN_OPTION: s="CURLM_UNKNOWN_OPTION"; break;
case CURLM_LAST: s="CURLM_LAST"; break;
default: s="CURLM_unknown";
break; break;
case CURLM_BAD_EASY_HANDLE: case CURLM_BAD_SOCKET: s="CURLM_BAD_SOCKET";
s="CURLM_BAD_EASY_HANDLE";
break;
case CURLM_OUT_OF_MEMORY:
s="CURLM_OUT_OF_MEMORY";
break;
case CURLM_INTERNAL_ERROR:
s="CURLM_INTERNAL_ERROR";
break;
case CURLM_UNKNOWN_OPTION:
s="CURLM_UNKNOWN_OPTION";
break;
case CURLM_LAST:
s="CURLM_LAST";
break;
default:
s="CURLM_unknown";
break;
case CURLM_BAD_SOCKET:
s="CURLM_BAD_SOCKET";
fprintf(MSG_OUT, "ERROR: %s returns %s\n", where, s); fprintf(MSG_OUT, "ERROR: %s returns %s\n", where, s);
/* ignore this error */ /* ignore this error */
return; return;
@ -180,8 +164,8 @@ static void check_multi_info(GlobalInfo *g)
CURLcode res; CURLcode res;
fprintf(MSG_OUT, "REMAINING: %d\n", g->still_running); fprintf(MSG_OUT, "REMAINING: %d\n", g->still_running);
while((msg = curl_multi_info_read(g->multi, &msgs_left))) { while ((msg = curl_multi_info_read(g->multi, &msgs_left))) {
if(msg->msg == CURLMSG_DONE) { if (msg->msg == CURLMSG_DONE) {
easy = msg->easy_handle; easy = msg->easy_handle;
res = msg->data.result; res = msg->data.result;
curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn); curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
@ -209,7 +193,8 @@ static void event_cb(EV_P_ struct ev_io *w, int revents)
rc = curl_multi_socket_action(g->multi, w->fd, action, &g->still_running); rc = curl_multi_socket_action(g->multi, w->fd, action, &g->still_running);
mcode_or_die("event_cb: curl_multi_socket_action", rc); mcode_or_die("event_cb: curl_multi_socket_action", rc);
check_multi_info(g); check_multi_info(g);
if(g->still_running <= 0) { if ( g->still_running <= 0 )
{
fprintf(MSG_OUT, "last transfer done, kill timeout\n"); fprintf(MSG_OUT, "last transfer done, kill timeout\n");
ev_timer_stop(g->loop, &g->timer_event); ev_timer_stop(g->loop, &g->timer_event);
} }
@ -223,8 +208,7 @@ static void timer_cb(EV_P_ struct ev_timer *w, int revents)
GlobalInfo *g = (GlobalInfo *)w->data; GlobalInfo *g = (GlobalInfo *)w->data;
CURLMcode rc; CURLMcode rc;
rc = curl_multi_socket_action(g->multi, CURL_SOCKET_TIMEOUT, 0, rc = curl_multi_socket_action(g->multi, CURL_SOCKET_TIMEOUT, 0, &g->still_running);
&g->still_running);
mcode_or_die("timer_cb: curl_multi_socket_action", rc); mcode_or_die("timer_cb: curl_multi_socket_action", rc);
check_multi_info(g); check_multi_info(g);
} }
@ -233,8 +217,9 @@ static void timer_cb(EV_P_ struct ev_timer *w, int revents)
static void remsock(SockInfo *f, GlobalInfo *g) static void remsock(SockInfo *f, GlobalInfo *g)
{ {
printf("%s \n", __PRETTY_FUNCTION__); printf("%s \n", __PRETTY_FUNCTION__);
if(f) { if ( f )
if(f->evset) {
if ( f->evset )
ev_io_stop(g->loop, &f->ev); ev_io_stop(g->loop, &f->ev);
free(f); free(f);
} }
@ -252,7 +237,7 @@ static void setsock(SockInfo*f, curl_socket_t s, CURL*e, int act, GlobalInfo*g)
f->sockfd = s; f->sockfd = s;
f->action = act; f->action = act;
f->easy = e; f->easy = e;
if(f->evset) if ( f->evset )
ev_io_stop(g->loop, &f->ev); ev_io_stop(g->loop, &f->ev);
ev_io_init(&f->ev, event_cb, f->sockfd, kind); ev_io_init(&f->ev, event_cb, f->sockfd, kind);
f->ev.data = g; f->ev.data = g;
@ -284,16 +269,18 @@ static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
fprintf(MSG_OUT, fprintf(MSG_OUT,
"socket callback: s=%d e=%p what=%s ", s, e, whatstr[what]); "socket callback: s=%d e=%p what=%s ", s, e, whatstr[what]);
if(what == CURL_POLL_REMOVE) { if ( what == CURL_POLL_REMOVE )
{
fprintf(MSG_OUT, "\n"); fprintf(MSG_OUT, "\n");
remsock(fdp, g); remsock(fdp, g);
} } else
else { {
if(!fdp) { if ( !fdp )
{
fprintf(MSG_OUT, "Adding data: %s\n", whatstr[what]); fprintf(MSG_OUT, "Adding data: %s\n", whatstr[what]);
addsock(s, e, what, g); addsock(s, e, what, g);
} } else
else { {
fprintf(MSG_OUT, fprintf(MSG_OUT,
"Changing action from %s to %s\n", "Changing action from %s to %s\n",
whatstr[fdp->action], whatstr[what]); whatstr[fdp->action], whatstr[what]);
@ -339,7 +326,8 @@ static void new_conn(char *url, GlobalInfo *g )
conn->error[0]='\0'; conn->error[0]='\0';
conn->easy = curl_easy_init(); conn->easy = curl_easy_init();
if(!conn->easy) { if ( !conn->easy )
{
fprintf(MSG_OUT, "curl_easy_init() failed, exiting!\n"); fprintf(MSG_OUT, "curl_easy_init() failed, exiting!\n");
exit(2); exit(2);
} }
@ -374,16 +362,16 @@ static void fifo_cb(EV_P_ struct ev_io *w, int revents)
int n=0; int n=0;
GlobalInfo *g = (GlobalInfo *)w->data; GlobalInfo *g = (GlobalInfo *)w->data;
do { do
{
s[0]='\0'; s[0]='\0';
rv=fscanf(g->input, "%1023s%n", s, &n); rv=fscanf(g->input, "%1023s%n", s, &n);
s[n]='\0'; s[n]='\0';
if(n && s[0]) { if ( n && s[0] )
new_conn(s, g); /* if we read a URL, go get it! */ {
} new_conn(s,g); /* if we read a URL, go get it! */
else } else break;
break; } while ( rv != EOF );
} while(rv != EOF);
} }
/* Create a named pipe and tell libevent to monitor it */ /* Create a named pipe and tell libevent to monitor it */
@ -394,20 +382,24 @@ static int init_fifo (GlobalInfo *g)
curl_socket_t sockfd; curl_socket_t sockfd;
fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo); fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo);
if(lstat (fifo, &st) == 0) { if ( lstat (fifo, &st) == 0 )
if((st.st_mode & S_IFMT) == S_IFREG) { {
if ( (st.st_mode & S_IFMT) == S_IFREG )
{
errno = EEXIST; errno = EEXIST;
perror("lstat"); perror("lstat");
exit (1); exit (1);
} }
} }
unlink(fifo); unlink(fifo);
if(mkfifo (fifo, 0600) == -1) { if ( mkfifo (fifo, 0600) == -1 )
{
perror("mkfifo"); perror("mkfifo");
exit (1); exit (1);
} }
sockfd = open(fifo, O_RDWR | O_NONBLOCK, 0); sockfd = open(fifo, O_RDWR | O_NONBLOCK, 0);
if(sockfd == -1) { if ( sockfd == -1 )
{
perror("open"); perror("open");
exit (1); exit (1);
} }
@ -416,7 +408,7 @@ static int init_fifo (GlobalInfo *g)
fprintf(MSG_OUT, "Now, pipe some URL's into > %s\n", fifo); fprintf(MSG_OUT, "Now, pipe some URL's into > %s\n", fifo);
ev_io_init(&g->fifo_event, fifo_cb, sockfd, EV_READ); ev_io_init(&g->fifo_event, fifo_cb, sockfd, EV_READ);
ev_io_start(g->loop, &g->fifo_event); ev_io_start(g->loop, &g->fifo_event);
return (0); return(0);
} }
int main(int argc, char **argv) int main(int argc, char **argv)

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -19,10 +19,9 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
***************************************************************************/ ***************************************************************************/
/* <DESC> /*
* An example demonstrating how an application can pass in a custom * This is an example demonstrating how an application can pass in a custom
* socket to libcurl to use. This example also handles the connect itself. * socket to libcurl to use. This example also handles the connect itself.
* </DESC>
*/ */
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
@ -54,7 +53,7 @@
static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
{ {
size_t written = fwrite(ptr, size, nmemb, (FILE *)stream); int written = fwrite(ptr, size, nmemb, (FILE *)stream);
return written; return written;
} }
@ -92,7 +91,7 @@ int main(void)
WSADATA wsaData; WSADATA wsaData;
int initwsa; int initwsa;
if((initwsa = WSAStartup(MAKEWORD(2, 0), &wsaData)) != 0) { if((initwsa = WSAStartup(MAKEWORD(2,0), &wsaData)) != 0) {
printf("WSAStartup failed: %d\n", initwsa); printf("WSAStartup failed: %d\n", initwsa);
return 1; return 1;
} }
@ -107,7 +106,7 @@ int main(void)
curl_easy_setopt(curl, CURLOPT_URL, "http://99.99.99.99:9999"); curl_easy_setopt(curl, CURLOPT_URL, "http://99.99.99.99:9999");
/* Create the socket "manually" */ /* Create the socket "manually" */
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == CURL_SOCKET_BAD ) { if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) == CURL_SOCKET_BAD ) {
printf("Error creating listening socket.\n"); printf("Error creating listening socket.\n");
return 3; return 3;
} }
@ -116,10 +115,10 @@ int main(void)
servaddr.sin_family = AF_INET; servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORTNUM); servaddr.sin_port = htons(PORTNUM);
if(INADDR_NONE == (servaddr.sin_addr.s_addr = inet_addr(IPADDR))) if (INADDR_NONE == (servaddr.sin_addr.s_addr = inet_addr(IPADDR)))
return 2; return 2;
if(connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) == if(connect(sockfd,(struct sockaddr *) &servaddr, sizeof(servaddr)) ==
-1) { -1) {
close(sockfd); close(sockfd);
printf("client error: connect: %s\n", strerror(errno)); printf("client error: connect: %s\n", strerror(errno));

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -19,10 +19,6 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
***************************************************************************/ ***************************************************************************/
/* <DESC>
* Upload to a file:// URL
* </DESC>
*/
#include <stdio.h> #include <stdio.h>
#include <curl/curl.h> #include <curl/curl.h>
#include <sys/stat.h> #include <sys/stat.h>

View File

@ -42,10 +42,6 @@
* *
* This example requires libcurl 7.9.7 or later. * This example requires libcurl 7.9.7 or later.
*/ */
/* <DESC>
* implements an fopen() abstraction allowing reading from URLs
* </DESC>
*/
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
@ -80,7 +76,7 @@ struct fcurl_data
typedef struct fcurl_data URL_FILE; typedef struct fcurl_data URL_FILE;
/* exported functions */ /* exported functions */
URL_FILE *url_fopen(const char *url, const char *operation); URL_FILE *url_fopen(const char *url,const char *operation);
int url_fclose(URL_FILE *file); int url_fclose(URL_FILE *file);
int url_feof(URL_FILE *file); int url_feof(URL_FILE *file);
size_t url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file); size_t url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file);
@ -106,13 +102,13 @@ static size_t write_callback(char *buffer,
if(size > rembuff) { if(size > rembuff) {
/* not enough space in buffer */ /* not enough space in buffer */
newbuff=realloc(url->buffer, url->buffer_len + (size - rembuff)); newbuff=realloc(url->buffer,url->buffer_len + (size - rembuff));
if(newbuff==NULL) { if(newbuff==NULL) {
fprintf(stderr, "callback buffer grow failed\n"); fprintf(stderr,"callback buffer grow failed\n");
size=rembuff; size=rembuff;
} }
else { else {
/* realloc succeeded increase buffer size*/ /* realloc suceeded increase buffer size*/
url->buffer_len+=size - rembuff; url->buffer_len+=size - rembuff;
url->buffer=newbuff; url->buffer=newbuff;
} }
@ -135,7 +131,7 @@ static int fill_buffer(URL_FILE *file, size_t want)
CURLMcode mc; /* curl_multi_fdset() return code */ CURLMcode mc; /* curl_multi_fdset() return code */
/* only attempt to fill buffer if transactions still running and buffer /* only attempt to fill buffer if transactions still running and buffer
* doesn't exceed required size already * doesnt exceed required size already
*/ */
if((!file->still_running) || (file->buffer_pos > want)) if((!file->still_running) || (file->buffer_pos > want))
return 0; return 0;
@ -165,7 +161,8 @@ static int fill_buffer(URL_FILE *file, size_t want)
/* get file descriptors from the transfers */ /* get file descriptors from the transfers */
mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
if(mc != CURLM_OK) { if(mc != CURLM_OK)
{
fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc); fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
break; break;
} }
@ -208,12 +205,14 @@ static int fill_buffer(URL_FILE *file, size_t want)
} }
/* use to remove want bytes from the front of a files buffer */ /* use to remove want bytes from the front of a files buffer */
static int use_buffer(URL_FILE *file, size_t want) static int use_buffer(URL_FILE *file,int want)
{ {
/* sort out buffer */ /* sort out buffer */
if((file->buffer_pos - want) <=0) { if((file->buffer_pos - want) <=0) {
/* ditch buffer - write will recreate */ /* ditch buffer - write will recreate */
free(file->buffer); if(file->buffer)
free(file->buffer);
file->buffer=NULL; file->buffer=NULL;
file->buffer_pos=0; file->buffer_pos=0;
file->buffer_len=0; file->buffer_len=0;
@ -229,10 +228,10 @@ static int use_buffer(URL_FILE *file, size_t want)
return 0; return 0;
} }
URL_FILE *url_fopen(const char *url, const char *operation) URL_FILE *url_fopen(const char *url,const char *operation)
{ {
/* this code could check for URLs or types in the 'url' and /* this code could check for URLs or types in the 'url' and
basically use the real fopen() for standard files */ basicly use the real fopen() for standard files */
URL_FILE *file; URL_FILE *file;
(void)operation; (void)operation;
@ -243,7 +242,7 @@ URL_FILE *url_fopen(const char *url, const char *operation)
memset(file, 0, sizeof(URL_FILE)); memset(file, 0, sizeof(URL_FILE));
if((file->handle.file=fopen(url, operation))) if((file->handle.file=fopen(url,operation)))
file->type = CFTYPE_FILE; /* marked as URL */ file->type = CFTYPE_FILE; /* marked as URL */
else { else {
@ -303,7 +302,9 @@ int url_fclose(URL_FILE *file)
break; break;
} }
free(file->buffer);/* free any allocated buffer space */ if(file->buffer)
free(file->buffer);/* free any allocated buffer space */
free(file); free(file);
return ret; return ret;
@ -337,13 +338,13 @@ size_t url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file)
switch(file->type) { switch(file->type) {
case CFTYPE_FILE: case CFTYPE_FILE:
want=fread(ptr, size, nmemb, file->handle.file); want=fread(ptr,size,nmemb,file->handle.file);
break; break;
case CFTYPE_CURL: case CFTYPE_CURL:
want = nmemb * size; want = nmemb * size;
fill_buffer(file, want); fill_buffer(file,want);
/* check if theres data in the buffer - if not fill_buffer() /* check if theres data in the buffer - if not fill_buffer()
* either errored or EOF */ * either errored or EOF */
@ -357,7 +358,7 @@ size_t url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file)
/* xfer data to caller */ /* xfer data to caller */
memcpy(ptr, file->buffer, want); memcpy(ptr, file->buffer, want);
use_buffer(file, want); use_buffer(file,want);
want = want / size; /* number of items */ want = want / size; /* number of items */
break; break;
@ -378,11 +379,11 @@ char *url_fgets(char *ptr, size_t size, URL_FILE *file)
switch(file->type) { switch(file->type) {
case CFTYPE_FILE: case CFTYPE_FILE:
ptr = fgets(ptr, (int)size, file->handle.file); ptr = fgets(ptr,size,file->handle.file);
break; break;
case CFTYPE_CURL: case CFTYPE_CURL:
fill_buffer(file, want); fill_buffer(file,want);
/* check if theres data in the buffer - if not fill either errored or /* check if theres data in the buffer - if not fill either errored or
* EOF */ * EOF */
@ -406,7 +407,7 @@ char *url_fgets(char *ptr, size_t size, URL_FILE *file)
memcpy(ptr, file->buffer, want); memcpy(ptr, file->buffer, want);
ptr[want]=0;/* allways null terminate */ ptr[want]=0;/* allways null terminate */
use_buffer(file, want); use_buffer(file,want);
break; break;
@ -434,7 +435,9 @@ void url_rewind(URL_FILE *file)
curl_multi_add_handle(multi_handle, file->handle.curl); curl_multi_add_handle(multi_handle, file->handle.curl);
/* ditch buffer - write will recreate - resets stream pos*/ /* ditch buffer - write will recreate - resets stream pos*/
free(file->buffer); if(file->buffer)
free(file->buffer);
file->buffer=NULL; file->buffer=NULL;
file->buffer_pos=0; file->buffer_pos=0;
file->buffer_len=0; file->buffer_len=0;
@ -446,10 +449,6 @@ void url_rewind(URL_FILE *file)
} }
} }
#define FGETSFILE "fgets.test"
#define FREADFILE "fread.test"
#define REWINDFILE "rewind.test"
/* Small main program to retrive from a url using fgets and fread saving the /* Small main program to retrive from a url using fgets and fread saving the
* output to two test files (note the fgets method will corrupt binary files if * output to two test files (note the fgets method will corrupt binary files if
* they contain 0 chars */ * they contain 0 chars */
@ -458,7 +457,7 @@ int main(int argc, char *argv[])
URL_FILE *handle; URL_FILE *handle;
FILE *outf; FILE *outf;
size_t nread; int nread;
char buffer[256]; char buffer[256];
const char *url; const char *url;
@ -468,7 +467,7 @@ int main(int argc, char *argv[])
url=argv[1];/* use passed url */ url=argv[1];/* use passed url */
/* copy from url line by line with fgets */ /* copy from url line by line with fgets */
outf=fopen(FGETSFILE, "wb+"); outf=fopen("fgets.test","w+");
if(!outf) { if(!outf) {
perror("couldn't open fgets output file\n"); perror("couldn't open fgets output file\n");
return 1; return 1;
@ -482,8 +481,8 @@ int main(int argc, char *argv[])
} }
while(!url_feof(handle)) { while(!url_feof(handle)) {
url_fgets(buffer, sizeof(buffer), handle); url_fgets(buffer,sizeof(buffer),handle);
fwrite(buffer, 1, strlen(buffer), outf); fwrite(buffer,1,strlen(buffer),outf);
} }
url_fclose(handle); url_fclose(handle);
@ -492,7 +491,7 @@ int main(int argc, char *argv[])
/* Copy from url with fread */ /* Copy from url with fread */
outf=fopen(FREADFILE, "wb+"); outf=fopen("fread.test","w+");
if(!outf) { if(!outf) {
perror("couldn't open fread output file\n"); perror("couldn't open fread output file\n");
return 1; return 1;
@ -506,8 +505,8 @@ int main(int argc, char *argv[])
} }
do { do {
nread = url_fread(buffer, 1, sizeof(buffer), handle); nread = url_fread(buffer, 1,sizeof(buffer), handle);
fwrite(buffer, 1, nread, outf); fwrite(buffer,1,nread,outf);
} while(nread); } while(nread);
url_fclose(handle); url_fclose(handle);
@ -516,7 +515,7 @@ int main(int argc, char *argv[])
/* Test rewind */ /* Test rewind */
outf=fopen(REWINDFILE, "wb+"); outf=fopen("rewind.test","w+");
if(!outf) { if(!outf) {
perror("couldn't open fread output file\n"); perror("couldn't open fread output file\n");
return 1; return 1;
@ -529,19 +528,21 @@ int main(int argc, char *argv[])
return 2; return 2;
} }
nread = url_fread(buffer, 1, sizeof(buffer), handle); nread = url_fread(buffer, 1,sizeof(buffer), handle);
fwrite(buffer, 1, nread, outf); fwrite(buffer,1,nread,outf);
url_rewind(handle); url_rewind(handle);
buffer[0]='\n'; buffer[0]='\n';
fwrite(buffer, 1, 1, outf); fwrite(buffer,1,1,outf);
nread = url_fread(buffer, 1,sizeof(buffer), handle);
fwrite(buffer,1,nread,outf);
nread = url_fread(buffer, 1, sizeof(buffer), handle);
fwrite(buffer, 1, nread, outf);
url_fclose(handle); url_fclose(handle);
fclose(outf); fclose(outf);
return 0;/* all done */ return 0;/* all done */
} }

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -19,10 +19,6 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
***************************************************************************/ ***************************************************************************/
/* <DESC>
* FTP wildcard pattern matching
* </DESC>
*/
#include <curl/curl.h> #include <curl/curl.h>
#include <stdio.h> #include <stdio.h>
@ -119,7 +115,7 @@ static long file_is_coming(struct curl_fileinfo *finfo,
return CURL_CHUNK_BGN_FUNC_SKIP; return CURL_CHUNK_BGN_FUNC_SKIP;
} }
data->output = fopen(finfo->filename, "wb"); data->output = fopen(finfo->filename, "w");
if(!data->output) { if(!data->output) {
return CURL_CHUNK_BGN_FUNC_FAIL; return CURL_CHUNK_BGN_FUNC_FAIL;
} }

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -23,9 +23,11 @@
#include <curl/curl.h> #include <curl/curl.h>
/* <DESC> /*
* Get a single file from an FTP server. * This is an example showing how to get a single file from an FTP server.
* </DESC> * It delays the actual destination file creation until the first write
* callback so that it won't create an empty file in case the remote file
* doesn't exist or something else fails.
*/ */
struct FtpFile { struct FtpFile {
@ -51,7 +53,7 @@ int main(void)
CURL *curl; CURL *curl;
CURLcode res; CURLcode res;
struct FtpFile ftpfile={ struct FtpFile ftpfile={
"curl.tar.gz", /* name to store the file as if successful */ "curl.tar.gz", /* name to store the file as if succesful */
NULL NULL
}; };
@ -63,7 +65,7 @@ int main(void)
* You better replace the URL with one that works! * You better replace the URL with one that works!
*/ */
curl_easy_setopt(curl, CURLOPT_URL, curl_easy_setopt(curl, CURLOPT_URL,
"ftp://ftp.example.com/curl/curl-7.9.2.tar.gz"); "ftp://ftp.example.com/pub/www/utilities/curl/curl-7.9.2.tar.gz");
/* Define our callback to get called when there's data to be written */ /* Define our callback to get called when there's data to be written */
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
/* Set a pointer to our struct to pass to the callback */ /* Set a pointer to our struct to pass to the callback */

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -24,9 +24,9 @@
#include <curl/curl.h> #include <curl/curl.h>
/* <DESC> /*
* Checks a single file's size and mtime from an FTP server. * This is an example showing how to check a single file's size and mtime
* </DESC> * from an FTP server.
*/ */
static size_t throw_away(void *ptr, size_t size, size_t nmemb, void *data) static size_t throw_away(void *ptr, size_t size, size_t nmemb, void *data)
@ -65,18 +65,16 @@ int main(void)
res = curl_easy_perform(curl); res = curl_easy_perform(curl);
if(CURLE_OK == res) { if(CURLE_OK == res) {
/* https://curl.haxx.se/libcurl/c/curl_easy_getinfo.html */ /* http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html */
res = curl_easy_getinfo(curl, CURLINFO_FILETIME, &filetime); res = curl_easy_getinfo(curl, CURLINFO_FILETIME, &filetime);
if((CURLE_OK == res) && (filetime >= 0)) { if((CURLE_OK == res) && (filetime >= 0)) {
time_t file_time = (time_t)filetime; time_t file_time = (time_t)filetime;
printf("filetime %s: %s", filename, ctime(&file_time)); printf("filetime %s: %s", filename, ctime(&file_time));
} }
res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &filesize);
&filesize);
if((CURLE_OK == res) && (filesize>0.0)) if((CURLE_OK == res) && (filesize>0.0))
printf("filesize %s: %0.0f bytes\n", filename, filesize); printf("filesize %s: %0.0f bytes\n", filename, filesize);
} } else {
else {
/* we failed */ /* we failed */
fprintf(stderr, "curl told us %d\n", res); fprintf(stderr, "curl told us %d\n", res);
} }

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -23,11 +23,13 @@
#include <curl/curl.h> #include <curl/curl.h>
/* <DESC> /*
* Similar to ftpget.c but also stores the received response-lines * Similar to ftpget.c but this also stores the received response-lines
* in a separate file using our own callback! * in a separate file using our own callback!
* </DESC> *
* This functionality was introduced in libcurl 7.9.3.
*/ */
static size_t static size_t
write_response(void *ptr, size_t size, size_t nmemb, void *data) write_response(void *ptr, size_t size, size_t nmemb, void *data)
{ {
@ -35,9 +37,6 @@ write_response(void *ptr, size_t size, size_t nmemb, void *data)
return fwrite(ptr, size, nmemb, writehere); return fwrite(ptr, size, nmemb, writehere);
} }
#define FTPBODY "ftp-list"
#define FTPHEADERS "ftp-responses"
int main(void) int main(void)
{ {
CURL *curl; CURL *curl;
@ -46,10 +45,10 @@ int main(void)
FILE *respfile; FILE *respfile;
/* local file name to store the file as */ /* local file name to store the file as */
ftpfile = fopen(FTPBODY, "wb"); /* b is binary, needed on win32 */ ftpfile = fopen("ftp-list", "wb"); /* b is binary, needed on win32 */
/* local file name to store the FTP server's response lines in */ /* local file name to store the FTP server's response lines in */
respfile = fopen(FTPHEADERS, "wb"); /* b is binary, needed on win32 */ respfile = fopen("ftp-responses", "wb"); /* b is binary, needed on win32 */
curl = curl_easy_init(); curl = curl_easy_init();
if(curl) { if(curl) {

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -24,9 +24,11 @@
#include <curl/curl.h> #include <curl/curl.h>
/* <DESC> /*
* Get a single file from an FTPS server. * This is an example showing how to get a single file from an FTPS server.
* </DESC> * It delays the actual destination file creation until the first write
* callback so that it won't create an empty file in case the remote file
* doesn't exist or something else fails.
*/ */
struct FtpFile { struct FtpFile {
@ -53,7 +55,7 @@ int main(void)
CURL *curl; CURL *curl;
CURLcode res; CURLcode res;
struct FtpFile ftpfile={ struct FtpFile ftpfile={
"yourfile.bin", /* name to store the file as if successful */ "yourfile.bin", /* name to store the file as if succesful */
NULL NULL
}; };

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -33,10 +33,11 @@
#include <unistd.h> #include <unistd.h>
#endif #endif
/* <DESC> /*
* Performs an FTP upload and renames the file just after a successful * This example shows an FTP upload, with a rename of the file just after
* transfer. * a successful upload.
* </DESC> *
* Example based on source code provided by Erick Nuwendam. Thanks!
*/ */
#define LOCAL_FILE "/tmp/uploadthis.txt" #define LOCAL_FILE "/tmp/uploadthis.txt"
@ -104,7 +105,7 @@ int main(void)
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
/* specify target */ /* specify target */
curl_easy_setopt(curl, CURLOPT_URL, REMOTE_URL); curl_easy_setopt(curl,CURLOPT_URL, REMOTE_URL);
/* pass in that last of FTP commands to run after the transfer */ /* pass in that last of FTP commands to run after the transfer */
curl_easy_setopt(curl, CURLOPT_POSTQUOTE, headerlist); curl_easy_setopt(curl, CURLOPT_POSTQUOTE, headerlist);

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -19,9 +19,13 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
***************************************************************************/ ***************************************************************************/
/* <DESC> /* Upload to FTP, resuming failed transfers
* Upload to FTP, resuming failed transfers. *
* </DESC> * Compile for MinGW like this:
* gcc -Wall -pedantic -std=c99 ftpuploadwithresume.c -o ftpuploadresume.exe
* -lcurl -lmsvcr70
*
* Written by Philip Bock
*/ */
#include <stdlib.h> #include <stdlib.h>
@ -36,8 +40,7 @@
/* The MinGW headers are missing a few Win32 function definitions, /* The MinGW headers are missing a few Win32 function definitions,
you shouldn't need this if you use VC++ */ you shouldn't need this if you use VC++ */
#if defined(__MINGW32__) && !defined(__MINGW64__) #if defined(__MINGW32__) && !defined(__MINGW64__)
int __cdecl _snscanf(const char * input, size_t length, int __cdecl _snscanf(const char * input, size_t length, const char * format, ...);
const char * format, ...);
#endif #endif
@ -50,7 +53,7 @@ size_t getcontentlengthfunc(void *ptr, size_t size, size_t nmemb, void *stream)
/* _snscanf() is Win32 specific */ /* _snscanf() is Win32 specific */
r = _snscanf(ptr, size * nmemb, "Content-Length: %ld\n", &len); r = _snscanf(ptr, size * nmemb, "Content-Length: %ld\n", &len);
if(r) /* Microsoft: we don't read the specs */ if (r) /* Microsoft: we don't read the specs */
*((long *) stream) = len; *((long *) stream) = len;
return size * nmemb; return size * nmemb;
@ -68,7 +71,7 @@ size_t readfunc(void *ptr, size_t size, size_t nmemb, void *stream)
FILE *f = stream; FILE *f = stream;
size_t n; size_t n;
if(ferror(f)) if (ferror(f))
return CURL_READFUNC_ABORT; return CURL_READFUNC_ABORT;
n = fread(ptr, size, nmemb, f) * size; n = fread(ptr, size, nmemb, f) * size;
@ -86,7 +89,7 @@ int upload(CURL *curlhandle, const char * remotepath, const char * localpath,
int c; int c;
f = fopen(localpath, "rb"); f = fopen(localpath, "rb");
if(!f) { if (f == NULL) {
perror(NULL); perror(NULL);
return 0; return 0;
} }
@ -95,7 +98,7 @@ int upload(CURL *curlhandle, const char * remotepath, const char * localpath,
curl_easy_setopt(curlhandle, CURLOPT_URL, remotepath); curl_easy_setopt(curlhandle, CURLOPT_URL, remotepath);
if(timeout) if (timeout)
curl_easy_setopt(curlhandle, CURLOPT_FTP_RESPONSE_TIMEOUT, timeout); curl_easy_setopt(curlhandle, CURLOPT_FTP_RESPONSE_TIMEOUT, timeout);
curl_easy_setopt(curlhandle, CURLOPT_HEADERFUNCTION, getcontentlengthfunc); curl_easy_setopt(curlhandle, CURLOPT_HEADERFUNCTION, getcontentlengthfunc);
@ -106,15 +109,14 @@ int upload(CURL *curlhandle, const char * remotepath, const char * localpath,
curl_easy_setopt(curlhandle, CURLOPT_READFUNCTION, readfunc); curl_easy_setopt(curlhandle, CURLOPT_READFUNCTION, readfunc);
curl_easy_setopt(curlhandle, CURLOPT_READDATA, f); curl_easy_setopt(curlhandle, CURLOPT_READDATA, f);
/* disable passive mode */ curl_easy_setopt(curlhandle, CURLOPT_FTPPORT, "-"); /* disable passive mode */
curl_easy_setopt(curlhandle, CURLOPT_FTPPORT, "-");
curl_easy_setopt(curlhandle, CURLOPT_FTP_CREATE_MISSING_DIRS, 1L); curl_easy_setopt(curlhandle, CURLOPT_FTP_CREATE_MISSING_DIRS, 1L);
curl_easy_setopt(curlhandle, CURLOPT_VERBOSE, 1L); curl_easy_setopt(curlhandle, CURLOPT_VERBOSE, 1L);
for(c = 0; (r != CURLE_OK) && (c < tries); c++) { for (c = 0; (r != CURLE_OK) && (c < tries); c++) {
/* are we resuming? */ /* are we resuming? */
if(c) { /* yes */ if (c) { /* yes */
/* determine the length of the file already written */ /* determine the length of the file already written */
/* /*
@ -129,7 +131,7 @@ int upload(CURL *curlhandle, const char * remotepath, const char * localpath,
curl_easy_setopt(curlhandle, CURLOPT_HEADER, 1L); curl_easy_setopt(curlhandle, CURLOPT_HEADER, 1L);
r = curl_easy_perform(curlhandle); r = curl_easy_perform(curlhandle);
if(r != CURLE_OK) if (r != CURLE_OK)
continue; continue;
curl_easy_setopt(curlhandle, CURLOPT_NOBODY, 0L); curl_easy_setopt(curlhandle, CURLOPT_NOBODY, 0L);
@ -148,7 +150,7 @@ int upload(CURL *curlhandle, const char * remotepath, const char * localpath,
fclose(f); fclose(f);
if(r == CURLE_OK) if (r == CURLE_OK)
return 1; return 1;
else { else {
fprintf(stderr, "%s\n", curl_easy_strerror(r)); fprintf(stderr, "%s\n", curl_easy_strerror(r));
@ -163,8 +165,7 @@ int main(int c, char **argv)
curl_global_init(CURL_GLOBAL_ALL); curl_global_init(CURL_GLOBAL_ALL);
curlhandle = curl_easy_init(); curlhandle = curl_easy_init();
upload(curlhandle, "ftp://user:pass@example.com/path/file", "C:\\file", upload(curlhandle, "ftp://user:pass@example.com/path/file", "C:\\file", 0, 3);
0, 3);
curl_easy_cleanup(curlhandle); curl_easy_cleanup(curlhandle);
curl_global_cleanup(); curl_global_cleanup();

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -19,10 +19,6 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
***************************************************************************/ ***************************************************************************/
/* <DESC>
* Use getinfo to get content-type after completed transfer.
* </DESC>
*/
#include <stdio.h> #include <stdio.h>
#include <curl/curl.h> #include <curl/curl.h>
@ -31,14 +27,18 @@ int main(void)
CURL *curl; CURL *curl;
CURLcode res; CURLcode res;
/* http://curl.haxx.se/libcurl/c/curl_easy_init.html */
curl = curl_easy_init(); curl = curl_easy_init();
if(curl) { if(curl) {
/* http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTURL */
curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/"); curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/");
/* http://curl.haxx.se/libcurl/c/curl_easy_perform.html */
res = curl_easy_perform(curl); res = curl_easy_perform(curl);
if(CURLE_OK == res) { if(CURLE_OK == res) {
char *ct; char *ct;
/* ask for the content-type */ /* ask for the content-type */
/* http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html */
res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct); res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct);
if((CURLE_OK == res) && ct) if((CURLE_OK == res) && ct)
@ -46,6 +46,7 @@ int main(void)
} }
/* always cleanup */ /* always cleanup */
/* http://curl.haxx.se/libcurl/c/curl_easy_cleanup.html */
curl_easy_cleanup(curl); curl_easy_cleanup(curl);
} }
return 0; return 0;

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -19,10 +19,8 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
***************************************************************************/ ***************************************************************************/
/* <DESC> /* Example source code to show how the callback function can be used to
* Shows how the write callback function can be used to download data into a * download data into a chunk of memory instead of storing it in a file.
* chunk of memory instead of storing it in a file.
* </DESC>
*/ */
#include <stdio.h> #include <stdio.h>
@ -36,6 +34,7 @@ struct MemoryStruct {
size_t size; size_t size;
}; };
static size_t static size_t
WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
{ {
@ -56,6 +55,7 @@ WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
return realsize; return realsize;
} }
int main(void) int main(void)
{ {
CURL *curl_handle; CURL *curl_handle;
@ -106,7 +106,8 @@ int main(void)
/* cleanup curl stuff */ /* cleanup curl stuff */
curl_easy_cleanup(curl_handle); curl_easy_cleanup(curl_handle);
free(chunk.memory); if(chunk.memory)
free(chunk.memory);
/* we're done with libcurl, so clean it up */ /* we're done with libcurl, so clean it up */
curl_global_cleanup(); curl_global_cleanup();

View File

@ -1,70 +0,0 @@
/***************************************************************************
* _ _ ____ _
* 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.
*
***************************************************************************/
/* <DESC>
* Show how to extract Location: header and URL to redirect to.
* </DESC>
*/
#include <stdio.h>
#include <curl/curl.h>
int main(void)
{
CURL *curl;
CURLcode res;
char *location;
long response_code;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
/* example.com is redirected, figure out the redirection! */
/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);
/* Check for errors */
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
else {
res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
if((res == CURLE_OK) &&
((response_code / 100) != 3)) {
/* a redirect implies a 3xx response code */
fprintf(stderr, "Not a redirect.\n");
}
else {
res = curl_easy_getinfo(curl, CURLINFO_REDIRECT_URL, &location);
if((res == CURLE_OK) && location) {
/* This is the new absolute URL that you could redirect to, even if
* the Location: response header may have been a relative URL. */
printf("Redirected to: %s\n", location);
}
}
}
/* always cleanup */
curl_easy_cleanup(curl);
}
return 0;
}

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -19,41 +19,38 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
***************************************************************************/ ***************************************************************************/
/* <DESC>
* multi socket API usage together with with glib2
* </DESC>
*/
/* Example application source code using the multi socket interface to /* Example application source code using the multi socket interface to
* download many files at once. * download many files at once.
* *
* Written by Jeff Pohlmeyer * Written by Jeff Pohlmeyer
Requires glib-2.x and a (POSIX?) system that has mkfifo(). Requires glib-2.x and a (POSIX?) system that has mkfifo().
This is an adaptation of libcurl's "hipev.c" and libevent's "event-test.c" This is an adaptation of libcurl's "hipev.c" and libevent's "event-test.c"
sample programs, adapted to use glib's g_io_channel in place of libevent. sample programs, adapted to use glib's g_io_channel in place of libevent.
When running, the program creates the named pipe "hiper.fifo" When running, the program creates the named pipe "hiper.fifo"
Whenever there is input into the fifo, the program reads the input as a list Whenever there is input into the fifo, the program reads the input as a list
of URL's and creates some new easy handles to fetch each URL via the of URL's and creates some new easy handles to fetch each URL via the
curl_multi "hiper" API. curl_multi "hiper" API.
Thus, you can try a single URL: Thus, you can try a single URL:
% echo http://www.yahoo.com > hiper.fifo % echo http://www.yahoo.com > hiper.fifo
Or a whole bunch of them: Or a whole bunch of them:
% cat my-url-list > hiper.fifo % cat my-url-list > hiper.fifo
The fifo buffer is handled almost instantly, so you can even add more URL's The fifo buffer is handled almost instantly, so you can even add more URL's
while the previous requests are still being downloaded. while the previous requests are still being downloaded.
This is purely a demo app, all retrieved data is simply discarded by the write This is purely a demo app, all retrieved data is simply discarded by the write
callback. callback.
*/ */
#include <glib.h> #include <glib.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
@ -63,10 +60,13 @@
#include <errno.h> #include <errno.h>
#include <curl/curl.h> #include <curl/curl.h>
#define MSG_OUT g_print /* Change to "g_error" to write to stderr */ #define MSG_OUT g_print /* Change to "g_error" to write to stderr */
#define SHOW_VERBOSE 0 /* Set to non-zero for libcurl messages */ #define SHOW_VERBOSE 0 /* Set to non-zero for libcurl messages */
#define SHOW_PROGRESS 0 /* Set to non-zero to enable progress callback */ #define SHOW_PROGRESS 0 /* Set to non-zero to enable progress callback */
/* Global information, common to all connections */ /* Global information, common to all connections */
typedef struct _GlobalInfo { typedef struct _GlobalInfo {
CURLM *multi; CURLM *multi;
@ -74,6 +74,8 @@ typedef struct _GlobalInfo {
int still_running; int still_running;
} GlobalInfo; } GlobalInfo;
/* Information associated with a specific easy handle */ /* Information associated with a specific easy handle */
typedef struct _ConnInfo { typedef struct _ConnInfo {
CURL *easy; CURL *easy;
@ -82,6 +84,7 @@ typedef struct _ConnInfo {
char error[CURL_ERROR_SIZE]; char error[CURL_ERROR_SIZE];
} ConnInfo; } ConnInfo;
/* Information associated with a specific socket */ /* Information associated with a specific socket */
typedef struct _SockInfo { typedef struct _SockInfo {
curl_socket_t sockfd; curl_socket_t sockfd;
@ -93,25 +96,30 @@ typedef struct _SockInfo {
GlobalInfo *global; GlobalInfo *global;
} SockInfo; } SockInfo;
/* Die if we get a bad CURLMcode somewhere */ /* Die if we get a bad CURLMcode somewhere */
static void mcode_or_die(const char *where, CURLMcode code) { static void mcode_or_die(const char *where, CURLMcode code) {
if(CURLM_OK != code) { if ( CURLM_OK != code ) {
const char *s; const char *s;
switch (code) { switch (code) {
case CURLM_BAD_HANDLE: s="CURLM_BAD_HANDLE"; break; case CURLM_BAD_HANDLE: s="CURLM_BAD_HANDLE"; break;
case CURLM_BAD_EASY_HANDLE: s="CURLM_BAD_EASY_HANDLE"; break; case CURLM_BAD_EASY_HANDLE: s="CURLM_BAD_EASY_HANDLE"; break;
case CURLM_OUT_OF_MEMORY: s="CURLM_OUT_OF_MEMORY"; break; case CURLM_OUT_OF_MEMORY: s="CURLM_OUT_OF_MEMORY"; break;
case CURLM_INTERNAL_ERROR: s="CURLM_INTERNAL_ERROR"; break; case CURLM_INTERNAL_ERROR: s="CURLM_INTERNAL_ERROR"; break;
case CURLM_BAD_SOCKET: s="CURLM_BAD_SOCKET"; break; case CURLM_BAD_SOCKET: s="CURLM_BAD_SOCKET"; break;
case CURLM_UNKNOWN_OPTION: s="CURLM_UNKNOWN_OPTION"; break; case CURLM_UNKNOWN_OPTION: s="CURLM_UNKNOWN_OPTION"; break;
case CURLM_LAST: s="CURLM_LAST"; break; case CURLM_LAST: s="CURLM_LAST"; break;
default: s="CURLM_unknown"; default: s="CURLM_unknown";
} }
MSG_OUT("ERROR: %s returns %s\n", where, s); MSG_OUT("ERROR: %s returns %s\n", where, s);
exit(code); exit(code);
} }
} }
/* Check for completed transfers, and remove their easy handles */ /* Check for completed transfers, and remove their easy handles */
static void check_multi_info(GlobalInfo *g) static void check_multi_info(GlobalInfo *g)
{ {
@ -123,8 +131,8 @@ static void check_multi_info(GlobalInfo *g)
CURLcode res; CURLcode res;
MSG_OUT("REMAINING: %d\n", g->still_running); MSG_OUT("REMAINING: %d\n", g->still_running);
while((msg = curl_multi_info_read(g->multi, &msgs_left))) { while ((msg = curl_multi_info_read(g->multi, &msgs_left))) {
if(msg->msg == CURLMSG_DONE) { if (msg->msg == CURLMSG_DONE) {
easy = msg->easy_handle; easy = msg->easy_handle;
res = msg->data.result; res = msg->data.result;
curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn); curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
@ -138,6 +146,8 @@ static void check_multi_info(GlobalInfo *g)
} }
} }
/* Called by glib when our timeout expires */ /* Called by glib when our timeout expires */
static gboolean timer_cb(gpointer data) static gboolean timer_cb(gpointer data)
{ {
@ -145,12 +155,14 @@ static gboolean timer_cb(gpointer data)
CURLMcode rc; CURLMcode rc;
rc = curl_multi_socket_action(g->multi, rc = curl_multi_socket_action(g->multi,
CURL_SOCKET_TIMEOUT, 0, &g->still_running); CURL_SOCKET_TIMEOUT, 0, &g->still_running);
mcode_or_die("timer_cb: curl_multi_socket_action", rc); mcode_or_die("timer_cb: curl_multi_socket_action", rc);
check_multi_info(g); check_multi_info(g);
return FALSE; return FALSE;
} }
/* Update the event timer after curl_multi library calls */ /* Update the event timer after curl_multi library calls */
static int update_timeout_cb(CURLM *multi, long timeout_ms, void *userp) static int update_timeout_cb(CURLM *multi, long timeout_ms, void *userp)
{ {
@ -160,12 +172,15 @@ static int update_timeout_cb(CURLM *multi, long timeout_ms, void *userp)
timeout.tv_usec = (timeout_ms%1000)*1000; timeout.tv_usec = (timeout_ms%1000)*1000;
MSG_OUT("*** update_timeout_cb %ld => %ld:%ld ***\n", MSG_OUT("*** update_timeout_cb %ld => %ld:%ld ***\n",
timeout_ms, timeout.tv_sec, timeout.tv_usec); timeout_ms, timeout.tv_sec, timeout.tv_usec);
g->timer_event = g_timeout_add(timeout_ms, timer_cb, g); g->timer_event = g_timeout_add(timeout_ms, timer_cb, g);
return 0; return 0;
} }
/* Called by glib when we get action on a multi socket */ /* Called by glib when we get action on a multi socket */
static gboolean event_cb(GIOChannel *ch, GIOCondition condition, gpointer data) static gboolean event_cb(GIOChannel *ch, GIOCondition condition, gpointer data)
{ {
@ -183,43 +198,41 @@ static gboolean event_cb(GIOChannel *ch, GIOCondition condition, gpointer data)
check_multi_info(g); check_multi_info(g);
if(g->still_running) { if(g->still_running) {
return TRUE; return TRUE;
} } else {
else {
MSG_OUT("last transfer done, kill timeout\n"); MSG_OUT("last transfer done, kill timeout\n");
if(g->timer_event) { if (g->timer_event) { g_source_remove(g->timer_event); }
g_source_remove(g->timer_event);
}
return FALSE; return FALSE;
} }
} }
/* Clean up the SockInfo structure */ /* Clean up the SockInfo structure */
static void remsock(SockInfo *f) static void remsock(SockInfo *f)
{ {
if(!f) { if (!f) { return; }
return; if (f->ev) { g_source_remove(f->ev); }
}
if(f->ev) {
g_source_remove(f->ev);
}
g_free(f); g_free(f);
} }
/* Assign information to a SockInfo structure */ /* Assign information to a SockInfo structure */
static void setsock(SockInfo*f, curl_socket_t s, CURL*e, int act, GlobalInfo*g) static void setsock(SockInfo*f, curl_socket_t s, CURL*e, int act, GlobalInfo*g)
{ {
GIOCondition kind = GIOCondition kind =
(act&CURL_POLL_IN?G_IO_IN:0)|(act&CURL_POLL_OUT?G_IO_OUT:0); (act&CURL_POLL_IN?G_IO_IN:0)|(act&CURL_POLL_OUT?G_IO_OUT:0);
f->sockfd = s; f->sockfd = s;
f->action = act; f->action = act;
f->easy = e; f->easy = e;
if(f->ev) { if (f->ev) { g_source_remove(f->ev); }
g_source_remove(f->ev); f->ev=g_io_add_watch(f->ch, kind, event_cb,g);
}
f->ev=g_io_add_watch(f->ch, kind, event_cb, g);
} }
/* Initialize a new SockInfo structure */ /* Initialize a new SockInfo structure */
static void addsock(curl_socket_t s, CURL *easy, int action, GlobalInfo *g) static void addsock(curl_socket_t s, CURL *easy, int action, GlobalInfo *g)
{ {
@ -231,6 +244,8 @@ static void addsock(curl_socket_t s, CURL *easy, int action, GlobalInfo *g)
curl_multi_assign(g->multi, s, fdp); curl_multi_assign(g->multi, s, fdp);
} }
/* CURLMOPT_SOCKETFUNCTION */ /* CURLMOPT_SOCKETFUNCTION */
static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp) static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
{ {
@ -239,15 +254,14 @@ static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
static const char *whatstr[]={ "none", "IN", "OUT", "INOUT", "REMOVE" }; static const char *whatstr[]={ "none", "IN", "OUT", "INOUT", "REMOVE" };
MSG_OUT("socket callback: s=%d e=%p what=%s ", s, e, whatstr[what]); MSG_OUT("socket callback: s=%d e=%p what=%s ", s, e, whatstr[what]);
if(what == CURL_POLL_REMOVE) { if (what == CURL_POLL_REMOVE) {
MSG_OUT("\n"); MSG_OUT("\n");
remsock(fdp); remsock(fdp);
} } else {
else { if (!fdp) {
if(!fdp) {
MSG_OUT("Adding data: %s%s\n", MSG_OUT("Adding data: %s%s\n",
what&CURL_POLL_IN?"READ":"", what&CURL_POLL_IN?"READ":"",
what&CURL_POLL_OUT?"WRITE":"" ); what&CURL_POLL_OUT?"WRITE":"" );
addsock(s, e, what, g); addsock(s, e, what, g);
} }
else { else {
@ -259,6 +273,8 @@ static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
return 0; return 0;
} }
/* CURLOPT_WRITEFUNCTION */ /* CURLOPT_WRITEFUNCTION */
static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *data) static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *data)
{ {
@ -269,15 +285,18 @@ static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *data)
return realsize; return realsize;
} }
/* CURLOPT_PROGRESSFUNCTION */ /* CURLOPT_PROGRESSFUNCTION */
static int prog_cb (void *p, double dltotal, double dlnow, double ult, static int prog_cb (void *p, double dltotal, double dlnow, double ult, double uln)
double uln)
{ {
ConnInfo *conn = (ConnInfo *)p; ConnInfo *conn = (ConnInfo *)p;
MSG_OUT("Progress: %s (%g/%g)\n", conn->url, dlnow, dltotal); MSG_OUT("Progress: %s (%g/%g)\n", conn->url, dlnow, dltotal);
return 0; return 0;
} }
/* Create a new easy handle, and add it to the global curl_multi */ /* Create a new easy handle, and add it to the global curl_multi */
static void new_conn(char *url, GlobalInfo *g ) static void new_conn(char *url, GlobalInfo *g )
{ {
@ -285,9 +304,11 @@ static void new_conn(char *url, GlobalInfo *g )
CURLMcode rc; CURLMcode rc;
conn = g_malloc0(sizeof(ConnInfo)); conn = g_malloc0(sizeof(ConnInfo));
conn->error[0]='\0'; conn->error[0]='\0';
conn->easy = curl_easy_init(); conn->easy = curl_easy_init();
if(!conn->easy) { if (!conn->easy) {
MSG_OUT("curl_easy_init() failed, exiting!\n"); MSG_OUT("curl_easy_init() failed, exiting!\n");
exit(2); exit(2);
} }
@ -315,90 +336,93 @@ static void new_conn(char *url, GlobalInfo *g )
that the necessary socket_action() call will be called by this app */ that the necessary socket_action() call will be called by this app */
} }
/* This gets called by glib whenever data is received from the fifo */ /* This gets called by glib whenever data is received from the fifo */
static gboolean fifo_cb (GIOChannel *ch, GIOCondition condition, gpointer data) static gboolean fifo_cb (GIOChannel *ch, GIOCondition condition, gpointer data)
{ {
#define BUF_SIZE 1024 #define BUF_SIZE 1024
gsize len, tp; gsize len, tp;
gchar *buf, *tmp, *all=NULL; gchar *buf, *tmp, *all=NULL;
GIOStatus rv; GIOStatus rv;
do { do {
GError *err=NULL; GError *err=NULL;
rv = g_io_channel_read_line(ch, &buf, &len, &tp, &err); rv = g_io_channel_read_line (ch,&buf,&len,&tp,&err);
if(buf) { if ( buf ) {
if(tp) { if (tp) { buf[tp]='\0'; }
buf[tp]='\0'; new_conn(buf,(GlobalInfo*)data);
}
new_conn(buf, (GlobalInfo*)data);
g_free(buf); g_free(buf);
} } else {
else {
buf = g_malloc(BUF_SIZE+1); buf = g_malloc(BUF_SIZE+1);
while(TRUE) { while (TRUE) {
buf[BUF_SIZE]='\0'; buf[BUF_SIZE]='\0';
g_io_channel_read_chars(ch, buf, BUF_SIZE, &len, &err); g_io_channel_read_chars(ch,buf,BUF_SIZE,&len,&err);
if(len) { if (len) {
buf[len]='\0'; buf[len]='\0';
if(all) { if (all) {
tmp=all; tmp=all;
all=g_strdup_printf("%s%s", tmp, buf); all=g_strdup_printf("%s%s", tmp, buf);
g_free(tmp); g_free(tmp);
} } else {
else {
all = g_strdup(buf); all = g_strdup(buf);
} }
} } else {
else { break;
break;
} }
} }
if(all) { if (all) {
new_conn(all, (GlobalInfo*)data); new_conn(all,(GlobalInfo*)data);
g_free(all); g_free(all);
} }
g_free(buf); g_free(buf);
} }
if(err) { if ( err ) {
g_error("fifo_cb: %s", err->message); g_error("fifo_cb: %s", err->message);
g_free(err); g_free(err);
break; break;
} }
} while((len) && (rv == G_IO_STATUS_NORMAL)); } while ( (len) && (rv == G_IO_STATUS_NORMAL) );
return TRUE; return TRUE;
} }
int init_fifo(void) int init_fifo(void)
{ {
struct stat st; struct stat st;
const char *fifo = "hiper.fifo"; const char *fifo = "hiper.fifo";
int socket; int socket;
if(lstat (fifo, &st) == 0) { if (lstat (fifo, &st) == 0) {
if((st.st_mode & S_IFMT) == S_IFREG) { if ((st.st_mode & S_IFMT) == S_IFREG) {
errno = EEXIST; errno = EEXIST;
perror("lstat"); perror("lstat");
exit (1); exit (1);
}
} }
}
unlink (fifo); unlink (fifo);
if(mkfifo (fifo, 0600) == -1) { if (mkfifo (fifo, 0600) == -1) {
perror("mkfifo"); perror("mkfifo");
exit (1); exit (1);
} }
socket = open (fifo, O_RDWR | O_NONBLOCK, 0); socket = open (fifo, O_RDWR | O_NONBLOCK, 0);
if(socket == -1) { if (socket == -1) {
perror("open"); perror("open");
exit (1); exit (1);
} }
MSG_OUT("Now, pipe some URL's into > %s\n", fifo); MSG_OUT("Now, pipe some URL's into > %s\n", fifo);
return socket;
return socket;
} }
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
GlobalInfo *g; GlobalInfo *g;
@ -410,8 +434,8 @@ int main(int argc, char **argv)
fd=init_fifo(); fd=init_fifo();
ch=g_io_channel_unix_new(fd); ch=g_io_channel_unix_new(fd);
g_io_add_watch(ch, G_IO_IN, fifo_cb, g); g_io_add_watch(ch,G_IO_IN,fifo_cb,g);
gmain=g_main_loop_new(NULL, FALSE); gmain=g_main_loop_new(NULL,FALSE);
g->multi = curl_multi_init(); g->multi = curl_multi_init();
curl_multi_setopt(g->multi, CURLMOPT_SOCKETFUNCTION, sock_cb); curl_multi_setopt(g->multi, CURLMOPT_SOCKETFUNCTION, sock_cb);
curl_multi_setopt(g->multi, CURLMOPT_SOCKETDATA, g); curl_multi_setopt(g->multi, CURLMOPT_SOCKETDATA, g);

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -19,10 +19,6 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
***************************************************************************/ ***************************************************************************/
/* <DESC>
* multi socket API usage with libevent 2
* </DESC>
*/
/* Example application source code using the multi socket interface to /* Example application source code using the multi socket interface to
download many files at once. download many files at once.
@ -126,7 +122,7 @@ static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g)
/* Die if we get a bad CURLMcode somewhere */ /* Die if we get a bad CURLMcode somewhere */
static void mcode_or_die(const char *where, CURLMcode code) static void mcode_or_die(const char *where, CURLMcode code)
{ {
if(CURLM_OK != code) { if ( CURLM_OK != code ) {
const char *s; const char *s;
switch (code) { switch (code) {
case CURLM_BAD_HANDLE: s="CURLM_BAD_HANDLE"; break; case CURLM_BAD_HANDLE: s="CURLM_BAD_HANDLE"; break;
@ -160,8 +156,8 @@ static void check_multi_info(GlobalInfo *g)
CURLcode res; CURLcode res;
fprintf(MSG_OUT, "REMAINING: %d\n", g->still_running); fprintf(MSG_OUT, "REMAINING: %d\n", g->still_running);
while((msg = curl_multi_info_read(g->multi, &msgs_left))) { while ((msg = curl_multi_info_read(g->multi, &msgs_left))) {
if(msg->msg == CURLMSG_DONE) { if (msg->msg == CURLMSG_DONE) {
easy = msg->easy_handle; easy = msg->easy_handle;
res = msg->data.result; res = msg->data.result;
curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn); curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
@ -191,9 +187,9 @@ static void event_cb(int fd, short kind, void *userp)
mcode_or_die("event_cb: curl_multi_socket_action", rc); mcode_or_die("event_cb: curl_multi_socket_action", rc);
check_multi_info(g); check_multi_info(g);
if(g->still_running <= 0 ) { if ( g->still_running <= 0 ) {
fprintf(MSG_OUT, "last transfer done, kill timeout\n"); fprintf(MSG_OUT, "last transfer done, kill timeout\n");
if(evtimer_pending(g->timer_event, NULL)) { if (evtimer_pending(g->timer_event, NULL)) {
evtimer_del(g->timer_event); evtimer_del(g->timer_event);
} }
} }
@ -220,8 +216,8 @@ static void timer_cb(int fd, short kind, void *userp)
/* Clean up the SockInfo structure */ /* Clean up the SockInfo structure */
static void remsock(SockInfo *f) static void remsock(SockInfo *f)
{ {
if(f) { if (f) {
if(f->evset) if (f->evset)
event_free(f->ev); event_free(f->ev);
free(f); free(f);
} }
@ -238,7 +234,7 @@ static void setsock(SockInfo*f, curl_socket_t s, CURL*e, int act, GlobalInfo*g)
f->sockfd = s; f->sockfd = s;
f->action = act; f->action = act;
f->easy = e; f->easy = e;
if(f->evset) if (f->evset)
event_free(f->ev); event_free(f->ev);
f->ev = event_new(g->evbase, f->sockfd, kind, event_cb, g); f->ev = event_new(g->evbase, f->sockfd, kind, event_cb, g);
f->evset = 1; f->evset = 1;
@ -266,12 +262,12 @@ static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
fprintf(MSG_OUT, fprintf(MSG_OUT,
"socket callback: s=%d e=%p what=%s ", s, e, whatstr[what]); "socket callback: s=%d e=%p what=%s ", s, e, whatstr[what]);
if(what == CURL_POLL_REMOVE) { if (what == CURL_POLL_REMOVE) {
fprintf(MSG_OUT, "\n"); fprintf(MSG_OUT, "\n");
remsock(fdp); remsock(fdp);
} }
else { else {
if(!fdp) { if (!fdp) {
fprintf(MSG_OUT, "Adding data: %s\n", whatstr[what]); fprintf(MSG_OUT, "Adding data: %s\n", whatstr[what]);
addsock(s, e, what, g); addsock(s, e, what, g);
} }
@ -322,7 +318,7 @@ static void new_conn(char *url, GlobalInfo *g )
conn->error[0]='\0'; conn->error[0]='\0';
conn->easy = curl_easy_init(); conn->easy = curl_easy_init();
if(!conn->easy) { if (!conn->easy) {
fprintf(MSG_OUT, "curl_easy_init() failed, exiting!\n"); fprintf(MSG_OUT, "curl_easy_init() failed, exiting!\n");
exit(2); exit(2);
} }
@ -330,7 +326,7 @@ static void new_conn(char *url, GlobalInfo *g )
conn->url = strdup(url); conn->url = strdup(url);
curl_easy_setopt(conn->easy, CURLOPT_URL, conn->url); curl_easy_setopt(conn->easy, CURLOPT_URL, conn->url);
curl_easy_setopt(conn->easy, CURLOPT_WRITEFUNCTION, write_cb); curl_easy_setopt(conn->easy, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(conn->easy, CURLOPT_WRITEDATA, conn); curl_easy_setopt(conn->easy, CURLOPT_WRITEDATA, &conn);
curl_easy_setopt(conn->easy, CURLOPT_VERBOSE, 1L); curl_easy_setopt(conn->easy, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(conn->easy, CURLOPT_ERRORBUFFER, conn->error); curl_easy_setopt(conn->easy, CURLOPT_ERRORBUFFER, conn->error);
curl_easy_setopt(conn->easy, CURLOPT_PRIVATE, conn); curl_easy_setopt(conn->easy, CURLOPT_PRIVATE, conn);
@ -360,12 +356,10 @@ static void fifo_cb(int fd, short event, void *arg)
s[0]='\0'; s[0]='\0';
rv=fscanf(g->input, "%1023s%n", s, &n); rv=fscanf(g->input, "%1023s%n", s, &n);
s[n]='\0'; s[n]='\0';
if(n && s[0] ) { if ( n && s[0] ) {
new_conn(s, arg); /* if we read a URL, go get it! */ new_conn(s,arg); /* if we read a URL, go get it! */
} } else break;
else } while ( rv != EOF);
break;
} while(rv != EOF);
} }
/* Create a named pipe and tell libevent to monitor it */ /* Create a named pipe and tell libevent to monitor it */
@ -376,20 +370,20 @@ static int init_fifo (GlobalInfo *g)
curl_socket_t sockfd; curl_socket_t sockfd;
fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo); fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo);
if(lstat (fifo, &st) == 0) { if (lstat (fifo, &st) == 0) {
if((st.st_mode & S_IFMT) == S_IFREG) { if ((st.st_mode & S_IFMT) == S_IFREG) {
errno = EEXIST; errno = EEXIST;
perror("lstat"); perror("lstat");
exit (1); exit (1);
} }
} }
unlink(fifo); unlink(fifo);
if(mkfifo (fifo, 0600) == -1) { if (mkfifo (fifo, 0600) == -1) {
perror("mkfifo"); perror("mkfifo");
exit (1); exit (1);
} }
sockfd = open(fifo, O_RDWR | O_NONBLOCK, 0); sockfd = open(fifo, O_RDWR | O_NONBLOCK, 0);
if(sockfd == -1) { if (sockfd == -1) {
perror("open"); perror("open");
exit (1); exit (1);
} }

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 2012 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -20,13 +20,13 @@
* *
***************************************************************************/ ***************************************************************************/
/* <DESC>
* Uses the "Streaming HTML parser" to extract the href pieces in a streaming
* manner from a downloaded HTML.
* </DESC>
*/
/* /*
* The HTML parser is found at http://code.google.com/p/htmlstreamparser/ * This example uses the "Streaming HTML parser" to extract the href pieces in
* a streaming manner from a downloaded HTML. Kindly donated by Michał
* Kowalczyk.
*
* The parser is found at
* http://code.google.com/p/htmlstreamparser/
*/ */
#include <stdio.h> #include <stdio.h>
@ -38,11 +38,11 @@ static size_t write_callback(void *buffer, size_t size, size_t nmemb,
void *hsp) void *hsp)
{ {
size_t realsize = size * nmemb, p; size_t realsize = size * nmemb, p;
for(p = 0; p < realsize; p++) { for (p = 0; p < realsize; p++) {
html_parser_char_parse(hsp, ((char *)buffer)[p]); html_parser_char_parse(hsp, ((char *)buffer)[p]);
if(html_parser_cmp_tag(hsp, "a", 1)) if (html_parser_cmp_tag(hsp, "a", 1))
if(html_parser_cmp_attr(hsp, "href", 4)) if (html_parser_cmp_attr(hsp, "href", 4))
if(html_parser_is_in(hsp, HTML_VALUE_ENDED)) { if (html_parser_is_in(hsp, HTML_VALUE_ENDED)) {
html_parser_val(hsp)[html_parser_val_length(hsp)] = '\0'; html_parser_val(hsp)[html_parser_val_length(hsp)] = '\0';
printf("%s\n", html_parser_val(hsp)); printf("%s\n", html_parser_val(hsp));
} }
@ -56,7 +56,7 @@ int main(int argc, char *argv[])
CURL *curl; CURL *curl;
HTMLSTREAMPARSER *hsp; HTMLSTREAMPARSER *hsp;
if(argc != 2) { if (argc != 2) {
printf("Usage: %s URL\n", argv[0]); printf("Usage: %s URL\n", argv[0]);
return EXIT_FAILURE; return EXIT_FAILURE;
} }

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -19,12 +19,13 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
***************************************************************************/ ***************************************************************************/
/* <DESC> /* Download a document and use libtidy to parse the HTML.
* Download a document and use libtidy to parse the HTML. * Written by Jeff Pohlmeyer
* </DESC> *
*/
/*
* LibTidy => http://tidy.sourceforge.net * LibTidy => http://tidy.sourceforge.net
*
* gcc -Wall -I/usr/local/include tidycurl.c -lcurl -ltidy -o tidycurl
*
*/ */
#include <stdio.h> #include <stdio.h>
@ -38,21 +39,23 @@ uint write_cb(char *in, uint size, uint nmemb, TidyBuffer *out)
uint r; uint r;
r = size * nmemb; r = size * nmemb;
tidyBufAppend( out, in, r ); tidyBufAppend( out, in, r );
return r; return(r);
} }
/* Traverse the document tree */ /* Traverse the document tree */
void dumpNode(TidyDoc doc, TidyNode tnod, int indent ) void dumpNode(TidyDoc doc, TidyNode tnod, int indent )
{ {
TidyNode child; TidyNode child;
for(child = tidyGetChild(tnod); child; child = tidyGetNext(child) ) { for ( child = tidyGetChild(tnod); child; child = tidyGetNext(child) )
{
ctmbstr name = tidyNodeGetName( child ); ctmbstr name = tidyNodeGetName( child );
if(name) { if ( name )
{
/* if it has a name, then it's an HTML tag ... */ /* if it has a name, then it's an HTML tag ... */
TidyAttr attr; TidyAttr attr;
printf( "%*.*s%s ", indent, indent, "<", name); printf( "%*.*s%s ", indent, indent, "<", name);
/* walk the attribute list */ /* walk the attribute list */
for(attr=tidyAttrFirst(child); attr; attr=tidyAttrNext(attr) ) { for ( attr=tidyAttrFirst(child); attr; attr=tidyAttrNext(attr) ) {
printf(tidyAttrName(attr)); printf(tidyAttrName(attr));
tidyAttrValue(attr)?printf("=\"%s\" ", tidyAttrValue(attr)?printf("=\"%s\" ",
tidyAttrValue(attr)):printf(" "); tidyAttrValue(attr)):printf(" ");
@ -80,7 +83,7 @@ int main(int argc, char **argv )
TidyBuffer docbuf = {0}; TidyBuffer docbuf = {0};
TidyBuffer tidy_errbuf = {0}; TidyBuffer tidy_errbuf = {0};
int err; int err;
if(argc == 2) { if ( argc == 2) {
curl = curl_easy_init(); curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, argv[1]); curl_easy_setopt(curl, CURLOPT_URL, argv[1]);
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curl_errbuf); curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curl_errbuf);
@ -96,13 +99,13 @@ int main(int argc, char **argv )
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &docbuf); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &docbuf);
err=curl_easy_perform(curl); err=curl_easy_perform(curl);
if(!err) { if ( !err ) {
err = tidyParseBuffer(tdoc, &docbuf); /* parse the input */ err = tidyParseBuffer(tdoc, &docbuf); /* parse the input */
if(err >= 0) { if ( err >= 0 ) {
err = tidyCleanAndRepair(tdoc); /* fix any problems */ err = tidyCleanAndRepair(tdoc); /* fix any problems */
if(err >= 0) { if ( err >= 0 ) {
err = tidyRunDiagnostics(tdoc); /* load tidy error buffer */ err = tidyRunDiagnostics(tdoc); /* load tidy error buffer */
if(err >= 0) { if ( err >= 0 ) {
dumpNode( tdoc, tidyGetRoot(tdoc), 0 ); /* walk the tree */ dumpNode( tdoc, tidyGetRoot(tdoc), 0 ); /* walk the tree */
fprintf(stderr, "%s\n", tidy_errbuf.bp); /* show errors */ fprintf(stderr, "%s\n", tidy_errbuf.bp); /* show errors */
} }
@ -117,11 +120,11 @@ int main(int argc, char **argv )
tidyBufFree(&docbuf); tidyBufFree(&docbuf);
tidyBufFree(&tidy_errbuf); tidyBufFree(&tidy_errbuf);
tidyRelease(tdoc); tidyRelease(tdoc);
return err; return(err);
} }
else else
printf( "usage: %s <url>\n", argv[0] ); printf( "usage: %s <url>\n", argv[0] );
return 0; return(0);
} }

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -19,10 +19,8 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
***************************************************************************/ ***************************************************************************/
/* <DESC> // Get a web page, parse it with libxml.
* Get a web page, extract the title with libxml. //
* </DESC>
*/
// Written by Lars Nilsson // Written by Lars Nilsson
// //
// GNU C++ compile command line suggestion (edit paths accordingly): // GNU C++ compile command line suggestion (edit paths accordingly):
@ -42,7 +40,7 @@
// //
#ifdef _MSC_VER #ifdef _MSC_VER
#define COMPARE(a, b) (!_stricmp((a), (b))) #define COMPARE(a, b) (!stricmp((a), (b)))
#else #else
#define COMPARE(a, b) (!strcasecmp((a), (b))) #define COMPARE(a, b) (!strcasecmp((a), (b)))
#endif #endif

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -19,10 +19,6 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
***************************************************************************/ ***************************************************************************/
/* <DESC>
* simple HTTP POST using the easy interface
* </DESC>
*/
#include <stdio.h> #include <stdio.h>
#include <curl/curl.h> #include <curl/curl.h>

View File

@ -1,292 +0,0 @@
/***************************************************************************
* _ _ ____ _
* 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.
*
***************************************************************************/
/* <DESC>
* Multiplexed HTTP/2 downloads over a single connection
* </DESC>
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* somewhat unix-specific */
#include <sys/time.h>
#include <unistd.h>
/* curl stuff */
#include <curl/curl.h>
#ifndef CURLPIPE_MULTIPLEX
/* This little trick will just make sure that we don't enable pipelining for
libcurls old enough to not have this symbol. It is _not_ defined to zero in
a recent libcurl header. */
#define CURLPIPE_MULTIPLEX 0
#endif
#define NUM_HANDLES 1000
void *curl_hnd[NUM_HANDLES];
int num_transfers;
/* a handle to number lookup, highly ineffective when we do many
transfers... */
static int hnd2num(CURL *hnd)
{
int i;
for(i=0; i< num_transfers; i++) {
if(curl_hnd[i] == hnd)
return i;
}
return 0; /* weird, but just a fail-safe */
}
static
void dump(const char *text, int num, unsigned char *ptr, size_t size,
char nohex)
{
size_t i;
size_t c;
unsigned int width=0x10;
if(nohex)
/* without the hex output, we can fit more on screen */
width = 0x40;
fprintf(stderr, "%d %s, %ld bytes (0x%lx)\n",
num, text, (long)size, (long)size);
for(i=0; i<size; i+= width) {
fprintf(stderr, "%4.4lx: ", (long)i);
if(!nohex) {
/* hex not disabled, show it */
for(c = 0; c < width; c++)
if(i+c < size)
fprintf(stderr, "%02x ", ptr[i+c]);
else
fputs(" ", stderr);
}
for(c = 0; (c < width) && (i+c < size); c++) {
/* check for 0D0A; if found, skip past and start a new line of output */
if(nohex && (i+c+1 < size) && ptr[i+c]==0x0D && ptr[i+c+1]==0x0A) {
i+=(c+2-width);
break;
}
fprintf(stderr, "%c",
(ptr[i+c]>=0x20) && (ptr[i+c]<0x80)?ptr[i+c]:'.');
/* check again for 0D0A, to avoid an extra \n if it's at width */
if(nohex && (i+c+2 < size) && ptr[i+c+1]==0x0D && ptr[i+c+2]==0x0A) {
i+=(c+3-width);
break;
}
}
fputc('\n', stderr); /* newline */
}
}
static
int my_trace(CURL *handle, curl_infotype type,
char *data, size_t size,
void *userp)
{
const char *text;
int num = hnd2num(handle);
(void)handle; /* prevent compiler warning */
(void)userp;
switch (type) {
case CURLINFO_TEXT:
fprintf(stderr, "== %d Info: %s", num, data);
default: /* in case a new one is introduced to shock us */
return 0;
case CURLINFO_HEADER_OUT:
text = "=> Send header";
break;
case CURLINFO_DATA_OUT:
text = "=> Send data";
break;
case CURLINFO_SSL_DATA_OUT:
text = "=> Send SSL data";
break;
case CURLINFO_HEADER_IN:
text = "<= Recv header";
break;
case CURLINFO_DATA_IN:
text = "<= Recv data";
break;
case CURLINFO_SSL_DATA_IN:
text = "<= Recv SSL data";
break;
}
dump(text, num, (unsigned char *)data, size, 1);
return 0;
}
static void setup(CURL *hnd, int num)
{
FILE *out;
char filename[128];
snprintf(filename, 128, "dl-%d", num);
out = fopen(filename, "wb");
/* write to this file */
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, out);
/* set the same URL */
curl_easy_setopt(hnd, CURLOPT_URL, "https://localhost:8443/index.html");
/* send it verbose for max debuggaility */
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, my_trace);
/* HTTP/2 please */
curl_easy_setopt(hnd, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
/* we use a self-signed test server, skip verification during debugging */
curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYHOST, 0L);
#if (CURLPIPE_MULTIPLEX > 0)
/* wait for pipe connection to confirm */
curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
#endif
curl_hnd[num] = hnd;
}
/*
* Simply download two files over HTTP/2, using the same physical connection!
*/
int main(int argc, char **argv)
{
CURL *easy[NUM_HANDLES];
CURLM *multi_handle;
int i;
int still_running; /* keep number of running handles */
if(argc > 1)
/* if given a number, do that many transfers */
num_transfers = atoi(argv[1]);
if(!num_transfers || (num_transfers > NUM_HANDLES))
num_transfers = 3; /* a suitable low default */
/* init a multi stack */
multi_handle = curl_multi_init();
for(i=0; i<num_transfers; i++) {
easy[i] = curl_easy_init();
/* set options */
setup(easy[i], i);
/* add the individual transfer */
curl_multi_add_handle(multi_handle, easy[i]);
}
curl_multi_setopt(multi_handle, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
/* we start some action by calling perform right away */
curl_multi_perform(multi_handle, &still_running);
do {
struct timeval timeout;
int rc; /* select() return code */
CURLMcode mc; /* curl_multi_fdset() return code */
fd_set fdread;
fd_set fdwrite;
fd_set fdexcep;
int maxfd = -1;
long curl_timeo = -1;
FD_ZERO(&fdread);
FD_ZERO(&fdwrite);
FD_ZERO(&fdexcep);
/* set a suitable timeout to play around with */
timeout.tv_sec = 1;
timeout.tv_usec = 0;
curl_multi_timeout(multi_handle, &curl_timeo);
if(curl_timeo >= 0) {
timeout.tv_sec = curl_timeo / 1000;
if(timeout.tv_sec > 1)
timeout.tv_sec = 1;
else
timeout.tv_usec = (curl_timeo % 1000) * 1000;
}
/* get file descriptors from the transfers */
mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
break;
}
/* On success the value of maxfd is guaranteed to be >= -1. We call
select(maxfd + 1, ...); specially in case of (maxfd == -1) there are
no fds ready yet so we call select(0, ...) --or Sleep() on Windows--
to sleep 100ms, which is the minimum suggested value in the
curl_multi_fdset() doc. */
if(maxfd == -1) {
#ifdef _WIN32
Sleep(100);
rc = 0;
#else
/* Portable sleep for platforms other than Windows. */
struct timeval wait = { 0, 100 * 1000 }; /* 100ms */
rc = select(0, NULL, NULL, NULL, &wait);
#endif
}
else {
/* Note that on some platforms 'timeout' may be modified by select().
If you need access to the original value save a copy beforehand. */
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
}
switch(rc) {
case -1:
/* select error */
break;
case 0:
default:
/* timeout or readable/writable sockets */
curl_multi_perform(multi_handle, &still_running);
break;
}
} while(still_running);
curl_multi_cleanup(multi_handle);
for(i=0; i<num_transfers; i++)
curl_easy_cleanup(easy[i]);
return 0;
}

View File

@ -1,320 +0,0 @@
/***************************************************************************
* _ _ ____ _
* 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.
*
***************************************************************************/
/* <DESC>
* HTTP/2 server push
* </DESC>
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* somewhat unix-specific */
#include <sys/time.h>
#include <unistd.h>
/* curl stuff */
#include <curl/curl.h>
#ifndef CURLPIPE_MULTIPLEX
#error "too old libcurl, can't do HTTP/2 server push!"
#endif
static
void dump(const char *text, unsigned char *ptr, size_t size,
char nohex)
{
size_t i;
size_t c;
unsigned int width=0x10;
if(nohex)
/* without the hex output, we can fit more on screen */
width = 0x40;
fprintf(stderr, "%s, %ld bytes (0x%lx)\n",
text, (long)size, (long)size);
for(i=0; i<size; i+= width) {
fprintf(stderr, "%4.4lx: ", (long)i);
if(!nohex) {
/* hex not disabled, show it */
for(c = 0; c < width; c++)
if(i+c < size)
fprintf(stderr, "%02x ", ptr[i+c]);
else
fputs(" ", stderr);
}
for(c = 0; (c < width) && (i+c < size); c++) {
/* check for 0D0A; if found, skip past and start a new line of output */
if(nohex && (i+c+1 < size) && ptr[i+c]==0x0D && ptr[i+c+1]==0x0A) {
i+=(c+2-width);
break;
}
fprintf(stderr, "%c",
(ptr[i+c]>=0x20) && (ptr[i+c]<0x80)?ptr[i+c]:'.');
/* check again for 0D0A, to avoid an extra \n if it's at width */
if(nohex && (i+c+2 < size) && ptr[i+c+1]==0x0D && ptr[i+c+2]==0x0A) {
i+=(c+3-width);
break;
}
}
fputc('\n', stderr); /* newline */
}
}
static
int my_trace(CURL *handle, curl_infotype type,
char *data, size_t size,
void *userp)
{
const char *text;
(void)handle; /* prevent compiler warning */
(void)userp;
switch (type) {
case CURLINFO_TEXT:
fprintf(stderr, "== Info: %s", data);
default: /* in case a new one is introduced to shock us */
return 0;
case CURLINFO_HEADER_OUT:
text = "=> Send header";
break;
case CURLINFO_DATA_OUT:
text = "=> Send data";
break;
case CURLINFO_SSL_DATA_OUT:
text = "=> Send SSL data";
break;
case CURLINFO_HEADER_IN:
text = "<= Recv header";
break;
case CURLINFO_DATA_IN:
text = "<= Recv data";
break;
case CURLINFO_SSL_DATA_IN:
text = "<= Recv SSL data";
break;
}
dump(text, (unsigned char *)data, size, 1);
return 0;
}
#define OUTPUTFILE "dl"
static void setup(CURL *hnd)
{
FILE *out = fopen(OUTPUTFILE, "wb");
/* write to this file */
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, out);
/* set the same URL */
curl_easy_setopt(hnd, CURLOPT_URL, "https://localhost:8443/index.html");
/* send it verbose for max debuggaility */
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, my_trace);
/* HTTP/2 please */
curl_easy_setopt(hnd, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
/* we use a self-signed test server, skip verification during debugging */
curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYHOST, 0L);
#if (CURLPIPE_MULTIPLEX > 0)
/* wait for pipe connection to confirm */
curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
#endif
}
/* called when there's an incoming push */
static int server_push_callback(CURL *parent,
CURL *easy,
size_t num_headers,
struct curl_pushheaders *headers,
void *userp)
{
char *headp;
size_t i;
int *transfers = (int *)userp;
char filename[128];
FILE *out;
static unsigned int count = 0;
(void)parent; /* we have no use for this */
snprintf(filename, 128, "push%u", count++);
/* here's a new stream, save it in a new file for each new push */
out = fopen(filename, "wb");
/* write to this file */
curl_easy_setopt(easy, CURLOPT_WRITEDATA, out);
fprintf(stderr, "**** push callback approves stream %u, got %d headers!\n",
count, (int)num_headers);
for(i=0; i<num_headers; i++) {
headp = curl_pushheader_bynum(headers, i);
fprintf(stderr, "**** header %u: %s\n", (int)i, headp);
}
headp = curl_pushheader_byname(headers, ":path");
if(headp) {
fprintf(stderr, "**** The PATH is %s\n", headp /* skip :path + colon */ );
}
(*transfers)++; /* one more */
return CURL_PUSH_OK;
}
/*
* Download a file over HTTP/2, take care of server push.
*/
int main(void)
{
CURL *easy;
CURLM *multi_handle;
int still_running; /* keep number of running handles */
int transfers=1; /* we start with one */
struct CURLMsg *m;
/* init a multi stack */
multi_handle = curl_multi_init();
easy = curl_easy_init();
/* set options */
setup(easy);
/* add the easy transfer */
curl_multi_add_handle(multi_handle, easy);
curl_multi_setopt(multi_handle, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
curl_multi_setopt(multi_handle, CURLMOPT_PUSHFUNCTION, server_push_callback);
curl_multi_setopt(multi_handle, CURLMOPT_PUSHDATA, &transfers);
/* we start some action by calling perform right away */
curl_multi_perform(multi_handle, &still_running);
do {
struct timeval timeout;
int rc; /* select() return code */
CURLMcode mc; /* curl_multi_fdset() return code */
fd_set fdread;
fd_set fdwrite;
fd_set fdexcep;
int maxfd = -1;
long curl_timeo = -1;
FD_ZERO(&fdread);
FD_ZERO(&fdwrite);
FD_ZERO(&fdexcep);
/* set a suitable timeout to play around with */
timeout.tv_sec = 1;
timeout.tv_usec = 0;
curl_multi_timeout(multi_handle, &curl_timeo);
if(curl_timeo >= 0) {
timeout.tv_sec = curl_timeo / 1000;
if(timeout.tv_sec > 1)
timeout.tv_sec = 1;
else
timeout.tv_usec = (curl_timeo % 1000) * 1000;
}
/* get file descriptors from the transfers */
mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
break;
}
/* On success the value of maxfd is guaranteed to be >= -1. We call
select(maxfd + 1, ...); specially in case of (maxfd == -1) there are
no fds ready yet so we call select(0, ...) --or Sleep() on Windows--
to sleep 100ms, which is the minimum suggested value in the
curl_multi_fdset() doc. */
if(maxfd == -1) {
#ifdef _WIN32
Sleep(100);
rc = 0;
#else
/* Portable sleep for platforms other than Windows. */
struct timeval wait = { 0, 100 * 1000 }; /* 100ms */
rc = select(0, NULL, NULL, NULL, &wait);
#endif
}
else {
/* Note that on some platforms 'timeout' may be modified by select().
If you need access to the original value save a copy beforehand. */
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
}
switch(rc) {
case -1:
/* select error */
break;
case 0:
default:
/* timeout or readable/writable sockets */
curl_multi_perform(multi_handle, &still_running);
break;
}
/*
* A little caution when doing server push is that libcurl itself has
* created and added one or more easy handles but we need to clean them up
* when we are done.
*/
do {
int msgq = 0;;
m = curl_multi_info_read(multi_handle, &msgq);
if(m && (m->msg == CURLMSG_DONE)) {
CURL *e = m->easy_handle;
transfers--;
curl_multi_remove_handle(multi_handle, e);
curl_easy_cleanup(e);
}
} while(m);
} while(transfers); /* as long as we have transfers going */
curl_multi_cleanup(multi_handle);
return 0;
}

View File

@ -1,356 +0,0 @@
/***************************************************************************
* _ _ ____ _
* 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.
*
***************************************************************************/
/* <DESC>
* Multiplexed HTTP/2 uploads over a single connection
* </DESC>
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
/* somewhat unix-specific */
#include <sys/time.h>
#include <unistd.h>
/* curl stuff */
#include <curl/curl.h>
#ifndef CURLPIPE_MULTIPLEX
/* This little trick will just make sure that we don't enable pipelining for
libcurls old enough to not have this symbol. It is _not_ defined to zero in
a recent libcurl header. */
#define CURLPIPE_MULTIPLEX 0
#endif
#define NUM_HANDLES 1000
void *curl_hnd[NUM_HANDLES];
int num_transfers;
/* a handle to number lookup, highly ineffective when we do many
transfers... */
static int hnd2num(CURL *hnd)
{
int i;
for(i=0; i< num_transfers; i++) {
if(curl_hnd[i] == hnd)
return i;
}
return 0; /* weird, but just a fail-safe */
}
static
void dump(const char *text, int num, unsigned char *ptr, size_t size,
char nohex)
{
size_t i;
size_t c;
unsigned int width=0x10;
if(nohex)
/* without the hex output, we can fit more on screen */
width = 0x40;
fprintf(stderr, "%d %s, %ld bytes (0x%lx)\n",
num, text, (long)size, (long)size);
for(i=0; i<size; i+= width) {
fprintf(stderr, "%4.4lx: ", (long)i);
if(!nohex) {
/* hex not disabled, show it */
for(c = 0; c < width; c++)
if(i+c < size)
fprintf(stderr, "%02x ", ptr[i+c]);
else
fputs(" ", stderr);
}
for(c = 0; (c < width) && (i+c < size); c++) {
/* check for 0D0A; if found, skip past and start a new line of output */
if(nohex && (i+c+1 < size) && ptr[i+c]==0x0D && ptr[i+c+1]==0x0A) {
i+=(c+2-width);
break;
}
fprintf(stderr, "%c",
(ptr[i+c]>=0x20) && (ptr[i+c]<0x80)?ptr[i+c]:'.');
/* check again for 0D0A, to avoid an extra \n if it's at width */
if(nohex && (i+c+2 < size) && ptr[i+c+1]==0x0D && ptr[i+c+2]==0x0A) {
i+=(c+3-width);
break;
}
}
fputc('\n', stderr); /* newline */
}
}
static
int my_trace(CURL *handle, curl_infotype type,
char *data, size_t size,
void *userp)
{
char timebuf[20];
const char *text;
int num = hnd2num(handle);
static time_t epoch_offset;
static int known_offset;
struct timeval tv;
time_t secs;
struct tm *now;
(void)handle; /* prevent compiler warning */
(void)userp;
gettimeofday(&tv, NULL);
if(!known_offset) {
epoch_offset = time(NULL) - tv.tv_sec;
known_offset = 1;
}
secs = epoch_offset + tv.tv_sec;
now = localtime(&secs); /* not thread safe but we don't care */
snprintf(timebuf, sizeof(timebuf), "%02d:%02d:%02d.%06ld",
now->tm_hour, now->tm_min, now->tm_sec, (long)tv.tv_usec);
switch (type) {
case CURLINFO_TEXT:
fprintf(stderr, "%s [%d] Info: %s", timebuf, num, data);
default: /* in case a new one is introduced to shock us */
return 0;
case CURLINFO_HEADER_OUT:
text = "=> Send header";
break;
case CURLINFO_DATA_OUT:
text = "=> Send data";
break;
case CURLINFO_SSL_DATA_OUT:
text = "=> Send SSL data";
break;
case CURLINFO_HEADER_IN:
text = "<= Recv header";
break;
case CURLINFO_DATA_IN:
text = "<= Recv data";
break;
case CURLINFO_SSL_DATA_IN:
text = "<= Recv SSL data";
break;
}
dump(text, num, (unsigned char *)data, size, 1);
return 0;
}
struct input {
FILE *in;
size_t bytes_read; /* count up */
CURL *hnd;
};
static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
{
struct input *i = userp;
size_t retcode = fread(ptr, size, nmemb, i->in);
i->bytes_read += retcode;
return retcode;
}
struct input indata[NUM_HANDLES];
static void setup(CURL *hnd, int num, const char *upload)
{
FILE *out;
char url[256];
char filename[128];
struct stat file_info;
curl_off_t uploadsize;
snprintf(filename, 128, "dl-%d", num);
out = fopen(filename, "wb");
snprintf(url, 256, "https://localhost:8443/upload-%d", num);
/* get the file size of the local file */
stat(upload, &file_info);
uploadsize = file_info.st_size;
indata[num].in = fopen(upload, "rb");
indata[num].hnd = hnd;
/* write to this file */
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, out);
/* we want to use our own read function */
curl_easy_setopt(hnd, CURLOPT_READFUNCTION, read_callback);
/* read from this file */
curl_easy_setopt(hnd, CURLOPT_READDATA, &indata[num]);
/* provide the size of the upload */
curl_easy_setopt(hnd, CURLOPT_INFILESIZE_LARGE, uploadsize);
/* send in the URL to store the upload as */
curl_easy_setopt(hnd, CURLOPT_URL, url);
/* upload please */
curl_easy_setopt(hnd, CURLOPT_UPLOAD, 1L);
/* send it verbose for max debuggaility */
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, my_trace);
/* HTTP/2 please */
curl_easy_setopt(hnd, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
/* we use a self-signed test server, skip verification during debugging */
curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYHOST, 0L);
#if (CURLPIPE_MULTIPLEX > 0)
/* wait for pipe connection to confirm */
curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
#endif
curl_hnd[num] = hnd;
}
/*
* Upload all files over HTTP/2, using the same physical connection!
*/
int main(int argc, char **argv)
{
CURL *easy[NUM_HANDLES];
CURLM *multi_handle;
int i;
int still_running; /* keep number of running handles */
const char *filename = "index.html";
if(argc > 1)
/* if given a number, do that many transfers */
num_transfers = atoi(argv[1]);
if(argc > 2)
/* if given a file name, upload this! */
filename = argv[2];
if(!num_transfers || (num_transfers > NUM_HANDLES))
num_transfers = 3; /* a suitable low default */
/* init a multi stack */
multi_handle = curl_multi_init();
for(i=0; i<num_transfers; i++) {
easy[i] = curl_easy_init();
/* set options */
setup(easy[i], i, filename);
/* add the individual transfer */
curl_multi_add_handle(multi_handle, easy[i]);
}
curl_multi_setopt(multi_handle, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
/* We do HTTP/2 so let's stick to one connection per host */
curl_multi_setopt(multi_handle, CURLMOPT_MAX_HOST_CONNECTIONS, 1L);
/* we start some action by calling perform right away */
curl_multi_perform(multi_handle, &still_running);
do {
struct timeval timeout;
int rc; /* select() return code */
CURLMcode mc; /* curl_multi_fdset() return code */
fd_set fdread;
fd_set fdwrite;
fd_set fdexcep;
int maxfd = -1;
long curl_timeo = -1;
FD_ZERO(&fdread);
FD_ZERO(&fdwrite);
FD_ZERO(&fdexcep);
/* set a suitable timeout to play around with */
timeout.tv_sec = 1;
timeout.tv_usec = 0;
curl_multi_timeout(multi_handle, &curl_timeo);
if(curl_timeo >= 0) {
timeout.tv_sec = curl_timeo / 1000;
if(timeout.tv_sec > 1)
timeout.tv_sec = 1;
else
timeout.tv_usec = (curl_timeo % 1000) * 1000;
}
/* get file descriptors from the transfers */
mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
break;
}
/* On success the value of maxfd is guaranteed to be >= -1. We call
select(maxfd + 1, ...); specially in case of (maxfd == -1) there are
no fds ready yet so we call select(0, ...) --or Sleep() on Windows--
to sleep 100ms, which is the minimum suggested value in the
curl_multi_fdset() doc. */
if(maxfd == -1) {
#ifdef _WIN32
Sleep(100);
rc = 0;
#else
/* Portable sleep for platforms other than Windows. */
struct timeval wait = { 0, 100 * 1000 }; /* 100ms */
rc = select(0, NULL, NULL, NULL, &wait);
#endif
}
else {
/* Note that on some platforms 'timeout' may be modified by select().
If you need access to the original value save a copy beforehand. */
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
}
switch(rc) {
case -1:
/* select error */
break;
case 0:
default:
/* timeout or readable/writable sockets */
curl_multi_perform(multi_handle, &still_running);
break;
}
} while(still_running);
curl_multi_cleanup(multi_handle);
for(i=0; i<num_transfers; i++)
curl_easy_cleanup(easy[i]);
return 0;
}

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -19,10 +19,6 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
***************************************************************************/ ***************************************************************************/
/* <DESC>
* HTTP request with custom modified, removed and added headers
* </DESC>
*/
#include <stdio.h> #include <stdio.h>
#include <curl/curl.h> #include <curl/curl.h>

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -19,10 +19,6 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
***************************************************************************/ ***************************************************************************/
/* <DESC>
* HTTP PUT with easy interface and read callback
* </DESC>
*/
#include <stdio.h> #include <stdio.h>
#include <fcntl.h> #include <fcntl.h>
#include <sys/stat.h> #include <sys/stat.h>
@ -60,7 +56,7 @@ int main(int argc, char **argv)
{ {
CURL *curl; CURL *curl;
CURLcode res; CURLcode res;
FILE * hd_src; FILE * hd_src ;
struct stat file_info; struct stat file_info;
char *file; char *file;

View File

@ -5,11 +5,11 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at https://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * 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 * copies of the Software, and permit persons to whom the Software is
@ -19,10 +19,6 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
***************************************************************************/ ***************************************************************************/
/* <DESC>
* Simple HTTPS GET
* </DESC>
*/
#include <stdio.h> #include <stdio.h>
#include <curl/curl.h> #include <curl/curl.h>

Some files were not shown because too many files have changed in this diff Show More