forked from osmocom/wireshark
Add brotli decompression support for HTTP and HTTP2 dissectors.
Change-Id: I9c09f55673187f6fee723fcd72798fb6b9958b03 Reviewed-on: https://code.wireshark.org/review/32745 Petri-Dish: Peter Wu <peter@lekensteyn.nl> Tested-by: Petri Dish Buildbot Reviewed-by: Peter Wu <peter@lekensteyn.nl>
This commit is contained in:
parent
51ac1047a7
commit
9ce60b173b
|
@ -1104,6 +1104,9 @@ ws_find_package(CARES ENABLE_CARES HAVE_C_ARES "1.5.0")
|
||||||
# Zlib compression
|
# Zlib compression
|
||||||
ws_find_package(ZLIB ENABLE_ZLIB HAVE_ZLIB)
|
ws_find_package(ZLIB ENABLE_ZLIB HAVE_ZLIB)
|
||||||
|
|
||||||
|
# Brotli compression
|
||||||
|
ws_find_package(BROTLI ENABLE_BROTLI HAVE_BROTLI)
|
||||||
|
|
||||||
# LZ4 compression
|
# LZ4 compression
|
||||||
ws_find_package(LZ4 ENABLE_LZ4 HAVE_LZ4)
|
ws_find_package(LZ4 ENABLE_LZ4 HAVE_LZ4)
|
||||||
|
|
||||||
|
@ -1809,6 +1812,11 @@ if(WIN32)
|
||||||
list (APPEND OPTIONAL_DLLS "${ZLIB_DLL_DIR}/${ZLIB_DLL}")
|
list (APPEND OPTIONAL_DLLS "${ZLIB_DLL_DIR}/${ZLIB_DLL}")
|
||||||
list (APPEND OPTIONAL_PDBS "${ZLIB_DLL_DIR}/${ZLIB_PDB}")
|
list (APPEND OPTIONAL_PDBS "${ZLIB_DLL_DIR}/${ZLIB_PDB}")
|
||||||
endif(ZLIB_FOUND)
|
endif(ZLIB_FOUND)
|
||||||
|
if (BROTLI_FOUND)
|
||||||
|
foreach( _dll ${BROTLI_DLLS} )
|
||||||
|
list (APPEND OPTIONAL_DLLS "${BROTLI_DLL_DIR}/${_dll}")
|
||||||
|
endforeach(_dll)
|
||||||
|
endif(BROTLI_FOUND)
|
||||||
|
|
||||||
# With libs downloaded to c:/wireshark-win64-libs this currently
|
# With libs downloaded to c:/wireshark-win64-libs this currently
|
||||||
# (early 2018) expands to about 1900 characters.
|
# (early 2018) expands to about 1900 characters.
|
||||||
|
@ -2756,6 +2764,9 @@ if(RPMBUILD_EXECUTABLE)
|
||||||
if (SYSTEMD_FOUND)
|
if (SYSTEMD_FOUND)
|
||||||
list(APPEND _rpmbuild_with_args --with sdjournal)
|
list(APPEND _rpmbuild_with_args --with sdjournal)
|
||||||
endif()
|
endif()
|
||||||
|
if (BROTLI_FOUND)
|
||||||
|
list(APPEND _rpmbuild_with_args --with brotli)
|
||||||
|
endif()
|
||||||
|
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND ${PERL_EXECUTABLE}
|
COMMAND ${PERL_EXECUTABLE}
|
||||||
|
|
|
@ -65,6 +65,7 @@ option(ENABLE_PCAP_NG_DEFAULT "Enable pcapng as default file format" ON)
|
||||||
|
|
||||||
option(ENABLE_ZLIB "Build with zlib compression support" ON)
|
option(ENABLE_ZLIB "Build with zlib compression support" ON)
|
||||||
option(ENABLE_LZ4 "Build with LZ4 compression support" ON)
|
option(ENABLE_LZ4 "Build with LZ4 compression support" ON)
|
||||||
|
option(ENABLE_BROTLI "Build with brotli compression support" ON)
|
||||||
option(ENABLE_SNAPPY "Build with Snappy compression support" ON)
|
option(ENABLE_SNAPPY "Build with Snappy compression support" ON)
|
||||||
option(ENABLE_NGHTTP2 "Build with HTTP/2 header decompression support" ON)
|
option(ENABLE_NGHTTP2 "Build with HTTP/2 header decompression support" ON)
|
||||||
option(ENABLE_LUA "Build with Lua dissector support" ON)
|
option(ENABLE_LUA "Build with Lua dissector support" ON)
|
||||||
|
|
7
INSTALL
7
INSTALL
|
@ -153,6 +153,13 @@ README.windows for those instructions.
|
||||||
the capture-file utilities that come in this package, use
|
the capture-file utilities that come in this package, use
|
||||||
this switch.
|
this switch.
|
||||||
|
|
||||||
|
-DENABLE_BROTLI=OFF
|
||||||
|
By default, if 'configure' finds brotli, the wiretap library
|
||||||
|
will be built so that it can read brotli compressed capture
|
||||||
|
files. If you have brotli but do not wish to build it into
|
||||||
|
the wiretap library, used by Wireshark, TShark, and the
|
||||||
|
capture-file utilities that come in this package, use this switch.
|
||||||
|
|
||||||
-DENABLE_PLUGINS=OFF
|
-DENABLE_PLUGINS=OFF
|
||||||
By default, if your system can support run-time loadable modules,
|
By default, if your system can support run-time loadable modules,
|
||||||
the packet analyzers are build with support for plugins.
|
the packet analyzers are build with support for plugins.
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
#
|
||||||
|
# - Find brotli
|
||||||
|
# Find brotli includes and libraries
|
||||||
|
#
|
||||||
|
# BROTLI_INCLUDE_DIRS - where to find brotli header files
|
||||||
|
# BROTLI_LIBRARIES - List of libraries when using brotli.
|
||||||
|
# BROTLI_FOUND - True if brotli found.
|
||||||
|
# BROTLI_DLL_DIR - (Windows) Path to the brotli DLLs
|
||||||
|
# BROTLI_DLLS - (Windows) Name of the brotli DLLs
|
||||||
|
|
||||||
|
include( FindWSWinLibs )
|
||||||
|
FindWSWinLibs( "brotli-.*" "BROTLI_HINTS" )
|
||||||
|
|
||||||
|
find_path(BROTLI_INCLUDE_DIR
|
||||||
|
NAMES "brotli/decode.h"
|
||||||
|
HINTS "${BROTLI_HINTS}/include"
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(BROTLIDEC_LIBRARY
|
||||||
|
NAMES brotlidec
|
||||||
|
HINTS "${BROTLI_HINTS}/lib"
|
||||||
|
)
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args( BROTLI DEFAULT_MSG BROTLIDEC_LIBRARY BROTLI_INCLUDE_DIR )
|
||||||
|
|
||||||
|
if( BROTLI_FOUND )
|
||||||
|
set( BROTLI_INCLUDE_DIRS ${BROTLI_INCLUDE_DIR} )
|
||||||
|
set( BROTLI_LIBRARIES ${BROTLIDEC_LIBRARY} )
|
||||||
|
|
||||||
|
if (WIN32)
|
||||||
|
set ( BROTLI_DLL_DIR "${BROTLI_HINTS}/bin"
|
||||||
|
CACHE PATH "Path to the brotli DLLs"
|
||||||
|
)
|
||||||
|
file( GLOB _brotli_dlls RELATIVE "${BROTLI_DLL_DIR}"
|
||||||
|
"${BROTLI_DLL_DIR}/brotlicommon*.dll"
|
||||||
|
"${BROTLI_DLL_DIR}/brotlidec*.dll"
|
||||||
|
)
|
||||||
|
set ( BROTLI_DLLS ${_brotli_dlls}
|
||||||
|
# We're storing filenames only. Should we use STRING instead?
|
||||||
|
CACHE FILEPATH "brotli DLL list"
|
||||||
|
)
|
||||||
|
mark_as_advanced( BROTLI_DLL_DIR BROTLI_DLLS )
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
set( BROTLI_INCLUDE_DIRS )
|
||||||
|
set( BROTLI_LIBRARIES )
|
||||||
|
endif()
|
||||||
|
|
||||||
|
mark_as_advanced( BROTLI_LIBRARIES BROTLI_INCLUDE_DIRS )
|
|
@ -136,6 +136,9 @@
|
||||||
/* Define to use zlib library */
|
/* Define to use zlib library */
|
||||||
#cmakedefine HAVE_ZLIB 1
|
#cmakedefine HAVE_ZLIB 1
|
||||||
|
|
||||||
|
/* Define to use brotli library */
|
||||||
|
#cmakedefine HAVE_BROTLI 1
|
||||||
|
|
||||||
/* Define to use lz4 library */
|
/* Define to use lz4 library */
|
||||||
#cmakedefine HAVE_LZ4 1
|
#cmakedefine HAVE_LZ4 1
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ Build-Depends: lsb-release,
|
||||||
libmaxminddb-dev, dpkg-dev (>= 1.16.1~), libsystemd-dev | libsystemd-journal-dev,
|
libmaxminddb-dev, dpkg-dev (>= 1.16.1~), libsystemd-dev | libsystemd-journal-dev,
|
||||||
libnl-genl-3-dev [linux-any], libnl-route-3-dev [linux-any], asciidoctor,
|
libnl-genl-3-dev [linux-any], libnl-route-3-dev [linux-any], asciidoctor,
|
||||||
cmake (>= 3.5) | cmake3, libsbc-dev, libnghttp2-dev, libssh-gcrypt-dev,
|
cmake (>= 3.5) | cmake3, libsbc-dev, libnghttp2-dev, libssh-gcrypt-dev,
|
||||||
liblz4-dev, libsnappy-dev, libspandsp-dev, libxml2-dev
|
liblz4-dev, libsnappy-dev, libspandsp-dev, libxml2-dev, libbrotli-dev
|
||||||
Build-Conflicts: libsnmp4.2-dev, libsnmp-dev
|
Build-Conflicts: libsnmp4.2-dev, libsnmp-dev
|
||||||
Vcs-Svn: svn://svn.debian.org/svn/collab-maint/ext-maint/wireshark/trunk
|
Vcs-Svn: svn://svn.debian.org/svn/collab-maint/ext-maint/wireshark/trunk
|
||||||
Vcs-Browser: http://svn.debian.org/wsvn/collab-maint/ext-maint/wireshark/trunk/
|
Vcs-Browser: http://svn.debian.org/wsvn/collab-maint/ext-maint/wireshark/trunk/
|
||||||
|
|
|
@ -1680,6 +1680,7 @@ libwireshark.so.0 libwireshark0 #MINVER#
|
||||||
tvb_captured_length@Base 1.12.0~rc1
|
tvb_captured_length@Base 1.12.0~rc1
|
||||||
tvb_captured_length_remaining@Base 1.12.0~rc1
|
tvb_captured_length_remaining@Base 1.12.0~rc1
|
||||||
tvb_child_uncompress@Base 1.12.0~rc1
|
tvb_child_uncompress@Base 1.12.0~rc1
|
||||||
|
tvb_child_uncompress_brotli@Base 3.1.0
|
||||||
tvb_clone@Base 1.12.0~rc1
|
tvb_clone@Base 1.12.0~rc1
|
||||||
tvb_clone_offset_len@Base 1.12.0~rc1
|
tvb_clone_offset_len@Base 1.12.0~rc1
|
||||||
tvb_composite_append@Base 1.9.1
|
tvb_composite_append@Base 1.9.1
|
||||||
|
@ -1801,6 +1802,7 @@ libwireshark.so.0 libwireshark0 #MINVER#
|
||||||
tvb_strnlen@Base 1.9.1
|
tvb_strnlen@Base 1.9.1
|
||||||
tvb_strsize@Base 1.9.1
|
tvb_strsize@Base 1.9.1
|
||||||
tvb_uncompress@Base 1.9.1
|
tvb_uncompress@Base 1.9.1
|
||||||
|
tvb_uncompress_brotli@Base 3.1.0
|
||||||
tvb_unicode_strsize@Base 1.9.1
|
tvb_unicode_strsize@Base 1.9.1
|
||||||
tvb_ws_mempbrk_pattern_guint8@Base 1.99.3
|
tvb_ws_mempbrk_pattern_guint8@Base 1.99.3
|
||||||
tvbparse_casestring@Base 1.9.1
|
tvbparse_casestring@Base 1.9.1
|
||||||
|
|
|
@ -34,7 +34,7 @@ Features” section below for more details.
|
||||||
The following features are new (or have been significantly updated)
|
The following features are new (or have been significantly updated)
|
||||||
since version 3.0.0:
|
since version 3.0.0:
|
||||||
|
|
||||||
* Watch this space.
|
* Brotli decompression support in HTTP/HTTP2 (requires the brotli library).
|
||||||
|
|
||||||
// === Removed Features and Support
|
// === Removed Features and Support
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@ if (HAVE_HFI_SECTION_INIT)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
include_directories(
|
include_directories(
|
||||||
|
${BROTLI_INCLUDE_DIRS}
|
||||||
${GLIB2_INCLUDE_DIRS}
|
${GLIB2_INCLUDE_DIRS}
|
||||||
${CARES_INCLUDE_DIRS}
|
${CARES_INCLUDE_DIRS}
|
||||||
${GCRYPT_INCLUDE_DIRS}
|
${GCRYPT_INCLUDE_DIRS}
|
||||||
|
@ -265,6 +266,7 @@ set(LIBWIRESHARK_NONGENERATED_FILES
|
||||||
tvbparse.c
|
tvbparse.c
|
||||||
tvbuff.c
|
tvbuff.c
|
||||||
tvbuff_base64.c
|
tvbuff_base64.c
|
||||||
|
tvbuff_brotli.c
|
||||||
tvbuff_composite.c
|
tvbuff_composite.c
|
||||||
tvbuff_real.c
|
tvbuff_real.c
|
||||||
tvbuff_subset.c
|
tvbuff_subset.c
|
||||||
|
@ -378,6 +380,7 @@ target_link_libraries(epan
|
||||||
wsutil
|
wsutil
|
||||||
${GLIB2_LIBRARIES}
|
${GLIB2_LIBRARIES}
|
||||||
PRIVATE
|
PRIVATE
|
||||||
|
${BROTLI_LIBRARIES}
|
||||||
${CARES_LIBRARIES}
|
${CARES_LIBRARIES}
|
||||||
${GCRYPT_LIBRARIES}
|
${GCRYPT_LIBRARIES}
|
||||||
${GIO2_LIBRARIES}
|
${GIO2_LIBRARIES}
|
||||||
|
|
|
@ -237,9 +237,9 @@ static gboolean http_desegment_body = TRUE;
|
||||||
static gboolean http_dechunk_body = TRUE;
|
static gboolean http_dechunk_body = TRUE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Decompression of zlib encoded entities.
|
* Decompression of zlib or brotli encoded entities.
|
||||||
*/
|
*/
|
||||||
#ifdef HAVE_ZLIB
|
#if defined(HAVE_ZLIB) || defined(HAVE_BROTLI)
|
||||||
static gboolean http_decompress_body = TRUE;
|
static gboolean http_decompress_body = TRUE;
|
||||||
#else
|
#else
|
||||||
static gboolean http_decompress_body = FALSE;
|
static gboolean http_decompress_body = FALSE;
|
||||||
|
@ -1704,6 +1704,7 @@ dissect_http_message(tvbuff_t *tvb, int offset, packet_info *pinfo,
|
||||||
proto_item *e_ti = NULL;
|
proto_item *e_ti = NULL;
|
||||||
proto_tree *e_tree = NULL;
|
proto_tree *e_tree = NULL;
|
||||||
|
|
||||||
|
#ifdef HAVE_ZLIB
|
||||||
if (http_decompress_body &&
|
if (http_decompress_body &&
|
||||||
(g_ascii_strcasecmp(headers.content_encoding, "gzip") == 0 ||
|
(g_ascii_strcasecmp(headers.content_encoding, "gzip") == 0 ||
|
||||||
g_ascii_strcasecmp(headers.content_encoding, "deflate") == 0 ||
|
g_ascii_strcasecmp(headers.content_encoding, "deflate") == 0 ||
|
||||||
|
@ -1713,6 +1714,16 @@ dissect_http_message(tvbuff_t *tvb, int offset, packet_info *pinfo,
|
||||||
uncomp_tvb = tvb_child_uncompress(tvb, next_tvb, 0,
|
uncomp_tvb = tvb_child_uncompress(tvb, next_tvb, 0,
|
||||||
tvb_captured_length(next_tvb));
|
tvb_captured_length(next_tvb));
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_BROTLI
|
||||||
|
if (http_decompress_body &&
|
||||||
|
g_ascii_strcasecmp(headers.content_encoding, "br") == 0)
|
||||||
|
{
|
||||||
|
uncomp_tvb = tvb_child_uncompress_brotli(tvb, next_tvb, 0,
|
||||||
|
tvb_captured_length(next_tvb));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add the encoded entity to the protocol tree
|
* Add the encoded entity to the protocol tree
|
||||||
|
@ -4017,7 +4028,7 @@ proto_register_http(void)
|
||||||
"Whether to reassemble bodies of entities that are transferred "
|
"Whether to reassemble bodies of entities that are transferred "
|
||||||
"using the \"Transfer-Encoding: chunked\" method",
|
"using the \"Transfer-Encoding: chunked\" method",
|
||||||
&http_dechunk_body);
|
&http_dechunk_body);
|
||||||
#ifdef HAVE_ZLIB
|
#if defined(HAVE_ZLIB) || defined(HAVE_BROTLI)
|
||||||
prefs_register_bool_preference(http_module, "decompress_body",
|
prefs_register_bool_preference(http_module, "decompress_body",
|
||||||
"Uncompress entity bodies",
|
"Uncompress entity bodies",
|
||||||
"Whether to uncompress entity bodies that are compressed "
|
"Whether to uncompress entity bodies that are compressed "
|
||||||
|
|
|
@ -65,9 +65,9 @@ VALUE_STRING_ENUM(http2_header_repr_type);
|
||||||
VALUE_STRING_ARRAY(http2_header_repr_type);
|
VALUE_STRING_ARRAY(http2_header_repr_type);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Decompression of zlib encoded entities.
|
* Decompression of zlib or brotli encoded entities.
|
||||||
*/
|
*/
|
||||||
#ifdef HAVE_ZLIB
|
#if defined(HAVE_ZLIB) || defined(HAVE_BROTLI)
|
||||||
static gboolean http2_decompress_body = TRUE;
|
static gboolean http2_decompress_body = TRUE;
|
||||||
#else
|
#else
|
||||||
static gboolean http2_decompress_body = FALSE;
|
static gboolean http2_decompress_body = FALSE;
|
||||||
|
@ -1985,18 +1985,36 @@ dissect_frame_prio(tvbuff_t *tvb, proto_tree *http2_tree, guint offset, guint8 f
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_NGHTTP2
|
#ifdef HAVE_NGHTTP2
|
||||||
static int
|
enum body_uncompression {
|
||||||
can_uncompress_body(packet_info *pinfo)
|
BODY_UNCOMPRESSION_NONE,
|
||||||
|
BODY_UNCOMPRESSION_ZLIB,
|
||||||
|
BODY_UNCOMPRESSION_BROTLI
|
||||||
|
};
|
||||||
|
|
||||||
|
static enum body_uncompression
|
||||||
|
get_body_uncompression_info(packet_info *pinfo)
|
||||||
{
|
{
|
||||||
http2_data_stream_body_info_t *body_info = get_data_stream_body_info(pinfo);
|
http2_data_stream_body_info_t *body_info = get_data_stream_body_info(pinfo);
|
||||||
gchar *content_encoding = body_info->content_encoding;
|
gchar *content_encoding = body_info->content_encoding;
|
||||||
|
|
||||||
/* Check we have a content-encoding header appropriate as well as checking if this is partial content.
|
/* Check we have a content-encoding header appropriate as well as checking if this is partial content.
|
||||||
* We can't decompress part of a gzip encoded entity */
|
* We can't decompress part of a gzip encoded entity */
|
||||||
return http2_decompress_body
|
if (!http2_decompress_body || body_info->is_partial_content == TRUE || content_encoding == NULL) {
|
||||||
&& body_info->is_partial_content == FALSE
|
return BODY_UNCOMPRESSION_NONE;
|
||||||
&& content_encoding != NULL
|
}
|
||||||
&& (strncmp(content_encoding, "gzip", 4) == 0 || strncmp(content_encoding, "deflate", 7) == 0);
|
|
||||||
|
#ifdef HAVE_ZLIB
|
||||||
|
if (strncmp(content_encoding, "gzip", 4) == 0 || strncmp(content_encoding, "deflate", 7) == 0) {
|
||||||
|
return BODY_UNCOMPRESSION_ZLIB;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_BROTLI
|
||||||
|
if (strncmp(content_encoding, "br", 2) == 0) {
|
||||||
|
return BODY_UNCOMPRESSION_BROTLI;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return BODY_UNCOMPRESSION_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try to dissect reassembled http2.data.data according to content_type. */
|
/* Try to dissect reassembled http2.data.data according to content_type. */
|
||||||
|
@ -2027,9 +2045,17 @@ dissect_http2_data_full_body(tvbuff_t *tvb, packet_info *pinfo, proto_tree *http
|
||||||
|
|
||||||
gint datalen = tvb_reported_length(tvb);
|
gint datalen = tvb_reported_length(tvb);
|
||||||
|
|
||||||
if (can_uncompress_body(pinfo)) {
|
enum body_uncompression uncompression = get_body_uncompression_info(pinfo);
|
||||||
|
if (uncompression != BODY_UNCOMPRESSION_NONE) {
|
||||||
proto_item *compressed_proto_item = NULL;
|
proto_item *compressed_proto_item = NULL;
|
||||||
tvbuff_t *uncompressed_tvb = tvb_child_uncompress(tvb, tvb, 0, datalen);
|
|
||||||
|
tvbuff_t *uncompressed_tvb = NULL;
|
||||||
|
if (uncompression == BODY_UNCOMPRESSION_ZLIB) {
|
||||||
|
uncompressed_tvb = tvb_child_uncompress(tvb, tvb, 0, datalen);
|
||||||
|
} else if (uncompression == BODY_UNCOMPRESSION_BROTLI) {
|
||||||
|
uncompressed_tvb = tvb_child_uncompress_brotli(tvb, tvb, 0, datalen);
|
||||||
|
}
|
||||||
|
|
||||||
http2_data_stream_body_info_t *body_info = get_data_stream_body_info(pinfo);
|
http2_data_stream_body_info_t *body_info = get_data_stream_body_info(pinfo);
|
||||||
gchar *compression_method = body_info->content_encoding;
|
gchar *compression_method = body_info->content_encoding;
|
||||||
|
|
||||||
|
|
18
epan/epan.c
18
epan/epan.c
|
@ -80,6 +80,10 @@
|
||||||
#include <nghttp2/nghttp2ver.h>
|
#include <nghttp2/nghttp2ver.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_BROTLI
|
||||||
|
#include <brotli/decode.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_LIBXML2
|
#ifdef HAVE_LIBXML2
|
||||||
#include <libxml/xmlversion.h>
|
#include <libxml/xmlversion.h>
|
||||||
#include <libxml/parser.h>
|
#include <libxml/parser.h>
|
||||||
|
@ -769,6 +773,14 @@ epan_get_compiled_version_info(GString *str)
|
||||||
g_string_append(str, "without nghttp2");
|
g_string_append(str, "without nghttp2");
|
||||||
#endif /* HAVE_NGHTTP2 */
|
#endif /* HAVE_NGHTTP2 */
|
||||||
|
|
||||||
|
/* brotli */
|
||||||
|
g_string_append(str, ", ");
|
||||||
|
#ifdef HAVE_BROTLI
|
||||||
|
g_string_append(str, "with brotli");
|
||||||
|
#else
|
||||||
|
g_string_append(str, "without brotli");
|
||||||
|
#endif /* HAVE_BROTLI */
|
||||||
|
|
||||||
/* LZ4 */
|
/* LZ4 */
|
||||||
g_string_append(str, ", ");
|
g_string_append(str, ", ");
|
||||||
#ifdef HAVE_LZ4
|
#ifdef HAVE_LZ4
|
||||||
|
@ -808,6 +820,12 @@ epan_get_runtime_version_info(GString *str)
|
||||||
|
|
||||||
/* Gcrypt */
|
/* Gcrypt */
|
||||||
g_string_append_printf(str, ", with Gcrypt %s", gcry_check_version(NULL));
|
g_string_append_printf(str, ", with Gcrypt %s", gcry_check_version(NULL));
|
||||||
|
|
||||||
|
/* brotli */
|
||||||
|
#ifdef HAVE_BROTLI
|
||||||
|
g_string_append_printf(str, ", with brotli %d.%d.%d", BrotliDecoderVersion() >> 24,
|
||||||
|
(BrotliDecoderVersion() >> 12) & 0xFFF, BrotliDecoderVersion() & 0xFFF);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -907,6 +907,24 @@ WS_DLL_PUBLIC tvbuff_t *tvb_uncompress(tvbuff_t *tvb, const int offset,
|
||||||
WS_DLL_PUBLIC tvbuff_t *tvb_child_uncompress(tvbuff_t *parent, tvbuff_t *tvb,
|
WS_DLL_PUBLIC tvbuff_t *tvb_child_uncompress(tvbuff_t *parent, tvbuff_t *tvb,
|
||||||
const int offset, int comprlen);
|
const int offset, int comprlen);
|
||||||
|
|
||||||
|
/* From tvbuff_brotli.c */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uncompresses a brotli compressed packet inside a tvbuff at offset with
|
||||||
|
* length comprlen. Returns an uncompressed tvbuffer if uncompression
|
||||||
|
* succeeded or NULL if uncompression failed.
|
||||||
|
*/
|
||||||
|
WS_DLL_PUBLIC tvbuff_t *tvb_uncompress_brotli(tvbuff_t *tvb, const int offset,
|
||||||
|
int comprlen);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uncompresses a brotli compressed packet inside a tvbuff at offset with
|
||||||
|
* length comprlen. Returns an uncompressed tvbuffer attached to tvb if
|
||||||
|
* uncompression succeeded or NULL if uncompression failed.
|
||||||
|
*/
|
||||||
|
WS_DLL_PUBLIC tvbuff_t *tvb_child_uncompress_brotli(tvbuff_t *parent, tvbuff_t *tvb,
|
||||||
|
const int offset, int comprlen);
|
||||||
|
|
||||||
/* From tvbuff_base64.c */
|
/* From tvbuff_base64.c */
|
||||||
|
|
||||||
/** Return a tvb that contains the binary representation of a base64
|
/** Return a tvb that contains the binary representation of a base64
|
||||||
|
|
|
@ -0,0 +1,192 @@
|
||||||
|
/* tvbuff_brotli.c
|
||||||
|
*
|
||||||
|
* Wireshark - Network traffic analyzer
|
||||||
|
* By Gerald Combs <gerald@wireshark.org>
|
||||||
|
* Copyright 1998 Gerald Combs
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <glib.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_BROTLI
|
||||||
|
#include <brotli/decode.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "tvbuff.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_BROTLI
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 512KiB is the buffer size used by the brotli tool, so we
|
||||||
|
* use that too.
|
||||||
|
*/
|
||||||
|
#define TVB_BROTLI_BUFSIZ (1 << 19)
|
||||||
|
|
||||||
|
static void*
|
||||||
|
brotli_g_malloc_wrapper(void *opaque _U_, size_t size)
|
||||||
|
{
|
||||||
|
return g_malloc(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
brotli_g_free_wrapper(void *opaque _U_, void *address)
|
||||||
|
{
|
||||||
|
g_free(address);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Uncompresses a brotli compressed packet inside a message of tvb at offset with
|
||||||
|
* length comprlen. Returns an uncompressed tvbuffer if uncompression
|
||||||
|
* succeeded or NULL if uncompression failed.
|
||||||
|
*/
|
||||||
|
|
||||||
|
tvbuff_t *
|
||||||
|
tvb_uncompress_brotli(tvbuff_t *tvb, const int offset, int comprlen)
|
||||||
|
{
|
||||||
|
guint8 *compr;
|
||||||
|
guint8 *uncompr = NULL;
|
||||||
|
tvbuff_t *uncompr_tvb;
|
||||||
|
BrotliDecoderState *decoder;
|
||||||
|
guint8 *strmbuf;
|
||||||
|
const size_t bufsiz = TVB_BROTLI_BUFSIZ;
|
||||||
|
size_t available_in;
|
||||||
|
const guint8 *next_in;
|
||||||
|
size_t available_out;
|
||||||
|
guint8 *next_out;
|
||||||
|
size_t total_out;
|
||||||
|
guint needs_more_output;
|
||||||
|
guint finished;
|
||||||
|
|
||||||
|
if (tvb == NULL || comprlen <= 0) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
compr = (guint8 *)tvb_memdup(NULL, tvb, offset, comprlen);
|
||||||
|
if (compr == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
decoder = BrotliDecoderCreateInstance(
|
||||||
|
&brotli_g_malloc_wrapper /*alloc_func*/,
|
||||||
|
&brotli_g_free_wrapper /*free_func*/,
|
||||||
|
NULL /*opaque*/);
|
||||||
|
if (decoder == NULL) {
|
||||||
|
wmem_free(NULL, compr);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
strmbuf = (guint8 *)g_malloc(bufsiz);
|
||||||
|
|
||||||
|
available_in = comprlen;
|
||||||
|
next_in = compr;
|
||||||
|
total_out = 0;
|
||||||
|
needs_more_output = 0;
|
||||||
|
finished = 0;
|
||||||
|
while (available_in > 0 || needs_more_output) {
|
||||||
|
needs_more_output = 0;
|
||||||
|
available_out = bufsiz;
|
||||||
|
next_out = strmbuf;
|
||||||
|
|
||||||
|
BrotliDecoderResult result = BrotliDecoderDecompressStream(
|
||||||
|
decoder, &available_in, &next_in, &available_out, &next_out, &total_out);
|
||||||
|
switch (result) {
|
||||||
|
case BROTLI_DECODER_RESULT_SUCCESS:
|
||||||
|
if (available_in > 0) {
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
finished = 1;
|
||||||
|
break;
|
||||||
|
case BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:
|
||||||
|
needs_more_output = 1;
|
||||||
|
break;
|
||||||
|
case BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:
|
||||||
|
/*
|
||||||
|
* It's possible that not enough frames were captured
|
||||||
|
* to decompress this fully, so return what we've done
|
||||||
|
* so far, if any.
|
||||||
|
*/
|
||||||
|
break;
|
||||||
|
case BROTLI_DECODER_RESULT_ERROR:
|
||||||
|
default:
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check if decompressed size is too large.
|
||||||
|
*/
|
||||||
|
if (total_out > G_MAXINT) {
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* BrotliDecoderDecompressStream sets available_out to the number of bytes
|
||||||
|
* left unused from the buffer. But we are interested in the bytes it wrote
|
||||||
|
* to the buffer in this pass, so we calculate pass_out.
|
||||||
|
*/
|
||||||
|
size_t pass_out = bufsiz - available_out;
|
||||||
|
if (pass_out > 0) {
|
||||||
|
uncompr = (guint8 *)g_realloc(uncompr, total_out);
|
||||||
|
memcpy(uncompr + (total_out - pass_out), strmbuf, pass_out);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (uncompr == NULL) {
|
||||||
|
/*
|
||||||
|
* This is for the case when the validly decompressed
|
||||||
|
* length is 0.
|
||||||
|
*/
|
||||||
|
if (finished) {
|
||||||
|
uncompr = (guint8 *)g_strdup("");
|
||||||
|
} else {
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uncompr_tvb = tvb_new_real_data((guint8 *)uncompr, (guint)total_out, (gint)total_out);
|
||||||
|
tvb_set_free_cb(uncompr_tvb, g_free);
|
||||||
|
|
||||||
|
g_free(strmbuf);
|
||||||
|
wmem_free(NULL, compr);
|
||||||
|
BrotliDecoderDestroyInstance(decoder);
|
||||||
|
return uncompr_tvb;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
g_free(strmbuf);
|
||||||
|
g_free(uncompr);
|
||||||
|
wmem_free(NULL, compr);
|
||||||
|
BrotliDecoderDestroyInstance(decoder);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
tvbuff_t *
|
||||||
|
tvb_uncompress_brotli(tvbuff_t *tvb _U_, const int offset _U_, int comprlen _U_)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
tvbuff_t *
|
||||||
|
tvb_child_uncompress_brotli(tvbuff_t *parent, tvbuff_t *tvb, const int offset, int comprlen)
|
||||||
|
{
|
||||||
|
tvbuff_t *new_tvb = tvb_uncompress_brotli(tvb, offset, comprlen);
|
||||||
|
if (new_tvb)
|
||||||
|
tvb_set_child_real_data_tvbuff(parent, new_tvb);
|
||||||
|
return new_tvb;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Editor modelines - https://www.wireshark.org/tools/modelines.html
|
||||||
|
*
|
||||||
|
* Local variables:
|
||||||
|
* c-basic-offset: 4
|
||||||
|
* tab-width: 8
|
||||||
|
* indent-tabs-mode: nil
|
||||||
|
* End:
|
||||||
|
*
|
||||||
|
* vi: set shiftwidth=4 tabstop=8 expandtab:
|
||||||
|
* :indentSize=4:tabSize=8:noTabs=true:
|
||||||
|
*/
|
|
@ -19,6 +19,7 @@
|
||||||
%bcond_with nghttp2
|
%bcond_with nghttp2
|
||||||
%bcond_with sdjournal
|
%bcond_with sdjournal
|
||||||
%bcond_with guides
|
%bcond_with guides
|
||||||
|
%bcond_with brotli
|
||||||
|
|
||||||
|
|
||||||
# Set at most one of these two:
|
# Set at most one of these two:
|
||||||
|
@ -145,6 +146,21 @@ Requires: systemd-libs
|
||||||
%endif
|
%endif
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
%if %{with brotli}
|
||||||
|
%if 0%{?suse_version}
|
||||||
|
BuildRequires: libbrotli-devel
|
||||||
|
# On SUSE libbrotli-devel installs the libbrotlidec.so, libbrotlienc.so
|
||||||
|
# and libbrotlicommon.so symlinks, but only installs the libbrotlicommon1 and libbrotlienc1
|
||||||
|
# packages, leaving the libbrotlidec.so symlink broken, so we have to include libbrotlidec1
|
||||||
|
# as a build-time dependency...
|
||||||
|
BuildRequires: libbrotlidec1
|
||||||
|
Requires: libbrotlidec1
|
||||||
|
%else
|
||||||
|
BuildRequires: brotli-devel
|
||||||
|
Requires: brotli
|
||||||
|
%endif
|
||||||
|
%endif
|
||||||
|
|
||||||
# Uncomment these if you want to be sure you get them...
|
# Uncomment these if you want to be sure you get them...
|
||||||
#BuildRequires: krb5-devel
|
#BuildRequires: krb5-devel
|
||||||
#BuildRequires: libsmi-devel
|
#BuildRequires: libsmi-devel
|
||||||
|
@ -314,6 +330,11 @@ cmake3 \
|
||||||
-DBUILD_sdjournal=ON \
|
-DBUILD_sdjournal=ON \
|
||||||
%else
|
%else
|
||||||
-DBUILD_sdjournal=OFF \
|
-DBUILD_sdjournal=OFF \
|
||||||
|
%endif
|
||||||
|
%if %{with brotli}
|
||||||
|
-DENABLE_BROTLI=ON \
|
||||||
|
%else
|
||||||
|
-DENABLE_BROTLI=OFF \
|
||||||
%endif
|
%endif
|
||||||
-DDISABLE_WERROR=ON \
|
-DDISABLE_WERROR=ON \
|
||||||
%if %{with ninja}
|
%if %{with ninja}
|
||||||
|
@ -476,6 +497,9 @@ update-mime-database %{_datadir}/mime &> /dev/null || :
|
||||||
%{_libdir}/pkgconfig/wireshark.pc
|
%{_libdir}/pkgconfig/wireshark.pc
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Apr 22 2019 Daniel Bakai
|
||||||
|
- Added brotli (as an option, defaulting to not required).
|
||||||
|
|
||||||
* Fri Sep 28 2018 Gerald Combs
|
* Fri Sep 28 2018 Gerald Combs
|
||||||
- Add sdjournal
|
- Add sdjournal
|
||||||
|
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -169,6 +169,7 @@ def features(cmd_tshark, make_env):
|
||||||
have_libgcrypt17=gcry_m and float(gcry_m.group(1)) >= 1.7,
|
have_libgcrypt17=gcry_m and float(gcry_m.group(1)) >= 1.7,
|
||||||
have_gnutls='with GnuTLS' in tshark_v,
|
have_gnutls='with GnuTLS' in tshark_v,
|
||||||
have_pkcs11='and PKCS #11 support' in tshark_v,
|
have_pkcs11='and PKCS #11 support' in tshark_v,
|
||||||
|
have_brotli='with brotli' in tshark_v,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,20 @@ import subprocesstest
|
||||||
import unittest
|
import unittest
|
||||||
import fixtures
|
import fixtures
|
||||||
|
|
||||||
|
@fixtures.mark_usefixtures('test_env')
|
||||||
|
@fixtures.uses_fixtures
|
||||||
|
class case_dissect_http(subprocesstest.SubprocessTestCase):
|
||||||
|
def test_http_brotli_decompression(self, cmd_tshark, features, dirs, capture_file):
|
||||||
|
'''HTTP brotli decompression'''
|
||||||
|
if not features.have_brotli:
|
||||||
|
self.skipTest('Requires brotli.')
|
||||||
|
self.assertRun((cmd_tshark,
|
||||||
|
'-r', capture_file('http-brotli.pcapng'),
|
||||||
|
'-Y', 'http.response.code==200',
|
||||||
|
'-Tfields', '-etext',
|
||||||
|
))
|
||||||
|
self.assertTrue(self.grepOutput('This is a test file for testing brotli decompression in Wireshark'))
|
||||||
|
|
||||||
@fixtures.mark_usefixtures('test_env')
|
@fixtures.mark_usefixtures('test_env')
|
||||||
@fixtures.uses_fixtures
|
@fixtures.uses_fixtures
|
||||||
class case_dissect_http2(subprocesstest.SubprocessTestCase):
|
class case_dissect_http2(subprocesstest.SubprocessTestCase):
|
||||||
|
@ -30,6 +44,18 @@ class case_dissect_http2(subprocesstest.SubprocessTestCase):
|
||||||
))
|
))
|
||||||
self.assertTrue(self.grepOutput('DATA'))
|
self.assertTrue(self.grepOutput('DATA'))
|
||||||
|
|
||||||
|
def test_http2_brotli_decompression(self, cmd_tshark, features, dirs, capture_file):
|
||||||
|
'''HTTP2 brotli decompression'''
|
||||||
|
if not features.have_nghttp2:
|
||||||
|
self.skipTest('Requires nghttp2.')
|
||||||
|
if not features.have_brotli:
|
||||||
|
self.skipTest('Requires brotli.')
|
||||||
|
self.assertRun((cmd_tshark,
|
||||||
|
'-r', capture_file('http2-brotli.pcapng'),
|
||||||
|
'-Y', 'http2.data.data matches "This is a test file for testing brotli decompression in Wireshark"',
|
||||||
|
))
|
||||||
|
self.assertTrue(self.grepOutput('DATA'))
|
||||||
|
|
||||||
@fixtures.mark_usefixtures('test_env')
|
@fixtures.mark_usefixtures('test_env')
|
||||||
@fixtures.uses_fixtures
|
@fixtures.uses_fixtures
|
||||||
class case_dissect_tcp(subprocesstest.SubprocessTestCase):
|
class case_dissect_tcp(subprocesstest.SubprocessTestCase):
|
||||||
|
|
|
@ -137,6 +137,10 @@ echo "libgnutls28-dev is unavailable" >&2
|
||||||
add_package ADDITIONAL_LIST libmaxminddb-dev ||
|
add_package ADDITIONAL_LIST libmaxminddb-dev ||
|
||||||
echo "libmaxminddb-dev is unavailable" >&2
|
echo "libmaxminddb-dev is unavailable" >&2
|
||||||
|
|
||||||
|
# Debian >= stretch-backports, Ubuntu >= 16.04
|
||||||
|
add_package ADDITIONAL_LIST libbrotli-dev ||
|
||||||
|
echo "libbrotli-dev is unavailable" >&2
|
||||||
|
|
||||||
# libsystemd-journal-dev: Ubuntu 14.04
|
# libsystemd-journal-dev: Ubuntu 14.04
|
||||||
# libsystemd-dev: Ubuntu >= 16.04
|
# libsystemd-dev: Ubuntu >= 16.04
|
||||||
add_package DEBDEPS_LIST libsystemd-dev ||
|
add_package DEBDEPS_LIST libsystemd-dev ||
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
brew update
|
brew update
|
||||||
|
|
||||||
#install some libs needed by Wireshark
|
#install some libs needed by Wireshark
|
||||||
brew install c-ares glib libgcrypt gnutls lua@5.1 cmake python nghttp2 snappy lz4 libxml2 ninja libmaxminddb doxygen libsmi spandsp
|
brew install c-ares glib libgcrypt gnutls lua@5.1 cmake python nghttp2 snappy lz4 libxml2 ninja libmaxminddb doxygen libsmi spandsp brotli
|
||||||
|
|
||||||
#install Qt5
|
#install Qt5
|
||||||
brew install qt5
|
brew install qt5
|
||||||
|
|
|
@ -172,6 +172,7 @@ if [ "$SPANDSP_VERSION" ]; then
|
||||||
fi
|
fi
|
||||||
BCG729_VERSION=1.0.2
|
BCG729_VERSION=1.0.2
|
||||||
PYTHON3_VERSION=3.7.1
|
PYTHON3_VERSION=3.7.1
|
||||||
|
BROTLI_VERSION=1.0.7
|
||||||
|
|
||||||
#
|
#
|
||||||
# GNU autotools; they're provided with releases up to Snow Leopard, but
|
# GNU autotools; they're provided with releases up to Snow Leopard, but
|
||||||
|
@ -1711,11 +1712,70 @@ uninstall_python3() {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
install_brotli() {
|
||||||
|
if [ "$BROTLI_VERSION" -a ! -f brotli-$BROTLI_VERSION-done ] ; then
|
||||||
|
echo "Downloading, building, and installing brotli:"
|
||||||
|
[ -f brotli-$BROTLI_VERSION.tar.gz ] || curl -L -o brotli-$BROTLI_VERSION.tar.gz https://github.com/google/brotli/archive/v$BROTLI_VERSION.tar.gz || exit 1
|
||||||
|
$no_build && echo "Skipping installation" && return
|
||||||
|
gzcat brotli-$BROTLI_VERSION.tar.gz | tar xf - || exit 1
|
||||||
|
cd brotli-$BROTLI_VERSION
|
||||||
|
mkdir build_dir
|
||||||
|
cd build_dir
|
||||||
|
MACOSX_DEPLOYMENT_TARGET=$min_osx_target SDKROOT="$SDKPATH" cmake ../ || exit 1
|
||||||
|
make $MAKE_BUILD_OPTS || exit 1
|
||||||
|
$DO_MAKE_INSTALL || exit 1
|
||||||
|
cd ../..
|
||||||
|
touch brotli-$BROTLI_VERSION-done
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
uninstall_brotli() {
|
||||||
|
if [ ! -z "$installed_brotli_version" ] ; then
|
||||||
|
echo "Uninstalling brotli:"
|
||||||
|
cd brotli-$installed_brotli_version
|
||||||
|
#
|
||||||
|
# brotli uses cmake on macOS and doesn't support "make uninstall"
|
||||||
|
#
|
||||||
|
# $DO_MAKE_UNINSTALL || exit 1
|
||||||
|
sudo rm -rf /usr/local/bin/brotli
|
||||||
|
sudo rm -rf /usr/local/lib/libbrotli*
|
||||||
|
sudo rm -rf /usr/local/include/brotli
|
||||||
|
sudo rm -rf /usr/local/lib/pkgconfig/libbrotli*
|
||||||
|
#
|
||||||
|
# brotli uses cmake on macOS and doesn't support "make distclean"
|
||||||
|
#
|
||||||
|
# make distclean || exit 1
|
||||||
|
cd ..
|
||||||
|
rm brotli-$installed_brotli_version-done
|
||||||
|
|
||||||
|
if [ "$#" -eq 1 -a "$1" = "-r" ] ; then
|
||||||
|
#
|
||||||
|
# Get rid of the previously downloaded and unpacked version.
|
||||||
|
#
|
||||||
|
rm -rf brotli-$installed_brotli_version
|
||||||
|
rm -rf brotli-$installed_brotli_version.tar.gz
|
||||||
|
fi
|
||||||
|
|
||||||
|
installed_brotli_version=""
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
install_all() {
|
install_all() {
|
||||||
#
|
#
|
||||||
# Check whether the versions we have installed are the versions
|
# Check whether the versions we have installed are the versions
|
||||||
# requested; if not, uninstall the installed versions.
|
# requested; if not, uninstall the installed versions.
|
||||||
#
|
#
|
||||||
|
if [ ! -z "$installed_brotli_version" -a \
|
||||||
|
"$installed_brotli_version" != "$BROTLI_VERSION" ] ; then
|
||||||
|
echo "Installed brotli version is $installed_brotli_version"
|
||||||
|
if [ -z "$BROTLI_VERSION" ] ; then
|
||||||
|
echo "brotli is not requested"
|
||||||
|
else
|
||||||
|
echo "Requested brotli version is $BROTLI_VERSION"
|
||||||
|
fi
|
||||||
|
uninstall_brotli -r
|
||||||
|
fi
|
||||||
|
|
||||||
if [ ! -z "$installed_python3_version" -a \
|
if [ ! -z "$installed_python3_version" -a \
|
||||||
"$installed_python3_version" != "$PYTHON3_VERSION" ] ; then
|
"$installed_python3_version" != "$PYTHON3_VERSION" ] ; then
|
||||||
echo "Installed python3 version is $installed_python3_version"
|
echo "Installed python3 version is $installed_python3_version"
|
||||||
|
@ -2188,6 +2248,8 @@ install_all() {
|
||||||
install_bcg729
|
install_bcg729
|
||||||
|
|
||||||
install_python3
|
install_python3
|
||||||
|
|
||||||
|
install_brotli
|
||||||
}
|
}
|
||||||
|
|
||||||
uninstall_all() {
|
uninstall_all() {
|
||||||
|
@ -2204,6 +2266,8 @@ uninstall_all() {
|
||||||
# We also do a "make distclean", so that we don't have leftovers from
|
# We also do a "make distclean", so that we don't have leftovers from
|
||||||
# old configurations.
|
# old configurations.
|
||||||
#
|
#
|
||||||
|
uninstall_brotli
|
||||||
|
|
||||||
uninstall_python3
|
uninstall_python3
|
||||||
|
|
||||||
uninstall_bcg729
|
uninstall_bcg729
|
||||||
|
@ -2406,6 +2470,7 @@ then
|
||||||
installed_spandsp_version=`ls spandsp-*-done 2>/dev/null | sed 's/spandsp-\(.*\)-done/\1/'`
|
installed_spandsp_version=`ls spandsp-*-done 2>/dev/null | sed 's/spandsp-\(.*\)-done/\1/'`
|
||||||
installed_bcg729_version=`ls bcg729-*-done 2>/dev/null | sed 's/bcg729-\(.*\)-done/\1/'`
|
installed_bcg729_version=`ls bcg729-*-done 2>/dev/null | sed 's/bcg729-\(.*\)-done/\1/'`
|
||||||
installed_python3_version=`ls python3-*-done 2>/dev/null | sed 's/python3-\(.*\)-done/\1/'`
|
installed_python3_version=`ls python3-*-done 2>/dev/null | sed 's/python3-\(.*\)-done/\1/'`
|
||||||
|
installed_brotli_version=`ls brotli-*-done 2>/dev/null | sed 's/brotli-\(.*\)-done/\1/'`
|
||||||
|
|
||||||
cd $topdir
|
cd $topdir
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -106,6 +106,19 @@ add_package() {
|
||||||
eval "${list}=\"\${${list}} \${pkgname}\""
|
eval "${list}=\"\${${list}} \${pkgname}\""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Adds packages $2-$n to list variable $1 if all the packages are found
|
||||||
|
add_packages() {
|
||||||
|
local list="$1" pkgnames="${@:2}"
|
||||||
|
|
||||||
|
# fail if any package is not known
|
||||||
|
for pkgname in $pkgnames; do
|
||||||
|
$PM $PM_SEARCH "$pkgname" &> /dev/null || return 1
|
||||||
|
done
|
||||||
|
|
||||||
|
# all packages are found, append it to list
|
||||||
|
eval "${list}=\"\${${list}} \${pkgnames}\""
|
||||||
|
}
|
||||||
|
|
||||||
# python3: OpenSUSE 43.3, Fedora 26
|
# python3: OpenSUSE 43.3, Fedora 26
|
||||||
# python34: Centos 7
|
# python34: Centos 7
|
||||||
add_package BASIC_LIST python3 || add_package BASIC_LIST python34 ||
|
add_package BASIC_LIST python3 || add_package BASIC_LIST python34 ||
|
||||||
|
@ -197,6 +210,9 @@ echo "ninja is unavailable" >&2
|
||||||
add_package ADDITIONAL_LIST libxslt || add_package ADDITIONAL_LIST libxslt1 ||
|
add_package ADDITIONAL_LIST libxslt || add_package ADDITIONAL_LIST libxslt1 ||
|
||||||
echo "xslt is unavailable" >&2
|
echo "xslt is unavailable" >&2
|
||||||
|
|
||||||
|
add_package ADDITIONAL_LIST brotli-devel || add_packages ADDITIONAL_LIST libbrotli-devel libbrotlidec1 ||
|
||||||
|
echo "brotli is unavailable" >&2
|
||||||
|
|
||||||
ACTUAL_LIST=$BASIC_LIST
|
ACTUAL_LIST=$BASIC_LIST
|
||||||
|
|
||||||
# Now arrange for optional support libraries
|
# Now arrange for optional support libraries
|
||||||
|
|
|
@ -76,6 +76,7 @@ $Win32CurrentTag = "2019-04-08"
|
||||||
$Win64Archives = @{
|
$Win64Archives = @{
|
||||||
"AirPcap_Devpack_4_1_0_1622.zip" = "09d637f28a79b1d2ecb09f35436271a90c0f69bd0a1ee82b803abaaf63c18a69";
|
"AirPcap_Devpack_4_1_0_1622.zip" = "09d637f28a79b1d2ecb09f35436271a90c0f69bd0a1ee82b803abaaf63c18a69";
|
||||||
"bcg729-1.0.4-win64ws.zip" = "9a095fda4c39860d96f0c568830faa6651cd17635f68e27aa6de46c689aa0ee2";
|
"bcg729-1.0.4-win64ws.zip" = "9a095fda4c39860d96f0c568830faa6651cd17635f68e27aa6de46c689aa0ee2";
|
||||||
|
"brotli-1.0.2-4-win64ws.zip" = "f60636764f0e2539ad86d37826e90445a346291f8d046bd4f5c998301f200195";
|
||||||
"c-ares-1.15.0-win64ws.zip" = "ade864fd08e887d353a9c939fa6e68b0bf3e08761b6e81f60ce15e6543256552";
|
"c-ares-1.15.0-win64ws.zip" = "ade864fd08e887d353a9c939fa6e68b0bf3e08761b6e81f60ce15e6543256552";
|
||||||
"gnutls-3.6.3-1-win64ws.zip" = "994ac2578e7b4ca01e589ab2598927d53f7370bc3ff679f3006b0e6bb7a06df4";
|
"gnutls-3.6.3-1-win64ws.zip" = "994ac2578e7b4ca01e589ab2598927d53f7370bc3ff679f3006b0e6bb7a06df4";
|
||||||
"krb5-1.17-1-win64ws.zip" = "1f4a7ab86ae331ea9e58c9776a60def81ae9fe622882b2e8da2ad6ce6f6fb1d8";
|
"krb5-1.17-1-win64ws.zip" = "1f4a7ab86ae331ea9e58c9776a60def81ae9fe622882b2e8da2ad6ce6f6fb1d8";
|
||||||
|
@ -97,6 +98,7 @@ $Win64Archives = @{
|
||||||
$Win32Archives = @{
|
$Win32Archives = @{
|
||||||
"AirPcap_Devpack_4_1_0_1622.zip" = "09d637f28a79b1d2ecb09f35436271a90c0f69bd0a1ee82b803abaaf63c18a69";
|
"AirPcap_Devpack_4_1_0_1622.zip" = "09d637f28a79b1d2ecb09f35436271a90c0f69bd0a1ee82b803abaaf63c18a69";
|
||||||
"bcg729-1.0.4-win32ws.zip" = "b785ec78dec6bca8252130eb884bfa28c1140001dd7369a535579176de9e4271";
|
"bcg729-1.0.4-win32ws.zip" = "b785ec78dec6bca8252130eb884bfa28c1140001dd7369a535579176de9e4271";
|
||||||
|
"brotli-1.0.2-4-win32ws.zip" = "193a9b35e42a73f77dabe2c99c57173d7f2bb215118c1cd027a6cf522cc3dc14";
|
||||||
"c-ares-1.15.0-win32ws.zip" = "a54151203a631b478470aaa21b3a1fde6178f2fea9f15a1a6da4bfcecc92cfcd";
|
"c-ares-1.15.0-win32ws.zip" = "a54151203a631b478470aaa21b3a1fde6178f2fea9f15a1a6da4bfcecc92cfcd";
|
||||||
"gnutls-3.6.3-1-win32ws.zip" = "42d8313ffb888f525d6c39330c39bcc2182e68ee8433a09dd85e1f1e1474f592";
|
"gnutls-3.6.3-1-win32ws.zip" = "42d8313ffb888f525d6c39330c39bcc2182e68ee8433a09dd85e1f1e1474f592";
|
||||||
"krb5-1.17-1-win32ws.zip" = "f90cac08355ccfe624652d3e05f8e2e077b8830382315d4ea0a6fa52af08260b";
|
"krb5-1.17-1-win32ws.zip" = "f90cac08355ccfe624652d3e05f8e2e077b8830382315d4ea0a6fa52af08260b";
|
||||||
|
|
Loading…
Reference in New Issue