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:
Dániel Bakai 2019-04-10 12:52:52 +02:00 committed by Peter Wu
parent 51ac1047a7
commit 9ce60b173b
24 changed files with 496 additions and 16 deletions

View File

@ -1104,6 +1104,9 @@ ws_find_package(CARES ENABLE_CARES HAVE_C_ARES "1.5.0")
# Zlib compression
ws_find_package(ZLIB ENABLE_ZLIB HAVE_ZLIB)
# Brotli compression
ws_find_package(BROTLI ENABLE_BROTLI HAVE_BROTLI)
# LZ4 compression
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_PDBS "${ZLIB_DLL_DIR}/${ZLIB_PDB}")
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
# (early 2018) expands to about 1900 characters.
@ -2756,6 +2764,9 @@ if(RPMBUILD_EXECUTABLE)
if (SYSTEMD_FOUND)
list(APPEND _rpmbuild_with_args --with sdjournal)
endif()
if (BROTLI_FOUND)
list(APPEND _rpmbuild_with_args --with brotli)
endif()
execute_process(
COMMAND ${PERL_EXECUTABLE}

View File

@ -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_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_NGHTTP2 "Build with HTTP/2 header decompression support" ON)
option(ENABLE_LUA "Build with Lua dissector support" ON)

View File

@ -153,6 +153,13 @@ README.windows for those instructions.
the capture-file utilities that come in this package, use
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
By default, if your system can support run-time loadable modules,
the packet analyzers are build with support for plugins.

View File

@ -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 )

View File

@ -136,6 +136,9 @@
/* Define to use zlib library */
#cmakedefine HAVE_ZLIB 1
/* Define to use brotli library */
#cmakedefine HAVE_BROTLI 1
/* Define to use lz4 library */
#cmakedefine HAVE_LZ4 1

2
debian/control vendored
View File

@ -17,7 +17,7 @@ Build-Depends: lsb-release,
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,
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
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/

View File

@ -1680,6 +1680,7 @@ libwireshark.so.0 libwireshark0 #MINVER#
tvb_captured_length@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_brotli@Base 3.1.0
tvb_clone@Base 1.12.0~rc1
tvb_clone_offset_len@Base 1.12.0~rc1
tvb_composite_append@Base 1.9.1
@ -1801,6 +1802,7 @@ libwireshark.so.0 libwireshark0 #MINVER#
tvb_strnlen@Base 1.9.1
tvb_strsize@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_ws_mempbrk_pattern_guint8@Base 1.99.3
tvbparse_casestring@Base 1.9.1

View File

@ -34,7 +34,7 @@ Features” section below for more details.
The following features are new (or have been significantly updated)
since version 3.0.0:
* Watch this space.
* Brotli decompression support in HTTP/HTTP2 (requires the brotli library).
// === Removed Features and Support

View File

