Skip to content

Commit e13357b

Browse files
gvollantbagder
authored andcommitted
content_encoding: add zstd decoding support
include zstd curl patch for Makefile.m32 from vszakats and include Add CMake support for zstd from Peter Wu Helped-by: Viktor Szakats Helped-by: Peter Wu Closes #5453
1 parent c4026a9 commit e13357b

21 files changed

+813
-16
lines changed

.azure-pipelines.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ stages:
7676
configure: --enable-debug --disable-shared --disable-threaded-resolver --enable-alt-svc
7777
tflags: -n -t --shallow=40 !FTP
7878
steps:
79-
- script: sudo apt-get update && sudo apt-get install -y stunnel4 python-impacket $(install)
79+
- script: sudo apt-get update && sudo apt-get install -y stunnel4 python-impacket libzstd-dev libbrotli-dev $(install)
8080
displayName: 'apt install'
8181

8282
- script: ./buildconf && ./configure $(configure)

.travis.yml

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ jobs:
9494
- *common_packages
9595
- libpsl-dev
9696
- libbrotli-dev
97+
- libzstd-dev
9798
- env:
9899
- T=novalgrind BORINGSSL=yes C="--with-ssl=$HOME/boringssl" LD_LIBRARY_PATH=/home/travis/boringssl/lib:/usr/local/lib
99100
- OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
@@ -111,6 +112,7 @@ jobs:
111112
- *common_packages
112113
- libpsl-dev
113114
- libbrotli-dev
115+
- libzstd-dev
114116
- env:
115117
- T=novalgrind NGTCP2=yes C="--with-ssl=$HOME/ngbuild --with-ngtcp2=$HOME/ngbuild --with-nghttp3=$HOME/ngbuild --enable-alt-svc" NOTESTS=
116118
- OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
@@ -121,6 +123,7 @@ jobs:
121123
- *common_packages
122124
- libpsl-dev
123125
- libbrotli-dev
126+
- libzstd-dev
124127
- env:
125128
- T=novalgrind NGTCP2=yes GNUTLS=yes C="PKG_CONFIG_PATH=$HOME/ngbuild --without-ssl --with-gnutls=$HOME/ngbuild --with-ngtcp2=$HOME/ngbuild --with-nghttp3=$HOME/ngbuild --enable-alt-svc" NOTESTS=
126129
- OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
@@ -131,6 +134,7 @@ jobs:
131134
- *common_packages
132135
- libpsl-dev
133136
- libbrotli-dev
137+
- libzstd-dev
134138
- autogen
135139
- automake
136140
- autopoint
@@ -151,6 +155,7 @@ jobs:
151155
- *common_packages
152156
- libpsl-dev
153157
- libbrotli-dev
158+
- libzstd-dev
154159
- env:
155160
- T=debug-mesalink C="--with-mesalink --without-ssl"
156161
- OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
@@ -161,6 +166,7 @@ jobs:
161166
- *common_packages
162167
- libpsl-dev
163168
- libbrotli-dev
169+
- libzstd-dev
164170
- env:
165171
- T=debug
166172
- &clang OVERRIDE_CC="CC=clang-9" OVERRIDE_CXX="CXX=clang++-9"
@@ -172,6 +178,7 @@ jobs:
172178
- &clang_packages [*common_packages, clang-9]
173179
- libpsl-dev
174180
- libbrotli-dev
181+
- libzstd-dev
175182
- env:
176183
- T=debug C="--enable-alt-svc"
177184
- *clang
@@ -183,6 +190,7 @@ jobs:
183190
- *clang_packages
184191
- libpsl-dev
185192
- libbrotli-dev
193+
- libzstd-dev
186194
- env:
187195
- T=debug C="--with-mbedtls --without-ssl"
188196
- *clang
@@ -194,6 +202,7 @@ jobs:
194202
- *clang_packages
195203
- libpsl-dev
196204
- libbrotli-dev
205+
- libzstd-dev
197206
- libmbedtls-dev
198207
- env:
199208
- T=debug C="--with-gnutls --without-ssl"
@@ -207,6 +216,7 @@ jobs:
207216
- libgnutls28-dev
208217
- libpsl-dev
209218
- libbrotli-dev
219+
- libzstd-dev
210220
- env:
211221
- T=debug C="--with-nss --without-ssl" NOTESTS=1 CPPFLAGS="-isystem /usr/include/nss"
212222
- *clang
@@ -219,11 +229,12 @@ jobs:
219229
- libnss3-dev
220230
- libpsl-dev
221231
- libbrotli-dev
232+
- libzstd-dev
222233
- env:
223234
- T=iconv
224235
- OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
225236
- env:
226-
- T=cmake BORINGSSL=yes QUICHE=yes C="-DUSE_QUICHE=1 -DOPENSSL_ROOT_DIR=$HOME/boringssl"
237+
- T=cmake BORINGSSL=yes QUICHE=yes C="-DUSE_QUICHE=1 -DOPENSSL_ROOT_DIR=$HOME/boringssl -DCURL_BROTLI=1 -DCURL_ZSTD=1"
227238
- OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
228239
- PKG_CONFIG_PATH="$HOME/quiche/target/release"
229240
before_install:
@@ -235,8 +246,9 @@ jobs:
235246
- *common_packages
236247
- libpsl-dev
237248
- libbrotli-dev
249+
- libzstd-dev
238250
- env:
239-
- T=cmake NGTCP2=yes C="-DUSE_NGTCP2=ON"
251+
- T=cmake NGTCP2=yes C="-DUSE_NGTCP2=ON -DCURL_BROTLI=1 -DCURL_ZSTD=1"
240252
- *clang
241253
- PKG_CONFIG_PATH="$HOME/ngbuild/lib/pkgconfig"
242254
compiler: clang
@@ -247,6 +259,7 @@ jobs:
247259
- *clang_packages
248260
- libpsl-dev
249261
- libbrotli-dev
262+
- libzstd-dev
250263
- env:
251264
- T=torture
252265
- OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
@@ -258,6 +271,7 @@ jobs:
258271
- lcov
259272
- libpsl-dev
260273
- libbrotli-dev
274+
- libzstd-dev
261275
- libssh2-1-dev
262276
- env:
263277
- T=distcheck
@@ -269,6 +283,7 @@ jobs:
269283
- *common_packages
270284
- libpsl-dev
271285
- libbrotli-dev
286+
- libzstd-dev
272287
- env:
273288
- T=fuzzer
274289
- *clang
@@ -280,6 +295,7 @@ jobs:
280295
- *clang_packages
281296
- libpsl-dev
282297
- libbrotli-dev
298+
- libzstd-dev
283299
- env:
284300
- T=tidy
285301
- *clang
@@ -292,6 +308,7 @@ jobs:
292308
- clang-tidy-9
293309
- libpsl-dev
294310
- libbrotli-dev
311+
- libzstd-dev
295312
- env:
296313
- T=scan-build
297314
- *clang
@@ -303,6 +320,7 @@ jobs:
303320
- *clang_packages
304321
- libpsl-dev
305322
- libbrotli-dev
323+
- libzstd-dev
306324
- env:
307325
- T=debug CFLAGS="-fsanitize=address,undefined,signed-integer-overflow -fno-sanitize-recover=undefined,integer -Wformat -Werror=format-security -Werror=array-bounds -g" LDFLAGS="-fsanitize=address,undefined -fno-sanitize-recover=undefined,integer" LIBS="-ldl -lubsan"
308326
- *clang
@@ -314,6 +332,7 @@ jobs:
314332
- *clang_packages
315333
- libpsl-dev
316334
- libbrotli-dev
335+
- libzstd-dev
317336
- env:
318337
- T=debug C="--enable-alt-svc"
319338
- OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
@@ -325,6 +344,7 @@ jobs:
325344
- *common_packages
326345
- libpsl-dev
327346
- libbrotli-dev
347+
- libzstd-dev
328348
- libev-dev
329349
- libssl-dev
330350
- libtool

