From 79657965696b7b69fe83bee1aa18e44a9c7a37ba Mon Sep 17 00:00:00 2001 From: J Huang Date: Sat, 10 Jun 2017 15:25:26 +0800 Subject: [PATCH] [Fix] enable curl compression only on curl >=7.21.0 curl < 7.21.0 will output redirection reponse body to the output when compressed, which will cause tarball is prepended with redirection reponse body and leads to checksum mismatch. - add `nvm_curl_use_compression` and `nvm_curl_version` --- nvm.sh | 14 +++++-- test/fast/Unit tests/nvm_curl_use_compression | 38 +++++++++++++++++++ test/fast/Unit tests/nvm_curl_version | 32 ++++++++++++++++ 3 files changed, 81 insertions(+), 3 deletions(-) create mode 100755 test/fast/Unit tests/nvm_curl_use_compression create mode 100755 test/fast/Unit tests/nvm_curl_version diff --git a/nvm.sh b/nvm.sh index 61977b5..365e8e3 100644 --- a/nvm.sh +++ b/nvm.sh @@ -79,11 +79,15 @@ nvm_curl_libz_support() { curl -V 2>/dev/null | nvm_grep "^Features:" | nvm_grep -q "libz" } +nvm_curl_use_compression() { + nvm_curl_libz_support && nvm_version_greater_than_or_equal_to "$(nvm_curl_version)" 7.21.0; +} + nvm_get_latest() { local NVM_LATEST_URL local CURL_COMPRESSED_FLAG if nvm_has "curl"; then - if nvm_curl_libz_support; then + if nvm_curl_use_compression; then CURL_COMPRESSED_FLAG="--compressed" fi NVM_LATEST_URL="$(curl "${CURL_COMPRESSED_FLAG:-}" -q -w "%{url_effective}\n" -L -s -S http://latest.nvm.sh -o /dev/null)" @@ -103,7 +107,7 @@ nvm_get_latest() { nvm_download() { local CURL_COMPRESSED_FLAG if nvm_has "curl"; then - if nvm_curl_libz_support; then + if nvm_curl_use_compression; then CURL_COMPRESSED_FLAG="--compressed" fi curl "${CURL_COMPRESSED_FLAG:-}" -q "$@" @@ -221,6 +225,10 @@ nvm_clang_version() { clang --version | command awk '{ if ($2 == "version") print $3; else if ($3 == "version") print $4 }' | command sed 's/-.*$//g' } +nvm_curl_version() { + curl -V | command awk '{ if ($1 == "curl") print $2 }' | command sed 's/-.*$//g' +} + nvm_version_greater() { command awk 'BEGIN { if (ARGV[1] == "" || ARGV[2] == "") exit(1) @@ -3284,7 +3292,7 @@ nvm() { nvm_version_greater nvm_version_greater_than_or_equal_to \ nvm_print_npm_version nvm_npm_global_modules \ nvm_has_system_node nvm_has_system_iojs \ - nvm_download nvm_get_latest nvm_has nvm_install_default_packages \ + nvm_download nvm_get_latest nvm_has nvm_install_default_packages nvm_curl_use_compression nvm_curl_version \ nvm_supports_source_options nvm_auto nvm_supports_xz \ nvm_echo nvm_err nvm_grep nvm_cd \ nvm_die_on_prefix nvm_get_make_jobs nvm_get_minor_version \ diff --git a/test/fast/Unit tests/nvm_curl_use_compression b/test/fast/Unit tests/nvm_curl_use_compression new file mode 100755 index 0000000..e263864 --- /dev/null +++ b/test/fast/Unit tests/nvm_curl_use_compression @@ -0,0 +1,38 @@ +#!/bin/sh + +cleanup () { + unset -f die +} + +die () { echo -e "$@" ; cleanup ; exit 1; } + +NVM_ENV=testing \. ../../../nvm.sh + +curl() { + if [ "$1" = "-V" ]; then + echo "${VERSION_MESSAGE}" + fi +} + +CURL_VERSION_ON_ARCHLINUX_WITH_LIBZ="curl 7.54.0 (x86_64-pc-linux-gnu) libcurl/7.54.0 OpenSSL/1.1.0f zlib/1.2.11 libpsl/0.17.0 (+libicu/59.1) libssh2/1.8.0 nghttp2/1.22.0 +Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp +Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy PSL" + +CURL_VERSION_ON_ARCHLINUX_WITHOUT_LIBZ="curl 7.54.0 (x86_64-pc-linux-gnu) libcurl/7.54.0 OpenSSL/1.1.0f zlib/1.2.11 libpsl/0.17.0 (+libicu/59.1) libssh2/1.8.0 nghttp2/1.22.0 +Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp +Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL TLS-SRP HTTP2 UnixSockets HTTPS-proxy PSL" + +CURL_VERSION_ON_CENTOS6_WITH_LIBZ="curl 7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2 +Protocols: tftp ftp telnet dict ldap ldaps http file https ftps scp sftp +Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz" + +VERSION_MESSAGE="${CURL_VERSION_ON_ARCHLINUX_WITH_LIBZ}" +nvm_curl_use_compression || die "nvm_curl_use_compression should return 0" + +VERSION_MESSAGE="${CURL_VERSION_ON_ARCHLINUX_WITHOUT_LIBZ}" +! nvm_curl_use_compression || die "nvm_curl_use_compression should return 1 without libz support" + +VERSION_MESSAGE="${CURL_VERSION_ON_CENTOS6_WITH_LIBZ}" +! nvm_curl_use_compression || die "nvm_curl_use_compression should return 1 when curl < 7.21.0" + +cleanup diff --git a/test/fast/Unit tests/nvm_curl_version b/test/fast/Unit tests/nvm_curl_version new file mode 100755 index 0000000..d61014e --- /dev/null +++ b/test/fast/Unit tests/nvm_curl_version @@ -0,0 +1,32 @@ +#!/bin/sh + +cleanup () { + unset -f die + unset -f curl +} + +die () { echo -e "$@" ; cleanup ; exit 1; } + +NVM_ENV=testing \. ../../../nvm.sh + +curl() { + if [ "$1" = "-V" ]; then + echo "${VERSION_MESSAGE}" + fi +} + +assert_version_is() { + if [ "${1}" != "${2}" ]; then + die "Expected ${2}, got ${1}, origin version message:\n${VERSION_MESSAGE}" + return 1 + fi +} + +CURL_VERSION_MESSAGE="curl 7.54.0 (x86_64-pc-linux-gnu) libcurl/7.54.0 OpenSSL/1.1.0f zlib/1.2.11 libpsl/0.17.0 (+libicu/59.1) libssh2/1.8.0 nghttp2/1.22.0 +Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp +Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy PSL" + +VERSION_MESSAGE="${CURL_VERSION_MESSAGE}" +assert_version_is "$(nvm_curl_version)" "7.54.0" + +cleanup