lib: add CURLFOLLOW_OBEYCODE and CURLFOLLOW_FIRSTONLY
—
$ git checkout -f fb13923dd67d5196c47e8df9c05b5cca59c1a750
Previous HEAD position was 7b0240c077 curl.h: convert CURLUSESSL* names to defines
HEAD is now at fb13923dd6 lib: add CURLFOLLOW_OBEYCODE and CURLFOLLOW_FIRSTONLY
$ git clean -fdx
Removing Makefile
Removing Makefile.in
Removing aclocal.m4
Removing autom4te.cache/
Removing buildinfo.txt
Removing compile
Removing config.guess
Removing config.log
Removing config.status
Removing config.sub
Removing configure
Removing curl-config
Removing depcomp
Removing docs/Makefile
Removing docs/Makefile.in
Removing docs/cmdline-opts/Makefile
Removing docs/cmdline-opts/Makefile.in
Removing docs/examples/.deps/
Removing docs/examples/Makefile
Removing docs/examples/Makefile.in
Removing docs/libcurl/Makefile
Removing docs/libcurl/Makefile.in
Removing docs/libcurl/opts/Makefile
Removing docs/libcurl/opts/Makefile.in
Removing include/Makefile
Removing include/Makefile.in
Removing include/curl/Makefile
Removing include/curl/Makefile.in
Removing install-sh
Removing lib/.deps/
Removing lib/.dirstamp
Removing lib/.libs/
Removing lib/Makefile
Removing lib/Makefile.in
Removing lib/curl-base64.o
Removing lib/curl-curl_multibyte.o
Removing lib/curl-dynbuf.o
Removing lib/curl-nonblock.o
Removing lib/curl-strcase.o
Removing lib/curl-strparse.o
Removing lib/curl-strtoofft.o
Removing lib/curl-timediff.o
Removing lib/curl-version_win32.o
Removing lib/curl-warnless.o
Removing lib/curl_config.h
Removing lib/curl_config.h.in
Removing lib/libcurl.la
Removing lib/libcurl.vers
Removing lib/libcurl_la-altsvc.lo
Removing lib/libcurl_la-altsvc.o
Removing lib/libcurl_la-amigaos.lo
Removing lib/libcurl_la-amigaos.o
Removing lib/libcurl_la-asyn-ares.lo
Removing lib/libcurl_la-asyn-ares.o
Removing lib/libcurl_la-asyn-thread.lo
Removing lib/libcurl_la-asyn-thread.o
Removing lib/libcurl_la-base64.lo
Removing lib/libcurl_la-base64.o
Removing lib/libcurl_la-bufq.lo
Removing lib/libcurl_la-bufq.o
Removing lib/libcurl_la-bufref.lo
Removing lib/libcurl_la-bufref.o
Removing lib/libcurl_la-cf-h1-proxy.lo
Removing lib/libcurl_la-cf-h1-proxy.o
Removing lib/libcurl_la-cf-h2-proxy.lo
Removing lib/libcurl_la-cf-h2-proxy.o
Removing lib/libcurl_la-cf-haproxy.lo
Removing lib/libcurl_la-cf-haproxy.o
Removing lib/libcurl_la-cf-https-connect.lo
Removing lib/libcurl_la-cf-https-connect.o
Removing lib/libcurl_la-cf-socket.lo
Removing lib/libcurl_la-cf-socket.o
Removing lib/libcurl_la-cfilters.lo
Removing lib/libcurl_la-cfilters.o
Removing lib/libcurl_la-conncache.lo
Removing lib/libcurl_la-conncache.o
Removing lib/libcurl_la-connect.lo
Removing lib/libcurl_la-connect.o
Removing lib/libcurl_la-content_encoding.lo
Removing lib/libcurl_la-content_encoding.o
Removing lib/libcurl_la-cookie.lo
Removing lib/libcurl_la-cookie.o
Removing lib/libcurl_la-cshutdn.lo
Removing lib/libcurl_la-cshutdn.o
Removing lib/libcurl_la-curl_addrinfo.lo
Removing lib/libcurl_la-curl_addrinfo.o
Removing lib/libcurl_la-curl_des.lo
Removing lib/libcurl_la-curl_des.o
Removing lib/libcurl_la-curl_endian.lo
Removing lib/libcurl_la-curl_endian.o
Removing lib/libcurl_la-curl_fnmatch.lo
Removing lib/libcurl_la-curl_fnmatch.o
Removing lib/libcurl_la-curl_get_line.lo
Removing lib/libcurl_la-curl_get_line.o
Removing lib/libcurl_la-curl_gethostname.lo
Removing lib/libcurl_la-curl_gethostname.o
Removing lib/libcurl_la-curl_gssapi.lo
Removing lib/libcurl_la-curl_gssapi.o
Removing lib/libcurl_la-curl_memrchr.lo
Removing lib/libcurl_la-curl_memrchr.o
Removing lib/libcurl_la-curl_multibyte.lo
Removing lib/libcurl_la-curl_multibyte.o
Removing lib/libcurl_la-curl_ntlm_core.lo
Removing lib/libcurl_la-curl_ntlm_core.o
Removing lib/libcurl_la-curl_range.lo
Removing lib/libcurl_la-curl_range.o
Removing lib/libcurl_la-curl_rtmp.lo
Removing lib/libcurl_la-curl_rtmp.o
Removing lib/libcurl_la-curl_sasl.lo
Removing lib/libcurl_la-curl_sasl.o
Removing lib/libcurl_la-curl_sha512_256.lo
Removing lib/libcurl_la-curl_sha512_256.o
Removing lib/libcurl_la-curl_sspi.lo
Removing lib/libcurl_la-curl_sspi.o
Removing lib/libcurl_la-curl_threads.lo
Removing lib/libcurl_la-curl_threads.o
Removing lib/libcurl_la-curl_trc.lo
Removing lib/libcurl_la-curl_trc.o
Removing lib/libcurl_la-cw-out.lo
Removing lib/libcurl_la-cw-out.o
Removing lib/libcurl_la-cw-pause.lo
Removing lib/libcurl_la-cw-pause.o
Removing lib/libcurl_la-dict.lo
Removing lib/libcurl_la-dict.o
Removing lib/libcurl_la-dllmain.lo
Removing lib/libcurl_la-dllmain.o
Removing lib/libcurl_la-doh.lo
Removing lib/libcurl_la-doh.o
Removing lib/libcurl_la-dynbuf.lo
Removing lib/libcurl_la-dynbuf.o
Removing lib/libcurl_la-dynhds.lo
Removing lib/libcurl_la-dynhds.o
Removing lib/libcurl_la-easy.lo
Removing lib/libcurl_la-easy.o
Removing lib/libcurl_la-easygetopt.lo
Removing lib/libcurl_la-easygetopt.o
Removing lib/libcurl_la-easyoptions.lo
Removing lib/libcurl_la-easyoptions.o
Removing lib/libcurl_la-escape.lo
Removing lib/libcurl_la-escape.o
Removing lib/libcurl_la-file.lo
Removing lib/libcurl_la-file.o
Removing lib/libcurl_la-fileinfo.lo
Removing lib/libcurl_la-fileinfo.o
Removing lib/libcurl_la-fopen.lo
Removing lib/libcurl_la-fopen.o
Removing lib/libcurl_la-formdata.lo
Removing lib/libcurl_la-formdata.o
Removing lib/libcurl_la-ftp.lo
Removing lib/libcurl_la-ftp.o
Removing lib/libcurl_la-ftplistparser.lo
Removing lib/libcurl_la-ftplistparser.o
Removing lib/libcurl_la-getenv.lo
Removing lib/libcurl_la-getenv.o
Removing lib/libcurl_la-getinfo.lo
Removing lib/libcurl_la-getinfo.o
Removing lib/libcurl_la-gopher.lo
Removing lib/libcurl_la-gopher.o
Removing lib/libcurl_la-hash.lo
Removing lib/libcurl_la-hash.o
Removing lib/libcurl_la-hash_offt.lo
Removing lib/libcurl_la-hash_offt.o
Removing lib/libcurl_la-headers.lo
Removing lib/libcurl_la-headers.o
Removing lib/libcurl_la-hmac.lo
Removing lib/libcurl_la-hmac.o
Removing lib/libcurl_la-hostasyn.lo
Removing lib/libcurl_la-hostasyn.o
Removing lib/libcurl_la-hostip.lo
Removing lib/libcurl_la-hostip.o
Removing lib/libcurl_la-hostip4.lo
Removing lib/libcurl_la-hostip4.o
Removing lib/libcurl_la-hostip6.lo
Removing lib/libcurl_la-hostip6.o
Removing lib/libcurl_la-hostsyn.lo
Removing lib/libcurl_la-hostsyn.o
Removing lib/libcurl_la-hsts.lo
Removing lib/libcurl_la-hsts.o
Removing lib/libcurl_la-http.lo
Removing lib/libcurl_la-http.o
Removing lib/libcurl_la-http1.lo
Removing lib/libcurl_la-http1.o
Removing lib/libcurl_la-http2.lo
Removing lib/libcurl_la-http2.o
Removing lib/libcurl_la-http_aws_sigv4.lo
Removing lib/libcurl_la-http_aws_sigv4.o
Removing lib/libcurl_la-http_chunks.lo
Removing lib/libcurl_la-http_chunks.o
Removing lib/libcurl_la-http_digest.lo
Removing lib/libcurl_la-http_digest.o
Removing lib/libcurl_la-http_negotiate.lo
Removing lib/libcurl_la-http_negotiate.o
Removing lib/libcurl_la-http_ntlm.lo
Removing lib/libcurl_la-http_ntlm.o
Removing lib/libcurl_la-http_proxy.lo
Removing lib/libcurl_la-http_proxy.o
Removing lib/libcurl_la-httpsrr.lo
Removing lib/libcurl_la-httpsrr.o
Removing lib/libcurl_la-idn.lo
Removing lib/libcurl_la-idn.o
Removing lib/libcurl_la-if2ip.lo
Removing lib/libcurl_la-if2ip.o
Removing lib/libcurl_la-imap.lo
Removing lib/libcurl_la-imap.o
Removing lib/libcurl_la-inet_ntop.lo
Removing lib/libcurl_la-inet_ntop.o
Removing lib/libcurl_la-inet_pton.lo
Removing lib/libcurl_la-inet_pton.o
Removing lib/libcurl_la-krb5.lo
Removing lib/libcurl_la-krb5.o
Removing lib/libcurl_la-ldap.lo
Removing lib/libcurl_la-ldap.o
Removing lib/libcurl_la-llist.lo
Removing lib/libcurl_la-llist.o
Removing lib/libcurl_la-macos.lo
Removing lib/libcurl_la-macos.o
Removing lib/libcurl_la-md4.lo
Removing lib/libcurl_la-md4.o
Removing lib/libcurl_la-md5.lo
Removing lib/libcurl_la-md5.o
Removing lib/libcurl_la-memdebug.lo
Removing lib/libcurl_la-memdebug.o
Removing lib/libcurl_la-mime.lo
Removing lib/libcurl_la-mime.o
Removing lib/libcurl_la-mprintf.lo
Removing lib/libcurl_la-mprintf.o
Removing lib/libcurl_la-mqtt.lo
Removing lib/libcurl_la-mqtt.o
Removing lib/libcurl_la-multi.lo
Removing lib/libcurl_la-multi.o
Removing lib/libcurl_la-multi_ev.lo
Removing lib/libcurl_la-multi_ev.o
Removing lib/libcurl_la-netrc.lo
Removing lib/libcurl_la-netrc.o
Removing lib/libcurl_la-nonblock.lo
Removing lib/libcurl_la-nonblock.o
Removing lib/libcurl_la-noproxy.lo
Removing lib/libcurl_la-noproxy.o
Removing lib/libcurl_la-openldap.lo
Removing lib/libcurl_la-openldap.o
Removing lib/libcurl_la-parsedate.lo
Removing lib/libcurl_la-parsedate.o
Removing lib/libcurl_la-pingpong.lo
Removing lib/libcurl_la-pingpong.o
Removing lib/libcurl_la-pop3.lo
Removing lib/libcurl_la-pop3.o
Removing lib/libcurl_la-progress.lo
Removing lib/libcurl_la-progress.o
Removing lib/libcurl_la-psl.lo
Removing lib/libcurl_la-psl.o
Removing lib/libcurl_la-rand.lo
Removing lib/libcurl_la-rand.o
Removing lib/libcurl_la-rename.lo
Removing lib/libcurl_la-rename.o
Removing lib/libcurl_la-request.lo
Removing lib/libcurl_la-request.o
Removing lib/libcurl_la-rtsp.lo
Removing lib/libcurl_la-rtsp.o
Removing lib/libcurl_la-select.lo
Removing lib/libcurl_la-select.o
Removing lib/libcurl_la-sendf.lo
Removing lib/libcurl_la-sendf.o
Removing lib/libcurl_la-setopt.lo
Removing lib/libcurl_la-setopt.o
Removing lib/libcurl_la-sha256.lo
Removing lib/libcurl_la-sha256.o
Removing lib/libcurl_la-share.lo
Removing lib/libcurl_la-share.o
Removing lib/libcurl_la-slist.lo
Removing lib/libcurl_la-slist.o
Removing lib/libcurl_la-smb.lo
Removing lib/libcurl_la-smb.o
Removing lib/libcurl_la-smtp.lo
Removing lib/libcurl_la-smtp.o
Removing lib/libcurl_la-socketpair.lo
Removing lib/libcurl_la-socketpair.o
Removing lib/libcurl_la-socks.lo
Removing lib/libcurl_la-socks.o
Removing lib/libcurl_la-socks_gssapi.lo
Removing lib/libcurl_la-socks_gssapi.o
Removing lib/libcurl_la-socks_sspi.lo
Removing lib/libcurl_la-socks_sspi.o
Removing lib/libcurl_la-speedcheck.lo
Removing lib/libcurl_la-speedcheck.o
Removing lib/libcurl_la-splay.lo
Removing lib/libcurl_la-splay.o
Removing lib/libcurl_la-strcase.lo
Removing lib/libcurl_la-strcase.o
Removing lib/libcurl_la-strdup.lo
Removing lib/libcurl_la-strdup.o
Removing lib/libcurl_la-strequal.lo
Removing lib/libcurl_la-strequal.o
Removing lib/libcurl_la-strerror.lo
Removing lib/libcurl_la-strerror.o
Removing lib/libcurl_la-strparse.lo
Removing lib/libcurl_la-strparse.o
Removing lib/libcurl_la-strtoofft.lo
Removing lib/libcurl_la-strtoofft.o
Removing lib/libcurl_la-system_win32.lo
Removing lib/libcurl_la-system_win32.o
Removing lib/libcurl_la-telnet.lo
Removing lib/libcurl_la-telnet.o
Removing lib/libcurl_la-tftp.lo
Removing lib/libcurl_la-tftp.o
Removing lib/libcurl_la-timediff.lo
Removing lib/libcurl_la-timediff.o
Removing lib/libcurl_la-timeval.lo
Removing lib/libcurl_la-timeval.o
Removing lib/libcurl_la-transfer.lo
Removing lib/libcurl_la-transfer.o
Removing lib/libcurl_la-url.lo
Removing lib/libcurl_la-url.o
Removing lib/libcurl_la-urlapi.lo
Removing lib/libcurl_la-urlapi.o
Removing lib/libcurl_la-version.lo
Removing lib/libcurl_la-version.o
Removing lib/libcurl_la-version_win32.lo
Removing lib/libcurl_la-version_win32.o
Removing lib/libcurl_la-warnless.lo
Removing lib/libcurl_la-warnless.o
Removing lib/libcurl_la-ws.lo
Removing lib/libcurl_la-ws.o
Removing lib/stamp-h1
Removing lib/vauth/.deps/
Removing lib/vauth/.dirstamp
Removing lib/vauth/libcurl_la-cleartext.lo
Removing lib/vauth/libcurl_la-cleartext.o
Removing lib/vauth/libcurl_la-cram.lo
Removing lib/vauth/libcurl_la-cram.o
Removing lib/vauth/libcurl_la-digest.lo
Removing lib/vauth/libcurl_la-digest.o
Removing lib/vauth/libcurl_la-digest_sspi.lo
Removing lib/vauth/libcurl_la-digest_sspi.o
Removing lib/vauth/libcurl_la-gsasl.lo
Removing lib/vauth/libcurl_la-gsasl.o
Removing lib/vauth/libcurl_la-krb5_gssapi.lo
Removing lib/vauth/libcurl_la-krb5_gssapi.o
Removing lib/vauth/libcurl_la-krb5_sspi.lo
Removing lib/vauth/libcurl_la-krb5_sspi.o
Removing lib/vauth/libcurl_la-ntlm.lo
Removing lib/vauth/libcurl_la-ntlm.o
Removing lib/vauth/libcurl_la-ntlm_sspi.lo
Removing lib/vauth/libcurl_la-ntlm_sspi.o
Removing lib/vauth/libcurl_la-oauth2.lo
Removing lib/vauth/libcurl_la-oauth2.o
Removing lib/vauth/libcurl_la-spnego_gssapi.lo
Removing lib/vauth/libcurl_la-spnego_gssapi.o
Removing lib/vauth/libcurl_la-spnego_sspi.lo
Removing lib/vauth/libcurl_la-spnego_sspi.o
Removing lib/vauth/libcurl_la-vauth.lo
Removing lib/vauth/libcurl_la-vauth.o
Removing lib/vquic/.deps/
Removing lib/vquic/.dirstamp
Removing lib/vquic/libcurl_la-curl_msh3.lo
Removing lib/vquic/libcurl_la-curl_msh3.o
Removing lib/vquic/libcurl_la-curl_ngtcp2.lo
Removing lib/vquic/libcurl_la-curl_ngtcp2.o
Removing lib/vquic/libcurl_la-curl_osslq.lo
Removing lib/vquic/libcurl_la-curl_osslq.o
Removing lib/vquic/libcurl_la-curl_quiche.lo
Removing lib/vquic/libcurl_la-curl_quiche.o
Removing lib/vquic/libcurl_la-vquic-tls.lo
Removing lib/vquic/libcurl_la-vquic-tls.o
Removing lib/vquic/libcurl_la-vquic.lo
Removing lib/vquic/libcurl_la-vquic.o
Removing lib/vssh/.deps/
Removing lib/vssh/.dirstamp
Removing lib/vssh/libcurl_la-curl_path.lo
Removing lib/vssh/libcurl_la-curl_path.o
Removing lib/vssh/libcurl_la-libssh.lo
Removing lib/vssh/libcurl_la-libssh.o
Removing lib/vssh/libcurl_la-libssh2.lo
Removing lib/vssh/libcurl_la-libssh2.o
Removing lib/vssh/libcurl_la-wolfssh.lo
Removing lib/vssh/libcurl_la-wolfssh.o
Removing lib/vtls/.deps/
Removing lib/vtls/.dirstamp
Removing lib/vtls/libcurl_la-bearssl.lo
Removing lib/vtls/libcurl_la-bearssl.o
Removing lib/vtls/libcurl_la-cipher_suite.lo
Removing lib/vtls/libcurl_la-cipher_suite.o
Removing lib/vtls/libcurl_la-gtls.lo
Removing lib/vtls/libcurl_la-gtls.o
Removing lib/vtls/libcurl_la-hostcheck.lo
Removing lib/vtls/libcurl_la-hostcheck.o
Removing lib/vtls/libcurl_la-keylog.lo
Removing lib/vtls/libcurl_la-keylog.o
Removing lib/vtls/libcurl_la-mbedtls.lo
Removing lib/vtls/libcurl_la-mbedtls.o
Removing lib/vtls/libcurl_la-mbedtls_threadlock.lo
Removing lib/vtls/libcurl_la-mbedtls_threadlock.o
Removing lib/vtls/libcurl_la-openssl.lo
Removing lib/vtls/libcurl_la-openssl.o
Removing lib/vtls/libcurl_la-rustls.lo
Removing lib/vtls/libcurl_la-rustls.o
Removing lib/vtls/libcurl_la-schannel.lo
Removing lib/vtls/libcurl_la-schannel.o
Removing lib/vtls/libcurl_la-schannel_verify.lo
Removing lib/vtls/libcurl_la-schannel_verify.o
Removing lib/vtls/libcurl_la-sectransp.lo
Removing lib/vtls/libcurl_la-sectransp.o
Removing lib/vtls/libcurl_la-vtls.lo
Removing lib/vtls/libcurl_la-vtls.o
Removing lib/vtls/libcurl_la-vtls_scache.lo
Removing lib/vtls/libcurl_la-vtls_scache.o
Removing lib/vtls/libcurl_la-vtls_spack.lo
Removing lib/vtls/libcurl_la-vtls_spack.o
Removing lib/vtls/libcurl_la-wolfssl.lo
Removing lib/vtls/libcurl_la-wolfssl.o
Removing lib/vtls/libcurl_la-x509asn1.lo
Removing lib/vtls/libcurl_la-x509asn1.o
Removing libcurl.pc
Removing libtool
Removing ltmain.sh
Removing m4/libtool.m4
Removing m4/ltoptions.m4
Removing m4/ltsugar.m4
Removing m4/ltversion.m4
Removing m4/lt~obsolete.m4
Removing missing
Removing packages/Makefile
Removing packages/Makefile.in
Removing packages/vms/Makefile
Removing packages/vms/Makefile.in
Removing scripts/Makefile
Removing scripts/Makefile.in
Removing src/.deps/
Removing src/.libs/
Removing src/Makefile
Removing src/Makefile.in
Removing src/curl
Removing src/curl-slist_wc.o
Removing src/curl-terminal.o
Removing src/curl-tool_bname.o
Removing src/curl-tool_ca_embed.o
Removing src/curl-tool_cb_dbg.o
Removing src/curl-tool_cb_hdr.o
Removing src/curl-tool_cb_prg.o
Removing src/curl-tool_cb_rea.o
Removing src/curl-tool_cb_see.o
Removing src/curl-tool_cb_soc.o
Removing src/curl-tool_cb_wrt.o
Removing src/curl-tool_cfgable.o
Removing src/curl-tool_dirhie.o
Removing src/curl-tool_doswin.o
Removing src/curl-tool_easysrc.o
Removing src/curl-tool_filetime.o
Removing src/curl-tool_findfile.o
Removing src/curl-tool_formparse.o
Removing src/curl-tool_getparam.o
Removing src/curl-tool_getpass.o
Removing src/curl-tool_help.o
Removing src/curl-tool_helpers.o
Removing src/curl-tool_hugehelp.o
Removing src/curl-tool_ipfs.o
Removing src/curl-tool_libinfo.o
Removing src/curl-tool_listhelp.o
Removing src/curl-tool_main.o
Removing src/curl-tool_msgs.o
Removing src/curl-tool_operate.o
Removing src/curl-tool_operhlp.o
Removing src/curl-tool_paramhlp.o
Removing src/curl-tool_parsecfg.o
Removing src/curl-tool_progress.o
Removing src/curl-tool_setopt.o
Removing src/curl-tool_sleep.o
Removing src/curl-tool_ssls.o
Removing src/curl-tool_stderr.o
Removing src/curl-tool_strdup.o
Removing src/curl-tool_urlglob.o
Removing src/curl-tool_util.o
Removing src/curl-tool_vms.o
Removing src/curl-tool_writeout.o
Removing src/curl-tool_writeout_json.o
Removing src/curl-tool_xattr.o
Removing src/curl-var.o
Removing src/tool_ca_embed.c
Removing src/tool_hugehelp.c
Removing tests/Makefile
Removing tests/Makefile.in
Removing tests/certs/Makefile
Removing tests/certs/Makefile.in
Removing tests/certs/scripts/Makefile
Removing tests/certs/scripts/Makefile.in
Removing tests/config
Removing tests/configurehelp.pm
Removing tests/data/Makefile
Removing tests/data/Makefile.in
Removing tests/http/Makefile
Removing tests/http/Makefile.in
Removing tests/http/clients/.deps/
Removing tests/http/clients/Makefile
Removing tests/http/clients/Makefile.in
Removing tests/http/config.ini
Removing tests/libtest/.deps/
Removing tests/libtest/Makefile
Removing tests/libtest/Makefile.in
Removing tests/server/.deps/
Removing tests/server/Makefile
Removing tests/server/Makefile.in
Removing tests/unit/.deps/
Removing tests/unit/Makefile
Removing tests/unit/Makefile.in
$ autoreconf -fi
libtoolize: putting auxiliary files in '.'.
libtoolize: copying file './ltmain.sh'
libtoolize: putting macros in AC_CONFIG_MACRO_DIRS, 'm4'.
libtoolize: copying file 'm4/libtool.m4'
libtoolize: copying file 'm4/ltoptions.m4'
libtoolize: copying file 'm4/ltsugar.m4'
libtoolize: copying file 'm4/ltversion.m4'
libtoolize: copying file 'm4/lt~obsolete.m4'
libtoolize: Remember to add 'LT_INIT' to configure.ac.
configure.ac:126: installing './compile'
configure.ac:422: installing './config.guess'
configure.ac:422: installing './config.sub'
configure.ac:126: installing './install-sh'
configure.ac:132: installing './missing'
docs/examples/Makefile.am: installing './depcomp'
$ bash -c find . -name config.guess -exec cp /usr/share/misc/config.guess {} \;
$ bash -c find . -name config.sub -exec cp /usr/share/misc/config.sub {} \;
$ chmod +x configure
$ ./configure --disable-shared --without-ssl --disable-docs
checking whether to enable maintainer-specific portions of Makefiles... no
checking whether make supports nested variables... yes
checking whether to enable debug build options... no
checking whether to enable compiler optimizer... (assumed) yes
checking whether to enable strict compiler warnings... no
checking whether to enable compiler warnings as errors... no
checking whether to enable curl debug memory tracking... no
checking whether to enable hiding of library internal symbols... yes
checking whether to enable c-ares for DNS lookups... no
checking whether to disable dependency on -lrt... (assumed no)
checking whether to enable HTTPSRR support... no
checking whether to enable ECH support... no
checking whether to enable SSL session export support... no
checking for path separator... :
checking for sed... /usr/bin/sed
checking for grep... /usr/bin/grep
checking that grep -E works... yes
checking for ar... /usr/bin/ar
checking for a BSD-compatible install... /usr/bin/install -c
checking for gcc... ccache gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether the compiler supports GNU C... yes
checking whether ccache gcc accepts -g... yes
checking for ccache gcc option to enable C11 features... none needed
checking whether ccache gcc understands -c and -o together... yes
checking how to run the C preprocessor... ccache gcc -E
checking for stdio.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for strings.h... yes
checking for sys/stat.h... yes
checking for sys/types.h... yes
checking for unistd.h... yes
checking for stdatomic.h... yes
checking if _Atomic is available... yes
checking for a sed that does not truncate output... (cached) /usr/bin/sed
checking for code coverage support... no
checking whether build environment is sane... yes
checking for a race-free mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports the include directive... yes (GNU style)
checking dependency style of ccache gcc... gcc3
checking curl version... 8.13.0-DEV
checking for httpd... no
checking for apache2... no
checking for apxs... no
configure: httpd/apache2 not in PATH, http tests disabled
configure: apxs not in PATH, http tests disabled
checking for nghttpx... no
checking for caddy... /usr/bin/caddy
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking for grep that handles long lines and -e... (cached) /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking if OS is AIX (to define _ALL_SOURCE)... no
checking if _THREAD_SAFE is already defined... no
checking if _THREAD_SAFE is actually needed... no
checking if _THREAD_SAFE is onwards defined... no
checking if _REENTRANT is already defined... no
checking if _REENTRANT is actually needed... no
checking if _REENTRANT is onwards defined... no
checking for special C compiler options needed for large files... no
checking for _FILE_OFFSET_BITS value needed for large files... no
checking how to print strings... printf
checking for a sed that does not truncate output... (cached) /usr/bin/sed
checking for fgrep... /usr/bin/grep -F
checking for ld used by ccache gcc... /usr/bin/ld
checking if the linker (/usr/bin/ld) is GNU ld... yes
checking for BSD- or MS-compatible name lister (nm)... /usr/bin/nm -B
checking the name lister (/usr/bin/nm -B) interface... BSD nm
checking whether ln -s works... yes
checking the maximum length of command line arguments... 1572864
checking how to convert x86_64-pc-linux-gnu file names to x86_64-pc-linux-gnu format... func_convert_file_noop
checking how to convert x86_64-pc-linux-gnu file names to toolchain format... func_convert_file_noop
checking for /usr/bin/ld option to reload object files... -r
checking for objdump... objdump
checking how to recognize dependent libraries... pass_all
checking for dlltool... no
checking how to associate runtime and link libraries... printf %s\n
checking for archiver @FILE support... @
checking for strip... strip
checking for ranlib... ranlib
checking command to parse /usr/bin/nm -B output from ccache gcc object... ok
checking for sysroot... no
checking for a working dd... /usr/bin/dd
checking how to truncate binary pipes... /usr/bin/dd bs=4096 count=1
checking for mt... mt
checking if mt is a manifest tool... no
checking for dlfcn.h... yes
checking for objdir... .libs
checking if ccache gcc supports -fno-rtti -fno-exceptions... no
checking for ccache gcc option to produce PIC... -fPIC -DPIC
checking if ccache gcc PIC flag -fPIC -DPIC works... yes
checking if ccache gcc static flag -static works... yes
checking if ccache gcc supports -c -o file.o... yes
checking if ccache gcc supports -c -o file.o... (cached) yes
checking whether the ccache gcc linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes
checking dynamic linker characteristics... GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
checking whether stripping libraries is possible... yes
checking if libtool supports shared libraries... yes
checking whether to build shared libraries... no
checking whether to build static libraries... yes
checking whether to build shared libraries with -version-info... yes
checking whether to build shared libraries with -no-undefined... no
checking whether to build shared libraries with -mimpure-text... no
checking whether to build shared libraries with PIC... yes
checking whether to build static libraries with PIC... yes
checking whether to build shared libraries only... no
checking whether to build static libraries only... yes
checking for windres... no
checking if cpp -P is needed... yes
checking if cpp -P works... yes
checking if compiler is DEC/Compaq/HP C... no
checking if compiler is HP-UX C... no
checking if compiler is IBM C... no
checking if compiler is Intel C... no
checking if compiler is clang... no
checking if compiler is GNU C... yes
checking compiler version... gcc '1100' (raw: '11')
checking if compiler is SunPro C... no
checking if compiler is Tiny C... no
checking whether build target is a native Windows one... no
checking if compiler accepts some basic options... yes
configure: compiler options added: -Werror-implicit-function-declaration
checking if compiler optimizer assumed setting might be used... yes
checking if compiler accepts optimizer enabling options... yes
configure: compiler options added: -O2
checking if compiler accepts strict warning options... yes
configure: compiler options added: -Wno-system-headers
checking if compiler halts on compilation errors... yes
checking if compiler halts on negative sized arrays... yes
checking if compiler halts on function prototype mismatch... yes
checking if compiler supports hiding library internal symbols... yes
checking whether build target supports Win32 crypto API... no
checking whether to build libcurl and curl in "unity" mode... no
checking whether to build tests into single-binary bundles... no
checking whether to support http... yes
checking whether to support ftp... yes
checking whether to support file... yes
checking whether to support IPFS... yes
checking whether to support ldap... yes
checking whether to support ldaps... yes
checking whether to support rtsp... yes
checking whether to support proxies... yes
checking whether to support dict... yes
checking whether to support telnet... yes
checking whether to support tftp... yes
checking whether to support pop3... yes
checking whether to support imap... yes
checking whether to support smb... yes
checking whether to support smtp... yes
checking whether to support gopher... yes
checking whether to support mqtt... no
checking whether to provide built-in manual... yes
checking whether to build documentation... no
checking whether to enable generation of C code... yes
checking whether to use libgcc... no
checking if X/Open network library is required... no
checking for gethostbyname... yes
checking whether build target is a native Windows one... (cached) no
checking for proto/bsdsocket.h... no
checking for connect in libraries... yes
checking for sys/types.h... (cached) yes
checking for sys/time.h... yes
checking for monotonic clock_gettime... yes
checking for clock_gettime in libraries... no additional lib required
checking if monotonic clock_gettime works... yes
checking for sys/types.h... (cached) yes
checking for sys/time.h... (cached) yes
checking for raw monotonic clock_gettime... yes
checking for pkg-config... /usr/bin/pkg-config
checking for zlib options with pkg-config... found
checking for zlib.h... yes
configure: found both libz and libz.h header
checking for BrotliDecoderDecompress in -lbrotlidec... no
checking for brotli/decode.h... no
checking for ZSTD_createDStream in -lzstd... no
checking for zstd.h... no
checking for lber.h... no
checking for ldap.h... no
checking for ldap_ssl.h... no
checking for LDAP libraries... cannot find LDAP libraries
checking whether to enable IPv6... yes
checking if struct sockaddr_in6 has sin6_scope_id member... yes
checking if argv can be written to... yes
checking if GSS-API support is requested... no
checking whether to enable Windows native SSL/TLS... no
checking whether to enable Secure Transport... no
checking whether to enable Amiga native SSL/TLS (AmiSSL v5)... no
checking for pkg-config... (cached) /usr/bin/pkg-config
checking for libpsl options with pkg-config... found
checking for psl_builtin in -lpsl... yes
checking for libpsl.h... yes
checking for library containing gsasl_init... no
checking for RTMP_Init in -lrtmp... no
checking whether versioned symbols are wanted... no
checking whether to build with libidn2... (assumed) yes
checking for pkg-config... (cached) /usr/bin/pkg-config
checking for libidn2 options with pkg-config... no
configure: IDN_LIBS: "-lidn2"
configure: IDN_LDFLAGS: ""
configure: IDN_CPPFLAGS: ""
configure: IDN_DIR: ""
checking if idn2_lookup_ul can be linked... no
checking for idn2.h... no
checking for pkg-config... (cached) /usr/bin/pkg-config
checking for libnghttp2 options with pkg-config... no
checking for nghttp2_session_get_stream_local_window_size in -lnghttp2... no
checking for sys/types.h... (cached) yes
checking for sys/time.h... (cached) yes
checking for sys/select.h... yes
checking for sys/socket.h... yes
checking for sys/ioctl.h... yes
checking for unistd.h... (cached) yes
checking for arpa/inet.h... yes
checking for net/if.h... yes
checking for netinet/in.h... yes
checking for netinet/in6.h... no
checking for sys/un.h... yes
checking for linux/tcp.h... yes
checking for netinet/tcp.h... yes
checking for netinet/udp.h... yes
checking for netdb.h... yes
checking for sys/sockio.h... no
checking for sys/stat.h... (cached) yes
checking for sys/param.h... yes
checking for termios.h... yes
checking for termio.h... yes
checking for fcntl.h... yes
checking for io.h... no
checking for pwd.h... yes
checking for utime.h... yes
checking for sys/utime.h... no
checking for sys/poll.h... yes
checking for poll.h... yes
checking for sys/resource.h... yes
checking for libgen.h... yes
checking for locale.h... yes
checking for stdbool.h... yes
checking for sys/filio.h... no
checking for sys/eventfd.h... yes
checking for an ANSI C-conforming const... yes
checking for size_t... yes
checking for sys/types.h... (cached) yes
checking for sys/time.h... (cached) yes
checking for sys/socket.h... (cached) yes
checking for struct timeval... yes
checking run-time libs availability... fine
checking size of size_t... 8
checking size of long... 8
checking size of int... 4
checking size of time_t... 8
checking size of off_t... 8
checking size of curl_off_t... 8
checking size of curl_socket_t... 4
checking for long long... yes
checking for ssize_t... yes
checking for bool... yes
checking for sa_family_t... yes
checking for suseconds_t... yes
checking if time_t is unsigned... no
checking for struct sockaddr_storage... yes
checking for sys/select.h... (cached) yes
checking for sys/socket.h... (cached) yes
checking for select... yes
checking for sys/types.h... (cached) yes
checking for sys/socket.h... (cached) yes
checking for recv... yes
checking for sys/types.h... (cached) yes
checking for sys/socket.h... (cached) yes
checking for send... yes
checking for sys/types.h... (cached) yes
checking for sys/socket.h... (cached) yes
checking for MSG_NOSIGNAL... yes
checking for sys/types.h... (cached) yes
checking for unistd.h... (cached) yes
checking if alarm can be linked... yes
checking if alarm is prototyped... yes
checking if alarm is compilable... yes
checking if alarm usage allowed... yes
checking if alarm might be used... yes
checking for sys/types.h... (cached) yes
checking for strings.h... (cached) yes
checking for sys/types.h... (cached) yes
checking for libgen.h... (cached) yes
checking if basename can be linked... yes
checking if basename is prototyped... yes
checking if basename is compilable... yes
checking if basename usage allowed... yes
checking if basename might be used... yes
checking if closesocket is prototyped... no
checking if closesocket might be used... no
checking for sys/types.h... (cached) yes
checking for sys/socket.h... (cached) yes
checking if CloseSocket is compilable... no
checking if CloseSocket might be used... no
checking for sys/types.h... (cached) yes
checking for unistd.h... (cached) yes
checking for fcntl.h... (cached) yes
checking if fcntl can be linked... yes
checking if fcntl is prototyped... yes
checking if fcntl is compilable... yes
checking if fcntl usage allowed... yes
checking if fcntl might be used... yes
checking if fcntl O_NONBLOCK is compilable... yes
checking if fcntl O_NONBLOCK usage allowed... yes
checking if fcntl O_NONBLOCK might be used... yes
checking whether build target is a native Windows one... (cached) no
checking for sys/types.h... (cached) yes
checking for netdb.h... (cached) yes
checking if freeaddrinfo is prototyped... yes
checking if freeaddrinfo is compilable... yes
checking if freeaddrinfo usage allowed... yes
checking if freeaddrinfo might be used... yes
checking for sys/types.h... (cached) yes
checking for sys/xattr.h... yes
checking if fsetxattr can be linked... yes
checking if fsetxattr is prototyped... yes
checking if fsetxattr takes 5 args.... yes
checking if fsetxattr is compilable... yes
checking if fsetxattr usage allowed... yes
checking if fsetxattr might be used... yes
checking if ftruncate can be linked... yes
checking if ftruncate is prototyped... yes
checking if ftruncate is compilable... yes
checking if ftruncate usage allowed... yes
checking if ftruncate might be used... yes
checking for sys/types.h... (cached) yes
checking if getaddrinfo is prototyped... yes
checking if getaddrinfo is compilable... yes
checking if getaddrinfo seems to work... yes
checking if getaddrinfo usage allowed... yes
checking if getaddrinfo might be used... yes
checking if getaddrinfo is threadsafe... yes
checking if gethostbyname_r can be linked... yes
checking if gethostbyname_r is prototyped... yes
checking if gethostbyname_r takes 3 args.... no
checking if gethostbyname_r takes 5 args.... no
checking if gethostbyname_r takes 6 args.... yes
checking if gethostbyname_r is compilable... yes
checking if gethostbyname_r usage allowed... yes
checking if gethostbyname_r might be used... yes
checking if gethostname is prototyped... yes
checking if gethostname is compilable... yes
checking for gethostname arg 2 data type... size_t
checking if gethostname usage allowed... yes
checking if gethostname might be used... yes
checking if getpeername is prototyped... yes
checking if getpeername is compilable... yes
checking if getpeername usage allowed... yes
checking if getpeername might be used... yes
checking if getsockname is prototyped... yes
checking if getsockname is compilable... yes
checking if getsockname usage allowed... yes
checking if getsockname might be used... yes
checking for sys/types.h... (cached) yes
checking for sys/socket.h... (cached) yes
checking for netinet/in.h... (cached) yes
checking for ifaddrs.h... yes
checking if getifaddrs can be linked... yes
checking if getifaddrs is prototyped... yes
checking if getifaddrs is compilable... yes
checking if getifaddrs seems to work... yes
checking if getifaddrs usage allowed... yes
checking if getifaddrs might be used... yes
checking for sys/types.h... (cached) yes
checking for sys/time.h... (cached) yes
checking if gmtime_r can be linked... yes
checking if gmtime_r is prototyped... yes
checking if gmtime_r is compilable... yes
checking if gmtime_r seems to work... yes
checking if gmtime_r usage allowed... yes
checking if gmtime_r might be used... yes
checking for sys/types.h... (cached) yes
checking for sys/socket.h... (cached) yes
checking for netinet/in.h... (cached) yes
checking for arpa/inet.h... (cached) yes
checking if inet_ntop can be linked... yes
checking if inet_ntop is prototyped... yes
checking if inet_ntop is compilable... yes
checking if inet_ntop seems to work... yes
checking if inet_ntop usage allowed... yes
checking if inet_ntop might be used... yes
checking if inet_pton can be linked... yes
checking if inet_pton is prototyped... yes
checking if inet_pton is compilable... yes
checking if inet_pton seems to work... yes
checking if inet_pton usage allowed... yes
checking if inet_pton might be used... yes
checking for sys/types.h... (cached) yes
checking for unistd.h... (cached) yes
checking for sys/socket.h... (cached) yes
checking for sys/ioctl.h... (cached) yes
checking for stropts.h... no
checking if ioctl can be linked... yes
checking if ioctl is prototyped... yes
checking if ioctl is compilable... yes
checking if ioctl usage allowed... yes
checking if ioctl might be used... yes
checking if ioctl FIONBIO is compilable... yes
checking if ioctl FIONBIO usage allowed... yes
checking if ioctl FIONBIO might be used... yes
checking if ioctl SIOCGIFADDR is compilable... yes
checking if ioctl SIOCGIFADDR usage allowed... yes
checking if ioctl SIOCGIFADDR might be used... yes
checking if ioctlsocket is prototyped... no
checking if ioctlsocket might be used... no
checking if IoctlSocket is compilable... no
checking if IoctlSocket might be used... no
checking if memrchr can be linked... yes
checking if memrchr is prototyped... yes
checking if memrchr is compilable... yes
checking if memrchr usage allowed... yes
checking if memrchr might be used... yes
checking for sys/types.h... (cached) yes
checking if sigaction can be linked... yes
checking if sigaction is prototyped... yes
checking if sigaction is compilable... yes
checking if sigaction usage allowed... yes
checking if sigaction might be used... yes
checking if siginterrupt can be linked... yes
checking if siginterrupt is prototyped... yes
checking if siginterrupt is compilable... yes
checking if siginterrupt usage allowed... yes
checking if siginterrupt might be used... yes
checking if signal can be linked... yes
checking if signal is prototyped... yes
checking if signal is compilable... yes
checking if signal usage allowed... yes
checking if signal might be used... yes
checking for sys/types.h... (cached) yes
checking if sigsetjmp can be linked... no
checking if sigsetjmp seems a macro... yes
checking if sigsetjmp is compilable... yes
checking if sigsetjmp usage allowed... yes
checking if sigsetjmp might be used... yes
checking if socket is prototyped... yes
checking if socket is compilable... yes
checking if socket usage allowed... yes
checking if socket might be used... yes
checking if socketpair can be linked... yes
checking if socketpair is prototyped... yes
checking if socketpair is compilable... yes
checking if socketpair usage allowed... yes
checking if socketpair might be used... yes
checking if strdup can be linked... yes
checking if strdup is prototyped... yes
checking if strdup is compilable... yes
checking if strdup usage allowed... yes
checking if strdup might be used... yes
checking if strerror_r can be linked... yes
checking if strerror_r is prototyped... yes
checking if strerror_r is compilable... yes
checking if strerror_r is glibc like... yes
checking if strerror_r seems to work... yes
checking if strerror_r usage allowed... yes
checking if strerror_r might be used... yes
checking for eventfd... yes
checking for fnmatch... yes
checking for geteuid... yes
checking for getpass_r... no
checking for getppid... yes
checking for getpwuid... yes
checking for getpwuid_r... yes
checking for getrlimit... yes
checking for gettimeofday... yes
checking for mach_absolute_time... no
checking for pipe... yes
checking for poll... yes
checking for sendmsg... yes
checking for sendmmsg... yes
checking for setlocale... yes
checking for setrlimit... yes
checking for snprintf... yes
checking for utime... yes
checking for utimes... yes
checking for if_nametoindex... yes
checking for realpath... yes
checking for sched_yield... yes
checking if strcasecmp can be linked... yes
checking if strcasecmp is prototyped... yes
checking if strcasecmp is compilable... yes
checking if strcasecmp usage allowed... yes
checking if strcasecmp might be used... yes
checking if strcmpi can be linked... no
checking if strcmpi might be used... no
checking if stricmp can be linked... no
checking if stricmp might be used... no
checking for setmode... no
checking for arc4random... no
checking for fseeko... yes
checking for ccache gcc options needed to detect all undeclared functions... none needed
checking whether fseeko is declared... yes
checking how to set a socket into non-blocking mode... fcntl O_NONBLOCK
checking for perl... /usr/bin/perl
checking whether to enable the threaded resolver... yes
checking for pthread.h... yes
checking for pthread_create... yes
checking for dirent.h... yes
checking for opendir... yes
checking convert -I options to -isystem... yes
checking whether to enable verbose strings... yes
checking whether to enable SSPI support (Windows native builds only)... no
checking whether to enable basic authentication method... yes
checking whether to enable bearer authentication method... yes
checking whether to enable digest authentication method... yes
checking whether to enable kerberos authentication method... yes
checking whether to enable negotiate authentication method... yes
checking whether to enable aws sig methods... yes
checking whether to support NTLM... yes
checking whether to enable TLS-SRP authentication... yes
checking whether to enable Unix domain sockets... auto
checking for struct sockaddr_un.sun_path... yes
checking whether to support cookies... yes
checking whether to support socketpair... yes
checking whether to support HTTP authentication... yes
checking whether to support DoH... yes
checking whether to support the MIME API... yes
checking whether to support binding connections locally... yes
checking whether to support the form API... yes
checking whether to support date parsing... yes
checking whether to support netrc parsing... yes
checking whether to support progress-meter... yes
checking whether to support the SHA-512/256 hash algorithm... yes
checking whether to support DNS shuffling... yes
checking whether to support curl_easy_option*... yes
checking whether to support alt-svc... yes
checking whether to support headers-api... yes
configure: disables HSTS due to lack of SSL
checking whether to support WebSockets... yes
checking whether hiding of library internal symbols will actually happen... yes
checking if this build supports HTTPS-proxy... no
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating docs/Makefile
config.status: creating docs/examples/Makefile
config.status: creating docs/libcurl/Makefile
config.status: creating docs/libcurl/opts/Makefile
config.status: creating docs/cmdline-opts/Makefile
config.status: creating include/Makefile
config.status: creating include/curl/Makefile
config.status: creating src/Makefile
config.status: creating lib/Makefile
config.status: creating scripts/Makefile
config.status: creating lib/libcurl.vers
config.status: creating tests/Makefile
config.status: creating tests/config
config.status: creating tests/configurehelp.pm
config.status: creating tests/certs/Makefile
config.status: creating tests/certs/scripts/Makefile
config.status: creating tests/data/Makefile
config.status: creating tests/server/Makefile
config.status: creating tests/libtest/Makefile
config.status: creating tests/unit/Makefile
config.status: creating tests/http/config.ini
config.status: creating tests/http/Makefile
config.status: creating tests/http/clients/Makefile
config.status: creating packages/Makefile
config.status: creating packages/vms/Makefile
config.status: creating curl-config
config.status: creating libcurl.pc
config.status: creating lib/curl_config.h
config.status: executing depfiles commands
config.status: executing libtool commands
configure: Configured to build curl/libcurl:
Host setup: x86_64-pc-linux-gnu
Install prefix: /usr/local
Compiler: ccache gcc
CFLAGS: -Werror-implicit-function-declaration -O2 -Wno-system-headers
CFLAGS extras:
CPPFLAGS: -D_GNU_SOURCE
LDFLAGS:
curl-config:
LIBS: -lpsl -lz
curl version: 8.13.0-DEV
SSL: no (--with-{openssl,gnutls,mbedtls,wolfssl,schannel,secure-transport,amissl,bearssl,rustls} )
SSH: no (--with-{libssh,libssh2})
zlib: enabled
brotli: no (--with-brotli)
zstd: no (--with-zstd)
GSS-API: no (--with-gssapi)
GSASL: no (libgsasl not found)
TLS-SRP: no (--enable-tls-srp)
resolver: POSIX threaded
IPv6: enabled
Unix sockets: enabled
IDN: no (--with-{libidn2,winidn})
Build docs: no
Build libcurl: Shared=no, Static=yes
Built-in manual: no (--enable-manual)
--libcurl option: enabled (--disable-libcurl-option)
Verbose errors: enabled (--disable-verbose)
Code coverage: disabled
SSPI: no (--enable-sspi)
ca cert bundle: no
ca cert path:
ca cert embed: no
ca fallback:
LDAP: no (--enable-ldap / --with-ldap-lib / --with-lber-lib)
LDAPS: no (--enable-ldaps)
IPFS/IPNS: enabled
RTSP: enabled
RTMP: no (--with-librtmp)
PSL: enabled
Alt-svc: enabled (--disable-alt-svc)
Headers API: enabled (--disable-headers-api)
HSTS: no (--enable-hsts)
HTTP1: enabled (internal)
HTTP2: no (--with-nghttp2)
HTTP3: no (--with-ngtcp2 --with-nghttp3, --with-quiche, --with-openssl-quic, --with-msh3)
ECH: no (--enable-ech)
HTTPS RR: no (--enable-httpsrr)
SSLS-EXPORT: no (--enable-ssls-export)
Protocols: dict file ftp gopher http imap ipfs ipns mqtt pop3 rtsp smtp telnet tftp ws
Features: alt-svc AsynchDNS IPv6 Largefile libz PSL threadsafe UnixSockets
configure: WARNING: Cannot find libraries for LDAP support: LDAP disabled
configure: WARNING: libgsasl was not found
configure: WARNING: Cannot find libidn2
$ make -j3
Making all in lib
make[1]: Entering directory '/root/asi_db/builds/curl/_worktrees/w0/lib'
make all-am
make[2]: Entering directory '/root/asi_db/builds/curl/_worktrees/w0/lib'
CC libcurl_la-altsvc.lo
CC libcurl_la-amigaos.lo
CC libcurl_la-asyn-ares.lo
CC libcurl_la-asyn-thread.lo
CC libcurl_la-base64.lo
CC libcurl_la-bufq.lo
CC libcurl_la-bufref.lo
CC libcurl_la-cf-h1-proxy.lo
CC libcurl_la-cf-h2-proxy.lo
CC libcurl_la-cf-haproxy.lo
CC libcurl_la-cf-https-connect.lo
CC libcurl_la-cf-socket.lo
CC libcurl_la-cfilters.lo
CC libcurl_la-conncache.lo
CC libcurl_la-cshutdn.lo
CC libcurl_la-connect.lo
CC libcurl_la-content_encoding.lo
CC libcurl_la-cookie.lo
CC libcurl_la-curl_addrinfo.lo
CC libcurl_la-curl_des.lo
CC libcurl_la-curl_endian.lo
CC libcurl_la-curl_fnmatch.lo
CC libcurl_la-curl_get_line.lo
CC libcurl_la-curl_gethostname.lo
CC libcurl_la-curl_gssapi.lo
CC libcurl_la-curl_memrchr.lo
CC libcurl_la-curl_multibyte.lo
CC libcurl_la-curl_ntlm_core.lo
CC libcurl_la-curl_range.lo
CC libcurl_la-curl_rtmp.lo
CC libcurl_la-curl_sasl.lo
CC libcurl_la-curl_sha512_256.lo
CC libcurl_la-curl_sspi.lo
CC libcurl_la-curl_threads.lo
CC libcurl_la-curl_trc.lo
CC libcurl_la-cw-out.lo
CC libcurl_la-cw-pause.lo
CC libcurl_la-dict.lo
CC libcurl_la-dllmain.lo
CC libcurl_la-doh.lo
CC libcurl_la-dynbuf.lo
CC libcurl_la-dynhds.lo
CC libcurl_la-easy.lo
CC libcurl_la-easygetopt.lo
CC libcurl_la-easyoptions.lo
CC libcurl_la-escape.lo
CC libcurl_la-file.lo
CC libcurl_la-fileinfo.lo
CC libcurl_la-fopen.lo
CC libcurl_la-formdata.lo
CC libcurl_la-ftp.lo
CC libcurl_la-ftplistparser.lo
CC libcurl_la-getenv.lo
CC libcurl_la-getinfo.lo
CC libcurl_la-gopher.lo
CC libcurl_la-hash.lo
CC libcurl_la-hash_offt.lo
CC libcurl_la-headers.lo
CC libcurl_la-hmac.lo
CC libcurl_la-hostasyn.lo
CC libcurl_la-hostip.lo
CC libcurl_la-hostip4.lo
CC libcurl_la-hostip6.lo
CC libcurl_la-hostsyn.lo
CC libcurl_la-hsts.lo
CC libcurl_la-http.lo
CC libcurl_la-http1.lo
CC libcurl_la-http2.lo
CC libcurl_la-http_aws_sigv4.lo
CC libcurl_la-http_chunks.lo
CC libcurl_la-http_digest.lo
CC libcurl_la-http_negotiate.lo
CC libcurl_la-http_ntlm.lo
CC libcurl_la-http_proxy.lo
CC libcurl_la-httpsrr.lo
CC libcurl_la-idn.lo
CC libcurl_la-if2ip.lo
CC libcurl_la-imap.lo
CC libcurl_la-inet_ntop.lo
CC libcurl_la-inet_pton.lo
CC libcurl_la-krb5.lo
CC libcurl_la-ldap.lo
CC libcurl_la-llist.lo
CC libcurl_la-macos.lo
CC libcurl_la-md4.lo
CC libcurl_la-md5.lo
CC libcurl_la-memdebug.lo
CC libcurl_la-mime.lo
CC libcurl_la-mprintf.lo
CC libcurl_la-mqtt.lo
CC libcurl_la-multi.lo
CC libcurl_la-multi_ev.lo
CC libcurl_la-netrc.lo
CC libcurl_la-nonblock.lo
CC libcurl_la-noproxy.lo
CC libcurl_la-openldap.lo
CC libcurl_la-parsedate.lo
CC libcurl_la-pingpong.lo
CC libcurl_la-pop3.lo
CC libcurl_la-progress.lo
CC libcurl_la-psl.lo
CC libcurl_la-rand.lo
CC libcurl_la-rename.lo
CC libcurl_la-request.lo
CC libcurl_la-rtsp.lo
CC libcurl_la-select.lo
CC libcurl_la-sendf.lo
CC libcurl_la-setopt.lo
CC libcurl_la-sha256.lo
CC libcurl_la-share.lo
CC libcurl_la-slist.lo
CC libcurl_la-smb.lo
CC libcurl_la-smtp.lo
CC libcurl_la-socketpair.lo
CC libcurl_la-socks.lo
CC libcurl_la-socks_gssapi.lo
CC libcurl_la-socks_sspi.lo
CC libcurl_la-speedcheck.lo
CC libcurl_la-splay.lo
CC libcurl_la-strcase.lo
CC libcurl_la-strdup.lo
CC libcurl_la-strequal.lo
CC libcurl_la-strerror.lo
CC libcurl_la-strparse.lo
CC libcurl_la-strtoofft.lo
CC libcurl_la-system_win32.lo
CC libcurl_la-telnet.lo
CC libcurl_la-tftp.lo
CC libcurl_la-timediff.lo
CC libcurl_la-timeval.lo
CC libcurl_la-transfer.lo
CC libcurl_la-url.lo
CC libcurl_la-urlapi.lo
CC libcurl_la-version.lo
CC libcurl_la-version_win32.lo
CC libcurl_la-warnless.lo
CC libcurl_la-ws.lo
CC vauth/libcurl_la-cleartext.lo
CC vauth/libcurl_la-cram.lo
CC vauth/libcurl_la-digest.lo
CC vauth/libcurl_la-digest_sspi.lo
CC vauth/libcurl_la-gsasl.lo
CC vauth/libcurl_la-krb5_gssapi.lo
CC vauth/libcurl_la-krb5_sspi.lo
CC vauth/libcurl_la-ntlm.lo
CC vauth/libcurl_la-ntlm_sspi.lo
CC vauth/libcurl_la-oauth2.lo
CC vauth/libcurl_la-spnego_gssapi.lo
CC vauth/libcurl_la-spnego_sspi.lo
CC vauth/libcurl_la-vauth.lo
CC vtls/libcurl_la-bearssl.lo
CC vtls/libcurl_la-cipher_suite.lo
CC vtls/libcurl_la-gtls.lo
CC vtls/libcurl_la-hostcheck.lo
CC vtls/libcurl_la-keylog.lo
CC vtls/libcurl_la-mbedtls.lo
CC vtls/libcurl_la-mbedtls_threadlock.lo
CC vtls/libcurl_la-openssl.lo
CC vtls/libcurl_la-rustls.lo
CC vtls/libcurl_la-schannel.lo
CC vtls/libcurl_la-schannel_verify.lo
CC vtls/libcurl_la-sectransp.lo
CC vtls/libcurl_la-vtls.lo
CC vtls/libcurl_la-vtls_scache.lo
CC vtls/libcurl_la-vtls_spack.lo
CC vtls/libcurl_la-wolfssl.lo
CC vtls/libcurl_la-x509asn1.lo
CC vquic/libcurl_la-curl_msh3.lo
CC vquic/libcurl_la-curl_ngtcp2.lo
CC vquic/libcurl_la-curl_osslq.lo
CC vquic/libcurl_la-curl_quiche.lo
CC vquic/libcurl_la-vquic-tls.lo
CC vquic/libcurl_la-vquic.lo
CC vssh/libcurl_la-libssh.lo
CC vssh/libcurl_la-libssh2.lo
CC vssh/libcurl_la-curl_path.lo
CC vssh/libcurl_la-wolfssh.lo
CCLD libcurl.la
make[2]: Leaving directory '/root/asi_db/builds/curl/_worktrees/w0/lib'
make[1]: Leaving directory '/root/asi_db/builds/curl/_worktrees/w0/lib'
Making all in docs
make[1]: Entering directory '/root/asi_db/builds/curl/_worktrees/w0/docs'
Making all in .
make[2]: Entering directory '/root/asi_db/builds/curl/_worktrees/w0/docs'
make[2]: Nothing to be done for 'all-am'.
make[2]: Leaving directory '/root/asi_db/builds/curl/_worktrees/w0/docs'
Making all in cmdline-opts
make[2]: Entering directory '/root/asi_db/builds/curl/_worktrees/w0/docs/cmdline-opts'
make[2]: Nothing to be done for 'all'.
make[2]: Leaving directory '/root/asi_db/builds/curl/_worktrees/w0/docs/cmdline-opts'
Making all in libcurl
make[2]: Entering directory '/root/asi_db/builds/curl/_worktrees/w0/docs/libcurl'
Making all in opts
make[3]: Entering directory '/root/asi_db/builds/curl/_worktrees/w0/docs/libcurl/opts'
make[3]: Nothing to be done for 'all'.
make[3]: Leaving directory '/root/asi_db/builds/curl/_worktrees/w0/docs/libcurl/opts'
make[3]: Entering directory '/root/asi_db/builds/curl/_worktrees/w0/docs/libcurl'
make[3]: Nothing to be done for 'all-am'.
make[3]: Leaving directory '/root/asi_db/builds/curl/_worktrees/w0/docs/libcurl'
make[2]: Leaving directory '/root/asi_db/builds/curl/_worktrees/w0/docs/libcurl'
make[1]: Leaving directory '/root/asi_db/builds/curl/_worktrees/w0/docs'
Making all in src
make[1]: Entering directory '/root/asi_db/builds/curl/_worktrees/w0/src'
CC curl-slist_wc.o
CC curl-tool_bname.o
CC curl-terminal.o
CC curl-tool_cb_dbg.o
CC curl-tool_cb_hdr.o
CC curl-tool_cb_prg.o
CC curl-tool_cb_rea.o
CC curl-tool_cb_see.o
CC curl-tool_cb_soc.o
CC curl-tool_cb_wrt.o
CC curl-tool_cfgable.o
CC curl-tool_dirhie.o
CC curl-tool_doswin.o
CC curl-tool_easysrc.o
CC curl-tool_filetime.o
CC curl-tool_findfile.o
CC curl-tool_formparse.o
CC curl-tool_getparam.o
CC curl-tool_getpass.o
CC curl-tool_help.o
CC curl-tool_helpers.o
CC curl-tool_ipfs.o
CC curl-tool_libinfo.o
CC curl-tool_listhelp.o
CC curl-tool_main.o
CC curl-tool_msgs.o
CC curl-tool_operate.o
CC curl-tool_operhlp.o
CC curl-tool_paramhlp.o
CC curl-tool_parsecfg.o
CC curl-tool_progress.o
CC curl-tool_setopt.o
CC curl-tool_sleep.o
CC curl-tool_ssls.o
CC curl-tool_stderr.o
CC curl-tool_strdup.o
CC curl-tool_urlglob.o
CC curl-tool_util.o
CC curl-tool_vms.o
CC curl-tool_writeout.o
CC curl-tool_writeout_json.o
CC curl-tool_xattr.o
CC curl-var.o
echo '#include "tool_hugehelp.h"' >> tool_hugehelp.c
echo 'extern const void *curl_ca_embed; const void *curl_ca_embed;' > tool_ca_embed.c
CC ../lib/curl-base64.o
CC ../lib/curl-curl_multibyte.o
CC ../lib/curl-dynbuf.o
CC ../lib/curl-nonblock.o
CC ../lib/curl-strtoofft.o
CC ../lib/curl-strparse.o
CC ../lib/curl-strcase.o
CC ../lib/curl-timediff.o
CC ../lib/curl-version_win32.o
CC ../lib/curl-warnless.o
CC curl-tool_hugehelp.o
CC curl-tool_ca_embed.o
CCLD curl
make[1]: Leaving directory '/root/asi_db/builds/curl/_worktrees/w0/src'
Making all in scripts
make[1]: Entering directory '/root/asi_db/builds/curl/_worktrees/w0/scripts'
make[1]: Nothing to be done for 'all'.
make[1]: Leaving directory '/root/asi_db/builds/curl/_worktrees/w0/scripts'
make[1]: Entering directory '/root/asi_db/builds/curl/_worktrees/w0'
make[1]: Nothing to be done for 'all-am'.
make[1]: Leaving directory '/root/asi_db/builds/curl/_worktrees/w0'
| @@ -602,7 +602,7 @@ problems may have been fixed or changed somewhat since this was written. | |
| 16.3 aws-sigv4 has problems with particular URLs | |
| - | https://github.com/curl/curl/issues/13058 |
| + | https://github.com/curl/curl/issues/13085 |
| 16.6 aws-sigv4 does not behave well with AWS VPC Lattice | |
| @@ -66,9 +66,15 @@ Many people have wrongly used this option to replace the entire request with | |
| their own, including multiple headers and POST contents. While that might work | |
| in many cases, it might cause libcurl to send invalid requests and it could | |
| possibly confuse the remote server badly. Use CURLOPT_POST(3) and | |
| - | CURLOPT_POSTFIELDS(3) to set POST data. Use CURLOPT_HTTPHEADER(3) |
| - | to replace or extend the set of headers sent by libcurl. Use |
| - | CURLOPT_HTTP_VERSION(3) to change HTTP version. |
| + | CURLOPT_POSTFIELDS(3) to set POST data. Use CURLOPT_HTTPHEADER(3) to replace |
| + | or extend the set of headers sent by libcurl. Use CURLOPT_HTTP_VERSION(3) to |
| + | change the HTTP version. |
| + | |
| + | When this option is used together with CURLOPT_FOLLOWLOCATION(3), the custom |
| + | set method overrides the method libcurl could otherwise change to for the |
| + | subsequent requests. You can fine-tune that decision by using the |
| + | CURLFOLLOW_OBEYCODE bit to CURLOPT_FOLLOWLOCATION(3) to make redirects adhere |
| + | to the redirect response code as the protocol instructs. |
| ## FTP | |
| @@ -25,19 +25,23 @@ CURLOPT_FOLLOWLOCATION - follow HTTP 3xx redirects | |
| ~~~c | |
| #include <curl/curl.h> | |
| - | CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FOLLOWLOCATION, long enable); |
| + | CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FOLLOWLOCATION, long mode); |
| ~~~ | |
| # DESCRIPTION | |
| - | A long parameter set to 1 tells the library to follow any Location: header |
| - | redirects that an HTTP server sends in a 30x response. The Location: header |
| - | can specify a relative or an absolute URL to follow. |
| + | This option tells the library to follow `Location:` header redirects that an |
| + | HTTP server sends in a 30x response. The `Location:` header can specify a |
| + | relative or an absolute URL to follow. The long parameter *mode* instructs how |
| + | libcurl should act on subsequent requests. |
| - | libcurl issues another request for the new URL and follows subsequent new |
| - | `Location:` redirects all the way until no more such headers are returned or |
| - | the maximum limit is reached. CURLOPT_MAXREDIRS(3) is used to limit the number |
| - | of redirects libcurl follows. |
| + | *mode* only had a single value (1L) for a long time that enables redirect |
| + | following. Since 8.13.0, two additional modes are also supported. See below. |
| + | |
| + | When following redirects, libcurl issues another request for the new URL and |
| + | follows subsequent new `Location:` redirects all the way until no more such |
| + | headers are returned or the maximum limit is reached. CURLOPT_MAXREDIRS(3) is |
| + | used to limit the number of redirects libcurl follows. |
| libcurl restricts what protocols it automatically follow redirects to. The | |
| accepted target protocols are set with CURLOPT_REDIR_PROTOCOLS_STR(3). By | |
| @@ -64,6 +68,45 @@ client may not want to pass on to other servers than the initially intended | |
| host and for all other headers than the two mentioned above, there is no | |
| protection from this happening when libcurl is told to follow redirects. | |
| + | Pick one of the following modes: |
| + | |
| + | ## CURLFOLLOW_ALL (1) |
| + | |
| + | Before 8.13.0 this bit had no name and 1L was just the value to enable this |
| + | option. This makes a set custom method be used in all HTTP requests, even |
| + | after redirects. |
| + | |
| + | ## CURLFOLLOW_OBEYCODE (2) |
| + | |
| + | When there is a custom request method set with CURLOPT_CUSTOMREQUEST(3), that |
| + | set method replaces what libcurl would otherwise use. If a 301/302/303 |
| + | response code is returned to signal a redirect, the method is changed from |
| + | POST to `GET`. For 307/308, the custom method remains set and used. |
| + | |
| + | Note that only POST (or a custom post) is changed to GET on 301/302, its not |
| + | change PUT etc - and therefore also not when libcurl issues a custom PUT. A |
| + | 303 response makes it switch to GET independently of the original method |
| + | (except for HEAD). |
| + | |
| + | To control for which of the 301/302/303 status codes libcurl should *not* |
| + | switch back to GET for when doing a custom POST, and instead keep the custom |
| + | method, use CURLOPT_POSTREDIR(3). |
| + | |
| + | If you prefer a custom POST method to be reset to exactly the method `POST`, |
| + | use CURLFOLLOW_FIRSTONLY instead. |
| + | |
| + | ## CURLFOLLOW_FIRSTONLY (3) |
| + | |
| + | When there is a custom request method set with CURLOPT_CUSTOMREQUEST(3), that |
| + | set method replaces what libcurl would otherwise use in the first outgoing |
| + | request only. The second request is then done according to the redirect |
| + | response code. |
| + | |
| + | If you prefer your custom method to remain in use after a 307/308 redirect, |
| + | use CURLFOLLOW_OBEYCODE instead. |
| + | |
| + | ## |
| + | |
| # NOTE | |
| Since libcurl changes method or not based on the specific HTTP response code, | |
| @@ -72,6 +115,10 @@ libcurl would otherwise do and if not that carefully may even make it | |
| misbehave since CURLOPT_CUSTOMREQUEST(3) overrides the method libcurl would | |
| otherwise select internally. | |
| + | Setting the CURLFOLLOW_OBEYCODE bit makes libcurl *not* use the custom set |
| + | method after redirects for 301, 302 and 303 responses. Unless the |
| + | CURLOPT_POSTREDIR(3) bits are set for those status codes. |
| + | |
| # DEFAULT | |
| 0, disabled | |
| @@ -337,11 +337,11 @@ CURLE_UNRECOVERABLE_POLL 7.84.0 | |
| CURLE_UNSUPPORTED_PROTOCOL 7.1 | |
| CURLE_UPLOAD_FAILED 7.16.3 | |
| CURLE_URL_MALFORMAT 7.1 | |
| + | CURLE_ECH_REQUIRED 8.8.0 |
| CURLE_URL_MALFORMAT_USER 7.1 7.17.0 | |
| CURLE_USE_SSL_FAILED 7.17.0 | |
| CURLE_WEIRD_SERVER_REPLY 7.51.0 | |
| CURLE_WRITE_ERROR 7.1 | |
| - | CURLE_ECH_REQUIRED 8.8.0 |
| CURLFILETYPE_DEVICE_BLOCK 7.21.0 | |
| CURLFILETYPE_DEVICE_CHAR 7.21.0 | |
| CURLFILETYPE_DIRECTORY 7.21.0 | |
| @@ -359,6 +359,9 @@ CURLFINFOFLAG_KNOWN_PERM 7.21.0 | |
| CURLFINFOFLAG_KNOWN_SIZE 7.21.0 | |
| CURLFINFOFLAG_KNOWN_TIME 7.21.0 | |
| CURLFINFOFLAG_KNOWN_UID 7.21.0 | |
| + | CURLFOLLOW_ALL 8.13.0 |
| + | CURLFOLLOW_OBEYCODE 8.13.0 |
| + | CURLFOLLOW_FIRSTONLY 8.13.0 |
| CURLFORM_ARRAY 7.9.1 7.56.0 | |
| CURLFORM_ARRAY_END 7.9.1 7.9.5 7.9.6 | |
| CURLFORM_ARRAY_START 7.9.1 7.9.5 7.9.6 | |
| @@ -175,6 +175,16 @@ typedef enum { | |
| #define CURLSSLBACKEND_CYASSL CURLSSLBACKEND_WOLFSSL | |
| #define CURLSSLBACKEND_DARWINSSL CURLSSLBACKEND_SECURETRANSPORT | |
| + | /* bits for the CURLOPT_FOLLOWLOCATION option */ |
| + | #define CURLFOLLOW_ALL 1L /* generic follow redirects */ |
| + | |
| + | /* Do not use the custom method in the follow-up request if the HTTP code |
| + | instructs so (301, 302, 303). */ |
| + | #define CURLFOLLOW_OBEYCODE 2L |
| + | |
| + | /* Only use the custom method in the first request, always reset in the next */ |
| + | #define CURLFOLLOW_FIRSTONLY 3L |
| + | |
| struct curl_httppost { | |
| struct curl_httppost *next; /* next entry in the list */ | |
| char *name; /* pointer to allocated name */ | |
| @@ -1154,6 +1154,21 @@ static bool http_should_fail(struct Curl_easy *data, int httpcode) | |
| return data->state.authproblem; | |
| } | |
| + | static void http_switch_to_get(struct Curl_easy *data, int code) |
| + | { |
| + | const char *req = data->set.str[STRING_CUSTOMREQUEST]; |
| + | if((req || data->state.httpreq != HTTPREQ_GET) && |
| + | (data->set.http_follow_mode == CURLFOLLOW_OBEYCODE)) { |
| + | infof(data, "Switch to GET because of %d response", code); |
| + | data->state.http_ignorecustom = TRUE; |
| + | } |
| + | else if(req && (data->set.http_follow_mode != CURLFOLLOW_FIRSTONLY)) |
| + | infof(data, "Stick to %s instead of GET", req); |
| + | |
| + | data->state.httpreq = HTTPREQ_GET; |
| + | Curl_creader_set_rewind(data, FALSE); |
| + | } |
| + | |
| CURLcode Curl_http_follow(struct Curl_easy *data, const char *newurl, | |
| followtype type) | |
| { | |
| @@ -1320,6 +1335,12 @@ CURLcode Curl_http_follow(struct Curl_easy *data, const char *newurl, | |
| data->state.url_alloc = TRUE; | |
| Curl_req_soft_reset(&data->req, data); | |
| infof(data, "Issue another request to this URL: '%s'", data->state.url); | |
| + | if((data->set.http_follow_mode == CURLFOLLOW_FIRSTONLY) && |
| + | data->set.str[STRING_CUSTOMREQUEST] && |
| + | !data->state.http_ignorecustom) { |
| + | data->state.http_ignorecustom = TRUE; |
| + | infof(data, "Drop custom request method for next request"); |
| + | } |
| /* | |
| * We get here when the HTTP code is 300-399 (and 401). We need to perform | |
| @@ -1361,11 +1382,8 @@ CURLcode Curl_http_follow(struct Curl_easy *data, const char *newurl, | |
| if((data->state.httpreq == HTTPREQ_POST | |
| || data->state.httpreq == HTTPREQ_POST_FORM | |
| || data->state.httpreq == HTTPREQ_POST_MIME) | |
| - | && !(data->set.keep_post & CURL_REDIR_POST_301)) { |
| - | infof(data, "Switch from POST to GET"); |
| - | data->state.httpreq = HTTPREQ_GET; |
| - | Curl_creader_set_rewind(data, FALSE); |
| - | } |
| + | && !(data->set.keep_post & CURL_REDIR_POST_301)) |
| + | http_switch_to_get(data, 301); |
| break; | |
| case 302: /* Found */ | |
| /* (quote from RFC7231, section 6.4.3) | |
| @@ -1387,11 +1405,8 @@ CURLcode Curl_http_follow(struct Curl_easy *data, const char *newurl, | |
| if((data->state.httpreq == HTTPREQ_POST | |
| || data->state.httpreq == HTTPREQ_POST_FORM | |
| || data->state.httpreq == HTTPREQ_POST_MIME) | |
| - | && !(data->set.keep_post & CURL_REDIR_POST_302)) { |
| - | infof(data, "Switch from POST to GET"); |
| - | data->state.httpreq = HTTPREQ_GET; |
| - | Curl_creader_set_rewind(data, FALSE); |
| - | } |
| + | && !(data->set.keep_post & CURL_REDIR_POST_302)) |
| + | http_switch_to_get(data, 302); |
| break; | |
| case 303: /* See Other */ | |
| @@ -1404,11 +1419,8 @@ CURLcode Curl_http_follow(struct Curl_easy *data, const char *newurl, | |
| ((data->state.httpreq != HTTPREQ_POST && | |
| data->state.httpreq != HTTPREQ_POST_FORM && | |
| data->state.httpreq != HTTPREQ_POST_MIME) || | |
| - | !(data->set.keep_post & CURL_REDIR_POST_303))) { |
| - | data->state.httpreq = HTTPREQ_GET; |
| - | infof(data, "Switch to %s", |
| - | data->req.no_body ? "HEAD" : "GET"); |
| - | } |
| + | !(data->set.keep_post & CURL_REDIR_POST_303))) |
| + | http_switch_to_get(data, 303); |
| break; | |
| case 304: /* Not Modified */ | |
| /* 304 means we did a conditional request and it was "Not modified". | |
| @@ -1802,8 +1814,10 @@ void Curl_http_method(struct Curl_easy *data, struct connectdata *conn, | |
| httpreq = HTTPREQ_PUT; | |
| /* Now set the 'request' pointer to the proper request string */ | |
| - | if(data->set.str[STRING_CUSTOMREQUEST]) |
| + | if(data->set.str[STRING_CUSTOMREQUEST] && |
| + | !data->state.http_ignorecustom) { |
| request = data->set.str[STRING_CUSTOMREQUEST]; | |
| + | } |
| else { | |
| if(data->req.no_body) | |
| request = "HEAD"; | |
| @@ -3137,7 +3151,7 @@ static CURLcode http_header(struct Curl_easy *data, | |
| else { | |
| data->req.location = location; | |
| - | if(data->set.http_follow_location) { |
| + | if(data->set.http_follow_mode) { |
| DEBUGASSERT(!data->req.newurl); | |
| data->req.newurl = strdup(data->req.location); /* clone */ | |
| if(!data->req.newurl) | |
| @@ -525,7 +525,9 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option, | |
| /* | |
| * Follow Location: header hints on an HTTP-server. | |
| */ | |
| - | data->set.http_follow_location = enabled; |
| + | if(uarg > 3) |
| + | return CURLE_BAD_FUNCTION_ARGUMENT; |
| + | data->set.http_follow_mode = (unsigned char)uarg; |
| break; | |
| case CURLOPT_UNRESTRICTED_AUTH: | |
| @@ -1358,6 +1358,7 @@ struct UrlState { | |
| BIT(internal); /* internal: true if this easy handle was created for | |
| internal use and the user does not have ownership of the | |
| handle. */ | |
| + | BIT(http_ignorecustom); /* ignore custom method from now */ |
| }; | |
| /* | |
| @@ -1727,6 +1728,7 @@ struct UserDefined { | |
| CURLOPT_GSSAPI_DELEGATION */ | |
| unsigned char gssapi_delegation; | |
| #endif | |
| + | unsigned char http_follow_mode; /* follow HTTP redirects */ |
| BIT(connect_only); /* make connection/request, then let application use the | |
| socket */ | |
| BIT(connect_only_ws); /* special websocket connect-only level */ | |
| @@ -1778,7 +1780,6 @@ struct UserDefined { | |
| BIT(hide_progress); /* do not use the progress meter */ | |
| BIT(http_fail_on_error); /* fail on HTTP error codes >= 400 */ | |
| BIT(http_keep_sending_on_error); /* for HTTP status codes >= 300 */ | |
| - | BIT(http_follow_location); /* follow HTTP redirects */ |
| BIT(http_transfer_encoding); /* request compressed HTTP transfer-encoding */ | |
| BIT(allow_auth_to_other_hosts); | |
| BIT(include_header); /* include received protocol headers in data output */ | |
| @@ -207,7 +207,8 @@ test1540 test1541 test1542 test1543 test1544 test1545 test1546 \ | |
| \ | |
| test1550 test1551 test1552 test1553 test1554 test1555 test1556 test1557 \ | |
| test1558 test1559 test1560 test1561 test1562 test1563 test1564 test1565 \ | |
| - | test1566 test1567 test1568 test1569 test1570 \ |
| + | test1566 test1567 test1568 test1569 test1570 test1571 test1572 test1573 \ |
| + | test1574 test1575 test1576 test1577 test1578 test1579 test1580 test1581 \ |
| \ | |
| test1590 test1591 test1592 test1593 test1594 test1595 test1596 test1597 \ | |
| test1598 \ | |
| @@ -0,0 +1,95 @@ | |
| + | <testcase> |
| + | <info> |
| + | <keywords> |
| + | CURLFOLLOW_OBEYCODE |
| + | CURLOPT_FOLLOWLOCATION |
| + | </keywords> |
| + | </info> |
| + | # |
| + | # Server-side |
| + | <reply> |
| + | <data crlf="yes"> |
| + | HTTP/1.1 302 OK |
| + | Date: Thu, 09 Nov 2010 14:49:00 GMT |
| + | Server: test-server/fake |
| + | Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT |
| + | ETag: "21025-dc7-39462498" |
| + | Accept-Ranges: bytes |
| + | Location: %TESTNUMBER0001 |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | Funny-head: yesyes |
| + | |
| + | -foo- |
| + | </data> |
| + | <data1 crlf="yes"> |
| + | HTTP/1.1 200 OK |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | |
| + | -bar- |
| + | </data> |
| + | <datacheck crlf="yes"> |
| + | HTTP/1.1 302 OK |
| + | Date: Thu, 09 Nov 2010 14:49:00 GMT |
| + | Server: test-server/fake |
| + | Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT |
| + | ETag: "21025-dc7-39462498" |
| + | Accept-Ranges: bytes |
| + | Location: %TESTNUMBER0001 |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | Funny-head: yesyes |
| + | |
| + | HTTP/1.1 200 OK |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | |
| + | -bar- |
| + | </datacheck> |
| + | </reply> |
| + | |
| + | # Client-side |
| + | <client> |
| + | <server> |
| + | http |
| + | </server> |
| + | <features> |
| + | http |
| + | </features> |
| + | <tool> |
| + | lib%TESTNUMBER |
| + | </tool> |
| + | |
| + | <name> |
| + | CURLFOLLOW_OBEYCODE with custom POST method, 302 => GET |
| + | </name> |
| + | <command> |
| + | http://%HOSTIP:%HTTPPORT/%TESTNUMBER 1571 |
| + | </command> |
| + | </client> |
| + | |
| + | # Verify data after the test has been "shot" |
| + | <verify> |
| + | <strip> |
| + | ^User-Agent:.* |
| + | </strip> |
| + | <protocol nonewline="yes" crlf="yes"> |
| + | IGLOO /%TESTNUMBER HTTP/1.1 |
| + | Host: %HOSTIP:%HTTPPORT |
| + | Accept: */* |
| + | Content-Length: 3 |
| + | Content-Type: application/x-www-form-urlencoded |
| + | |
| + | mooGET /%TESTNUMBER0001 HTTP/1.1 |
| + | Host: %HOSTIP:%HTTPPORT |
| + | Accept: */* |
| + | |
| + | |
| + | </protocol> |
| + | </verify> |
| + | </testcase> |
| @@ -0,0 +1,97 @@ | |
| + | <testcase> |
| + | <info> |
| + | <keywords> |
| + | CURLFOLLOW_OBEYCODE |
| + | CURLOPT_FOLLOWLOCATION |
| + | </keywords> |
| + | </info> |
| + | # |
| + | # Server-side |
| + | <reply> |
| + | <data crlf="yes"> |
| + | HTTP/1.1 308 OK |
| + | Date: Thu, 09 Nov 2010 14:49:00 GMT |
| + | Server: test-server/fake |
| + | Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT |
| + | ETag: "21025-dc7-39462498" |
| + | Accept-Ranges: bytes |
| + | Location: %TESTNUMBER0001 |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | Funny-head: yesyes |
| + | |
| + | -foo- |
| + | </data> |
| + | <data1 crlf="yes"> |
| + | HTTP/1.1 200 OK |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | |
| + | -bar- |
| + | </data> |
| + | <datacheck crlf="yes"> |
| + | HTTP/1.1 308 OK |
| + | Date: Thu, 09 Nov 2010 14:49:00 GMT |
| + | Server: test-server/fake |
| + | Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT |
| + | ETag: "21025-dc7-39462498" |
| + | Accept-Ranges: bytes |
| + | Location: %TESTNUMBER0001 |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | Funny-head: yesyes |
| + | |
| + | HTTP/1.1 200 OK |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | |
| + | -bar- |
| + | </datacheck> |
| + | </reply> |
| + | |
| + | # Client-side |
| + | <client> |
| + | <server> |
| + | http |
| + | </server> |
| + | <features> |
| + | http |
| + | </features> |
| + | <tool> |
| + | lib1571 |
| + | </tool> |
| + | |
| + | <name> |
| + | CURLFOLLOW_OBEYCODE with custom POST method, 308 => custom |
| + | </name> |
| + | <command> |
| + | http://%HOSTIP:%HTTPPORT/%TESTNUMBER 1571 |
| + | </command> |
| + | </client> |
| + | |
| + | # Verify data after the test has been "shot" |
| + | <verify> |
| + | <strip> |
| + | ^User-Agent:.* |
| + | </strip> |
| + | <protocol nonewline="yes" crlf="yes"> |
| + | IGLOO /%TESTNUMBER HTTP/1.1 |
| + | Host: %HOSTIP:%HTTPPORT |
| + | Accept: */* |
| + | Content-Length: 3 |
| + | Content-Type: application/x-www-form-urlencoded |
| + | |
| + | mooIGLOO /%TESTNUMBER0001 HTTP/1.1 |
| + | Host: %HOSTIP:%HTTPPORT |
| + | Accept: */* |
| + | Content-Length: 3 |
| + | Content-Type: application/x-www-form-urlencoded |
| + | |
| + | moo |
| + | </protocol> |
| + | </verify> |
| + | </testcase> |
| @@ -0,0 +1,92 @@ | |
| + | <testcase> |
| + | <info> |
| + | <keywords> |
| + | CURLFOLLOW_OBEYCODE |
| + | CURLOPT_FOLLOWLOCATION |
| + | </keywords> |
| + | </info> |
| + | # |
| + | # Server-side |
| + | <reply> |
| + | <data crlf="yes"> |
| + | HTTP/1.1 302 OK |
| + | Date: Thu, 09 Nov 2010 14:49:00 GMT |
| + | Server: test-server/fake |
| + | Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT |
| + | ETag: "21025-dc7-39462498" |
| + | Accept-Ranges: bytes |
| + | Location: %TESTNUMBER0001 |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | Funny-head: yesyes |
| + | |
| + | -foo- |
| + | </data> |
| + | <data1 crlf="yes"> |
| + | HTTP/1.1 200 OK |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | |
| + | -bar- |
| + | </data> |
| + | <datacheck crlf="yes"> |
| + | HTTP/1.1 302 OK |
| + | Date: Thu, 09 Nov 2010 14:49:00 GMT |
| + | Server: test-server/fake |
| + | Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT |
| + | ETag: "21025-dc7-39462498" |
| + | Accept-Ranges: bytes |
| + | Location: %TESTNUMBER0001 |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | Funny-head: yesyes |
| + | |
| + | HTTP/1.1 200 OK |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | |
| + | -bar- |
| + | </datacheck> |
| + | </reply> |
| + | |
| + | # Client-side |
| + | <client> |
| + | <server> |
| + | http |
| + | </server> |
| + | <features> |
| + | http |
| + | </features> |
| + | <tool> |
| + | lib1571 |
| + | </tool> |
| + | |
| + | <name> |
| + | CURLFOLLOW_OBEYCODE with custom GET method, 301 => custom |
| + | </name> |
| + | <command> |
| + | http://%HOSTIP:%HTTPPORT/%TESTNUMBER 1573 |
| + | </command> |
| + | </client> |
| + | |
| + | # Verify data after the test has been "shot" |
| + | <verify> |
| + | <strip> |
| + | ^User-Agent:.* |
| + | </strip> |
| + | <protocol crlf="yes"> |
| + | IGLOO /%TESTNUMBER HTTP/1.1 |
| + | Host: %HOSTIP:%HTTPPORT |
| + | Accept: */* |
| + | |
| + | IGLOO /%TESTNUMBER0001 HTTP/1.1 |
| + | Host: %HOSTIP:%HTTPPORT |
| + | Accept: */* |
| + | |
| + | </protocol> |
| + | </verify> |
| + | </testcase> |
| @@ -0,0 +1,92 @@ | |
| + | <testcase> |
| + | <info> |
| + | <keywords> |
| + | CURLFOLLOW_FIRSTONLY |
| + | CURLOPT_FOLLOWLOCATION |
| + | </keywords> |
| + | </info> |
| + | # |
| + | # Server-side |
| + | <reply> |
| + | <data crlf="yes"> |
| + | HTTP/1.1 302 OK |
| + | Date: Thu, 09 Nov 2010 14:49:00 GMT |
| + | Server: test-server/fake |
| + | Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT |
| + | ETag: "21025-dc7-39462498" |
| + | Accept-Ranges: bytes |
| + | Location: %TESTNUMBER0001 |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | Funny-head: yesyes |
| + | |
| + | -foo- |
| + | </data> |
| + | <data1 crlf="yes"> |
| + | HTTP/1.1 200 OK |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | |
| + | -bar- |
| + | </data> |
| + | <datacheck crlf="yes"> |
| + | HTTP/1.1 302 OK |
| + | Date: Thu, 09 Nov 2010 14:49:00 GMT |
| + | Server: test-server/fake |
| + | Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT |
| + | ETag: "21025-dc7-39462498" |
| + | Accept-Ranges: bytes |
| + | Location: %TESTNUMBER0001 |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | Funny-head: yesyes |
| + | |
| + | HTTP/1.1 200 OK |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | |
| + | -bar- |
| + | </datacheck> |
| + | </reply> |
| + | |
| + | # Client-side |
| + | <client> |
| + | <server> |
| + | http |
| + | </server> |
| + | <features> |
| + | http |
| + | </features> |
| + | <tool> |
| + | lib1571 |
| + | </tool> |
| + | |
| + | <name> |
| + | CURLFOLLOW_FIRSTONLY with custom GET method, 301 => GET |
| + | </name> |
| + | <command> |
| + | http://%HOSTIP:%HTTPPORT/%TESTNUMBER 1574 |
| + | </command> |
| + | </client> |
| + | |
| + | # Verify data after the test has been "shot" |
| + | <verify> |
| + | <strip> |
| + | ^User-Agent:.* |
| + | </strip> |
| + | <protocol crlf="yes"> |
| + | IGLOO /%TESTNUMBER HTTP/1.1 |
| + | Host: %HOSTIP:%HTTPPORT |
| + | Accept: */* |
| + | |
| + | GET /%TESTNUMBER0001 HTTP/1.1 |
| + | Host: %HOSTIP:%HTTPPORT |
| + | Accept: */* |
| + | |
| + | </protocol> |
| + | </verify> |
| + | </testcase> |
| @@ -0,0 +1,97 @@ | |
| + | <testcase> |
| + | <info> |
| + | <keywords> |
| + | CURLFOLLOW_FIRSTONLY |
| + | CURLOPT_FOLLOWLOCATION |
| + | </keywords> |
| + | </info> |
| + | # |
| + | # Server-side |
| + | <reply> |
| + | <data crlf="yes"> |
| + | HTTP/1.1 308 OK |
| + | Date: Thu, 09 Nov 2010 14:49:00 GMT |
| + | Server: test-server/fake |
| + | Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT |
| + | ETag: "21025-dc7-39462498" |
| + | Accept-Ranges: bytes |
| + | Location: %TESTNUMBER0001 |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | Funny-head: yesyes |
| + | |
| + | -foo- |
| + | </data> |
| + | <data1 crlf="yes"> |
| + | HTTP/1.1 200 OK |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | |
| + | -bar- |
| + | </data> |
| + | <datacheck crlf="yes"> |
| + | HTTP/1.1 308 OK |
| + | Date: Thu, 09 Nov 2010 14:49:00 GMT |
| + | Server: test-server/fake |
| + | Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT |
| + | ETag: "21025-dc7-39462498" |
| + | Accept-Ranges: bytes |
| + | Location: %TESTNUMBER0001 |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | Funny-head: yesyes |
| + | |
| + | HTTP/1.1 200 OK |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | |
| + | -bar- |
| + | </datacheck> |
| + | </reply> |
| + | |
| + | # Client-side |
| + | <client> |
| + | <server> |
| + | http |
| + | </server> |
| + | <features> |
| + | http |
| + | </features> |
| + | <tool> |
| + | lib1571 |
| + | </tool> |
| + | |
| + | <name> |
| + | CURLFOLLOW_FIRSTONLY with custom POST method, 308 => POST |
| + | </name> |
| + | <command> |
| + | http://%HOSTIP:%HTTPPORT/%TESTNUMBER 1575 |
| + | </command> |
| + | </client> |
| + | |
| + | # Verify data after the test has been "shot" |
| + | <verify> |
| + | <strip> |
| + | ^User-Agent:.* |
| + | </strip> |
| + | <protocol nonewline="yes" crlf="yes"> |
| + | IGLOO /%TESTNUMBER HTTP/1.1 |
| + | Host: %HOSTIP:%HTTPPORT |
| + | Accept: */* |
| + | Content-Length: 3 |
| + | Content-Type: application/x-www-form-urlencoded |
| + | |
| + | mooPOST /%TESTNUMBER0001 HTTP/1.1 |
| + | Host: %HOSTIP:%HTTPPORT |
| + | Accept: */* |
| + | Content-Length: 3 |
| + | Content-Type: application/x-www-form-urlencoded |
| + | |
| + | moo |
| + | </protocol> |
| + | </verify> |
| + | </testcase> |
| @@ -0,0 +1,95 @@ | |
| + | <testcase> |
| + | <info> |
| + | <keywords> |
| + | CURLFOLLOW_OBEYCODE |
| + | CURLOPT_FOLLOWLOCATION |
| + | </keywords> |
| + | </info> |
| + | # |
| + | # Server-side |
| + | <reply> |
| + | <data crlf="yes"> |
| + | HTTP/1.1 302 OK |
| + | Date: Thu, 09 Nov 2010 14:49:00 GMT |
| + | Server: test-server/fake |
| + | Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT |
| + | ETag: "21025-dc7-39462498" |
| + | Accept-Ranges: bytes |
| + | Location: %TESTNUMBER0001 |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | Funny-head: yesyes |
| + | |
| + | -foo- |
| + | </data> |
| + | <data1 crlf="yes"> |
| + | HTTP/1.1 200 OK |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | |
| + | -bar- |
| + | </data> |
| + | <datacheck crlf="yes"> |
| + | HTTP/1.1 302 OK |
| + | Date: Thu, 09 Nov 2010 14:49:00 GMT |
| + | Server: test-server/fake |
| + | Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT |
| + | ETag: "21025-dc7-39462498" |
| + | Accept-Ranges: bytes |
| + | Location: %TESTNUMBER0001 |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | Funny-head: yesyes |
| + | |
| + | HTTP/1.1 200 OK |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | |
| + | -bar- |
| + | </datacheck> |
| + | </reply> |
| + | |
| + | # Client-side |
| + | <client> |
| + | <server> |
| + | http |
| + | </server> |
| + | <features> |
| + | http |
| + | </features> |
| + | <tool> |
| + | lib%TESTNUMBER |
| + | </tool> |
| + | |
| + | <name> |
| + | CURLFOLLOW_OBEYCODE with custom PUT method, 302 => custom |
| + | </name> |
| + | <command> |
| + | http://%HOSTIP:%HTTPPORT/%TESTNUMBER 1576 |
| + | </command> |
| + | </client> |
| + | |
| + | # Verify data after the test has been "shot" |
| + | <verify> |
| + | <strip> |
| + | ^User-Agent:.* |
| + | </strip> |
| + | <protocol nonewline="yes" crlf="yes"> |
| + | CURL /%TESTNUMBER HTTP/1.1 |
| + | Host: %HOSTIP:%HTTPPORT |
| + | Accept: */* |
| + | Content-Length: 45 |
| + | |
| + | request indicates that the client, which madeCURL /%TESTNUMBER0001 HTTP/1.1 |
| + | Host: %HOSTIP:%HTTPPORT |
| + | Accept: */* |
| + | Content-Length: 45 |
| + | |
| + | request indicates that the client, which made |
| + | </protocol> |
| + | </verify> |
| + | </testcase> |
| @@ -0,0 +1,95 @@ | |
| + | <testcase> |
| + | <info> |
| + | <keywords> |
| + | CURLFOLLOW_OBEYCODE |
| + | CURLOPT_FOLLOWLOCATION |
| + | </keywords> |
| + | </info> |
| + | # |
| + | # Server-side |
| + | <reply> |
| + | <data crlf="yes"> |
| + | HTTP/1.1 308 OK |
| + | Date: Thu, 09 Nov 2010 14:49:00 GMT |
| + | Server: test-server/fake |
| + | Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT |
| + | ETag: "21025-dc7-39462498" |
| + | Accept-Ranges: bytes |
| + | Location: %TESTNUMBER0001 |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | Funny-head: yesyes |
| + | |
| + | -foo- |
| + | </data> |
| + | <data1 crlf="yes"> |
| + | HTTP/1.1 200 OK |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | |
| + | -bar- |
| + | </data> |
| + | <datacheck crlf="yes"> |
| + | HTTP/1.1 308 OK |
| + | Date: Thu, 09 Nov 2010 14:49:00 GMT |
| + | Server: test-server/fake |
| + | Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT |
| + | ETag: "21025-dc7-39462498" |
| + | Accept-Ranges: bytes |
| + | Location: %TESTNUMBER0001 |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | Funny-head: yesyes |
| + | |
| + | HTTP/1.1 200 OK |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | |
| + | -bar- |
| + | </datacheck> |
| + | </reply> |
| + | |
| + | # Client-side |
| + | <client> |
| + | <server> |
| + | http |
| + | </server> |
| + | <features> |
| + | http |
| + | </features> |
| + | <tool> |
| + | lib1576 |
| + | </tool> |
| + | |
| + | <name> |
| + | CURLFOLLOW_OBEYCODE with custom PUT method, 308 => custom |
| + | </name> |
| + | <command> |
| + | http://%HOSTIP:%HTTPPORT/%TESTNUMBER %TESTNUMBER |
| + | </command> |
| + | </client> |
| + | |
| + | # Verify data after the test has been "shot" |
| + | <verify> |
| + | <strip> |
| + | ^User-Agent:.* |
| + | </strip> |
| + | <protocol nonewline="yes" crlf="yes"> |
| + | CURL /%TESTNUMBER HTTP/1.1 |
| + | Host: %HOSTIP:%HTTPPORT |
| + | Accept: */* |
| + | Content-Length: 45 |
| + | |
| + | request indicates that the client, which madeCURL /%TESTNUMBER0001 HTTP/1.1 |
| + | Host: %HOSTIP:%HTTPPORT |
| + | Accept: */* |
| + | Content-Length: 45 |
| + | |
| + | request indicates that the client, which made |
| + | </protocol> |
| + | </verify> |
| + | </testcase> |
| @@ -0,0 +1,95 @@ | |
| + | <testcase> |
| + | <info> |
| + | <keywords> |
| + | CURLFOLLOW_FIRSTONLY |
| + | CURLOPT_FOLLOWLOCATION |
| + | </keywords> |
| + | </info> |
| + | # |
| + | # Server-side |
| + | <reply> |
| + | <data crlf="yes"> |
| + | HTTP/1.1 302 OK |
| + | Date: Thu, 09 Nov 2010 14:49:00 GMT |
| + | Server: test-server/fake |
| + | Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT |
| + | ETag: "21025-dc7-39462498" |
| + | Accept-Ranges: bytes |
| + | Location: %TESTNUMBER0001 |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | Funny-head: yesyes |
| + | |
| + | -foo- |
| + | </data> |
| + | <data1 crlf="yes"> |
| + | HTTP/1.1 200 OK |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | |
| + | -bar- |
| + | </data> |
| + | <datacheck crlf="yes"> |
| + | HTTP/1.1 302 OK |
| + | Date: Thu, 09 Nov 2010 14:49:00 GMT |
| + | Server: test-server/fake |
| + | Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT |
| + | ETag: "21025-dc7-39462498" |
| + | Accept-Ranges: bytes |
| + | Location: %TESTNUMBER0001 |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | Funny-head: yesyes |
| + | |
| + | HTTP/1.1 200 OK |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | |
| + | -bar- |
| + | </datacheck> |
| + | </reply> |
| + | |
| + | # Client-side |
| + | <client> |
| + | <server> |
| + | http |
| + | </server> |
| + | <features> |
| + | http |
| + | </features> |
| + | <tool> |
| + | lib1576 |
| + | </tool> |
| + | |
| + | <name> |
| + | CURLFOLLOW_FIRSTONLY with custom PUT method, 302 => PUT |
| + | </name> |
| + | <command> |
| + | http://%HOSTIP:%HTTPPORT/%TESTNUMBER %TESTNUMBER |
| + | </command> |
| + | </client> |
| + | |
| + | # Verify data after the test has been "shot" |
| + | <verify> |
| + | <strip> |
| + | ^User-Agent:.* |
| + | </strip> |
| + | <protocol nonewline="yes" crlf="yes"> |
| + | CURL /%TESTNUMBER HTTP/1.1 |
| + | Host: %HOSTIP:%HTTPPORT |
| + | Accept: */* |
| + | Content-Length: 45 |
| + | |
| + | request indicates that the client, which madePUT /%TESTNUMBER0001 HTTP/1.1 |
| + | Host: %HOSTIP:%HTTPPORT |
| + | Accept: */* |
| + | Content-Length: 45 |
| + | |
| + | request indicates that the client, which made |
| + | </protocol> |
| + | </verify> |
| + | </testcase> |
| @@ -0,0 +1,93 @@ | |
| + | <testcase> |
| + | <info> |
| + | <keywords> |
| + | CURLFOLLOW_OBEYCODE |
| + | CURLOPT_FOLLOWLOCATION |
| + | </keywords> |
| + | </info> |
| + | # |
| + | # Server-side |
| + | <reply> |
| + | <data crlf="yes"> |
| + | HTTP/1.1 303 OK |
| + | Date: Thu, 09 Nov 2010 14:49:00 GMT |
| + | Server: test-server/fake |
| + | Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT |
| + | ETag: "21025-dc7-39462498" |
| + | Accept-Ranges: bytes |
| + | Location: %TESTNUMBER0001 |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | Funny-head: yesyes |
| + | |
| + | -foo- |
| + | </data> |
| + | <data1 crlf="yes"> |
| + | HTTP/1.1 200 OK |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | |
| + | -bar- |
| + | </data> |
| + | <datacheck crlf="yes"> |
| + | HTTP/1.1 303 OK |
| + | Date: Thu, 09 Nov 2010 14:49:00 GMT |
| + | Server: test-server/fake |
| + | Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT |
| + | ETag: "21025-dc7-39462498" |
| + | Accept-Ranges: bytes |
| + | Location: %TESTNUMBER0001 |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | Funny-head: yesyes |
| + | |
| + | HTTP/1.1 200 OK |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | |
| + | -bar- |
| + | </datacheck> |
| + | </reply> |
| + | |
| + | # Client-side |
| + | <client> |
| + | <server> |
| + | http |
| + | </server> |
| + | <features> |
| + | http |
| + | </features> |
| + | <tool> |
| + | lib1576 |
| + | </tool> |
| + | |
| + | <name> |
| + | CURLFOLLOW_OBEYCODE with custom PUT method, 303 => GET |
| + | </name> |
| + | <command> |
| + | http://%HOSTIP:%HTTPPORT/%TESTNUMBER %TESTNUMBER |
| + | </command> |
| + | </client> |
| + | |
| + | # Verify data after the test has been "shot" |
| + | <verify> |
| + | <strip> |
| + | ^User-Agent:.* |
| + | </strip> |
| + | <protocol crlf="yes"> |
| + | CURL /%TESTNUMBER HTTP/1.1 |
| + | Host: %HOSTIP:%HTTPPORT |
| + | Accept: */* |
| + | Content-Length: 45 |
| + | |
| + | request indicates that the client, which madeGET /%TESTNUMBER0001 HTTP/1.1 |
| + | Host: %HOSTIP:%HTTPPORT |
| + | Accept: */* |
| + | |
| + | </protocol> |
| + | </verify> |
| + | </testcase> |
| @@ -0,0 +1,95 @@ | |
| + | <testcase> |
| + | <info> |
| + | <keywords> |
| + | CURLFOLLOW_FIRSTONLY |
| + | CURLOPT_FOLLOWLOCATION |
| + | </keywords> |
| + | </info> |
| + | # |
| + | # Server-side |
| + | <reply> |
| + | <data crlf="yes"> |
| + | HTTP/1.1 308 OK |
| + | Date: Thu, 09 Nov 2010 14:49:00 GMT |
| + | Server: test-server/fake |
| + | Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT |
| + | ETag: "21025-dc7-39462498" |
| + | Accept-Ranges: bytes |
| + | Location: %TESTNUMBER0001 |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | Funny-head: yesyes |
| + | |
| + | -foo- |
| + | </data> |
| + | <data1 crlf="yes"> |
| + | HTTP/1.1 200 OK |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | |
| + | -bar- |
| + | </data> |
| + | <datacheck crlf="yes"> |
| + | HTTP/1.1 308 OK |
| + | Date: Thu, 09 Nov 2010 14:49:00 GMT |
| + | Server: test-server/fake |
| + | Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT |
| + | ETag: "21025-dc7-39462498" |
| + | Accept-Ranges: bytes |
| + | Location: %TESTNUMBER0001 |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | Funny-head: yesyes |
| + | |
| + | HTTP/1.1 200 OK |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | |
| + | -bar- |
| + | </datacheck> |
| + | </reply> |
| + | |
| + | # Client-side |
| + | <client> |
| + | <server> |
| + | http |
| + | </server> |
| + | <features> |
| + | http |
| + | </features> |
| + | <tool> |
| + | lib1576 |
| + | </tool> |
| + | |
| + | <name> |
| + | CURLFOLLOW_FIRSTONLY with custom PUT method, 308 => PUT |
| + | </name> |
| + | <command> |
| + | http://%HOSTIP:%HTTPPORT/%TESTNUMBER 1578 |
| + | </command> |
| + | </client> |
| + | |
| + | # Verify data after the test has been "shot" |
| + | <verify> |
| + | <strip> |
| + | ^User-Agent:.* |
| + | </strip> |
| + | <protocol nonewline="yes" crlf="yes"> |
| + | CURL /%TESTNUMBER HTTP/1.1 |
| + | Host: %HOSTIP:%HTTPPORT |
| + | Accept: */* |
| + | Content-Length: 45 |
| + | |
| + | request indicates that the client, which madePUT /%TESTNUMBER0001 HTTP/1.1 |
| + | Host: %HOSTIP:%HTTPPORT |
| + | Accept: */* |
| + | Content-Length: 45 |
| + | |
| + | request indicates that the client, which made |
| + | </protocol> |
| + | </verify> |
| + | </testcase> |
| @@ -0,0 +1,97 @@ | |
| + | <testcase> |
| + | <info> |
| + | <keywords> |
| + | CURLFOLLOW_OBEYCODE |
| + | CURLOPT_FOLLOWLOCATION |
| + | </keywords> |
| + | </info> |
| + | # |
| + | # Server-side |
| + | <reply> |
| + | <data crlf="yes"> |
| + | HTTP/1.1 301 OK |
| + | Date: Thu, 09 Nov 2010 14:49:00 GMT |
| + | Server: test-server/fake |
| + | Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT |
| + | ETag: "21025-dc7-39462498" |
| + | Accept-Ranges: bytes |
| + | Location: %TESTNUMBER0001 |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | Funny-head: yesyes |
| + | |
| + | -foo- |
| + | </data> |
| + | <data1 crlf="yes"> |
| + | HTTP/1.1 200 OK |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | |
| + | -bar- |
| + | </data> |
| + | <datacheck crlf="yes"> |
| + | HTTP/1.1 301 OK |
| + | Date: Thu, 09 Nov 2010 14:49:00 GMT |
| + | Server: test-server/fake |
| + | Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT |
| + | ETag: "21025-dc7-39462498" |
| + | Accept-Ranges: bytes |
| + | Location: %TESTNUMBER0001 |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | Funny-head: yesyes |
| + | |
| + | HTTP/1.1 200 OK |
| + | Content-Length: 6 |
| + | Connection: close |
| + | Content-Type: text/html |
| + | |
| + | -bar- |
| + | </datacheck> |
| + | </reply> |
| + | |
| + | # Client-side |
| + | <client> |
| + | <server> |
| + | http |
| + | </server> |
| + | <features> |
| + | http |
| + | </features> |
| + | <tool> |
| + | lib1571 |
| + | </tool> |
| + | |
| + | <name> |
| + | CURLFOLLOW_OBEYCODE with custom POST301 method, 301 => custom |
| + | </name> |
| + | <command> |
| + | http://%HOSTIP:%HTTPPORT/%TESTNUMBER 1581 |
| + | </command> |
| + | </client> |
| + | |
| + | # Verify data after the test has been "shot" |
| + | <verify> |
| + | <strip> |
| + | ^User-Agent:.* |
| + | </strip> |
| + | <protocol nonewline="yes" crlf="yes"> |
| + | IGLOO /%TESTNUMBER HTTP/1.1 |
| + | Host: %HOSTIP:%HTTPPORT |
| + | Accept: */* |
| + | Content-Length: 3 |
| + | Content-Type: application/x-www-form-urlencoded |
| + | |
| + | mooIGLOO /%TESTNUMBER0001 HTTP/1.1 |
| + | Host: %HOSTIP:%HTTPPORT |
| + | Accept: */* |
| + | Content-Length: 3 |
| + | Content-Type: application/x-www-form-urlencoded |
| + | |
| + | moo |
| + | </protocol> |
| + | </verify> |
| + | </testcase> |
| @@ -60,7 +60,8 @@ LIBTESTPROGS = libauthretry libntlmconnect libprereq \ | |
| lib1534 lib1535 lib1536 lib1537 lib1538 lib1539 \ | |
| lib1540 lib1541 lib1542 lib1543 lib1545 \ | |
| lib1550 lib1551 lib1552 lib1553 lib1554 lib1555 lib1556 lib1557 \ | |
| - | lib1558 lib1559 lib1560 lib1564 lib1565 lib1567 lib1568 lib1569 \ |
| + | lib1558 lib1559 lib1560 lib1564 lib1565 lib1567 lib1568 lib1569 lib1571 \ |
| + | lib1576 lib1578 \ |
| lib1591 lib1592 lib1593 lib1594 lib1596 lib1597 lib1598 \ | |
| \ | |
| lib1662 \ | |
| @@ -523,6 +524,14 @@ lib1568_SOURCES = lib1568.c $(SUPPORTFILES) | |
| lib1569_SOURCES = lib1569.c $(SUPPORTFILES) | |
| + | lib1571_SOURCES = lib1571.c $(SUPPORTFILES) |
| + | lib1571_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1571 |
| + | |
| + | lib1576_SOURCES = lib1576.c $(SUPPORTFILES) |
| + | |
| + | lib1578_SOURCES = lib1576.c $(SUPPORTFILES) |
| + | lib1578_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1578 |
| + | |
| lib1591_SOURCES = lib1591.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS) | |
| lib1591_LDADD = $(TESTUTIL_LIBS) | |
| @@ -0,0 +1,72 @@ | |
| + | /*************************************************************************** |
| + | * _ _ ____ _ |
| + | * Project ___| | | | _ \| | |
| + | * / __| | | | |_) | | |
| + | * | (__| |_| | _ <| |___ |
| + | * \___|\___/|_| \_\_____| |
| + | * |
| + | * Copyright (C) Daniel Stenberg, <[email protected]>, 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.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. |
| + | * |
| + | * SPDX-License-Identifier: curl |
| + | * |
| + | ***************************************************************************/ |
| + | #include "test.h" |
| + | |
| + | #include "memdebug.h" |
| + | |
| + | CURLcode test(char *URL) |
| + | { |
| + | CURLcode res; |
| + | CURL *curl; |
| + | int testno = atoi(libtest_arg2); |
| + | |
| + | if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) { |
| + | fprintf(stderr, "curl_global_init() failed\n"); |
| + | return TEST_ERR_MAJOR_BAD; |
| + | } |
| + | |
| + | curl = curl_easy_init(); |
| + | if(!curl) { |
| + | fprintf(stderr, "curl_easy_init() failed\n"); |
| + | curl_global_cleanup(); |
| + | return TEST_ERR_MAJOR_BAD; |
| + | } |
| + | |
| + | test_setopt(curl, CURLOPT_HEADER, 1L); |
| + | test_setopt(curl, CURLOPT_VERBOSE, 1L); |
| + | test_setopt(curl, CURLOPT_URL, URL); |
| + | if((testno == 1571) || (testno == 1575) || (testno == 1581)) { |
| + | test_setopt(curl, CURLOPT_POSTFIELDS, "moo"); |
| + | } |
| + | if(testno == 1581) { |
| + | test_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_301); |
| + | } |
| + | |
| + | test_setopt(curl, CURLOPT_CUSTOMREQUEST, "IGLOO"); |
| + | if((testno == 1574) || (testno == 1575)) { |
| + | test_setopt(curl, CURLOPT_FOLLOWLOCATION, CURLFOLLOW_FIRSTONLY); |
| + | } |
| + | else { |
| + | test_setopt(curl, CURLOPT_FOLLOWLOCATION, CURLFOLLOW_OBEYCODE); |
| + | } |
| + | |
| + | res = curl_easy_perform(curl); |
| + | |
| + | test_cleanup: |
| + | |
| + | curl_easy_cleanup(curl); |
| + | curl_global_cleanup(); |
| + | |
| + | return res; |
| + | } |
| @@ -0,0 +1,86 @@ | |
| + | /*************************************************************************** |
| + | * _ _ ____ _ |
| + | * Project ___| | | | _ \| | |
| + | * / __| | | | |_) | | |
| + | * | (__| |_| | _ <| |___ |
| + | * \___|\___/|_| \_\_____| |
| + | * |
| + | * Copyright (C) Daniel Stenberg, <[email protected]>, 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.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. |
| + | * |
| + | * SPDX-License-Identifier: curl |
| + | * |
| + | ***************************************************************************/ |
| + | #include "test.h" |
| + | |
| + | #include "memdebug.h" |
| + | |
| + | static char testdata[] = "request indicates that the client, which made"; |
| + | |
| + | static size_t read_callback(char *ptr, size_t size, size_t nmemb, void *stream) |
| + | { |
| + | size_t amount = nmemb * size; /* Total bytes curl wants */ |
| + | if(amount < strlen(testdata)) { |
| + | return strlen(testdata); |
| + | } |
| + | (void)stream; |
| + | memcpy(ptr, testdata, strlen(testdata)); |
| + | return strlen(testdata); |
| + | } |
| + | |
| + | CURLcode test(char *URL) |
| + | { |
| + | CURLcode res; |
| + | CURL *curl; |
| + | struct curl_slist *pHeaderList = NULL; |
| + | int testno = atoi(libtest_arg2); |
| + | |
| + | if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) { |
| + | fprintf(stderr, "curl_global_init() failed\n"); |
| + | return TEST_ERR_MAJOR_BAD; |
| + | } |
| + | |
| + | curl = curl_easy_init(); |
| + | if(!curl) { |
| + | fprintf(stderr, "curl_easy_init() failed\n"); |
| + | curl_global_cleanup(); |
| + | return TEST_ERR_MAJOR_BAD; |
| + | } |
| + | |
| + | test_setopt(curl, CURLOPT_HEADER, 1L); |
| + | test_setopt(curl, CURLOPT_VERBOSE, 1L); |
| + | test_setopt(curl, CURLOPT_URL, URL); |
| + | test_setopt(curl, CURLOPT_UPLOAD, 1L); |
| + | test_setopt(curl, CURLOPT_READFUNCTION, read_callback); |
| + | test_setopt(curl, CURLOPT_INFILESIZE, (long)strlen(testdata)); |
| + | |
| + | test_setopt(curl, CURLOPT_CUSTOMREQUEST, "CURL"); |
| + | if(testno == 1578) { |
| + | test_setopt(curl, CURLOPT_FOLLOWLOCATION, CURLFOLLOW_FIRSTONLY); |
| + | } |
| + | else { |
| + | test_setopt(curl, CURLOPT_FOLLOWLOCATION, CURLFOLLOW_OBEYCODE); |
| + | } |
| + | /* Remove "Expect: 100-continue" */ |
| + | pHeaderList = curl_slist_append(pHeaderList, "Expect:"); |
| + | |
| + | curl_easy_setopt(curl, CURLOPT_HTTPHEADER, pHeaderList); |
| + | res = curl_easy_perform(curl); |
| + | |
| + | test_cleanup: |
| + | curl_easy_cleanup(curl); |
| + | curl_global_cleanup(); |
| + | curl_slist_free_all(pHeaderList); |
| + | |
| + | return res; |
| + | } |