CMake/FindZstd.cmake

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#***************************************************************************
2+
# _ _ ____ _
3+
# Project ___| | | | _ \| |
4+
# / __| | | | |_) | |
5+
# | (__| |_| | _ <| |___
6+
# \___|\___/|_| \_\_____|
7+
#
8+
# Copyright (C) 1998 - 2020, Daniel Stenberg, <[email protected]>, et al.
9+
#
10+
# This software is licensed as described in the file COPYING, which
11+
# you should have received as part of this distribution. The terms
12+
# are also available at https://curl.haxx.se/docs/copyright.html.
13+
#
14+
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
15+
# copies of the Software, and permit persons to whom the Software is
16+
# furnished to do so, under the terms of the COPYING file.
17+
#
18+
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19+
# KIND, either express or implied.
20+
#
21+
###########################################################################
22+
23+
#[=======================================================================[.rst:
24+
FindZstd
25+
----------
26+
27+
Find the zstd library
28+
29+
Result Variables
30+
^^^^^^^^^^^^^^^^
31+
32+
``Zstd_FOUND``
33+
System has zstd
34+
``Zstd_INCLUDE_DIRS``
35+
The zstd include directories.
36+
``Zstd_LIBRARIES``
37+
The libraries needed to use zstd
38+
#]=======================================================================]
39+
40+
if(UNIX)
41+
find_package(PkgConfig QUIET)
42+
pkg_search_module(PC_Zstd libzstd)
43+
endif()
44+
45+
find_path(Zstd_INCLUDE_DIR zstd.h
46+
HINTS
47+
${PC_Zstd_INCLUDEDIR}
48+
${PC_Zstd_INCLUDE_DIRS}
49+
)
50+
51+
find_library(Zstd_LIBRARY NAMES zstd
52+
HINTS
53+
${PC_Zstd_LIBDIR}
54+
${PC_Zstd_LIBRARY_DIRS}
55+
)
56+
57+
include(FindPackageHandleStandardArgs)
58+
find_package_handle_standard_args(Zstd
59+
REQUIRED_VARS
60+
Zstd_LIBRARY
61+
Zstd_INCLUDE_DIR
62+
)
63+
64+
if(Zstd_FOUND)
65+
set(Zstd_LIBRARIES ${Zstd_LIBRARY})
66+
set(Zstd_INCLUDE_DIRS ${Zstd_INCLUDE_DIR})
67+
endif()
68+
69+
mark_as_advanced(Zstd_INCLUDE_DIRS Zstd_LIBRARIES)