@ -16,6 +16,7 @@ if (HAVE_HFI_SECTION_INIT)
endif()
include_directories(
${BROTLI_INCLUDE_DIRS}
${GLIB2_INCLUDE_DIRS}
${CARES_INCLUDE_DIRS}
${GCRYPT_INCLUDE_DIRS}
@ -265,6 +266,7 @@ set(LIBWIRESHARK_NONGENERATED_FILES
tvbparse.c
tvbuff.c
tvbuff_base64.c
tvbuff_brotli.c
tvbuff_composite.c
tvbuff_real.c
tvbuff_subset.c
@ -378,6 +380,7 @@ target_link_libraries(epan
wsutil
${GLIB2_LIBRARIES}
PRIVATE
${BROTLI_LIBRARIES}
${CARES_LIBRARIES}
${GCRYPT_LIBRARIES}
${GIO2_LIBRARIES}

View File

@ -237,9 +237,9 @@ static gboolean http_desegment_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;
#else
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_tree *e_tree = NULL;
#ifdef HAVE_ZLIB
if (http_decompress_body &&
(g_ascii_strcasecmp(headers.content_encoding, "gzip") == 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,
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
@ -4017,7 +4028,7 @@ proto_register_http(void)
"Whether to reassemble bodies of entities that are transferred "
"using the \"Transfer-Encoding: chunked\" method",
&http_dechunk_body);
#ifdef HAVE_ZLIB
#if defined(HAVE_ZLIB) || defined(HAVE_BROTLI)
prefs_register_bool_preference(http_module, "decompress_body",
"Uncompress entity bodies",
"Whether to uncompress entity bodies that are compressed "

View File

@ -65,9 +65,9 @@ VALUE_STRING_ENUM(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;
#else
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
static int
can_uncompress_body(packet_info *pinfo)
enum body_uncompression {
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);
gchar *content_encoding = body_info->content_encoding;
/* 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 */
return http2_decompress_body
&& body_info->is_partial_content == FALSE
&& content_encoding != NULL
&& (strncmp(content_encoding, "gzip", 4) == 0 || strncmp(content_encoding, "deflate", 7) == 0);
if (!http2_decompress_body || body_info->is_partial_content == TRUE || content_encoding == NULL) {
return BODY_UNCOMPRESSION_NONE;
}
#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. */
@ -2027,9 +2045,17 @@ dissect_http2_data_full_body(tvbuff_t *tvb, packet_info *pinfo, proto_tree *http
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;
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);
gchar *compression_method = body_info->content_encoding;

View File

@ -80,6 +80,10 @@
#include <nghttp2/nghttp2ver.h>
#endif
#ifdef HAVE_BROTLI
#include <brotli/decode.h>
#endif
#ifdef HAVE_LIBXML2
#include <libxml/xmlversion.h>
#include <libxml/parser.h>
@ -769,6 +773,14 @@ epan_get_compiled_version_info(GString *str)
g_string_append(str, "without 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 */
g_string_append(str, ", ");
#ifdef HAVE_LZ4
@ -808,6 +820,12 @@ epan_get_runtime_version_info(GString *str)
/* Gcrypt */
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
}
/*

View File

@ -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,
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 */
/** Return a tvb that contains the binary representation of a base64

192
epan/tvbuff_brotli.c Normal file
View File

@ -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:
*/

View File

@ -19,6 +19,7 @@
%bcond_with nghttp2
%bcond_with sdjournal
%bcond_with guides
%bcond_with brotli
# Set at most one of these two:
@ -145,6 +146,21 @@ Requires: systemd-libs
%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...
#BuildRequires: krb5-devel
#BuildRequires: libsmi-devel
@ -314,6 +330,11 @@ cmake3 \
-DBUILD_sdjournal=ON \
%else
-DBUILD_sdjournal=OFF \
%endif
%if %{with brotli}
-DENABLE_BROTLI=ON \
%else
-DENABLE_BROTLI=OFF \
%endif
-DDISABLE_WERROR=ON \
%if %{with ninja}
@ -476,6 +497,9 @@ update-mime-database %{_datadir}/mime &> /dev/null || :
%{_libdir}/pkgconfig/wireshark.pc
%changelog
* Mon Apr 22 2019 Daniel Bakai
- Added brotli (as an option, defaulting to not required).
* Fri Sep 28 2018 Gerald Combs
- Add sdjournal

Binary file not shown.

Binary file not shown.

View File

@ -169,6 +169,7 @@ def features(cmd_tshark, make_env):
have_libgcrypt17=gcry_m and float(gcry_m.group(1)) >= 1.7,
have_gnutls='with GnuTLS' in tshark_v,
have_pkcs11='and PKCS #11 support' in tshark_v,
have_brotli='with brotli' in tshark_v,
)

View File

@ -14,6 +14,20 @@ import subprocesstest
import unittest
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.uses_fixtures
class case_dissect_http2(subprocesstest.SubprocessTestCase):
@ -30,6 +44,18 @@ class case_dissect_http2(subprocesstest.SubprocessTestCase):
))
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.uses_fixtures
class case_dissect_tcp(subprocesstest.SubprocessTestCase):

View File

@ -137,6 +137,10 @@ echo "libgnutls28-dev is unavailable" >&2
add_package ADDITIONAL_LIST libmaxminddb-dev ||
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-dev: Ubuntu >= 16.04
add_package DEBDEPS_LIST libsystemd-dev ||

View File

@ -13,7 +13,7 @@
brew update
#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
brew install qt5

View File

@ -172,6 +172,7 @@ if [ "$SPANDSP_VERSION" ]; then
fi
BCG729_VERSION=1.0.2
PYTHON3_VERSION=3.7.1
BROTLI_VERSION=1.0.7
#
# GNU autotools; they're provided with releases up to Snow Leopard, but
@ -1711,11 +1712,70 @@ uninstall_python3() {
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() {
#
# Check whether the versions we have installed are the 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 \
"$installed_python3_version" != "$PYTHON3_VERSION" ] ; then
echo "Installed python3 version is $installed_python3_version"
@ -2188,6 +2248,8 @@ install_all() {
install_bcg729
install_python3
install_brotli
}
uninstall_all() {
@ -2204,6 +2266,8 @@ uninstall_all() {
# We also do a "make distclean", so that we don't have leftovers from
# old configurations.
#
uninstall_brotli
uninstall_python3
uninstall_bcg729
@ -2406,6 +2470,7 @@ then
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_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
fi

View File

@ -106,6 +106,19 @@ add_package() {
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
# python34: Centos 7
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 ||
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
# Now arrange for optional support libraries

View File

@ -76,6 +76,7 @@ $Win32CurrentTag = "2019-04-08"
$Win64Archives = @{
"AirPcap_Devpack_4_1_0_1622.zip" = "09d637f28a79b1d2ecb09f35436271a90c0f69bd0a1ee82b803abaaf63c18a69";
"bcg729-1.0.4-win64ws.zip" = "9a095fda4c39860d96f0c568830faa6651cd17635f68e27aa6de46c689aa0ee2";
"brotli-1.0.2-4-win64ws.zip" = "f60636764f0e2539ad86d37826e90445a346291f8d046bd4f5c998301f200195";
"c-ares-1.15.0-win64ws.zip" = "ade864fd08e887d353a9c939fa6e68b0bf3e08761b6e81f60ce15e6543256552";
"gnutls-3.6.3-1-win64ws.zip" = "994ac2578e7b4ca01e589ab2598927d53f7370bc3ff679f3006b0e6bb7a06df4";
"krb5-1.17-1-win64ws.zip" = "1f4a7ab86ae331ea9e58c9776a60def81ae9fe622882b2e8da2ad6ce6f6fb1d8";
@ -97,6 +98,7 @@ $Win64Archives = @{
$Win32Archives = @{
"AirPcap_Devpack_4_1_0_1622.zip" = "09d637f28a79b1d2ecb09f35436271a90c0f69bd0a1ee82b803abaaf63c18a69";
"bcg729-1.0.4-win32ws.zip" = "b785ec78dec6bca8252130eb884bfa28c1140001dd7369a535579176de9e4271";
"brotli-1.0.2-4-win32ws.zip" = "193a9b35e42a73f77dabe2c99c57173d7f2bb215118c1cd027a6cf522cc3dc14";
"c-ares-1.15.0-win32ws.zip" = "a54151203a631b478470aaa21b3a1fde6178f2fea9f15a1a6da4bfcecc92cfcd";
"gnutls-3.6.3-1-win32ws.zip" = "42d8313ffb888f525d6c39330c39bcc2182e68ee8433a09dd85e1f1e1474f592";
"krb5-1.17-1-win32ws.zip" = "f90cac08355ccfe624652d3e05f8e2e077b8830382315d4ea0a6fa52af08260b";