CMakeLists.txt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,22 @@ if(CURL_BROTLI)
641641
endif()
642642
endif()
643643

644+
option(CURL_ZSTD "Set to ON to enable building curl with zstd support." OFF)
645+
set(HAVE_ZSTD OFF)
646+
if(CURL_ZSTD)
647+
find_package(Zstd REQUIRED)
648+
cmake_push_check_state()
649+
set(CMAKE_REQUIRED_INCLUDES ${Zstd_INCLUDE_DIRS})
650+
set(CMAKE_REQUIRED_LIBRARIES ${Zstd_LIBRARIES})
651+
check_symbol_exists(ZSTD_createDStream "zstd.h" HAVE_ZSTD_CREATEDSTREAM)
652+
cmake_pop_check_state()
653+
if(Zstd_FOUND AND HAVE_ZSTD_CREATEDSTREAM)
654+
set(HAVE_ZSTD ON)
655+
list(APPEND CURL_LIBS ${Zstd_LIBRARIES})
656+
include_directories(${Zstd_INCLUDE_DIRS})
657+
endif()
658+
endif()
659+
644660
#libSSH2
645661
option(CMAKE_USE_LIBSSH2 "Use libSSH2" ON)
646662
mark_as_advanced(CMAKE_USE_LIBSSH2)
@@ -1322,6 +1338,8 @@ _add_if("SSL" SSL_ENABLED)
13221338
_add_if("IPv6" ENABLE_IPV6)
13231339
_add_if("unix-sockets" USE_UNIX_SOCKETS)
13241340
_add_if("libz" HAVE_LIBZ)
1341+
_add_if("brotli" HAVE_BROTLI)
1342+
_add_if("zstd" HAVE_ZSTD)
13251343
_add_if("AsynchDNS" USE_ARES OR USE_THREADS_POSIX OR USE_THREADS_WIN32)
13261344
_add_if("IDN" HAVE_LIBIDN2)
13271345
_add_if("Largefile" (CURL_SIZEOF_CURL_OFF_T GREATER 4) AND

configure.ac

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,6 +1115,93 @@ if test X"$OPT_BROTLI" != Xno; then
11151115
fi
11161116
fi
11171117

1118+
dnl **********************************************************************
1119+
dnl Check for libzstd
1120+
dnl **********************************************************************
1121+
1122+
dnl Default to compiler & linker defaults for libzstd
1123+
OPT_ZSTD=off
1124+
AC_ARG_WITH(zstd,dnl
1125+
AC_HELP_STRING([--with-zstd=PATH],[Where to look for libzstd, PATH points to the libzstd installation; when possible, set the PKG_CONFIG_PATH environment variable instead of using this option])
1126+
AC_HELP_STRING([--without-zstd], [disable libzstd]),
1127+
OPT_ZSTD=$withval)
1128+
1129+
if test X"$OPT_ZSTD" != Xno; then
1130+
dnl backup the pre-zstd variables
1131+
CLEANLDFLAGS="$LDFLAGS"
1132+
CLEANCPPFLAGS="$CPPFLAGS"
1133+
CLEANLIBS="$LIBS"
1134+
1135+
case "$OPT_ZSTD" in
1136+
yes)
1137+
dnl --with-zstd (without path) used
1138+
CURL_CHECK_PKGCONFIG(libzstd)
1139+
1140+
if test "$PKGCONFIG" != "no" ; then
1141+
LIB_ZSTD=`$PKGCONFIG --libs-only-l libzstd`
1142+
LD_ZSTD=`$PKGCONFIG --libs-only-L libzstd`
1143+
CPP_ZSTD=`$PKGCONFIG --cflags-only-I libzstd`
1144+
version=`$PKGCONFIG --modversion libzstd`
1145+
DIR_ZSTD=`echo $LD_ZSTD | $SED -e 's/-L//'`
1146+
fi
1147+
1148+
;;
1149+
off)
1150+
dnl no --with-zstd option given, just check default places
1151+
;;
1152+
*)
1153+
dnl use the given --with-zstd spot
1154+
PREFIX_ZSTD=$OPT_ZSTD
1155+
;;
1156+
esac
1157+
1158+
dnl if given with a prefix, we set -L and -I based on that
1159+
if test -n "$PREFIX_ZSTD"; then
1160+
LIB_ZSTD="-lzstd"
1161+
LD_ZSTD=-L${PREFIX_ZSTD}/lib$libsuff
1162+
CPP_ZSTD=-I${PREFIX_ZSTD}/include
1163+
DIR_ZSTD=${PREFIX_ZSTD}/lib$libsuff
1164+
fi
1165+
1166+
LDFLAGS="$LDFLAGS $LD_ZSTD"
1167+
CPPFLAGS="$CPPFLAGS $CPP_ZSTD"
1168+
LIBS="$LIB_ZSTD $LIBS"
1169+
1170+
AC_CHECK_LIB(zstd, ZSTD_createDStream)
1171+
1172+
AC_CHECK_HEADERS(zstd.h,
1173+
curl_zstd_msg="enabled (libzstd)"
1174+
HAVE_ZSTD=1
1175+
AC_DEFINE(HAVE_ZSTD, 1, [if libzstd is in use])
1176+
AC_SUBST(HAVE_ZSTD, [1])
1177+
)
1178+
1179+
if test X"$OPT_ZSTD" != Xoff &&
1180+
test "$HAVE_ZSTD" != "1"; then
1181+
AC_MSG_ERROR([libzstd was not found where specified!])
1182+
fi
1183+
1184+
if test "$HAVE_ZSTD" = "1"; then
1185+
if test -n "$DIR_ZSTD"; then
1186+
dnl when the zstd shared lib were found in a path that the run-time
1187+
dnl linker doesn't search through, we need to add it to
1188+
dnl CURL_LIBRARY_PATH to prevent further configure tests to fail due to
1189+
dnl this
1190+
1191+
if test "x$cross_compiling" != "xyes"; then
1192+
CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_ZSTD"
1193+
export CURL_LIBRARY_PATH
1194+
AC_MSG_NOTICE([Added $DIR_ZSTD to CURL_LIBRARY_PATH])
1195+
fi
1196+
fi
1197+
else
1198+
dnl no zstd, revert back to clean variables
1199+
LDFLAGS=$CLEANLDFLAGS
1200+
CPPFLAGS=$CLEANCPPFLAGS
1201+
LIBS=$CLEANLIBS
1202+
fi
1203+
fi
1204+
11181205
dnl **********************************************************************
11191206
dnl Check for LDAP
11201207
dnl **********************************************************************
@@ -4825,6 +4912,9 @@ fi
48254912
if test "x$HAVE_BROTLI" = "x1"; then
48264913
SUPPORT_FEATURES="$SUPPORT_FEATURES brotli"
48274914
fi
4915+
if test "x$HAVE_ZSTD" = "x1"; then
4916+
SUPPORT_FEATURES="$SUPPORT_FEATURES zstd"
4917+
fi
48284918
if test "x$USE_ARES" = "x1" -o "x$USE_THREADS_POSIX" = "x1" \
48294919
-o "x$USE_THREADS_WIN32" = "x1"; then
48304920
SUPPORT_FEATURES="$SUPPORT_FEATURES AsynchDNS"
@@ -5067,6 +5157,7 @@ AC_MSG_NOTICE([Configured to build curl/libcurl:
50675157
SSH: ${curl_ssh_msg}
50685158
zlib: ${curl_zlib_msg}
50695159
brotli: ${curl_brotli_msg}
5160+
zstd: ${curl_zstd_msg}
50705161
GSS-API: ${curl_gss_msg}
50715162
TLS-SRP: ${curl_tls_srp_msg}
50725163
resolver: ${curl_res_msg}

0 commit comments

Comments
 (0)