diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index e96bcd9a0b95..56dd36d978cb 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -20,6 +20,4 @@ SV_REPO=
SV_BRANCH=
SU_REPO=
SU_BRANCH=
-LIBHTP_REPO=
-LIBHTP_BRANCH=
```
diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml
index 73bb9135d6f9..8175a50932e1 100644
--- a/.github/workflows/builds.yml
+++ b/.github/workflows/builds.yml
@@ -5,8 +5,6 @@ on:
pull_request:
workflow_dispatch:
inputs:
- LIBHTP_REPO:
- LIBHTP_BRANCH:
SU_REPO:
SU_BRANCH:
SV_REPO:
@@ -55,9 +53,6 @@ jobs:
echo "Parsing branch and PR info from:"
echo "${body}"
- LIBHTP_REPO=$(echo "${body}" | awk -F = '/^LIBHTP_REPO=/ { print $2 }')
- LIBHTP_BRANCH=$(echo "${body}" | awk -F = '/^LIBHTP_BRANCH=/ { print $2 }')
-
SU_REPO=$(echo "${body}" | awk -F = '/^SU_REPO=/ { print $2 }')
SU_BRANCH=$(echo "${body}" | awk -F = '/^SU_BRANCH=/ { print $2 }')
@@ -65,8 +60,6 @@ jobs:
SV_BRANCH=$(echo "${body}" | awk -F = '/^SV_BRANCH=/ { print $2 }')
else
echo "No pull request body, will use inputs or defaults."
- LIBHTP_REPO=${{ inputs.LIBHTP_REPO }}
- LIBHTP_BRANCH=${{ inputs.LIBHTP_BRANCH }}
SU_REPO=${{ inputs.SU_REPO }}
SU_BRANCH=${{ inputs.SU_BRANCH }}
SV_REPO=${{ inputs.SV_REPO }}
@@ -74,9 +67,6 @@ jobs:
fi
# If the _REPO variables don't contain a full URL, add GitHub.
- if [ "${LIBHTP_REPO}" ] && ! echo "${LIBHTP_REPO}" | grep -q '^https://'; then
- LIBHTP_REPO="https://github.com/${LIBHTP_REPO}"
- fi
if [ "${SU_REPO}" ] && ! echo "${SU_REPO}" | grep -q '^https://'; then
SU_REPO="https://github.com/${SU_REPO}"
fi
@@ -84,9 +74,6 @@ jobs:
SV_REPO="https://github.com/${SV_REPO}"
fi
- echo LIBHTP_REPO=${LIBHTP_REPO} | tee -a ${GITHUB_ENV}
- echo LIBHTP_BRANCH=${LIBHTP_BRANCH} | tee -a ${GITHUB_ENV}
-
echo SU_REPO=${SU_REPO} | tee -a ${GITHUB_ENV}
echo SU_BRANCH=${SU_BRANCH} | tee -a ${GITHUB_ENV}
@@ -95,8 +82,6 @@ jobs:
- name: Annotate output
run: |
- echo "::notice:: LIBHTP_REPO=${LIBHTP_REPO}"
- echo "::notice:: LIBHTP_BRANCH=${LIBHTP_BRANCH}"
echo "::notice:: SU_REPO=${SU_REPO}"
echo "::notice:: SU_BRANCH=${SU_BRANCH}"
echo "::notice:: SV_REPO=${SV_REPO}"
@@ -106,10 +91,6 @@ jobs:
- name: Checking out Suricata
uses: actions/checkout@v3.5.3
- - name: Fetching libhtp
- run: |
- DESTDIR=./bundle ./scripts/bundle.sh libhtp
- tar zcf libhtp.tar.gz -C bundle libhtp
- name: Fetching suricata-update
run: |
DESTDIR=./bundle ./scripts/bundle.sh suricata-update
@@ -135,7 +116,6 @@ jobs:
with:
name: prep
path: |
- libhtp.tar.gz
suricata-update.tar.gz
suricata-verify.tar.gz
@@ -191,7 +171,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xvf prep/libhtp.tar.gz
- run: tar xvf prep/suricata-update.tar.gz
- run: tar xvf prep/suricata-verify.tar.gz
- name: Install system packages
@@ -308,7 +287,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xvf prep/libhtp.tar.gz
- run: tar xvf prep/suricata-update.tar.gz
- run: tar xvf prep/suricata-verify.tar.gz
- name: Install system packages
@@ -408,7 +386,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xvf prep/libhtp.tar.gz
- run: tar xvf prep/suricata-update.tar.gz
- run: tar xvf prep/suricata-verify.tar.gz
- name: Setup cbindgen
@@ -649,7 +626,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- run: tar xf prep/suricata-update.tar.gz
- run: ./autogen.sh
- run: ./configure --disable-shared
@@ -741,7 +717,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- run: tar xf prep/suricata-update.tar.gz
- run: ./autogen.sh
- run: CC="clang" CFLAGS="$DEFAULT_CFLAGS -Wshadow -fsanitize=address -fno-omit-frame-pointer" ./configure --enable-debug --enable-unittests --disable-shared --enable-rust-strict --enable-hiredis --enable-nfqueue --enable-lua
@@ -829,7 +804,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- run: tar xf prep/suricata-update.tar.gz
- run: ./autogen.sh
- run: ./configure --enable-debug --enable-unittests --disable-shared --enable-rust-strict --enable-hiredis --enable-nfqueue
@@ -926,7 +900,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- run: tar xf prep/suricata-update.tar.gz
- name: Setup cbindgen
run: |
@@ -1019,7 +992,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- run: tar xf prep/suricata-update.tar.gz
- name: Setup cbindgen
run: |
@@ -1121,7 +1093,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- run: tar xf prep/suricata-update.tar.gz
- name: Setup cbindgen
run: |
@@ -1213,7 +1184,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- run: tar xf prep/suricata-update.tar.gz
- name: Setup cbindgen
run: |
@@ -1303,7 +1273,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- run: tar xf prep/suricata-update.tar.gz
- run: tar xf prep/suricata-verify.tar.gz
- run: mkdir /home/suricata/suricata
@@ -1393,7 +1362,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- run: ./autogen.sh
- run: |
if ./configure; then
@@ -1465,7 +1433,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- name: Setup cbindgen
run: |
mkdir -p $HOME/.cargo/bin
@@ -1506,14 +1473,6 @@ jobs:
CARGO_INCREMENTAL: 0
- run: llvm-profdata-14 merge -o ct.profdata /tmp/ct.profraw
- run: llvm-cov-14 show $(find rust/target/debug/deps/ -type f -regex 'rust/target/debug/deps/suricata\-[a-z0-9]+$') -instr-profile=ct.profdata --show-instantiations --ignore-filename-regex="^/root/.*" >> coverage.txt
- - run: |
- cd libhtp
- make test
- cd ..
- env:
- LLVM_PROFILE_FILE: "/tmp/htp-test.profraw"
- - run: llvm-profdata-14 merge -o htp-test.profdata /tmp/htp-test.profraw
- - run: llvm-cov-14 show libhtp/test/test_all -instr-profile=htp-test.profdata --show-instantiations --ignore-filename-regex="^/root/.*" >> coverage.txt
- name: Upload coverage to Codecov
uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70
with:
@@ -1585,7 +1544,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- name: Setup cbindgen
run: |
mkdir -p $HOME/.cargo/bin
@@ -1673,7 +1631,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- run: tar xf prep/suricata-update.tar.gz
- name: Setup cbindgen
run: |
@@ -1820,7 +1777,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- name: Setup cbindgen
run: |
mkdir -p $HOME/.cargo/bin
@@ -1911,7 +1867,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- name: Setup cbindgen
run: |
mkdir -p $HOME/.cargo/bin
@@ -1989,7 +1944,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- name: Setup cbindgen
run: |
mkdir -p $HOME/.cargo/bin
@@ -2076,7 +2030,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- name: Setup cbindgen
run: |
mkdir -p $HOME/.cargo/bin
@@ -2174,7 +2127,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- name: Setup cbindgen
run: |
mkdir -p $HOME/.cargo/bin
@@ -2244,7 +2196,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- run: tar xf prep/suricata-update.tar.gz
- name: Setup cbindgen
run: |
@@ -2318,7 +2269,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- run: tar xf prep/suricata-update.tar.gz
- name: Setup cbindgen
run: |
@@ -2374,13 +2324,11 @@ jobs:
with:
name: prep
path: prep
- - run: tar xvf prep/libhtp.tar.gz
- run: tar xvf prep/suricata-update.tar.gz
- run: ./autogen.sh
- run: CFLAGS="${DEFAULT_CFLAGS}" ./configure --enable-unittests
- run: make -j2
- # somehow it gets included by some C++ stdlib header (case unsensitive)
- - run: rm libhtp/VERSION && make check
+ - run: make check
- run: tar xf prep/suricata-verify.tar.gz
- name: Running suricata-verify
run: python3 ./suricata-verify/run.py -q
@@ -2416,7 +2364,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- run: tar xf prep/suricata-update.tar.gz
- name: Npcap DLL
run: |
@@ -2472,7 +2419,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- run: tar xf prep/suricata-update.tar.gz
- run: tar xf prep/suricata-verify.tar.gz
- name: Build
@@ -2516,7 +2462,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- name: WinDivert
run: |
curl -sL -O https://github.com/basil00/Divert/releases/download/v1.4.3/WinDivert-1.4.3-A.zip
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index 17b0f75f7332..ed2d1ba5d056 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -43,7 +43,6 @@ jobs:
sudo apt-get install libjansson-dev
sudo apt-get install libpcap-dev
sudo apt-get install libnuma-dev
- git clone --depth 1 https://github.com/OISF/libhtp.git
cargo install cbindgen
export PATH=/opt/work/.cargo/bin:$PATH
chmod +x autogen.sh
diff --git a/.github/workflows/commits.yml b/.github/workflows/commits.yml
index 04bbb3fdf96b..d51dc6963749 100644
--- a/.github/workflows/commits.yml
+++ b/.github/workflows/commits.yml
@@ -77,7 +77,6 @@ jobs:
# The action above is supposed to do this for us, but it doesn't appear to stick.
- run: /usr/bin/git config --global --add safe.directory /__w/suricata/suricata
- run: git fetch
- - run: git clone https://github.com/OISF/libhtp -b 0.5.x
- name: Building all commits
run: |
echo "Building commits from ${GITHUB_BASE_REF}."
diff --git a/.github/workflows/formatting.yml b/.github/workflows/formatting.yml
index 4c17fecc8685..3b931f9bfc02 100644
--- a/.github/workflows/formatting.yml
+++ b/.github/workflows/formatting.yml
@@ -125,7 +125,6 @@ jobs:
echo "No github merge commit found"
fi
shell: bash {0}
- - run: git clone https://github.com/OISF/libhtp -b 0.5.x
- run: ./autogen.sh
- run: ./configure --enable-unittests
- name: Check formatting
diff --git a/.lgtm.yml b/.lgtm.yml
index f89598ad4157..c231fd5cd708 100644
--- a/.lgtm.yml
+++ b/.lgtm.yml
@@ -11,10 +11,9 @@ extraction:
- libnuma-dev
- libpcap-dev
after_prepare:
- - git clone --depth 1 https://github.com/OISF/libhtp.git
- cargo install cbindgen
- export PATH=/opt/work/.cargo/bin:$PATH
- chmod +x autogen.sh
- ./autogen.sh
- ./configure
- - make
\ No newline at end of file
+ - make
diff --git a/Makefile.am b/Makefile.am
index 9bf75c95010c..f4602b01e630 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -48,7 +48,7 @@ endif
@echo "You can now start suricata by running as root something like:"
@echo " $(DESTDIR)$(bindir)/suricata -c $(DESTDIR)$(e_sysconfdir)suricata.yaml -i eth0"
@echo ""
- @echo "If a library like libhtp.so is not found, you can run suricata with:"
+ @echo "If a shared library is not found, you can add library paths with:"
@echo " LD_LIBRARY_PATH="$(DESTDIR)$(prefix)/lib" "$(DESTDIR)$(bindir)/suricata" -c "$(DESTDIR)$(e_sysconfdir)suricata.yaml" -i eth0"
@echo ""
@echo "The Emerging Threats Open rules are now installed. Rules can be"
diff --git a/configure.ac b/configure.ac
index 85ef19221b6a..e2cff3ccc14d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1539,101 +1539,6 @@
[test "x$install_suricata_update" = "xyes"])
AC_SUBST([install_suricata_update_reason])
- # libhtp
- AC_ARG_ENABLE(non-bundled-htp,
- AS_HELP_STRING([--enable-non-bundled-htp], [Enable the use of an already installed version of htp]),[enable_non_bundled_htp=$enableval],[enable_non_bundled_htp=no])
- AS_IF([test "x$enable_non_bundled_htp" = "xyes"], [
- PKG_CHECK_MODULES([libhtp], htp,, [with_pkgconfig_htp=no])
- if test "$with_pkgconfig_htp" != "no"; then
- CPPFLAGS="${CPPFLAGS} ${libhtp_CFLAGS}"
- LIBS="${LIBS} ${libhtp_LIBS}"
- fi
-
- AC_ARG_WITH(libhtp_includes,
- [ --with-libhtp-includes=DIR libhtp include directory],
- [with_libhtp_includes="$withval"],[with_libhtp_includes=no])
- AC_ARG_WITH(libhtp_libraries,
- [ --with-libhtp-libraries=DIR libhtp library directory],
- [with_libhtp_libraries="$withval"],[with_libhtp_libraries="no"])
-
- if test "$with_libhtp_includes" != "no"; then
- CPPFLAGS="-I${with_libhtp_includes} ${CPPFLAGS}"
- fi
-
- if test "$with_libhtp_libraries" != "no"; then
- LDFLAGS="${LDFLAGS} -L${with_libhtp_libraries}"
- fi
-
- AC_CHECK_HEADER(htp/htp.h,,[AC_MSG_ERROR(htp/htp.h not found ...)])
-
- LIBHTP=""
- AC_CHECK_LIB(htp, htp_conn_create,, LIBHTP="no")
- if test "$LIBHTP" = "no"; then
- echo
- echo " ERROR! libhtp library not found"
- echo
- exit 1
- fi
- PKG_CHECK_MODULES(LIBHTPMINVERSION, [htp >= 0.5.44],[libhtp_minver_found="yes"],[libhtp_minver_found="no"])
- if test "$libhtp_minver_found" = "no"; then
- PKG_CHECK_MODULES(LIBHTPDEVVERSION, [htp = 0.5.X],[libhtp_devver_found="yes"],[libhtp_devver_found="no"])
- if test "$libhtp_devver_found" = "no"; then
- echo
- echo " ERROR! libhtp was found but it is neither >= 0.5.44, nor the dev 0.5.X"
- echo
- exit 1
- fi
- fi
-
- AC_CHECK_LIB([htp], [htp_config_register_request_uri_normalize],AC_DEFINE_UNQUOTED([HAVE_HTP_URI_NORMALIZE_HOOK],[1],[Found htp_config_register_request_uri_normalize function in libhtp]) ,,[-lhtp])
- # check for htp_tx_get_response_headers_raw
- AC_CHECK_LIB([htp], [htp_tx_get_response_headers_raw],AC_DEFINE_UNQUOTED([HAVE_HTP_TX_GET_RESPONSE_HEADERS_RAW],[1],[Found htp_tx_get_response_headers_raw in libhtp]) ,,[-lhtp])
- AC_CHECK_LIB([htp], [htp_decode_query_inplace],AC_DEFINE_UNQUOTED([HAVE_HTP_DECODE_QUERY_INPLACE],[1],[Found htp_decode_query_inplace function in libhtp]) ,,[-lhtp])
- AC_CHECK_LIB([htp], [htp_config_set_response_decompression_layer_limit],AC_DEFINE_UNQUOTED([HAVE_HTP_CONFIG_SET_RESPONSE_DECOMPRESSION_LAYER_LIMIT],[1],[Found htp_config_set_response_decompression_layer_limit function in libhtp]) ,,[-lhtp])
- AC_EGREP_HEADER(htp_config_set_path_decode_u_encoding, htp/htp.h, AC_DEFINE_UNQUOTED([HAVE_HTP_SET_PATH_DECODE_U_ENCODING],[1],[Found usable htp_config_set_path_decode_u_encoding function in libhtp]) )
- AC_CHECK_LIB([htp], [htp_config_set_lzma_memlimit],AC_DEFINE_UNQUOTED([HAVE_HTP_CONFIG_SET_LZMA_MEMLIMIT],[1],[Found htp_config_set_lzma_memlimit function in libhtp]) ,,[-lhtp])
- AC_CHECK_LIB([htp], [htp_config_set_lzma_layers],AC_DEFINE_UNQUOTED([HAVE_HTP_CONFIG_SET_LZMA_LAYERS],[1],[Found htp_config_set_lzma_layers function in libhtp]) ,,[-lhtp])
- AC_CHECK_LIB([htp], [htp_config_set_compression_bomb_limit],AC_DEFINE_UNQUOTED([HAVE_HTP_CONFIG_SET_COMPRESSION_BOMB_LIMIT],[1],[Found htp_config_set_compression_bomb_limit function in libhtp]) ,,[-lhtp])
- AC_CHECK_LIB([htp], [htp_config_set_compression_time_limit],AC_DEFINE_UNQUOTED([HAVE_HTP_CONFIG_SET_COMPRESSION_TIME_LIMIT],[1],[Found htp_config_set_compression_time_limit function in libhtp]) ,,[-lhtp])
- ])
-
- if test "x$enable_non_bundled_htp" = "xno"; then
- # test if we have a bundled htp
- if test -d "$srcdir/libhtp"; then
- AC_CONFIG_SUBDIRS([libhtp])
- HTP_DIR="libhtp"
- AC_SUBST(HTP_DIR)
- HTP_LDADD="../libhtp/htp/libhtp.la"
- AC_SUBST(HTP_LDADD)
- # make sure libhtp is added to the includes
- CPPFLAGS="-I\${srcdir}/../libhtp/ ${CPPFLAGS}"
-
- AC_CHECK_HEADER(iconv.h,,[AC_MSG_ERROR(iconv.h not found ...)])
- AC_CHECK_LIB(iconv, libiconv_close)
- AC_DEFINE_UNQUOTED([HAVE_HTP_URI_NORMALIZE_HOOK],[1],[Assuming htp_config_register_request_uri_normalize function in bundled libhtp])
- AC_DEFINE_UNQUOTED([HAVE_HTP_TX_GET_RESPONSE_HEADERS_RAW],[1],[Assuming htp_tx_get_response_headers_raw function in bundled libhtp])
- AC_DEFINE_UNQUOTED([HAVE_HTP_DECODE_QUERY_INPLACE],[1],[Assuming htp_decode_query_inplace function in bundled libhtp])
- # enable when libhtp has been updated
- AC_DEFINE_UNQUOTED([HAVE_HTP_CONFIG_SET_RESPONSE_DECOMPRESSION_LAYER_LIMIT],[1],[Assuming htp_config_set_response_decompression_layer_limit function in bundled libhtp])
- AC_DEFINE_UNQUOTED([HAVE_HTP_CONFIG_SET_LZMA_MEMLIMIT],[1],[Assuming htp_config_set_lzma_memlimit function in bundled libhtp])
- AC_DEFINE_UNQUOTED([HAVE_HTP_CONFIG_SET_LZMA_LAYERS],[1],[Assuming htp_config_set_lzma_layers function in bundled libhtp])
- AC_DEFINE_UNQUOTED([HAVE_HTP_CONFIG_SET_COMPRESSION_BOMB_LIMIT],[1],[Assuming htp_config_set_compression_bomb_limit function in bundled libhtp])
- AC_DEFINE_UNQUOTED([HAVE_HTP_CONFIG_SET_COMPRESSION_TIME_LIMIT],[1],[Assuming htp_config_set_compression_time_limit function in bundled libhtp])
- else
- echo
- echo " ERROR: Libhtp is not bundled. Get libhtp by doing:"
- echo " git clone https://github.com/OISF/libhtp"
- echo " Then re-run Suricata's autogen.sh and configure script."
- echo " Or, if libhtp is installed in a different location,"
- echo " pass --enable-non-bundled-htp to Suricata's configure script."
- echo " Add --with-libhtp-includes=
and --with-libhtp-libraries= if"
- echo " libhtp is not installed in the include and library paths."
- echo
- exit 1
- fi
- fi
-
-
# Check for libcap-ng
case $host in
*-*-linux*)
@@ -2584,7 +2489,6 @@ AC_SUBST(MAJOR_MINOR)
AC_SUBST(RUST_FEATURES)
AC_SUBST(RUST_SURICATA_LIBDIR)
AC_SUBST(RUST_SURICATA_LIBNAME)
-AC_SUBST(enable_non_bundled_htp)
AM_CONDITIONAL([BUILD_SHARED_LIBRARY], [test "x$enable_shared" = "xyes"] && [test "x$can_build_shared_library" = "xyes"])
@@ -2624,7 +2528,6 @@ SURICATA_BUILD_CONF="Suricata Configuration:
LUA support: ${enable_lua}
libluajit: ${enable_luajit}
GeoIP2 support: ${enable_geoip}
- Non-bundled htp: ${enable_non_bundled_htp}
Hyperscan support: ${enable_hyperscan}
Libnet support: ${enable_libnet}
liblz4 support: ${enable_liblz4}
diff --git a/doc/userguide/capture-hardware/ebpf-xdp.rst b/doc/userguide/capture-hardware/ebpf-xdp.rst
index 116038716eff..68c02ec1f159 100644
--- a/doc/userguide/capture-hardware/ebpf-xdp.rst
+++ b/doc/userguide/capture-hardware/ebpf-xdp.rst
@@ -109,7 +109,7 @@ Compile and install Suricata
To get Suricata source, you can use the usual ::
git clone https://github.com/OISF/suricata.git
- cd suricata && git clone https://github.com/OISF/libhtp.git -b 0.5.x
+ cd suricata
./autogen.sh
diff --git a/doc/userguide/devguide/codebase/installation-from-git.rst b/doc/userguide/devguide/codebase/installation-from-git.rst
index 14f9ca76cd81..5cd83a057ca1 100644
--- a/doc/userguide/devguide/codebase/installation-from-git.rst
+++ b/doc/userguide/devguide/codebase/installation-from-git.rst
@@ -70,7 +70,7 @@ Next, enter the following line in the terminal:
git clone https://github.com/OISF/suricata.git
cd suricata
-Libhtp and suricata-update are not bundled. Get them by doing:
+Suricata-update is not bundled. Get it by doing:
.. code-block:: bash
diff --git a/doc/userguide/devguide/codebase/testing.rst b/doc/userguide/devguide/codebase/testing.rst
index c712e90a99b8..41cd88c81047 100644
--- a/doc/userguide/devguide/codebase/testing.rst
+++ b/doc/userguide/devguide/codebase/testing.rst
@@ -30,7 +30,7 @@ Use these to check that specific functions behave as expected, in success and in
during development, for nom parsers in the Rust codebase, for instance, or for checking that messages
or message parts of a protocol/stream are processed as they should.
-To execute all unit tests (both from C and Rust code), as well as ``libhtp`` ones, from the Suricata main directory, run::
+To execute all unit tests (both from C and Rust code) from the Suricata main directory, run::
make check
diff --git a/doc/userguide/lua/lua-functions.rst b/doc/userguide/lua/lua-functions.rst
index 9eff240f5314..dfb8941eb906 100644
--- a/doc/userguide/lua/lua-functions.rst
+++ b/doc/userguide/lua/lua-functions.rst
@@ -231,7 +231,7 @@ Example:
HttpGetRequestHost
~~~~~~~~~~~~~~~~~~
-Get the host from libhtp's tx->request_hostname, which can either be
+Get the host from libhtp's htp_tx_request_hostname(tx), which can either be
the host portion of the url or the host portion of the Host header.
Example:
diff --git a/doc/userguide/upgrade.rst b/doc/userguide/upgrade.rst
index ccf583f1a51f..66e5075bd142 100644
--- a/doc/userguide/upgrade.rst
+++ b/doc/userguide/upgrade.rst
@@ -30,6 +30,13 @@ by the ones Suricata supplies.
Major updates include new features, new default settings and often also
remove features.
+Upgrading 7.0 to 8.0
+--------------------
+
+Other Changes
+~~~~~~~~~~~~~
+- libhtp has been replaced with a rust version. This means libhtp is no longer built and linked as a shared library, and the libhtp dependency is now built directly into suricata.
+
Upgrading 6.0 to 7.0
--------------------
diff --git a/doxygen.cfg b/doxygen.cfg
index 5e07af09c618..f623680bfa1d 100644
--- a/doxygen.cfg
+++ b/doxygen.cfg
@@ -829,7 +829,7 @@ WARN_LOGFILE =
# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
# Note: If this tag is empty the current directory is searched.
-INPUT = src/ libhtp/htp/
+INPUT = src/
# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
diff --git a/libsuricata-config.in b/libsuricata-config.in
index 1fabe0765268..59b9c112ea3f 100644
--- a/libsuricata-config.in
+++ b/libsuricata-config.in
@@ -47,12 +47,6 @@ if [ "$use_static" = "no" ]; then
fi
fi
-# If we're using a bundled htp, add it to the libs as well. It will
-# already be present if we're use a non-bundled libhtp.
-if [ "$enable_non_bundled_htp" = "no" ]; then
- lib="${lib} -lhtp"
-fi
-
output=""
if [ "$show_cflags" = "yes" ]; then
diff --git a/qa/docker/buildbot.cfg b/qa/docker/buildbot.cfg
index aae492b82eb0..9369af0d35ab 100644
--- a/qa/docker/buildbot.cfg
+++ b/qa/docker/buildbot.cfg
@@ -66,8 +66,6 @@ from buildbot.steps.shell import ShellCommand
def SuriBuildFactory(repo='/data/oisf/'):
factory = BuildFactory()
factory.addStep(Git(repourl=repo, mode='copy'))
- factory.addStep(ShellCommand(command=["rm", "-rf", "libhtp"]))
- factory.addStep(ShellCommand(command=["git", "clone", "-b", "0.5.x", "/data/oisf/libhtp/.git/", "libhtp"]))
return factory
factory = SuriBuildFactory()
diff --git a/qa/travis-libhtp.sh b/qa/travis-libhtp.sh
deleted file mode 100755
index 109d6d398bc6..000000000000
--- a/qa/travis-libhtp.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-set -ex
-git clone https://github.com/OISF/libhtp -b 0.5.x
diff --git a/requirements.txt b/requirements.txt
index 7d8737bd433d..be73c5d4fcf2 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,7 +1,6 @@
-# Specify libhtp and suricata-update requirements.
+# Specify suricata-update requirements.
#
# Format:
#
# name {repo} {branch|tag}
-libhtp https://github.com/OISF/libhtp 0.5.44
suricata-update https://github.com/OISF/suricata-update 1.3.0rc1
diff --git a/rust/Cargo.toml.in b/rust/Cargo.toml.in
index 303994aac491..f3a6e5648322 100644
--- a/rust/Cargo.toml.in
+++ b/rust/Cargo.toml.in
@@ -39,6 +39,7 @@ hkdf = "~0.12.3"
aes = "~0.7.5"
aes-gcm = "~0.9.4"
+htp = { git = "https://github.com/cccs-rtmorti/libhtp-rs.git", branch = "main", version = "2.0.0" }
der-parser = "~8.2.0"
kerberos-parser = { version = "~0.7.1", default_features = false }
diff --git a/rust/Makefile.am b/rust/Makefile.am
index 2857288fefa3..b08dd5e00755 100644
--- a/rust/Makefile.am
+++ b/rust/Makefile.am
@@ -2,7 +2,8 @@ EXTRA_DIST = src derive \
.cargo/config.in \
cbindgen.toml \
dist/rust-bindings.h \
- vendor
+ vendor \
+ dist/htp
if !DEBUG
RELEASE = --release
@@ -33,12 +34,14 @@ if HAVE_CYGPATH
@rustup_home@ \
CARGO_HOME="$(CARGO_HOME)" \
CARGO_TARGET_DIR="$(e_rustdir)/target" \
+ CBINDGEN_HEADERS_DIR="$(e_rustdir)/gen" \
$(CARGO) build $(RELEASE) \
--features "$(RUST_FEATURES)" $(RUST_TARGET)
else
@rustup_home@ \
CARGO_HOME="$(CARGO_HOME)" \
CARGO_TARGET_DIR="$(abs_top_builddir)/rust/target" \
+ CBINDGEN_HEADERS_DIR="$(abs_top_builddir)/rust/gen" \
$(CARGO) build $(RELEASE) $(NIGHTLY_ARGS) \
--features "$(RUST_FEATURES)" $(RUST_TARGET)
endif
@@ -61,6 +64,7 @@ uninstall-local:
clean-local:
rm -rf target
+ rm -rf gen/htp/htp_rs.h
if HAVE_CBINDGEN
rm -rf gen dist
endif
@@ -98,6 +102,15 @@ else
dist/rust-bindings.h:
endif
+if HAVE_CBINDGEN
+dist/htp: vendor
+ cbindgen --config $(abs_top_srcdir)/rust/vendor/htp/cbindgen.toml \
+ --quiet --output $(abs_top_builddir)/rust/dist/htp/htp_rs.h \
+ $(abs_top_srcdir)/rust/vendor/htp/
+else
+dist/htp:
+endif
+
Cargo.toml: Cargo.toml.in
update-lock: Cargo.toml
diff --git a/rust/src/lib.rs b/rust/src/lib.rs
index 4c238538273a..a8bb3e55e068 100644
--- a/rust/src/lib.rs
+++ b/rust/src/lib.rs
@@ -112,3 +112,6 @@ pub mod plugin;
pub mod lzma;
pub mod util;
pub mod ffi;
+
+//Re-export htp symbols
+pub use htp::c_api::*;
diff --git a/scripts/bundle.sh b/scripts/bundle.sh
index aabd728d3d88..d19b666ecbad 100755
--- a/scripts/bundle.sh
+++ b/scripts/bundle.sh
@@ -1,12 +1,12 @@
#! /usr/bin/env bash
#
-# This script will bundle libhtp and/or suricata-update for you.
+# This script will bundle suricata-update for you.
#
# To use, run from the top Suricata source directory:
#
-# ./scripts/bundle.sh [suricata-update|libhtp]
+# ./scripts/bundle.sh [suricata-update]
#
-# If no arguments are provided, both suricata-update and libhtp will
+# If no arguments are provided, suricata-update will
# be bundled.
#
# Environment variables:
@@ -15,10 +15,6 @@
# SU_BRANCH: Override the Suricata-Update branch to a branch, tag or
# {pull,merge}-request.
#
-# LIBHTP_REPO: Overrides the libhtp git repo
-# LIBHTP_BRANCH: Override the libhtp branch to a branch, tag or
-# {pull,merge}-request.
-#
# DESTDIR: Checkout to another directory instead of the current
# directory.
#
@@ -82,14 +78,6 @@ while IFS= read -r requirement; do
cp -a ${DESTDIR}/suricata-update.tmp/. ${DESTDIR}/suricata-update
rm -rf ${DESTDIR}/suricata-update.tmp
;;
- libhtp)
- LIBHTP_REPO=${LIBHTP_REPO:-$2}
- LIBHTP_BRANCH=$(transform_branch ${LIBHTP_BRANCH:-$3})
- echo "===> Bundling ${LIBHTP_REPO} (${LIBHTP_BRANCH})"
- rm -rf ${DESTDIR}/libhtp
- fetch "${LIBHTP_REPO}" "${DESTDIR}/libhtp" "${LIBHTP_BRANCH}"
- rm -rf libhtp/.git
- ;;
\#*)
# Ignore comment.
;;
diff --git a/scripts/check-setup.sh b/scripts/check-setup.sh
index 9abe8001f1db..174ee8dd9d02 100755
--- a/scripts/check-setup.sh
+++ b/scripts/check-setup.sh
@@ -8,14 +8,6 @@ trap "rm -rf ${tmpdir}" EXIT
(cd .. && tar cf - $(git ls-files)) | (cd ${tmpdir} && tar xf -)
-if [ -e ../libhtp ]; then
- (cd ../libhtp && git archive --format=tar --prefix=libhtp/ HEAD) | \
- (cd ${tmpdir} && tar xvf -)
-else
- echo "error: this script required bundled libhtp..."
- exit 1
-fi
-
cd ${tmpdir}
# Do initial build.
diff --git a/scripts/clang-format.sh b/scripts/clang-format.sh
index fe16db07af41..2280a34f3af9 100755
--- a/scripts/clang-format.sh
+++ b/scripts/clang-format.sh
@@ -301,8 +301,7 @@ function RequireProgram {
# Make sure we are running from the top-level git directory.
# Same approach as for setup-decoder.sh. Good enough.
-# We could probably use git rev-parse --show-toplevel to do so, as long as we
-# handle the libhtp subfolder correctly.
+# We could probably use git rev-parse --show-toplevel to do so
function SetTopLevelDir {
if [ -e ./src/suricata.c ]; then
# Do nothing.
diff --git a/src/Makefile.am b/src/Makefile.am
index 4ca8dc7bdbc3..af5cc9ad8b1f 100755
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -27,7 +27,6 @@ noinst_HEADERS = \
app-layer-htp-body.h \
app-layer-htp-file.h \
app-layer-htp.h \
- app-layer-htp-libhtp.h \
app-layer-htp-mem.h \
app-layer-htp-range.h \
app-layer-htp-xff.h \
@@ -640,7 +639,6 @@ libsuricata_c_a_SOURCES = \
app-layer-htp-body.c \
app-layer-htp.c \
app-layer-htp-file.c \
- app-layer-htp-libhtp.c \
app-layer-htp-mem.c \
app-layer-htp-range.c \
app-layer-htp-xff.c \
@@ -1290,7 +1288,7 @@ suricata_SOURCES = main.c
# the library search path.
suricata_LDFLAGS = $(all_libraries) ${SECLDFLAGS}
-suricata_LDADD = libsuricata_c.a $(RUST_SURICATA_LIB) $(HTP_LDADD) $(RUST_LDADD)
+suricata_LDADD = libsuricata_c.a $(RUST_SURICATA_LIB) $(RUST_LDADD)
suricata_DEPENDENCIES = libsuricata_c.a $(RUST_SURICATA_LIB)
if BUILD_SHARED_LIBRARY
@@ -1326,7 +1324,7 @@ uninstall-local:
if BUILD_FUZZTARGETS
LDFLAGS_FUZZ = $(all_libraries) $(SECLDFLAGS)
-LDADD_FUZZ = libsuricata_c.a $(RUST_SURICATA_LIB) $(HTP_LDADD) $(RUST_LDADD)
+LDADD_FUZZ = libsuricata_c.a $(RUST_SURICATA_LIB) $(RUST_LDADD)
fuzz_applayerprotodetectgetproto_SOURCES = tests/fuzz/fuzz_applayerprotodetectgetproto.c
fuzz_applayerprotodetectgetproto_LDFLAGS = $(LDFLAGS_FUZZ)
diff --git a/src/app-layer-htp-file.c b/src/app-layer-htp-file.c
index 095b5903ca5b..c587ff4c7040 100644
--- a/src/app-layer-htp-file.c
+++ b/src/app-layer-htp-file.c
@@ -83,9 +83,9 @@ int HTPFileOpen(HtpState *s, HtpTxUserData *tx, const uint8_t *filename, uint16_
* @param[in] rawvalue
* @param[out] range
*
- * @return HTP_OK on success, HTP_ERROR on failure.
+ * @return HTP_STATUS_OK on success, HTP_STATUS_ERROR on failure.
*/
-int HTPParseContentRange(bstr *rawvalue, HTTPContentRange *range)
+int HTPParseContentRange(const bstr *rawvalue, HTTPContentRange *range)
{
uint32_t len = bstr_len(rawvalue);
return rs_http_parse_content_range(range, bstr_ptr(rawvalue), len);
@@ -100,7 +100,7 @@ int HTPParseContentRange(bstr *rawvalue, HTTPContentRange *range)
* @return HTP_OK on success, HTP_ERROR, -2, -3 on failure.
*/
static int HTPParseAndCheckContentRange(
- bstr *rawvalue, HTTPContentRange *range, HtpState *s, HtpTxUserData *htud)
+ const bstr *rawvalue, HTTPContentRange *range, HtpState *s, HtpTxUserData *htud)
{
int r = HTPParseContentRange(rawvalue, range);
if (r != 0) {
@@ -140,7 +140,7 @@ static int HTPParseAndCheckContentRange(
*/
int HTPFileOpenWithRange(HtpState *s, HtpTxUserData *txud, const uint8_t *filename,
uint16_t filename_len, const uint8_t *data, uint32_t data_len, uint64_t txid,
- bstr *rawvalue, HtpTxUserData *htud)
+ const bstr *rawvalue, HtpTxUserData *htud)
{
SCEnter();
uint16_t flags;
@@ -168,20 +168,21 @@ int HTPFileOpenWithRange(HtpState *s, HtpTxUserData *txud, const uint8_t *filena
}
// Then, we will try to handle reassembly of different ranges of the same file
- htp_tx_t *tx = htp_list_get(s->conn->transactions, txid);
+ const htp_tx_t *tx = htp_connp_tx(s->connp, txid);
if (!tx) {
SCReturnInt(-1);
}
uint8_t *keyurl;
uint32_t keylen;
- if (tx->request_hostname != NULL) {
- keylen = bstr_len(tx->request_hostname) + filename_len;
+ if (htp_tx_request_hostname(tx) != NULL) {
+ keylen = bstr_len(htp_tx_request_hostname(tx)) + filename_len;
keyurl = SCMalloc(keylen);
if (keyurl == NULL) {
SCReturnInt(-1);
}
- memcpy(keyurl, bstr_ptr(tx->request_hostname), bstr_len(tx->request_hostname));
- memcpy(keyurl + bstr_len(tx->request_hostname), filename, filename_len);
+ memcpy(keyurl, bstr_ptr(htp_tx_request_hostname(tx)),
+ bstr_len(htp_tx_request_hostname(tx)));
+ memcpy(keyurl + bstr_len(htp_tx_request_hostname(tx)), filename, filename_len);
} else {
// do not reassemble file without host info
SCReturnInt(0);
@@ -392,9 +393,9 @@ static int HTPFileParserTest01(void)
htp_tx_t *tx = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, http_state, 0);
FAIL_IF_NULL(tx);
- FAIL_IF_NULL(tx->request_method);
+ FAIL_IF_NULL(htp_tx_request_method(tx));
- FAIL_IF(memcmp(bstr_util_strdup_to_c(tx->request_method), "POST", 4) != 0);
+ FAIL_IF(memcmp(bstr_util_strdup_to_c(htp_tx_request_method(tx)), "POST", 4) != 0);
AppLayerParserThreadCtxFree(alp_tctx);
StreamTcpFreeConfig(true);
@@ -466,9 +467,9 @@ static int HTPFileParserTest02(void)
htp_tx_t *tx = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, http_state, 0);
FAIL_IF_NULL(tx);
- FAIL_IF_NULL(tx->request_method);
- FAIL_IF(memcmp(bstr_util_strdup_to_c(tx->request_method), "POST", 4) != 0);
- HtpTxUserData *tx_ud = htp_tx_get_user_data(tx);
+ FAIL_IF_NULL(htp_tx_request_method(tx));
+ FAIL_IF(memcmp(bstr_util_strdup_to_c(htp_tx_request_method(tx)), "POST", 4) != 0);
+ HtpTxUserData *tx_ud = htp_tx_user_data(tx);
FAIL_IF_NULL(tx_ud);
FAIL_IF_NULL(tx_ud->files_ts.tail);
FAIL_IF(tx_ud->files_ts.tail->state != FILE_STATE_CLOSED);
@@ -558,11 +559,11 @@ static int HTPFileParserTest03(void)
htp_tx_t *tx = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, http_state, 0);
FAIL_IF_NULL(tx);
- FAIL_IF_NULL(tx->request_method);
+ FAIL_IF_NULL(htp_tx_request_method(tx));
- FAIL_IF(memcmp(bstr_util_strdup_to_c(tx->request_method), "POST", 4) != 0);
+ FAIL_IF(memcmp(bstr_util_strdup_to_c(htp_tx_request_method(tx)), "POST", 4) != 0);
- HtpTxUserData *tx_ud = htp_tx_get_user_data(tx);
+ HtpTxUserData *tx_ud = htp_tx_user_data(tx);
FAIL_IF_NULL(tx_ud);
FAIL_IF_NULL(tx_ud->files_ts.head);
FAIL_IF_NULL(tx_ud->files_ts.tail);
@@ -654,11 +655,11 @@ static int HTPFileParserTest04(void)
htp_tx_t *tx = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, http_state, 0);
FAIL_IF_NULL(tx);
- FAIL_IF_NULL(tx->request_method);
+ FAIL_IF_NULL(htp_tx_request_method(tx));
- FAIL_IF(memcmp(bstr_util_strdup_to_c(tx->request_method), "POST", 4) != 0);
+ FAIL_IF(memcmp(bstr_util_strdup_to_c(htp_tx_request_method(tx)), "POST", 4) != 0);
- HtpTxUserData *tx_ud = htp_tx_get_user_data(tx);
+ HtpTxUserData *tx_ud = htp_tx_user_data(tx);
FAIL_IF_NULL(tx_ud);
FAIL_IF_NULL(tx_ud->files_ts.head);
FAIL_IF_NULL(tx_ud->files_ts.tail);
@@ -720,11 +721,11 @@ static int HTPFileParserTest05(void)
htp_tx_t *tx = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, http_state, 0);
FAIL_IF_NULL(tx);
- FAIL_IF_NULL(tx->request_method);
+ FAIL_IF_NULL(htp_tx_request_method(tx));
- FAIL_IF(memcmp(bstr_util_strdup_to_c(tx->request_method), "POST", 4) != 0);
+ FAIL_IF(memcmp(bstr_util_strdup_to_c(htp_tx_request_method(tx)), "POST", 4) != 0);
- HtpTxUserData *tx_ud = htp_tx_get_user_data(tx);
+ HtpTxUserData *tx_ud = htp_tx_user_data(tx);
FAIL_IF_NULL(tx_ud);
FAIL_IF_NULL(tx_ud->files_ts.head);
FAIL_IF_NULL(tx_ud->files_ts.tail);
@@ -795,11 +796,11 @@ static int HTPFileParserTest06(void)
htp_tx_t *tx = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, http_state, 0);
FAIL_IF_NULL(tx);
- FAIL_IF_NULL(tx->request_method);
+ FAIL_IF_NULL(htp_tx_request_method(tx));
- FAIL_IF(memcmp(bstr_util_strdup_to_c(tx->request_method), "POST", 4) != 0);
+ FAIL_IF(memcmp(bstr_util_strdup_to_c(htp_tx_request_method(tx)), "POST", 4) != 0);
- HtpTxUserData *tx_ud = htp_tx_get_user_data(tx);
+ HtpTxUserData *tx_ud = htp_tx_user_data(tx);
FAIL_IF_NULL(tx_ud);
FAIL_IF_NULL(tx_ud->files_ts.head);
FAIL_IF_NULL(tx_ud->files_ts.tail);
@@ -860,10 +861,10 @@ static int HTPFileParserTest07(void)
htp_tx_t *tx = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, http_state, 0);
FAIL_IF_NULL(tx);
- FAIL_IF_NULL(tx->request_method);
- FAIL_IF(memcmp(bstr_util_strdup_to_c(tx->request_method), "POST", 4) != 0);
+ FAIL_IF_NULL(htp_tx_request_method(tx));
+ FAIL_IF(memcmp(bstr_util_strdup_to_c(htp_tx_request_method(tx)), "POST", 4) != 0);
- HtpTxUserData *tx_ud = htp_tx_get_user_data(tx);
+ HtpTxUserData *tx_ud = htp_tx_user_data(tx);
FAIL_IF_NULL(tx_ud);
FAIL_IF_NULL(tx_ud->files_ts.head);
FAIL_IF_NULL(tx_ud->files_ts.tail);
@@ -1182,11 +1183,11 @@ static int HTPFileParserTest11(void)
htp_tx_t *tx = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, http_state, 0);
FAIL_IF_NULL(tx);
- FAIL_IF_NULL(tx->request_method);
+ FAIL_IF_NULL(htp_tx_request_method(tx));
- FAIL_IF(memcmp(bstr_util_strdup_to_c(tx->request_method), "POST", 4) != 0);
+ FAIL_IF(memcmp(bstr_util_strdup_to_c(htp_tx_request_method(tx)), "POST", 4) != 0);
- HtpTxUserData *tx_ud = htp_tx_get_user_data(tx);
+ HtpTxUserData *tx_ud = htp_tx_user_data(tx);
FAIL_IF_NULL(tx_ud);
FAIL_IF_NULL(tx_ud->files_ts.head);
FAIL_IF_NULL(tx_ud->files_ts.tail);
diff --git a/src/app-layer-htp-file.h b/src/app-layer-htp-file.h
index 4b682bc03781..a2ffd6bdfd33 100644
--- a/src/app-layer-htp-file.h
+++ b/src/app-layer-htp-file.h
@@ -30,12 +30,12 @@
int HTPFileOpen(HtpState *, HtpTxUserData *, const uint8_t *, uint16_t, const uint8_t *, uint32_t,
uint64_t, uint8_t);
int HTPFileOpenWithRange(HtpState *, HtpTxUserData *, const uint8_t *, uint16_t, const uint8_t *,
- uint32_t, uint64_t, bstr *rawvalue, HtpTxUserData *htud);
+ uint32_t, uint64_t, const bstr *rawvalue, HtpTxUserData *htud);
bool HTPFileCloseHandleRange(const StreamingBufferConfig *sbcfg, FileContainer *, const uint16_t,
HttpRangeContainerBlock *, const uint8_t *, uint32_t);
int HTPFileStoreChunk(HtpState *, HtpTxUserData *, const uint8_t *, uint32_t, uint8_t);
-int HTPParseContentRange(bstr *rawvalue, HTTPContentRange *range);
+int HTPParseContentRange(const bstr *rawvalue, HTTPContentRange *range);
int HTPFileClose(HtpState *, HtpTxUserData *tx, const uint8_t *data, uint32_t data_len,
uint8_t flags, uint8_t direction);
diff --git a/src/app-layer-htp-libhtp.c b/src/app-layer-htp-libhtp.c
deleted file mode 100644
index f7daf70c92ba..000000000000
--- a/src/app-layer-htp-libhtp.c
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * We are using this file to hold APIs copied from libhtp 0.5.x.
- */
-
-/***************************************************************************
- * Copyright (c) 2009-2010 Open Information Security Foundation
- * Copyright (c) 2010-2013 Qualys, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * - Neither the name of the Qualys, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- ***************************************************************************/
-
-/**
- * Anoop Saldanha
- */
-
-#include "suricata-common.h"
-#include
-#include "app-layer-htp-libhtp.h"
-
-/**
- * \brief Generates the normalized uri.
- *
- * Libhtp doesn't recreate the whole normalized uri and save it.
- * That duty has now been passed to us. A lot of this code has been
- * copied from libhtp.
- *
- * Keep an eye out on the tx->parsed_uri struct and how the parameters
- * in it are generated, just in case some modifications are made to
- * them in the future.
- *
- * \param uri_include_all boolean to indicate if scheme, username/password,
- hostname and port should be part of the buffer
- */
-bstr *SCHTPGenerateNormalizedUri(htp_tx_t *tx, htp_uri_t *uri, int uri_include_all)
-{
- if (uri == NULL)
- return NULL;
-
- // On the first pass determine the length of the final string
- size_t len = 0;
-
- if (uri_include_all) {
- if (uri->scheme != NULL) {
- len += bstr_len(uri->scheme);
- len += 3; // "://"
- }
-
- if ((uri->username != NULL) || (uri->password != NULL)) {
- if (uri->username != NULL) {
- len += bstr_len(uri->username);
- }
-
- len += 1; // ":"
-
- if (uri->password != NULL) {
- len += bstr_len(uri->password);
- }
-
- len += 1; // "@"
- }
-
- if (uri->hostname != NULL) {
- len += bstr_len(uri->hostname);
- }
-
- if (uri->port != NULL) {
- len += 1; // ":"
- len += bstr_len(uri->port);
- }
- }
-
- if (uri->path != NULL) {
- len += bstr_len(uri->path);
- }
-
- if (uri->query != NULL) {
- len += 1; // "?"
- len += bstr_len(uri->query);
- }
-
- if (uri->fragment != NULL) {
- len += 1; // "#"
- len += bstr_len(uri->fragment);
- }
-
- // On the second pass construct the string
- /* FIXME in memcap */
- bstr *r = bstr_alloc(len);
- if (r == NULL) {
- return NULL;
- }
-
- if (uri_include_all) {
- if (uri->scheme != NULL) {
- bstr_add_noex(r, uri->scheme);
- bstr_add_c_noex(r, "://");
- }
-
- if ((uri->username != NULL) || (uri->password != NULL)) {
- if (uri->username != NULL) {
- bstr_add_noex(r, uri->username);
- }
-
- bstr_add_c_noex(r, ":");
-
- if (uri->password != NULL) {
- bstr_add_noex(r, uri->password);
- }
-
- bstr_add_c_noex(r, "@");
- }
-
- if (uri->hostname != NULL) {
- bstr_add_noex(r, uri->hostname);
- }
-
- if (uri->port != NULL) {
- bstr_add_c_noex(r, ":");
- bstr_add_noex(r, uri->port);
- }
- }
-
- if (uri->path != NULL) {
- bstr_add_noex(r, uri->path);
- }
-
- if (uri->query != NULL) {
- bstr *query = bstr_dup(uri->query);
- if (query) {
- uint64_t flags = 0;
- htp_urldecode_inplace(tx->cfg, HTP_DECODER_URLENCODED, query, &flags);
- bstr_add_c_noex(r, "?");
- bstr_add_noex(r, query);
- bstr_free(query);
- }
- }
-
- if (uri->fragment != NULL) {
- bstr_add_c_noex(r, "#");
- bstr_add_noex(r, uri->fragment);
- }
-
- return r;
-}
diff --git a/src/app-layer-htp-libhtp.h b/src/app-layer-htp-libhtp.h
deleted file mode 100644
index c4a3c991f74b..000000000000
--- a/src/app-layer-htp-libhtp.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * We are using this file to hold APIs copied from libhtp 0.5.x.
- */
-
-/***************************************************************************
- * Copyright (c) 2009-2010 Open Information Security Foundation
- * Copyright (c) 2010-2013 Qualys, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * - Neither the name of the Qualys, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- ***************************************************************************/
-
-/**
- * Anoop Saldanha
- */
-
-#ifndef __APP_LAYER_HTP_LIBHTP__H__
-#define __APP_LAYER_HTP_LIBHTP__H__
-
-#include "suricata-common.h"
-
-bstr *SCHTPGenerateNormalizedUri(htp_tx_t *tx, htp_uri_t *uri, int uri_include_all);
-
-#endif /* __APP_LAYER_HTP_LIBHTP__H__ */
diff --git a/src/app-layer-htp-xff.c b/src/app-layer-htp-xff.c
index c145e5818e23..a4096f0c8ee4 100644
--- a/src/app-layer-htp-xff.c
+++ b/src/app-layer-htp-xff.c
@@ -139,20 +139,17 @@ int HttpXFFGetIPFromTx(const Flow *f, uint64_t tx_id, HttpXFFCfg *xff_cfg,
return 0;
}
- htp_header_t *h_xff = NULL;
- if (tx->request_headers != NULL) {
- h_xff = htp_table_get_c(tx->request_headers, xff_cfg->header);
- }
+ const htp_header_t *h_xff = htp_tx_request_header(tx, xff_cfg->header);
- if (h_xff != NULL && bstr_len(h_xff->value) >= XFF_CHAIN_MINLEN &&
- bstr_len(h_xff->value) < XFF_CHAIN_MAXLEN) {
+ if (h_xff != NULL && htp_header_value_len(h_xff) >= XFF_CHAIN_MINLEN &&
+ htp_header_value_len(h_xff) < XFF_CHAIN_MAXLEN) {
- memcpy(xff_chain, bstr_ptr(h_xff->value), bstr_len(h_xff->value));
- xff_chain[bstr_len(h_xff->value)]=0;
+ memcpy(xff_chain, htp_header_value_ptr(h_xff), htp_header_value_len(h_xff));
+ xff_chain[htp_header_value_len(h_xff)] = 0;
if (xff_cfg->flags & XFF_REVERSE) {
/** Get the last IP address from the chain */
- p_xff = memrchr(xff_chain, ' ', bstr_len(h_xff->value));
+ p_xff = memrchr(xff_chain, ' ', htp_header_value_len(h_xff));
if (p_xff == NULL) {
p_xff = xff_chain;
} else {
@@ -161,7 +158,7 @@ int HttpXFFGetIPFromTx(const Flow *f, uint64_t tx_id, HttpXFFCfg *xff_cfg,
}
else {
/** Get the first IP address from the chain */
- p_xff = memchr(xff_chain, ',', bstr_len(h_xff->value));
+ p_xff = memchr(xff_chain, ',', htp_header_value_len(h_xff));
if (p_xff != NULL) {
*p_xff = 0;
}
diff --git a/src/app-layer-htp.c b/src/app-layer-htp.c
index b2c915d9342d..8dd8f8db7880 100644
--- a/src/app-layer-htp.c
+++ b/src/app-layer-htp.c
@@ -60,7 +60,6 @@
#include "app-layer-htp.h"
#include "app-layer-htp-body.h"
#include "app-layer-htp-file.h"
-#include "app-layer-htp-libhtp.h"
#include "app-layer-htp-xff.h"
#include "app-layer-htp-range.h"
#include "app-layer-htp-mem.h"
@@ -107,72 +106,111 @@ static uint64_t htp_state_memcnt = 0;
#endif
SCEnumCharMap http_decoder_event_table[] = {
- { "UNKNOWN_ERROR", HTTP_DECODER_EVENT_UNKNOWN_ERROR },
- { "GZIP_DECOMPRESSION_FAILED", HTTP_DECODER_EVENT_GZIP_DECOMPRESSION_FAILED },
- { "REQUEST_FIELD_MISSING_COLON", HTTP_DECODER_EVENT_REQUEST_FIELD_MISSING_COLON },
- { "RESPONSE_FIELD_MISSING_COLON", HTTP_DECODER_EVENT_RESPONSE_FIELD_MISSING_COLON },
- { "INVALID_REQUEST_CHUNK_LEN", HTTP_DECODER_EVENT_INVALID_REQUEST_CHUNK_LEN },
- { "INVALID_RESPONSE_CHUNK_LEN", HTTP_DECODER_EVENT_INVALID_RESPONSE_CHUNK_LEN },
+ { "UNKNOWN_ERROR", HTP_LOG_CODE_UNKNOWN },
+ { "GZIP_DECOMPRESSION_FAILED", HTP_LOG_CODE_GZIP_DECOMPRESSION_FAILED },
+ { "REQUEST_FIELD_MISSING_COLON", HTP_LOG_CODE_REQUEST_FIELD_MISSING_COLON },
+ { "RESPONSE_FIELD_MISSING_COLON", HTP_LOG_CODE_RESPONSE_FIELD_MISSING_COLON },
+ { "INVALID_REQUEST_CHUNK_LEN", HTP_LOG_CODE_INVALID_REQUEST_CHUNK_LEN },
+ { "INVALID_RESPONSE_CHUNK_LEN", HTP_LOG_CODE_INVALID_RESPONSE_CHUNK_LEN },
{ "INVALID_TRANSFER_ENCODING_VALUE_IN_REQUEST",
- HTTP_DECODER_EVENT_INVALID_TRANSFER_ENCODING_VALUE_IN_REQUEST },
+ HTP_LOG_CODE_INVALID_TRANSFER_ENCODING_VALUE_IN_REQUEST },
{ "INVALID_TRANSFER_ENCODING_VALUE_IN_RESPONSE",
- HTTP_DECODER_EVENT_INVALID_TRANSFER_ENCODING_VALUE_IN_RESPONSE },
+ HTP_LOG_CODE_INVALID_TRANSFER_ENCODING_VALUE_IN_RESPONSE },
{ "INVALID_CONTENT_LENGTH_FIELD_IN_REQUEST",
- HTTP_DECODER_EVENT_INVALID_CONTENT_LENGTH_FIELD_IN_REQUEST },
+ HTP_LOG_CODE_INVALID_CONTENT_LENGTH_FIELD_IN_REQUEST },
{ "INVALID_CONTENT_LENGTH_FIELD_IN_RESPONSE",
- HTTP_DECODER_EVENT_INVALID_CONTENT_LENGTH_FIELD_IN_RESPONSE },
+ HTP_LOG_CODE_INVALID_CONTENT_LENGTH_FIELD_IN_RESPONSE },
{ "DUPLICATE_CONTENT_LENGTH_FIELD_IN_REQUEST",
- HTTP_DECODER_EVENT_DUPLICATE_CONTENT_LENGTH_FIELD_IN_REQUEST },
+ HTP_LOG_CODE_DUPLICATE_CONTENT_LENGTH_FIELD_IN_REQUEST },
{ "DUPLICATE_CONTENT_LENGTH_FIELD_IN_RESPONSE",
- HTTP_DECODER_EVENT_DUPLICATE_CONTENT_LENGTH_FIELD_IN_RESPONSE },
- { "100_CONTINUE_ALREADY_SEEN", HTTP_DECODER_EVENT_100_CONTINUE_ALREADY_SEEN },
- { "UNABLE_TO_MATCH_RESPONSE_TO_REQUEST",
- HTTP_DECODER_EVENT_UNABLE_TO_MATCH_RESPONSE_TO_REQUEST },
- { "INVALID_SERVER_PORT_IN_REQUEST", HTTP_DECODER_EVENT_INVALID_SERVER_PORT_IN_REQUEST },
- { "INVALID_AUTHORITY_PORT", HTTP_DECODER_EVENT_INVALID_AUTHORITY_PORT },
- { "REQUEST_HEADER_INVALID", HTTP_DECODER_EVENT_REQUEST_HEADER_INVALID },
- { "RESPONSE_HEADER_INVALID", HTTP_DECODER_EVENT_RESPONSE_HEADER_INVALID },
- { "MISSING_HOST_HEADER", HTTP_DECODER_EVENT_MISSING_HOST_HEADER },
- { "HOST_HEADER_AMBIGUOUS", HTTP_DECODER_EVENT_HOST_HEADER_AMBIGUOUS },
- { "INVALID_REQUEST_FIELD_FOLDING", HTTP_DECODER_EVENT_INVALID_REQUEST_FIELD_FOLDING },
- { "INVALID_RESPONSE_FIELD_FOLDING", HTTP_DECODER_EVENT_INVALID_RESPONSE_FIELD_FOLDING },
- { "REQUEST_FIELD_TOO_LONG", HTTP_DECODER_EVENT_REQUEST_FIELD_TOO_LONG },
- { "RESPONSE_FIELD_TOO_LONG", HTTP_DECODER_EVENT_RESPONSE_FIELD_TOO_LONG },
- { "FILE_NAME_TOO_LONG", HTTP_DECODER_EVENT_FILE_NAME_TOO_LONG },
- { "REQUEST_LINE_INVALID", HTTP_DECODER_EVENT_REQUEST_LINE_INVALID },
- { "REQUEST_BODY_UNEXPECTED", HTTP_DECODER_EVENT_REQUEST_BODY_UNEXPECTED },
- { "REQUEST_SERVER_PORT_TCP_PORT_MISMATCH",
- HTTP_DECODER_EVENT_REQUEST_SERVER_PORT_TCP_PORT_MISMATCH },
- { "REQUEST_URI_HOST_INVALID", HTTP_DECODER_EVENT_URI_HOST_INVALID },
- { "REQUEST_HEADER_HOST_INVALID", HTTP_DECODER_EVENT_HEADER_HOST_INVALID },
- { "REQUEST_AUTH_UNRECOGNIZED", HTTP_DECODER_EVENT_AUTH_UNRECOGNIZED },
- { "REQUEST_HEADER_REPETITION", HTTP_DECODER_EVENT_REQUEST_HEADER_REPETITION },
- { "RESPONSE_HEADER_REPETITION", HTTP_DECODER_EVENT_RESPONSE_HEADER_REPETITION },
- { "DOUBLE_ENCODED_URI", HTTP_DECODER_EVENT_DOUBLE_ENCODED_URI },
- { "URI_DELIM_NON_COMPLIANT", HTTP_DECODER_EVENT_URI_DELIM_NON_COMPLIANT },
- { "METHOD_DELIM_NON_COMPLIANT", HTTP_DECODER_EVENT_METHOD_DELIM_NON_COMPLIANT },
- { "REQUEST_LINE_LEADING_WHITESPACE", HTTP_DECODER_EVENT_REQUEST_LINE_LEADING_WHITESPACE },
- { "TOO_MANY_ENCODING_LAYERS", HTTP_DECODER_EVENT_TOO_MANY_ENCODING_LAYERS },
- { "ABNORMAL_CE_HEADER", HTTP_DECODER_EVENT_ABNORMAL_CE_HEADER },
- { "RESPONSE_MULTIPART_BYTERANGES", HTTP_DECODER_EVENT_RESPONSE_MULTIPART_BYTERANGES },
- { "RESPONSE_ABNORMAL_TRANSFER_ENCODING",
- HTTP_DECODER_EVENT_RESPONSE_ABNORMAL_TRANSFER_ENCODING },
- { "RESPONSE_CHUNKED_OLD_PROTO", HTTP_DECODER_EVENT_RESPONSE_CHUNKED_OLD_PROTO },
- { "RESPONSE_INVALID_PROTOCOL", HTTP_DECODER_EVENT_RESPONSE_INVALID_PROTOCOL },
- { "RESPONSE_INVALID_STATUS", HTTP_DECODER_EVENT_RESPONSE_INVALID_STATUS },
- { "REQUEST_LINE_INCOMPLETE", HTTP_DECODER_EVENT_REQUEST_LINE_INCOMPLETE },
-
- { "LZMA_MEMLIMIT_REACHED", HTTP_DECODER_EVENT_LZMA_MEMLIMIT_REACHED },
- { "COMPRESSION_BOMB", HTTP_DECODER_EVENT_COMPRESSION_BOMB },
-
- { "RANGE_INVALID", HTTP_DECODER_EVENT_RANGE_INVALID },
+ HTP_LOG_CODE_DUPLICATE_CONTENT_LENGTH_FIELD_IN_RESPONSE },
+ { "CONTINUE_ALREADY_SEEN", HTP_LOG_CODE_CONTINUE_ALREADY_SEEN },
+ { "UNABLE_TO_MATCH_RESPONSE_TO_REQUEST", HTP_LOG_CODE_UNABLE_TO_MATCH_RESPONSE_TO_REQUEST },
+ { "INVALID_SERVER_PORT_IN_REQUEST", HTP_LOG_CODE_INVALID_SERVER_PORT_IN_REQUEST },
+ { "INVALID_AUTHORITY_PORT", HTP_LOG_CODE_INVALID_AUTHORITY_PORT },
+ { "REQUEST_HEADER_INVALID", HTP_LOG_CODE_REQUEST_HEADER_INVALID },
+ { "RESPONSE_HEADER_INVALID", HTP_LOG_CODE_RESPONSE_HEADER_INVALID },
+ { "MISSING_HOST_HEADER", HTP_LOG_CODE_MISSING_HOST_HEADER },
+ { "HOST_HEADER_AMBIGUOUS", HTP_LOG_CODE_HOST_HEADER_AMBIGUOUS },
+ { "INVALID_REQUEST_FIELD_FOLDING", HTP_LOG_CODE_INVALID_REQUEST_FIELD_FOLDING },
+ { "INVALID_RESPONSE_FIELD_FOLDING", HTP_LOG_CODE_INVALID_RESPONSE_FIELD_FOLDING },
+ { "REQUEST_FIELD_TOO_LONG", HTP_LOG_CODE_REQUEST_FIELD_TOO_LONG },
+ { "RESPONSE_FIELD_TOO_LONG", HTP_LOG_CODE_RESPONSE_FIELD_TOO_LONG },
+ { "REQUEST_LINE_INVALID", HTP_LOG_CODE_REQUEST_LINE_INVALID },
+ { "REQUEST_BODY_UNEXPECTED", HTP_LOG_CODE_REQUEST_BODY_UNEXPECTED },
+ { "RESPONSE_BODY_UNEXPECTED", HTP_LOG_CODE_RESPONSE_BODY_UNEXPECTED },
+ { "REQUEST_SERVER_PORT_TCP_PORT_MISMATCH", HTP_LOG_CODE_REQUEST_SERVER_PORT_TCP_PORT_MISMATCH },
+ { "REQUEST_URI_HOST_INVALID", HTP_LOG_CODE_URI_HOST_INVALID },
+ { "REQUEST_HEADER_HOST_INVALID", HTP_LOG_CODE_HEADER_HOST_INVALID },
+ { "REQUEST_AUTH_UNRECOGNIZED", HTP_LOG_CODE_AUTH_UNRECOGNIZED },
+ { "REQUEST_HEADER_REPETITION", HTP_LOG_CODE_REQUEST_HEADER_REPETITION },
+ { "RESPONSE_HEADER_REPETITION", HTP_LOG_CODE_RESPONSE_HEADER_REPETITION },
+ { "DOUBLE_ENCODED_URI", HTP_LOG_CODE_DOUBLE_ENCODED_URI },
+ { "URI_DELIM_NON_COMPLIANT", HTP_LOG_CODE_URI_DELIM_NON_COMPLIANT },
+ { "METHOD_DELIM_NON_COMPLIANT", HTP_LOG_CODE_METHOD_DELIM_NON_COMPLIANT },
+ { "REQUEST_LINE_LEADING_WHITESPACE", HTP_LOG_CODE_REQUEST_LINE_LEADING_WHITESPACE },
+ { "TOO_MANY_ENCODING_LAYERS", HTP_LOG_CODE_TOO_MANY_ENCODING_LAYERS },
+ { "REQUEST_TOO_MANY_LZMA_LAYERS", HTP_LOG_CODE_REQUEST_TOO_MANY_LZMA_LAYERS },
+ { "RESPONSE_TOO_MANY_LZMA_LAYERS", HTP_LOG_CODE_RESPONSE_TOO_MANY_LZMA_LAYERS },
+ { "ABNORMAL_CE_HEADER", HTP_LOG_CODE_ABNORMAL_CE_HEADER },
+ { "RESPONSE_MULTIPART_BYTERANGES", HTP_LOG_CODE_RESPONSE_MULTIPART_BYTERANGES },
+ { "RESPONSE_ABNORMAL_TRANSFER_ENCODING", HTP_LOG_CODE_RESPONSE_ABNORMAL_TRANSFER_ENCODING },
+ { "RESPONSE_CHUNKED_OLD_PROTO", HTP_LOG_CODE_RESPONSE_CHUNKED_OLD_PROTO },
+ { "RESPONSE_INVALID_PROTOCOL", HTP_LOG_CODE_RESPONSE_INVALID_PROTOCOL },
+ { "RESPONSE_INVALID_STATUS", HTP_LOG_CODE_RESPONSE_INVALID_STATUS },
+ { "REQUEST_LINE_INCOMPLETE", HTP_LOG_CODE_REQUEST_LINE_INCOMPLETE },
+ { "PROTOCOL_CONTAINS_EXTRA_DATA", HTP_LOG_CODE_PROTOCOL_CONTAINS_EXTRA_DATA },
+ {
+ "CONTENT_LENGTH_EXTRA_DATA_START",
+ HTP_LOG_CODE_CONTENT_LENGTH_EXTRA_DATA_START,
+ },
+ {
+ "CONTENT_LENGTH_EXTRA_DATA_END",
+ HTP_LOG_CODE_CONTENT_LENGTH_EXTRA_DATA_END,
+ },
+ {
+ "CONTENT_LENGTH_EXTRA_DATA_END",
+ HTP_LOG_CODE_CONTENT_LENGTH_EXTRA_DATA_END,
+ },
+ { "SWITCHING_PROTO_WITH_CONTENT_LENGTH", HTP_LOG_CODE_SWITCHING_PROTO_WITH_CONTENT_LENGTH },
+ { "DEFORMED_EOL", HTP_LOG_CODE_DEFORMED_EOL },
+ { "PARSER_STATE_ERROR", HTP_LOG_CODE_PARSER_STATE_ERROR },
+ { "MISSING_OUTBOUND_TRANSACTION_DATA", HTP_LOG_CODE_MISSING_OUTBOUND_TRANSACTION_DATA },
+ { "MISSING_INBOUND_TRANSACTION_DATA", HTP_LOG_CODE_MISSING_INBOUND_TRANSACTION_DATA },
+ { "MISSING_INBOUND_TRANSACTION_DATA", HTP_LOG_CODE_MISSING_INBOUND_TRANSACTION_DATA },
+ { "ZERO_LENGTH_DATA_CHUNKS", HTP_LOG_CODE_ZERO_LENGTH_DATA_CHUNKS },
+ { "REQUEST_LINE_UNKNOWN_METHOD", HTP_LOG_CODE_REQUEST_LINE_UNKNOWN_METHOD },
+ { "REQUEST_LINE_UNKNOWN_METHOD", HTP_LOG_CODE_REQUEST_LINE_UNKNOWN_METHOD },
+ { "REQUEST_LINE_UNKNOWN_METHOD_NO_PROTOCOL",
+ HTP_LOG_CODE_REQUEST_LINE_UNKNOWN_METHOD_NO_PROTOCOL },
+ { "REQUEST_LINE_UNKNOWN_METHOD_INVALID_PROTOCOL",
+ HTP_LOG_CODE_REQUEST_LINE_UNKNOWN_METHOD_INVALID_PROTOCOL },
+ { "REQUEST_LINE_NO_PROTOCOL", HTP_LOG_CODE_REQUEST_LINE_NO_PROTOCOL },
+ { "RESPONSE_LINE_INVALID_PROTOCOL", HTP_LOG_CODE_RESPONSE_LINE_INVALID_PROTOCOL },
+ { "RESPONSE_LINE_INVALID_RESPONSE_STATUS", HTP_LOG_CODE_RESPONSE_LINE_INVALID_RESPONSE_STATUS },
+ { "RESPONSE_BODY_INTERNAL_ERROR", HTP_LOG_CODE_RESPONSE_BODY_INTERNAL_ERROR },
+ { "REQUEST_BODY_DATA_CALLBACK_ERROR", HTP_LOG_CODE_REQUEST_BODY_DATA_CALLBACK_ERROR },
+ { "RESPONSE_INVALID_EMPTY_NAME", HTP_LOG_CODE_RESPONSE_INVALID_EMPTY_NAME },
+ { "REQUEST_INVALID_EMPTY_NAME", HTP_LOG_CODE_REQUEST_INVALID_EMPTY_NAME },
+ { "RESPONSE_INVALID_LWS_AFTER_NAME", HTP_LOG_CODE_RESPONSE_INVALID_LWS_AFTER_NAME },
+ { "RESPONSE_HEADER_NAME_NOT_TOKEN", HTP_LOG_CODE_RESPONSE_HEADER_NAME_NOT_TOKEN },
+ { "REQUEST_INVALID_LWS_AFTER_NAME", HTP_LOG_CODE_REQUEST_INVALID_LWS_AFTER_NAME },
+ { "LZMA_DECOMPRESSION_DISABLED", HTP_LOG_CODE_LZMA_DECOMPRESSION_DISABLED },
+ { "CONNECTION_ALREADY_OPEN", HTP_LOG_CODE_CONNECTION_ALREADY_OPEN },
+ { "COMPRESSION_BOMB_DOUBLE_LZMA", HTP_LOG_CODE_COMPRESSION_BOMB_DOUBLE_LZMA },
+ { "INVALID_CONTENT_ENCODING", HTP_LOG_CODE_INVALID_CONTENT_ENCODING },
+ { "INVALID_GAP", HTP_LOG_CODE_INVALID_GAP },
+
+ { "LZMA_MEMLIMIT_REACHED", HTP_LOG_CODE_LZMA_MEMLIMIT_REACHED },
+ { "COMPRESSION_BOMB", HTP_LOG_CODE_COMPRESSION_BOMB },
/* suricata warnings/errors */
{ "MULTIPART_GENERIC_ERROR", HTTP_DECODER_EVENT_MULTIPART_GENERIC_ERROR },
{ "MULTIPART_NO_FILEDATA", HTTP_DECODER_EVENT_MULTIPART_NO_FILEDATA },
{ "MULTIPART_INVALID_HEADER", HTTP_DECODER_EVENT_MULTIPART_INVALID_HEADER },
-
{ "TOO_MANY_WARNINGS", HTTP_DECODER_EVENT_TOO_MANY_WARNINGS },
+ { "RANGE_INVALID", HTTP_DECODER_EVENT_RANGE_INVALID },
+ { "FILE_NAME_TOO_LONG", HTTP_DECODER_EVENT_FILE_NAME_TOO_LONG },
{ "FAILED_PROTOCOL_CHANGE", HTTP_DECODER_EVENT_FAILED_PROTOCOL_CHANGE },
{ NULL, -1 },
@@ -241,8 +279,9 @@ static inline uint64_t HtpGetActiveResponseTxID(HtpState *s)
*/
static const char *HTPLookupPersonalityString(int p)
{
-#define CASE_HTP_PERSONALITY_STRING(p) \
- case HTP_SERVER_ ## p: return #p
+#define CASE_HTP_PERSONALITY_STRING(p) \
+ case HTP_SERVER_PERSONALITY_##p: \
+ return #p
switch (p) {
CASE_HTP_PERSONALITY_STRING(MINIMAL);
@@ -270,8 +309,9 @@ static const char *HTPLookupPersonalityString(int p)
*/
static int HTPLookupPersonality(const char *str)
{
-#define IF_HTP_PERSONALITY_NUM(p) \
- if (strcasecmp(#p, str) == 0) return HTP_SERVER_ ## p
+#define IF_HTP_PERSONALITY_NUM(p) \
+ if (strcasecmp(#p, str) == 0) \
+ return HTP_SERVER_PERSONALITY_##p
IF_HTP_PERSONALITY_NUM(MINIMAL);
IF_HTP_PERSONALITY_NUM(GENERIC);
@@ -295,7 +335,7 @@ static int HTPLookupPersonality(const char *str)
"longer supported by libhtp, failing back to "
"Apache2 personality.",
str);
- return HTP_SERVER_APACHE_2;
+ return HTP_SERVER_PERSONALITY_APACHE_2;
}
return -1;
@@ -319,7 +359,7 @@ static void HTPSetEvent(HtpState *s, HtpTxUserData *htud,
if (tx == NULL && tx_id > 0)
tx = HTPStateGetTx(s, tx_id - 1);
if (tx != NULL) {
- htud = (HtpTxUserData *) htp_tx_get_user_data(tx);
+ htud = (HtpTxUserData *)htp_tx_user_data(tx);
if (htud != NULL) {
AppLayerDecoderEventsSetEventRaw(&htud->tx_data.events, e);
s->events++;
@@ -359,7 +399,6 @@ static void HtpTxUserDataFree(HtpState *state, HtpTxUserData *htud)
if (likely(htud)) {
HtpBodyFree(&state->cfg->request, &htud->request_body);
HtpBodyFree(&state->cfg->response, &htud->response_body);
- bstr_free(htud->request_uri_normalized);
if (htud->request_headers_raw)
HTPFree(htud->request_headers_raw, htud->request_headers_raw_len);
if (htud->response_headers_raw)
@@ -403,7 +442,7 @@ void HTPStateFree(void *state)
for (tx_id = 0; tx_id < total_txs; tx_id++) {
htp_tx_t *tx = HTPStateGetTx(s, tx_id);
if (tx != NULL) {
- HtpTxUserData *htud = (HtpTxUserData *) htp_tx_get_user_data(tx);
+ HtpTxUserData *htud = (HtpTxUserData *)htp_tx_user_data(tx);
HtpTxUserDataFree(s, htud);
htp_tx_set_user_data(tx, NULL);
}
@@ -428,8 +467,6 @@ void HTPStateFree(void *state)
/**
* \brief HTP transaction cleanup callback
*
- * \warning We cannot actually free the transactions here. It seems that
- * HTP only accepts freeing of transactions in the response callback.
*/
static void HTPStateTransactionFree(void *state, uint64_t id)
{
@@ -442,22 +479,10 @@ static void HTPStateTransactionFree(void *state, uint64_t id)
htp_tx_t *tx = HTPStateGetTx(s, id);
if (tx != NULL) {
/* This will remove obsolete body chunks */
- HtpTxUserData *htud = (HtpTxUserData *) htp_tx_get_user_data(tx);
+ HtpTxUserData *htud = (HtpTxUserData *)htp_tx_user_data(tx);
HtpTxUserDataFree(s, htud);
htp_tx_set_user_data(tx, NULL);
-
- /* hack: even if libhtp considers the tx incomplete, we want to
- * free it here. htp_tx_destroy however, will refuse to do this.
- * As htp_tx_destroy_incomplete isn't available in the public API,
- * we hack around it here. */
- if (unlikely(!(
- tx->request_progress == HTP_REQUEST_COMPLETE &&
- tx->response_progress == HTP_RESPONSE_COMPLETE)))
- {
- tx->request_progress = HTP_REQUEST_COMPLETE;
- tx->response_progress = HTP_RESPONSE_COMPLETE;
- }
- htp_tx_destroy(tx);
+ htp_tx_destroy(s->connp, tx);
}
}
@@ -521,7 +546,7 @@ void AppLayerHtpNeedFileInspection(void)
static void AppLayerHtpSetStreamDepthFlag(void *tx, const uint8_t flags)
{
- HtpTxUserData *tx_ud = (HtpTxUserData *) htp_tx_get_user_data((htp_tx_t *)tx);
+ HtpTxUserData *tx_ud = (HtpTxUserData *)htp_tx_user_data((htp_tx_t *)tx);
if (tx_ud) {
SCLogDebug("setting HTP_STREAM_DEPTH_SET, flags %02x", flags);
if (flags & STREAM_TOCLIENT) {
@@ -570,119 +595,6 @@ static uint32_t AppLayerHtpComputeChunkLength(uint64_t content_len_so_far, uint3
return (chunk_len == 0 ? data_len : chunk_len);
}
-/* below error messages updated up to libhtp 0.5.7 (git 379632278b38b9a792183694a4febb9e0dbd1e7a) */
-struct {
- const char *msg;
- uint8_t de;
-} htp_errors[] = {
- { "GZip decompressor: inflateInit2 failed", HTTP_DECODER_EVENT_GZIP_DECOMPRESSION_FAILED},
- { "Request field invalid: colon missing", HTTP_DECODER_EVENT_REQUEST_FIELD_MISSING_COLON},
- { "Response field invalid: missing colon", HTTP_DECODER_EVENT_RESPONSE_FIELD_MISSING_COLON},
- { "Request chunk encoding: Invalid chunk length", HTTP_DECODER_EVENT_INVALID_REQUEST_CHUNK_LEN},
- { "Response chunk encoding: Invalid chunk length", HTTP_DECODER_EVENT_INVALID_RESPONSE_CHUNK_LEN},
-/* { "Invalid T-E value in request", HTTP_DECODER_EVENT_INVALID_TRANSFER_ENCODING_VALUE_IN_REQUEST}, <- tx flag HTP_REQUEST_INVALID_T_E
- { "Invalid T-E value in response", HTTP_DECODER_EVENT_INVALID_TRANSFER_ENCODING_VALUE_IN_RESPONSE}, <- nothing to replace it */
-/* { "Invalid C-L field in request", HTTP_DECODER_EVENT_INVALID_CONTENT_LENGTH_FIELD_IN_REQUEST}, <- tx flag HTP_REQUEST_INVALID_C_L */
- { "Invalid C-L field in response", HTTP_DECODER_EVENT_INVALID_CONTENT_LENGTH_FIELD_IN_RESPONSE},
- { "Already seen 100-Continue", HTTP_DECODER_EVENT_100_CONTINUE_ALREADY_SEEN},
- { "Unable to match response to request", HTTP_DECODER_EVENT_UNABLE_TO_MATCH_RESPONSE_TO_REQUEST},
- { "Invalid server port information in request", HTTP_DECODER_EVENT_INVALID_SERVER_PORT_IN_REQUEST},
-/* { "Invalid authority port", HTTP_DECODER_EVENT_INVALID_AUTHORITY_PORT}, htp no longer returns this error */
- { "Request buffer over", HTTP_DECODER_EVENT_REQUEST_FIELD_TOO_LONG},
- { "Response buffer over", HTTP_DECODER_EVENT_RESPONSE_FIELD_TOO_LONG},
- { "C-T multipart/byteranges in responses not supported", HTTP_DECODER_EVENT_RESPONSE_MULTIPART_BYTERANGES},
- { "Compression bomb:", HTTP_DECODER_EVENT_COMPRESSION_BOMB},
-};
-
-struct {
- const char *msg;
- uint8_t de;
-} htp_warnings[] = {
- { "GZip decompressor:", HTTP_DECODER_EVENT_GZIP_DECOMPRESSION_FAILED},
- { "Request field invalid", HTTP_DECODER_EVENT_REQUEST_HEADER_INVALID},
- { "Response field invalid", HTTP_DECODER_EVENT_RESPONSE_HEADER_INVALID},
- { "Request header name is not a token", HTTP_DECODER_EVENT_REQUEST_HEADER_INVALID},
- { "Response header name is not a token", HTTP_DECODER_EVENT_RESPONSE_HEADER_INVALID},
-/* { "Host information in request headers required by HTTP/1.1", HTTP_DECODER_EVENT_MISSING_HOST_HEADER}, <- tx flag HTP_HOST_MISSING
- { "Host information ambiguous", HTTP_DECODER_EVENT_HOST_HEADER_AMBIGUOUS}, <- tx flag HTP_HOST_AMBIGUOUS */
- { "Invalid request field folding", HTTP_DECODER_EVENT_INVALID_REQUEST_FIELD_FOLDING},
- { "Invalid response field folding", HTTP_DECODER_EVENT_INVALID_RESPONSE_FIELD_FOLDING},
- /* line is now: htp_log(connp, HTP_LOG_MARK, HTP_LOG_ERROR, 0, "Request server port=%d number differs from the actual TCP port=%d", port, connp->conn->server_port);
- * luckily, "Request server port=" is unique */
-/* { "Request server port number differs from the actual TCP port", HTTP_DECODER_EVENT_REQUEST_SERVER_PORT_TCP_PORT_MISMATCH}, */
- { "Request server port=", HTTP_DECODER_EVENT_REQUEST_SERVER_PORT_TCP_PORT_MISMATCH},
- { "Request line: URI contains non-compliant delimiter", HTTP_DECODER_EVENT_URI_DELIM_NON_COMPLIANT},
- { "Request line: non-compliant delimiter between Method and URI", HTTP_DECODER_EVENT_METHOD_DELIM_NON_COMPLIANT},
- { "Request line: leading whitespace", HTTP_DECODER_EVENT_REQUEST_LINE_LEADING_WHITESPACE},
- { "Too many response content encoding layers", HTTP_DECODER_EVENT_TOO_MANY_ENCODING_LAYERS},
- { "C-E gzip has abnormal value", HTTP_DECODER_EVENT_ABNORMAL_CE_HEADER},
- { "C-E deflate has abnormal value", HTTP_DECODER_EVENT_ABNORMAL_CE_HEADER},
- { "C-E unknown setting", HTTP_DECODER_EVENT_ABNORMAL_CE_HEADER},
- { "Excessive request header repetitions", HTTP_DECODER_EVENT_REQUEST_HEADER_REPETITION},
- { "Excessive response header repetitions", HTTP_DECODER_EVENT_RESPONSE_HEADER_REPETITION},
- { "Transfer-encoding has abnormal chunked value", HTTP_DECODER_EVENT_RESPONSE_ABNORMAL_TRANSFER_ENCODING},
- { "Chunked transfer-encoding on HTTP/0.9 or HTTP/1.0", HTTP_DECODER_EVENT_RESPONSE_CHUNKED_OLD_PROTO},
- { "Invalid response line: invalid protocol", HTTP_DECODER_EVENT_RESPONSE_INVALID_PROTOCOL},
- { "Invalid response line: invalid response status", HTTP_DECODER_EVENT_RESPONSE_INVALID_STATUS},
- { "Request line incomplete", HTTP_DECODER_EVENT_REQUEST_LINE_INCOMPLETE},
- { "Unexpected request body", HTTP_DECODER_EVENT_REQUEST_BODY_UNEXPECTED},
- { "LZMA decompressor: memory limit reached", HTTP_DECODER_EVENT_LZMA_MEMLIMIT_REACHED},
- { "Ambiguous request C-L value", HTTP_DECODER_EVENT_DUPLICATE_CONTENT_LENGTH_FIELD_IN_REQUEST},
- { "Ambiguous response C-L value", HTTP_DECODER_EVENT_DUPLICATE_CONTENT_LENGTH_FIELD_IN_RESPONSE},
-};
-
-#define HTP_ERROR_MAX (sizeof(htp_errors) / sizeof(htp_errors[0]))
-#define HTP_WARNING_MAX (sizeof(htp_warnings) / sizeof(htp_warnings[0]))
-
-/**
- * \internal
- *
- * \brief Get the warning id for the warning msg.
- *
- * \param msg warning message
- *
- * \retval id the id or 0 in case of not found
- */
-static uint8_t HTPHandleWarningGetId(const char *msg)
-{
- SCLogDebug("received warning \"%s\"", msg);
- size_t idx;
- for (idx = 0; idx < HTP_WARNING_MAX; idx++) {
- if (strncmp(htp_warnings[idx].msg, msg,
- strlen(htp_warnings[idx].msg)) == 0)
- {
- return htp_warnings[idx].de;
- }
- }
-
- return 0;
-}
-
-/**
- * \internal
- *
- * \brief Get the error id for the error msg.
- *
- * \param msg error message
- *
- * \retval id the id or 0 in case of not found
- */
-static uint8_t HTPHandleErrorGetId(const char *msg)
-{
- SCLogDebug("received error \"%s\"", msg);
-
- size_t idx;
- for (idx = 0; idx < HTP_ERROR_MAX; idx++) {
- if (strncmp(htp_errors[idx].msg, msg,
- strlen(htp_errors[idx].msg)) == 0)
- {
- return htp_errors[idx].de;
- }
- }
-
- return 0;
-}
-
/**
* \internal
*
@@ -693,99 +605,81 @@ static uint8_t HTPHandleErrorGetId(const char *msg)
*/
static void HTPHandleError(HtpState *s, const uint8_t dir)
{
- if (s == NULL || s->conn == NULL ||
- s->conn->messages == NULL) {
- return;
- }
-
- size_t size = htp_list_size(s->conn->messages);
- size_t msg;
- if(size >= HTP_MAX_MESSAGES) {
- if (s->htp_messages_offset < HTP_MAX_MESSAGES) {
- //only once per HtpState
- HTPSetEvent(s, NULL, dir, HTTP_DECODER_EVENT_TOO_MANY_WARNINGS);
- s->htp_messages_offset = HTP_MAX_MESSAGES;
- //too noisy in fuzzing
- //DEBUG_VALIDATE_BUG_ON("Too many libhtp messages");
- }
+ if (s == NULL || s->conn == NULL || s->htp_messages_count >= HTP_MAX_MESSAGES) {
// ignore further messages
return;
}
- for (msg = s->htp_messages_offset; msg < size; msg++) {
- htp_log_t *log = htp_list_get(s->conn->messages, msg);
- if (log == NULL)
+ htp_log_t *log = htp_conn_next_log(s->conn);
+ while (log != NULL) {
+ char *msg = htp_log_message(log);
+ if (msg == NULL) {
+ htp_log_free(log);
+ log = htp_conn_next_log(s->conn);
continue;
+ }
- HtpTxUserData *htud = NULL;
- htp_tx_t *tx = log->tx; // will be NULL in <=0.5.9
- if (tx != NULL)
- htud = (HtpTxUserData *) htp_tx_get_user_data(tx);
-
- SCLogDebug("message %s", log->msg);
+ SCLogDebug("message %s", msg);
- uint8_t id = HTPHandleErrorGetId(log->msg);
- if (id == 0) {
- id = HTPHandleWarningGetId(log->msg);
- if (id == 0)
- id = HTTP_DECODER_EVENT_UNKNOWN_ERROR;
+ htp_log_code_t id = htp_log_code(log);
+ if (id != HTP_LOG_CODE_UNKNOWN && id != HTP_LOG_CODE_ERROR) {
+ HTPSetEvent(s, NULL, dir, (uint8_t)id);
}
-
- if (id > 0) {
- HTPSetEvent(s, htud, dir, id);
+ htp_free_cstring(msg);
+ htp_log_free(log);
+ s->htp_messages_count++;
+ if (s->htp_messages_count >= HTP_MAX_MESSAGES) {
+ // only once per HtpState
+ HTPSetEvent(s, NULL, dir, HTTP_DECODER_EVENT_TOO_MANY_WARNINGS);
+ // too noisy in fuzzing
+ // DEBUG_VALIDATE_BUG_ON("Too many libhtp messages");
+ break;
}
+ log = htp_conn_next_log(s->conn);
}
- s->htp_messages_offset = (uint16_t)msg;
- SCLogDebug("s->htp_messages_offset %u", s->htp_messages_offset);
+ SCLogDebug("s->htp_messages_count %u", s->htp_messages_count);
}
-static inline void HTPErrorCheckTxRequestFlags(HtpState *s, htp_tx_t *tx)
+static inline void HTPErrorCheckTxRequestFlags(HtpState *s, const htp_tx_t *tx)
{
#ifdef DEBUG
BUG_ON(s == NULL || tx == NULL);
#endif
- if (tx->flags & ( HTP_REQUEST_INVALID_T_E|HTP_REQUEST_INVALID_C_L|
- HTP_HOST_MISSING|HTP_HOST_AMBIGUOUS|HTP_HOSTU_INVALID|
- HTP_HOSTH_INVALID))
- {
- HtpTxUserData *htud = (HtpTxUserData *) htp_tx_get_user_data(tx);
+ if (htp_tx_flags(tx) & (HTP_FLAGS_REQUEST_INVALID_T_E | HTP_FLAGS_REQUEST_INVALID_C_L |
+ HTP_FLAGS_HOST_MISSING | HTP_FLAGS_HOST_AMBIGUOUS |
+ HTP_FLAGS_HOSTU_INVALID | HTP_FLAGS_HOSTH_INVALID)) {
+ HtpTxUserData *htud = (HtpTxUserData *)htp_tx_user_data(tx);
if (htud == NULL)
return;
- if (tx->flags & HTP_REQUEST_INVALID_T_E)
+ if (htp_tx_flags(tx) & HTP_FLAGS_REQUEST_INVALID_T_E)
HTPSetEvent(s, htud, STREAM_TOSERVER,
- HTTP_DECODER_EVENT_INVALID_TRANSFER_ENCODING_VALUE_IN_REQUEST);
- if (tx->flags & HTP_REQUEST_INVALID_C_L)
- HTPSetEvent(s, htud, STREAM_TOSERVER,
- HTTP_DECODER_EVENT_INVALID_CONTENT_LENGTH_FIELD_IN_REQUEST);
- if (tx->flags & HTP_HOST_MISSING)
- HTPSetEvent(s, htud, STREAM_TOSERVER,
- HTTP_DECODER_EVENT_MISSING_HOST_HEADER);
- if (tx->flags & HTP_HOST_AMBIGUOUS)
- HTPSetEvent(s, htud, STREAM_TOSERVER,
- HTTP_DECODER_EVENT_HOST_HEADER_AMBIGUOUS);
- if (tx->flags & HTP_HOSTU_INVALID)
- HTPSetEvent(s, htud, STREAM_TOSERVER,
- HTTP_DECODER_EVENT_URI_HOST_INVALID);
- if (tx->flags & HTP_HOSTH_INVALID)
- HTPSetEvent(s, htud, STREAM_TOSERVER,
- HTTP_DECODER_EVENT_HEADER_HOST_INVALID);
- }
- if (tx->request_auth_type == HTP_AUTH_UNRECOGNIZED) {
- HtpTxUserData *htud = (HtpTxUserData *) htp_tx_get_user_data(tx);
+ HTP_LOG_CODE_INVALID_TRANSFER_ENCODING_VALUE_IN_REQUEST);
+ if (htp_tx_flags(tx) & HTP_FLAGS_REQUEST_INVALID_C_L)
+ HTPSetEvent(
+ s, htud, STREAM_TOSERVER, HTP_LOG_CODE_INVALID_CONTENT_LENGTH_FIELD_IN_REQUEST);
+ if (htp_tx_flags(tx) & HTP_FLAGS_HOST_MISSING)
+ HTPSetEvent(s, htud, STREAM_TOSERVER, HTP_LOG_CODE_MISSING_HOST_HEADER);
+ if (htp_tx_flags(tx) & HTP_FLAGS_HOST_AMBIGUOUS)
+ HTPSetEvent(s, htud, STREAM_TOSERVER, HTP_LOG_CODE_HOST_HEADER_AMBIGUOUS);
+ if (htp_tx_flags(tx) & HTP_FLAGS_HOSTU_INVALID)
+ HTPSetEvent(s, htud, STREAM_TOSERVER, HTP_LOG_CODE_URI_HOST_INVALID);
+ if (htp_tx_flags(tx) & HTP_FLAGS_HOSTH_INVALID)
+ HTPSetEvent(s, htud, STREAM_TOSERVER, HTP_LOG_CODE_HEADER_HOST_INVALID);
+ }
+ if (htp_tx_request_auth_type(tx) == HTP_AUTH_TYPE_UNRECOGNIZED) {
+ HtpTxUserData *htud = (HtpTxUserData *)htp_tx_user_data(tx);
if (htud == NULL)
return;
- HTPSetEvent(s, htud, STREAM_TOSERVER,
- HTTP_DECODER_EVENT_AUTH_UNRECOGNIZED);
+ HTPSetEvent(s, htud, STREAM_TOSERVER, HTP_LOG_CODE_AUTH_UNRECOGNIZED);
}
- if (tx->is_protocol_0_9 && tx->request_method_number == HTP_M_UNKNOWN &&
- (tx->request_protocol_number == HTP_PROTOCOL_INVALID ||
- tx->request_protocol_number == HTP_PROTOCOL_UNKNOWN)) {
- HtpTxUserData *htud = (HtpTxUserData *) htp_tx_get_user_data(tx);
+ if (htp_tx_is_protocol_0_9(tx) && htp_tx_request_method_number(tx) == HTP_METHOD_UNKNOWN &&
+ (htp_tx_request_protocol_number(tx) == HTP_PROTOCOL_INVALID ||
+ htp_tx_request_protocol_number(tx) == HTP_PROTOCOL_UNKNOWN)) {
+ HtpTxUserData *htud = (HtpTxUserData *)htp_tx_user_data(tx);
if (htud == NULL)
return;
- HTPSetEvent(s, htud, STREAM_TOSERVER,
- HTTP_DECODER_EVENT_REQUEST_LINE_INVALID);
+ HTPSetEvent(s, htud, STREAM_TOSERVER, HTP_LOG_CODE_REQUEST_LINE_INVALID);
}
}
@@ -832,7 +726,7 @@ static int Setup(Flow *f, HtpState *hstate)
goto error;
}
- hstate->conn = htp_connp_get_connection(hstate->connp);
+ hstate->conn = (htp_conn_t *)htp_connp_connection(hstate->connp);
htp_connp_set_user_data(hstate->connp, (void *)hstate);
hstate->cfg = htp_cfg_rec;
@@ -883,12 +777,12 @@ static AppLayerResult HTPHandleRequestData(Flow *f, void *htp_state, AppLayerPar
const uint8_t *input = StreamSliceGetData(&stream_slice);
uint32_t input_len = StreamSliceGetDataLen(&stream_slice);
- htp_time_t ts = { SCTIME_SECS(f->startts), SCTIME_USECS(f->startts) };
+ struct timeval ts = { SCTIME_SECS(f->startts), SCTIME_USECS(f->startts) };
/* pass the new data to the htp parser */
if (input_len > 0) {
- const int r = htp_connp_req_data(hstate->connp, &ts, input, input_len);
+ const int r = htp_connp_request_data(hstate->connp, &ts, input, input_len);
switch (r) {
- case HTP_STREAM_ERROR:
+ case HTP_STREAM_STATE_ERROR:
ret = -1;
break;
default:
@@ -901,7 +795,7 @@ static AppLayerResult HTPHandleRequestData(Flow *f, void *htp_state, AppLayerPar
if (AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF_TS) &&
!(hstate->flags & HTP_FLAG_STATE_CLOSED_TS))
{
- htp_connp_req_close(hstate->connp, &ts);
+ htp_connp_request_close(hstate->connp, &ts);
hstate->flags |= HTP_FLAG_STATE_CLOSED_TS;
SCLogDebug("stream eof encountered, closing htp handle for ts");
}
@@ -950,32 +844,27 @@ static AppLayerResult HTPHandleResponseData(Flow *f, void *htp_state, AppLayerPa
DEBUG_VALIDATE_BUG_ON(hstate->connp == NULL);
hstate->slice = &stream_slice;
- htp_time_t ts = { SCTIME_SECS(f->startts), SCTIME_USECS(f->startts) };
- htp_tx_t *tx = NULL;
+ struct timeval ts = { SCTIME_SECS(f->startts), SCTIME_USECS(f->startts) };
+ const htp_tx_t *tx = NULL;
size_t consumed = 0;
if (input_len > 0) {
- const int r = htp_connp_res_data(hstate->connp, &ts, input, input_len);
+ const int r = htp_connp_response_data(hstate->connp, &ts, input, input_len);
switch (r) {
- case HTP_STREAM_ERROR:
+ case HTP_STREAM_STATE_ERROR:
ret = -1;
break;
- case HTP_STREAM_TUNNEL:
- tx = htp_connp_get_out_tx(hstate->connp);
- if (tx != NULL && tx->response_status_number == 101) {
- htp_header_t *h =
- (htp_header_t *)htp_table_get_c(tx->response_headers, "Upgrade");
- if (h == NULL || bstr_cmp_c(h->value, "h2c") != 0) {
- break;
- }
+ case HTP_STREAM_STATE_TUNNEL:
+ tx = htp_connp_get_response_tx(hstate->connp);
+ if (tx != NULL && htp_tx_is_http_2_upgrade(tx)) {
if (AppLayerProtoDetectGetProtoName(ALPROTO_HTTP2) == NULL) {
// if HTTP2 is disabled, keep the HTP_STREAM_TUNNEL mode
break;
}
uint16_t dp = 0;
- if (tx->request_port_number != -1) {
- dp = (uint16_t)tx->request_port_number;
+ if (htp_tx_request_port_number(tx) != -1) {
+ dp = (uint16_t)htp_tx_request_port_number(tx);
}
- consumed = htp_connp_res_data_consumed(hstate->connp);
+ consumed = htp_connp_response_data_consumed(hstate->connp);
hstate->slice = NULL;
if (!AppLayerRequestProtocolChange(hstate->f, dp, ALPROTO_HTTP2)) {
HTPSetEvent(hstate, NULL, STREAM_TOCLIENT,
@@ -1015,8 +904,8 @@ static AppLayerResult HTPHandleResponseData(Flow *f, void *htp_state, AppLayerPa
/**
* \param name /Lowercase/ version of the variable name
*/
-static int HTTPParseContentDispositionHeader(uint8_t *name, size_t name_len,
- uint8_t *data, size_t len, uint8_t **retptr, size_t *retlen)
+static int HTTPParseContentDispositionHeader(const uint8_t *name, size_t name_len,
+ const uint8_t *data, size_t len, uint8_t const **retptr, size_t *retlen)
{
#ifdef PRINT
printf("DATA START: \n");
@@ -1034,7 +923,7 @@ static int HTTPParseContentDispositionHeader(uint8_t *name, size_t name_len,
if (x >= len)
return 0;
- uint8_t *line = data+x;
+ const uint8_t *line = data + x;
size_t line_len = len-x;
size_t offset = 0;
#ifdef PRINT
@@ -1049,7 +938,7 @@ static int HTTPParseContentDispositionHeader(uint8_t *name, size_t name_len,
}
if (((line[x - 1] != '\\' && line[x] == ';') || ((x + 1) == line_len)) && (quote == 0 || quote % 2 == 0)) {
- uint8_t *token = line + offset;
+ const uint8_t *token = line + offset;
size_t token_len = x - offset;
if ((x + 1) == line_len) {
@@ -1069,7 +958,7 @@ static int HTTPParseContentDispositionHeader(uint8_t *name, size_t name_len,
#endif
if (token_len > name_len) {
if (name == NULL || SCMemcmpLowercase(name, token, name_len) == 0) {
- uint8_t *value = token + name_len;
+ const uint8_t *value = token + name_len;
size_t value_len = token_len - name_len;
if (value[0] == '\"') {
@@ -1099,8 +988,8 @@ static int HTTPParseContentDispositionHeader(uint8_t *name, size_t name_len,
/**
* \param name /Lowercase/ version of the variable name
*/
-static int HTTPParseContentTypeHeader(uint8_t *name, size_t name_len,
- uint8_t *data, size_t len, uint8_t **retptr, size_t *retlen)
+static int HTTPParseContentTypeHeader(const uint8_t *name, const size_t name_len,
+ const uint8_t *data, const size_t len, uint8_t const **retptr, size_t *retlen)
{
SCEnter();
#ifdef PRINT
@@ -1120,7 +1009,7 @@ static int HTTPParseContentTypeHeader(uint8_t *name, size_t name_len,
SCReturnInt(0);
}
- uint8_t *line = data+x;
+ const uint8_t *line = data + x;
size_t line_len = len-x;
size_t offset = 0;
#ifdef PRINT
@@ -1135,7 +1024,7 @@ static int HTTPParseContentTypeHeader(uint8_t *name, size_t name_len,
}
if (((line[x - 1] != '\\' && line[x] == ';') || ((x + 1) == line_len)) && (quote == 0 || quote % 2 == 0)) {
- uint8_t *token = line + offset;
+ const uint8_t *token = line + offset;
size_t token_len = x - offset;
if ((x + 1) == line_len) {
@@ -1155,7 +1044,7 @@ static int HTTPParseContentTypeHeader(uint8_t *name, size_t name_len,
#endif
if (token_len > name_len) {
if (name == NULL || SCMemcmpLowercase(name, token, name_len) == 0) {
- uint8_t *value = token + name_len;
+ const uint8_t *value = token + name_len;
size_t value_len = token_len - name_len;
if (value[0] == '\"') {
@@ -1195,17 +1084,15 @@ static int HTTPParseContentTypeHeader(uint8_t *name, size_t name_len,
* If the request contains a multipart message, this function will
* set the HTP_BOUNDARY_SET in the transaction.
*/
-static int HtpRequestBodySetupMultipart(htp_tx_t *tx, HtpTxUserData *htud)
+static int HtpRequestBodySetupMultipart(const htp_tx_t *tx, HtpTxUserData *htud)
{
- htp_header_t *h = (htp_header_t *)htp_table_get_c(tx->request_headers,
- "Content-Type");
- if (h != NULL && bstr_len(h->value) > 0) {
- uint8_t *boundary = NULL;
+ const htp_header_t *h = htp_tx_request_header(tx, "Content-Type");
+ if (h != NULL && htp_header_value_len(h) > 0) {
+ const uint8_t *boundary = NULL;
size_t boundary_len = 0;
- int r = HTTPParseContentTypeHeader((uint8_t *)"boundary=", 9,
- (uint8_t *) bstr_ptr(h->value), bstr_len(h->value),
- &boundary, &boundary_len);
+ int r = HTTPParseContentTypeHeader((uint8_t *)"boundary=", 9, htp_header_value_ptr(h),
+ htp_header_value_len(h), &boundary, &boundary_len);
if (r == 1) {
#ifdef PRINT
printf("BOUNDARY START: \n");
@@ -1237,15 +1124,13 @@ static int HtpRequestBodySetupMultipart(htp_tx_t *tx, HtpTxUserData *htud)
#define C_T_HDR "content-type:"
#define C_T_HDR_LEN 13
-static void HtpRequestBodyMultipartParseHeader(HtpState *hstate,
- HtpTxUserData *htud,
- uint8_t *header, uint32_t header_len,
- uint8_t **filename, uint16_t *filename_len,
- uint8_t **filetype, uint16_t *filetype_len)
+static void HtpRequestBodyMultipartParseHeader(HtpState *hstate, HtpTxUserData *htud,
+ uint8_t *header, uint32_t header_len, const uint8_t **filename, uint16_t *filename_len,
+ const uint8_t **filetype, uint16_t *filetype_len)
{
- uint8_t *fn = NULL;
+ const uint8_t *fn = NULL;
size_t fn_len = 0;
- uint8_t *ft = NULL;
+ const uint8_t *ft = NULL;
size_t ft_len = 0;
#ifdef PRINT
@@ -1356,7 +1241,7 @@ static void HtpRequestBodySetupBoundary(HtpTxUserData *htud,
memcpy(boundary + 2, htud->boundary, htud->boundary_len);
}
-static int HtpRequestBodyHandleMultipart(HtpState *hstate, HtpTxUserData *htud, void *tx,
+static int HtpRequestBodyHandleMultipart(HtpState *hstate, HtpTxUserData *htud, const void *tx,
const uint8_t *chunks_buffer, uint32_t chunks_buffer_len)
{
int result = 0;
@@ -1392,10 +1277,11 @@ static int HtpRequestBodyHandleMultipart(HtpState *hstate, HtpTxUserData *htud,
/* we currently only handle multipart for ts. When we support it for tc,
* we will need to supply right direction */
- tx_progress = AppLayerParserGetStateProgress(IPPROTO_TCP, ALPROTO_HTTP1, tx, STREAM_TOSERVER);
+ tx_progress =
+ AppLayerParserGetStateProgress(IPPROTO_TCP, ALPROTO_HTTP1, (void *)tx, STREAM_TOSERVER);
/* if we're in the file storage process, deal with that now */
if (htud->tsflags & HTP_FILENAME_SET) {
- if (header_start != NULL || (tx_progress > HTP_REQUEST_BODY)) {
+ if (header_start != NULL || (tx_progress > HTP_REQUEST_PROGRESS_BODY)) {
SCLogDebug("reached the end of the file");
const uint8_t *filedata = chunks_buffer;
@@ -1415,7 +1301,7 @@ static int HtpRequestBodyHandleMultipart(HtpState *hstate, HtpTxUserData *htud,
}
/* body parsing done, we did not get our form end. Use all data
* we still have and signal to files API we have an issue. */
- if (tx_progress > HTP_REQUEST_BODY) {
+ if (tx_progress > HTP_REQUEST_PROGRESS_BODY) {
filedata_len = chunks_buffer_len;
flags = FILE_TRUNCATED;
}
@@ -1488,9 +1374,9 @@ static int HtpRequestBodyHandleMultipart(HtpState *hstate, HtpTxUserData *htud,
header_end < (chunks_buffer + chunks_buffer_len) &&
header_start < header_end)
{
- uint8_t *filename = NULL;
+ const uint8_t *filename = NULL;
uint16_t filename_len = 0;
- uint8_t *filetype = NULL;
+ const uint8_t *filetype = NULL;
uint16_t filetype_len = 0;
uint32_t header_len = header_end - header_start;
@@ -1688,8 +1574,8 @@ static int HtpRequestBodyHandleMultipart(HtpState *hstate, HtpTxUserData *htud,
/** \internal
* \brief Handle POST or PUT, no multipart body data
*/
-static int HtpRequestBodyHandlePOSTorPUT(HtpState *hstate, HtpTxUserData *htud,
- htp_tx_t *tx, uint8_t *data, uint32_t data_len)
+static int HtpRequestBodyHandlePOSTorPUT(HtpState *hstate, HtpTxUserData *htud, const htp_tx_t *tx,
+ const uint8_t *data, uint32_t data_len)
{
int result = 0;
@@ -1700,9 +1586,9 @@ static int HtpRequestBodyHandlePOSTorPUT(HtpState *hstate, HtpTxUserData *htud,
size_t filename_len = 0;
/* get the name */
- if (tx->parsed_uri != NULL && tx->parsed_uri->path != NULL) {
- filename = (uint8_t *)bstr_ptr(tx->parsed_uri->path);
- filename_len = bstr_len(tx->parsed_uri->path);
+ if (htp_uri_path(htp_tx_parsed_uri(tx)) != NULL) {
+ filename = (uint8_t *)bstr_ptr(htp_uri_path(htp_tx_parsed_uri(tx)));
+ filename_len = bstr_len(htp_uri_path(htp_tx_parsed_uri(tx)));
}
if (filename != NULL) {
@@ -1744,46 +1630,44 @@ static int HtpRequestBodyHandlePOSTorPUT(HtpState *hstate, HtpTxUserData *htud,
return -1;
}
-static int HtpResponseBodyHandle(HtpState *hstate, HtpTxUserData *htud,
- htp_tx_t *tx, uint8_t *data, uint32_t data_len)
+static int HtpResponseBodyHandle(HtpState *hstate, HtpTxUserData *htud, const htp_tx_t *tx,
+ const uint8_t *data, uint32_t data_len)
{
SCEnter();
int result = 0;
/* see if we need to open the file
- * we check for tx->response_line in case of junk
+ * we check for htp_tx_response_line(tx) in case of junk
* interpreted as body before response line
*/
if (!(htud->tcflags & HTP_FILENAME_SET) &&
- (tx->response_line != NULL || tx->is_protocol_0_9))
- {
+ (htp_tx_response_line(tx) != NULL || htp_tx_is_protocol_0_9(tx))) {
SCLogDebug("setting up file name");
- uint8_t *filename = NULL;
+ const uint8_t *filename = NULL;
size_t filename_len = 0;
/* try Content-Disposition header first */
- htp_header_t *h = (htp_header_t *)htp_table_get_c(tx->response_headers,
- "Content-Disposition");
- if (h != NULL && bstr_len(h->value) > 0) {
+ const htp_header_t *h = htp_tx_response_header(tx, "Content-Disposition");
+ if (h != NULL && htp_header_value_len(h) > 0) {
/* parse content-disposition */
(void)HTTPParseContentDispositionHeader((uint8_t *)"filename=", 9,
- (uint8_t *) bstr_ptr(h->value), bstr_len(h->value), &filename, &filename_len);
+ htp_header_value_ptr(h), htp_header_value_len(h), &filename, &filename_len);
}
/* fall back to name from the uri */
if (filename == NULL) {
/* get the name */
- if (tx->parsed_uri != NULL && tx->parsed_uri->path != NULL) {
- filename = (uint8_t *)bstr_ptr(tx->parsed_uri->path);
- filename_len = bstr_len(tx->parsed_uri->path);
+ if (htp_uri_path(htp_tx_parsed_uri(tx)) != NULL) {
+ filename = (uint8_t *)bstr_ptr(htp_uri_path(htp_tx_parsed_uri(tx)));
+ filename_len = bstr_len(htp_uri_path(htp_tx_parsed_uri(tx)));
}
}
if (filename != NULL) {
// set range if present
- htp_header_t *h_content_range = htp_table_get_c(tx->response_headers, "content-range");
+ const htp_header_t *h_content_range = htp_tx_response_header(tx, "content-range");
if (filename_len > SC_FILENAME_MAX) {
// explicitly truncate the file name if too long
filename_len = SC_FILENAME_MAX;
@@ -1791,7 +1675,8 @@ static int HtpResponseBodyHandle(HtpState *hstate, HtpTxUserData *htud,
}
if (h_content_range != NULL) {
result = HTPFileOpenWithRange(hstate, htud, filename, (uint16_t)filename_len, data,
- data_len, HtpGetActiveResponseTxID(hstate), h_content_range->value, htud);
+ data_len, HtpGetActiveResponseTxID(hstate),
+ htp_header_value(h_content_range), htud);
} else {
result = HTPFileOpen(hstate, htud, filename, (uint16_t)filename_len, data, data_len,
HtpGetActiveResponseTxID(hstate), STREAM_TOCLIENT);
@@ -1807,9 +1692,7 @@ static int HtpResponseBodyHandle(HtpState *hstate, HtpTxUserData *htud,
htud->tcflags &= ~HTP_DONTSTORE;
}
}
- }
- else if (tx->response_line != NULL || tx->is_protocol_0_9)
- {
+ } else if (htp_tx_response_line(tx) != NULL || htp_tx_is_protocol_0_9(tx)) {
/* otherwise, just store the data */
if (!(htud->tcflags & HTP_DONTSTORE)) {
@@ -1833,51 +1716,54 @@ static int HtpResponseBodyHandle(HtpState *hstate, HtpTxUserData *htud,
/**
* \brief Function callback to append chunks for Requests
* \param d pointer to the htp_tx_data_t structure (a chunk from htp lib)
- * \retval int HTP_OK if all goes well
+ * \retval int HTP_STATUS_OK if all goes well
*/
-static int HTPCallbackRequestBodyData(htp_tx_data_t *d)
+static int HTPCallbackRequestBodyData(const htp_connp_t *connp, htp_tx_data_t *d)
{
SCEnter();
+ const htp_tx_t *tx = htp_tx_data_tx(d);
+
if (!(SC_ATOMIC_GET(htp_config_flags) & HTP_REQUIRE_REQUEST_BODY))
- SCReturnInt(HTP_OK);
+ SCReturnInt(HTP_STATUS_OK);
- if (d->len == 0)
- SCReturnInt(HTP_OK);
+ if (htp_tx_data_is_empty(d))
+ SCReturnInt(HTP_STATUS_OK);
#ifdef PRINT
printf("HTPBODY START: \n");
- PrintRawDataFp(stdout, (uint8_t *)d->data, d->len);
+ PrintRawDataFp(stdout, (uint8_t *)htp_tx_data_data(d), htp_tx_data_len(d));
printf("HTPBODY END: \n");
#endif
- HtpState *hstate = htp_connp_get_user_data(d->tx->connp);
+ HtpState *hstate = htp_connp_user_data(connp);
if (hstate == NULL) {
- SCReturnInt(HTP_ERROR);
+ SCReturnInt(HTP_STATUS_ERROR);
}
SCLogDebug("New request body data available at %p -> %p -> %p, bodylen "
- "%"PRIu32"", hstate, d, d->data, (uint32_t)d->len);
+ "%" PRIu32 "",
+ hstate, d, htp_tx_data_data(d), (uint32_t)htp_tx_data_len(d));
- HtpTxUserData *tx_ud = (HtpTxUserData *) htp_tx_get_user_data(d->tx);
+ HtpTxUserData *tx_ud = (HtpTxUserData *)htp_tx_user_data(tx);
if (tx_ud == NULL) {
- SCReturnInt(HTP_OK);
+ SCReturnInt(HTP_STATUS_OK);
}
tx_ud->tx_data.file_flags |= hstate->state_data.file_flags;
if (!tx_ud->response_body_init) {
tx_ud->response_body_init = 1;
- if (d->tx->request_method_number == HTP_M_POST) {
+ if (htp_tx_request_method_number(tx) == HTP_METHOD_POST) {
SCLogDebug("POST");
- int r = HtpRequestBodySetupMultipart(d->tx, tx_ud);
+ int r = HtpRequestBodySetupMultipart(tx, tx_ud);
if (r == 1) {
tx_ud->request_body_type = HTP_BODY_REQUEST_MULTIPART;
} else if (r == 0) {
tx_ud->request_body_type = HTP_BODY_REQUEST_POST;
SCLogDebug("not multipart");
}
- } else if (d->tx->request_method_number == HTP_M_PUT) {
+ } else if (htp_tx_request_method_number(tx) == HTP_METHOD_PUT) {
tx_ud->request_body_type = HTP_BODY_REQUEST_PUT;
}
}
@@ -1892,13 +1778,11 @@ static int HTPCallbackRequestBodyData(htp_tx_data_t *d)
if (AppLayerHtpCheckDepth(&hstate->cfg->request, &tx_ud->request_body, tx_ud->tsflags)) {
uint32_t stream_depth = FileReassemblyDepth();
uint32_t len = AppLayerHtpComputeChunkLength(tx_ud->request_body.content_len_so_far,
- hstate->cfg->request.body_limit,
- stream_depth,
- tx_ud->tsflags,
- (uint32_t)d->len);
- BUG_ON(len > (uint32_t)d->len);
+ hstate->cfg->request.body_limit, stream_depth, tx_ud->tsflags,
+ (uint32_t)htp_tx_data_len(d));
+ BUG_ON(len > (uint32_t)htp_tx_data_len(d));
- HtpBodyAppendChunk(&hstate->cfg->request, &tx_ud->request_body, d->data, len);
+ HtpBodyAppendChunk(&hstate->cfg->request, &tx_ud->request_body, htp_tx_data_data(d), len);
const uint8_t *chunks_buffer = NULL;
uint32_t chunks_buffer_len = 0;
@@ -1919,11 +1803,12 @@ static int HTPCallbackRequestBodyData(htp_tx_data_t *d)
printf("REASSCHUNK END: \n");
#endif
- HtpRequestBodyHandleMultipart(hstate, tx_ud, d->tx, chunks_buffer, chunks_buffer_len);
+ HtpRequestBodyHandleMultipart(hstate, tx_ud, tx, chunks_buffer, chunks_buffer_len);
} else if (tx_ud->request_body_type == HTP_BODY_REQUEST_POST ||
tx_ud->request_body_type == HTP_BODY_REQUEST_PUT) {
- HtpRequestBodyHandlePOSTorPUT(hstate, tx_ud, d->tx, (uint8_t *)d->data, len);
+ HtpRequestBodyHandlePOSTorPUT(
+ hstate, tx_ud, htp_tx_data_tx(d), htp_tx_data_data(d), len);
}
} else {
@@ -1936,10 +1821,11 @@ static int HTPCallbackRequestBodyData(htp_tx_data_t *d)
end:
if (hstate->conn != NULL) {
- SCLogDebug("checking body size %"PRIu64" against inspect limit %u (cur %"PRIu64", last %"PRIu64")",
- tx_ud->request_body.content_len_so_far,
- hstate->cfg->request.inspect_min_size,
- (uint64_t)hstate->conn->in_data_counter, hstate->last_request_data_stamp);
+ SCLogDebug("checking body size %" PRIu64 " against inspect limit %u (cur %" PRIu64
+ ", last %" PRIu64 ")",
+ tx_ud->request_body.content_len_so_far, hstate->cfg->request.inspect_min_size,
+ (uint64_t)htp_conn_request_data_counter(hstate->conn),
+ hstate->last_request_data_stamp);
/* if we reach the inspect_min_size we'll trigger inspection,
* so make sure that raw stream is also inspected. Set the
@@ -1947,11 +1833,14 @@ static int HTPCallbackRequestBodyData(htp_tx_data_t *d)
* get here. */
if (tx_ud->request_body.body_inspected == 0 &&
tx_ud->request_body.content_len_so_far >= hstate->cfg->request.inspect_min_size) {
- if ((uint64_t)hstate->conn->in_data_counter > hstate->last_request_data_stamp &&
- (uint64_t)hstate->conn->in_data_counter - hstate->last_request_data_stamp < (uint64_t)UINT_MAX)
- {
- const uint32_t data_size = (uint32_t)(
- (uint64_t)hstate->conn->in_data_counter - hstate->last_request_data_stamp);
+ if ((uint64_t)htp_conn_request_data_counter(hstate->conn) >
+ hstate->last_request_data_stamp &&
+ (uint64_t)htp_conn_request_data_counter(hstate->conn) -
+ hstate->last_request_data_stamp <
+ (uint64_t)UINT_MAX) {
+ uint32_t data_size =
+ (uint32_t)((uint64_t)htp_conn_request_data_counter(hstate->conn) -
+ hstate->last_request_data_stamp);
const uint32_t depth = MIN(data_size, hstate->cfg->request.inspect_min_size);
/* body still in progress, but due to min inspect size we need to inspect now */
@@ -1963,35 +1852,38 @@ static int HTPCallbackRequestBodyData(htp_tx_data_t *d)
StreamTcpReassemblySetMinInspectDepth(hstate->f->protoctx, STREAM_TOSERVER, 0);
}
}
- SCReturnInt(HTP_OK);
+ SCReturnInt(HTP_STATUS_OK);
}
/**
* \brief Function callback to append chunks for Responses
* \param d pointer to the htp_tx_data_t structure (a chunk from htp lib)
- * \retval int HTP_OK if all goes well
+ * \retval int HTP_STATUS_OK if all goes well
*/
-static int HTPCallbackResponseBodyData(htp_tx_data_t *d)
+static int HTPCallbackResponseBodyData(const htp_connp_t *connp, htp_tx_data_t *d)
{
SCEnter();
+ const htp_tx_t *tx = htp_tx_data_tx(d);
+
if (!(SC_ATOMIC_GET(htp_config_flags) & HTP_REQUIRE_RESPONSE_BODY))
- SCReturnInt(HTP_OK);
+ SCReturnInt(HTP_STATUS_OK);
- if (d->len == 0)
- SCReturnInt(HTP_OK);
+ if (htp_tx_data_is_empty(d))
+ SCReturnInt(HTP_STATUS_OK);
- HtpState *hstate = htp_connp_get_user_data(d->tx->connp);
+ HtpState *hstate = htp_connp_user_data(connp);
if (hstate == NULL) {
- SCReturnInt(HTP_ERROR);
+ SCReturnInt(HTP_STATUS_ERROR);
}
SCLogDebug("New response body data available at %p -> %p -> %p, bodylen "
- "%"PRIu32"", hstate, d, d->data, (uint32_t)d->len);
+ "%" PRIu32 "",
+ hstate, d, htp_tx_data_data(d), (uint32_t)htp_tx_data_len(d));
- HtpTxUserData *tx_ud = (HtpTxUserData *) htp_tx_get_user_data(d->tx);
+ HtpTxUserData *tx_ud = (HtpTxUserData *)htp_tx_user_data(tx);
if (tx_ud == NULL) {
- SCReturnInt(HTP_OK);
+ SCReturnInt(HTP_STATUS_OK);
}
tx_ud->tx_data.file_flags |= hstate->state_data.file_flags;
if (!tx_ud->request_body_init) {
@@ -2008,15 +1900,13 @@ static int HTPCallbackResponseBodyData(htp_tx_data_t *d)
if (AppLayerHtpCheckDepth(&hstate->cfg->response, &tx_ud->response_body, tx_ud->tcflags)) {
uint32_t stream_depth = FileReassemblyDepth();
uint32_t len = AppLayerHtpComputeChunkLength(tx_ud->response_body.content_len_so_far,
- hstate->cfg->response.body_limit,
- stream_depth,
- tx_ud->tcflags,
- (uint32_t)d->len);
- BUG_ON(len > (uint32_t)d->len);
+ hstate->cfg->response.body_limit, stream_depth, tx_ud->tcflags,
+ (uint32_t)htp_tx_data_len(d));
+ BUG_ON(len > (uint32_t)htp_tx_data_len(d));
- HtpBodyAppendChunk(&hstate->cfg->response, &tx_ud->response_body, d->data, len);
+ HtpBodyAppendChunk(&hstate->cfg->response, &tx_ud->response_body, htp_tx_data_data(d), len);
- HtpResponseBodyHandle(hstate, tx_ud, d->tx, (uint8_t *)d->data, len);
+ HtpResponseBodyHandle(hstate, tx_ud, htp_tx_data_tx(d), htp_tx_data_data(d), len);
} else {
if (tx_ud->tcflags & HTP_FILENAME_SET) {
SCLogDebug("closing file that was being stored");
@@ -2026,21 +1916,25 @@ static int HTPCallbackResponseBodyData(htp_tx_data_t *d)
}
if (hstate->conn != NULL) {
- SCLogDebug("checking body size %"PRIu64" against inspect limit %u (cur %"PRIu64", last %"PRIu64")",
- tx_ud->response_body.content_len_so_far,
- hstate->cfg->response.inspect_min_size,
- (uint64_t)hstate->conn->in_data_counter, hstate->last_response_data_stamp);
+ SCLogDebug("checking body size %" PRIu64 " against inspect limit %u (cur %" PRIu64
+ ", last %" PRIu64 ")",
+ tx_ud->response_body.content_len_so_far, hstate->cfg->response.inspect_min_size,
+ (uint64_t)htp_conn_request_data_counter(hstate->conn),
+ hstate->last_response_data_stamp);
/* if we reach the inspect_min_size we'll trigger inspection,
* so make sure that raw stream is also inspected. Set the
* data to be used to the amount of raw bytes we've seen to
* get here. */
if (tx_ud->response_body.body_inspected == 0 &&
tx_ud->response_body.content_len_so_far >= hstate->cfg->response.inspect_min_size) {
- if ((uint64_t)hstate->conn->out_data_counter > hstate->last_response_data_stamp &&
- (uint64_t)hstate->conn->out_data_counter - hstate->last_response_data_stamp < (uint64_t)UINT_MAX)
- {
- const uint32_t data_size = (uint32_t)((uint64_t)hstate->conn->out_data_counter -
- hstate->last_response_data_stamp);
+ if ((uint64_t)htp_conn_response_data_counter(hstate->conn) >
+ hstate->last_response_data_stamp &&
+ (uint64_t)htp_conn_response_data_counter(hstate->conn) -
+ hstate->last_response_data_stamp <
+ (uint64_t)UINT_MAX) {
+ uint32_t data_size =
+ (uint32_t)((uint64_t)htp_conn_response_data_counter(hstate->conn) -
+ hstate->last_response_data_stamp);
const uint32_t depth = MIN(data_size, hstate->cfg->response.inspect_min_size);
/* body still in progress, but due to min inspect size we need to inspect now */
@@ -2052,7 +1946,7 @@ static int HTPCallbackResponseBodyData(htp_tx_data_t *d)
StreamTcpReassemblySetMinInspectDepth(hstate->f->protoctx, STREAM_TOCLIENT, 0);
}
}
- SCReturnInt(HTP_OK);
+ SCReturnInt(HTP_STATUS_OK);
}
/**
@@ -2095,39 +1989,38 @@ void HTPFreeConfig(void)
SCReturn;
}
-static int HTPCallbackRequestHasTrailer(htp_tx_t *tx)
+static int HTPCallbackRequestHasTrailer(const htp_connp_t *connp, htp_tx_t *tx)
{
- HtpTxUserData *htud = (HtpTxUserData *)htp_tx_get_user_data(tx);
+ HtpTxUserData *htud = (HtpTxUserData *)htp_tx_user_data(tx);
if (htud != NULL) {
htud->request_has_trailers = 1;
}
- return HTP_OK;
+ return HTP_STATUS_OK;
}
-static int HTPCallbackResponseHasTrailer(htp_tx_t *tx)
+static int HTPCallbackResponseHasTrailer(const htp_connp_t *connp, htp_tx_t *tx)
{
- HtpTxUserData *htud = (HtpTxUserData *)htp_tx_get_user_data(tx);
+ HtpTxUserData *htud = (HtpTxUserData *)htp_tx_user_data(tx);
if (htud != NULL) {
htud->response_has_trailers = 1;
}
- return HTP_OK;
+ return HTP_STATUS_OK;
}
/**\internal
* \brief called at start of request
* Set min inspect size.
*/
-static int HTPCallbackRequestStart(htp_tx_t *tx)
+static int HTPCallbackRequestStart(const htp_connp_t *connp, htp_tx_t *tx)
{
- HtpState *hstate = htp_connp_get_user_data(tx->connp);
+ HtpState *hstate = htp_connp_user_data(connp);
if (hstate == NULL) {
- SCReturnInt(HTP_ERROR);
+ SCReturnInt(HTP_STATUS_ERROR);
}
- uint64_t consumed = hstate->slice->offset + htp_connp_req_data_consumed(hstate->connp);
+ uint64_t consumed = hstate->slice->offset + htp_connp_request_data_consumed(hstate->connp);
SCLogDebug("HTTP request start: data offset %" PRIu64 ", in_data_counter %" PRIu64, consumed,
- (uint64_t)hstate->conn->in_data_counter);
-
+ (uint64_t)htp_conn_request_data_counter(hstate->conn));
/* app-layer-frame-documentation tag start: frame registration http request */
Frame *frame = AppLayerFrameNewByAbsoluteOffset(
hstate->f, hstate->slice, consumed, -1, 0, HTTP_FRAME_REQUEST);
@@ -2142,32 +2035,32 @@ static int HTPCallbackRequestStart(htp_tx_t *tx)
StreamTcpReassemblySetMinInspectDepth(hstate->f->protoctx, STREAM_TOSERVER,
hstate->cfg->request.inspect_min_size);
- HtpTxUserData *tx_ud = (HtpTxUserData *) htp_tx_get_user_data(tx);
+ HtpTxUserData *tx_ud = (HtpTxUserData *)htp_tx_user_data(tx);
if (tx_ud == NULL) {
tx_ud = HTPCalloc(1, sizeof(HtpTxUserData));
if (unlikely(tx_ud == NULL)) {
- SCReturnInt(HTP_OK);
+ SCReturnInt(HTP_STATUS_OK);
}
tx_ud->tx_data.file_tx = STREAM_TOSERVER | STREAM_TOCLIENT; // each http tx may xfer files
htp_tx_set_user_data(tx, tx_ud);
}
- SCReturnInt(HTP_OK);
+ SCReturnInt(HTP_STATUS_OK);
}
/**\internal
* \brief called at start of response
* Set min inspect size.
*/
-static int HTPCallbackResponseStart(htp_tx_t *tx)
+static int HTPCallbackResponseStart(const htp_connp_t *connp, htp_tx_t *tx)
{
- HtpState *hstate = htp_connp_get_user_data(tx->connp);
+ HtpState *hstate = htp_connp_user_data(connp);
if (hstate == NULL) {
- SCReturnInt(HTP_ERROR);
+ SCReturnInt(HTP_STATUS_ERROR);
}
- uint64_t consumed = hstate->slice->offset + htp_connp_res_data_consumed(hstate->connp);
+ uint64_t consumed = hstate->slice->offset + htp_connp_response_data_consumed(hstate->connp);
SCLogDebug("HTTP response start: data offset %" PRIu64 ", out_data_counter %" PRIu64, consumed,
- (uint64_t)hstate->conn->out_data_counter);
+ (uint64_t)htp_conn_response_data_counter(hstate->conn));
Frame *frame = AppLayerFrameNewByAbsoluteOffset(
hstate->f, hstate->slice, consumed, -1, 1, HTTP_FRAME_RESPONSE);
@@ -2181,40 +2074,40 @@ static int HTPCallbackResponseStart(htp_tx_t *tx)
StreamTcpReassemblySetMinInspectDepth(hstate->f->protoctx, STREAM_TOCLIENT,
hstate->cfg->response.inspect_min_size);
- HtpTxUserData *tx_ud = (HtpTxUserData *) htp_tx_get_user_data(tx);
+ HtpTxUserData *tx_ud = (HtpTxUserData *)htp_tx_user_data(tx);
if (tx_ud == NULL) {
tx_ud = HTPCalloc(1, sizeof(HtpTxUserData));
if (unlikely(tx_ud == NULL)) {
- SCReturnInt(HTP_OK);
+ SCReturnInt(HTP_STATUS_OK);
}
tx_ud->tx_data.file_tx =
STREAM_TOCLIENT; // each http tx may xfer files. Toserver already missed.
htp_tx_set_user_data(tx, tx_ud);
}
- SCReturnInt(HTP_OK);
+ SCReturnInt(HTP_STATUS_OK);
}
/**
* \brief callback for request to store the recent incoming request
- into the recent_in_tx for the given htp state
+ into the recent_request_tx for the given htp state
* \param connp pointer to the current connection parser which has the htp
* state in it as user data
*/
-static int HTPCallbackRequestComplete(htp_tx_t *tx)
+static int HTPCallbackRequestComplete(const htp_connp_t *connp, htp_tx_t *tx)
{
SCEnter();
if (tx == NULL) {
- SCReturnInt(HTP_ERROR);
+ SCReturnInt(HTP_STATUS_ERROR);
}
- HtpState *hstate = htp_connp_get_user_data(tx->connp);
+ HtpState *hstate = htp_connp_user_data(connp);
if (hstate == NULL) {
- SCReturnInt(HTP_ERROR);
+ SCReturnInt(HTP_STATUS_ERROR);
}
const uint64_t abs_right_edge =
- hstate->slice->offset + htp_connp_req_data_consumed(hstate->connp);
+ hstate->slice->offset + htp_connp_request_data_consumed(hstate->connp);
/* app-layer-frame-documentation tag start: updating frame->len */
if (hstate->request_frame_id > 0) {
@@ -2239,7 +2132,7 @@ static int HTPCallbackRequestComplete(htp_tx_t *tx)
HTPErrorCheckTxRequestFlags(hstate, tx);
- HtpTxUserData *htud = (HtpTxUserData *)htp_tx_get_user_data(tx);
+ HtpTxUserData *htud = (HtpTxUserData *)htp_tx_user_data(tx);
if (htud != NULL) {
if (htud->tsflags & HTP_FILENAME_SET) {
SCLogDebug("closing file that was being stored");
@@ -2256,29 +2149,29 @@ static int HTPCallbackRequestComplete(htp_tx_t *tx)
/* request done, do raw reassembly now to inspect state and stream
* at the same time. */
AppLayerParserTriggerRawStreamReassembly(hstate->f, STREAM_TOSERVER);
- SCReturnInt(HTP_OK);
+ SCReturnInt(HTP_STATUS_OK);
}
/**
* \brief callback for response to remove the recent received requests
- from the recent_in_tx for the given htp state
+ from the recent_request_tx for the given htp state
* \param connp pointer to the current connection parser which has the htp
* state in it as user data
*/
-static int HTPCallbackResponseComplete(htp_tx_t *tx)
+static int HTPCallbackResponseComplete(const htp_connp_t *connp, htp_tx_t *tx)
{
SCEnter();
- HtpState *hstate = htp_connp_get_user_data(tx->connp);
+ HtpState *hstate = htp_connp_user_data(connp);
if (hstate == NULL) {
- SCReturnInt(HTP_ERROR);
+ SCReturnInt(HTP_STATUS_ERROR);
}
/* we have one whole transaction now */
hstate->transaction_cnt++;
const uint64_t abs_right_edge =
- hstate->slice->offset + htp_connp_res_data_consumed(hstate->connp);
+ hstate->slice->offset + htp_connp_response_data_consumed(hstate->connp);
if (hstate->response_frame_id > 0) {
Frame *frame = AppLayerFrameGetById(hstate->f, 1, hstate->response_frame_id);
@@ -2294,7 +2187,7 @@ static int HTPCallbackResponseComplete(htp_tx_t *tx)
hstate->response_frame_id = 0;
}
- HtpTxUserData *htud = (HtpTxUserData *) htp_tx_get_user_data(tx);
+ HtpTxUserData *htud = (HtpTxUserData *)htp_tx_user_data(tx);
if (htud != NULL) {
if (htud->tcflags & HTP_FILENAME_SET) {
SCLogDebug("closing file that was being stored");
@@ -2308,147 +2201,95 @@ static int HTPCallbackResponseComplete(htp_tx_t *tx)
AppLayerParserTriggerRawStreamReassembly(hstate->f, STREAM_TOCLIENT);
/* handle HTTP CONNECT */
- if (tx->request_method_number == HTP_M_CONNECT) {
+ if (htp_tx_request_method_number(tx) == HTP_METHOD_CONNECT) {
/* any 2XX status response implies that the connection will become
a tunnel immediately after this packet (RFC 7230, 3.3.3). */
- if ((tx->response_status_number >= 200) &&
- (tx->response_status_number < 300) &&
- (hstate->transaction_cnt == 1)) {
+ if ((htp_tx_response_status_number(tx) >= 200) &&
+ (htp_tx_response_status_number(tx) < 300) && (hstate->transaction_cnt == 1)) {
uint16_t dp = 0;
- if (tx->request_port_number != -1) {
- dp = (uint16_t)tx->request_port_number;
+ if (htp_tx_request_port_number(tx) != -1) {
+ dp = (uint16_t)htp_tx_request_port_number(tx);
}
// both ALPROTO_HTTP1 and ALPROTO_TLS are normal options
if (!AppLayerRequestProtocolChange(hstate->f, dp, ALPROTO_UNKNOWN)) {
HTPSetEvent(
hstate, htud, STREAM_TOCLIENT, HTTP_DECODER_EVENT_FAILED_PROTOCOL_CHANGE);
}
- tx->request_progress = HTP_REQUEST_COMPLETE;
- tx->response_progress = HTP_RESPONSE_COMPLETE;
}
}
hstate->last_response_data_stamp = abs_right_edge;
- SCReturnInt(HTP_OK);
+ SCReturnInt(HTP_STATUS_OK);
}
-static int HTPCallbackRequestLine(htp_tx_t *tx)
+static int HTPCallbackRequestLine(const htp_connp_t *connp, htp_tx_t *tx)
{
HtpTxUserData *tx_ud;
- bstr *request_uri_normalized;
- HtpState *hstate = htp_connp_get_user_data(tx->connp);
- const HTPCfgRec *cfg = hstate->cfg;
-
- request_uri_normalized = SCHTPGenerateNormalizedUri(tx, tx->parsed_uri, cfg->uri_include_all);
- if (request_uri_normalized == NULL)
- return HTP_OK;
+ HtpState *hstate = htp_connp_user_data(connp);
- tx_ud = htp_tx_get_user_data(tx);
+ tx_ud = htp_tx_user_data(tx);
if (unlikely(tx_ud == NULL)) {
- bstr_free(request_uri_normalized);
- return HTP_OK;
+ return HTP_STATUS_OK;
}
- if (unlikely(tx_ud->request_uri_normalized != NULL))
- bstr_free(tx_ud->request_uri_normalized);
- tx_ud->request_uri_normalized = request_uri_normalized;
- if (tx->flags) {
+ if (htp_tx_flags(tx)) {
HTPErrorCheckTxRequestFlags(hstate, tx);
}
- return HTP_OK;
-}
-
-static int HTPCallbackDoubleDecodeUriPart(htp_tx_t *tx, bstr *part)
-{
- if (part == NULL)
- return HTP_OK;
-
- uint64_t flags = 0;
- size_t prevlen = bstr_len(part);
- htp_status_t res = htp_urldecode_inplace(tx->cfg, HTP_DECODER_URLENCODED, part, &flags);
- // shorter string means that uri was encoded
- if (res == HTP_OK && prevlen > bstr_len(part)) {
- HtpTxUserData *htud = (HtpTxUserData *) htp_tx_get_user_data(tx);
- if (htud == NULL)
- return HTP_OK;
- HtpState *s = htp_connp_get_user_data(tx->connp);
- if (s == NULL)
- return HTP_OK;
- HTPSetEvent(s, htud, STREAM_TOSERVER,
- HTTP_DECODER_EVENT_DOUBLE_ENCODED_URI);
- }
-
- return HTP_OK;
+ return HTP_STATUS_OK;
}
-static int HTPCallbackDoubleDecodeQuery(htp_tx_t *tx)
-{
- if (tx->parsed_uri == NULL)
- return HTP_OK;
-
- return HTPCallbackDoubleDecodeUriPart(tx, tx->parsed_uri->query);
-}
-
-static int HTPCallbackDoubleDecodePath(htp_tx_t *tx)
-{
- if (tx->parsed_uri == NULL)
- return HTP_OK;
-
- return HTPCallbackDoubleDecodeUriPart(tx, tx->parsed_uri->path);
-}
-
-static int HTPCallbackRequestHeaderData(htp_tx_data_t *tx_data)
+static int HTPCallbackRequestHeaderData(const htp_connp_t *connp, htp_tx_data_t *tx_data)
{
void *ptmp;
- if (tx_data->len == 0 || tx_data->tx == NULL)
- return HTP_OK;
+ const htp_tx_t *tx = htp_tx_data_tx(tx_data);
+ if (htp_tx_data_is_empty(tx_data) || tx == NULL)
+ return HTP_STATUS_OK;
- HtpTxUserData *tx_ud = htp_tx_get_user_data(tx_data->tx);
+ HtpTxUserData *tx_ud = htp_tx_user_data(tx);
if (tx_ud == NULL) {
- return HTP_OK;
+ return HTP_STATUS_OK;
}
- ptmp = HTPRealloc(tx_ud->request_headers_raw,
- tx_ud->request_headers_raw_len,
- tx_ud->request_headers_raw_len + tx_data->len);
+ ptmp = HTPRealloc(tx_ud->request_headers_raw, tx_ud->request_headers_raw_len,
+ tx_ud->request_headers_raw_len + htp_tx_data_len(tx_data));
if (ptmp == NULL) {
- return HTP_OK;
+ return HTP_STATUS_OK;
}
tx_ud->request_headers_raw = ptmp;
- memcpy(tx_ud->request_headers_raw + tx_ud->request_headers_raw_len,
- tx_data->data, tx_data->len);
- tx_ud->request_headers_raw_len += tx_data->len;
+ memcpy(tx_ud->request_headers_raw + tx_ud->request_headers_raw_len, htp_tx_data_data(tx_data),
+ htp_tx_data_len(tx_data));
+ tx_ud->request_headers_raw_len += htp_tx_data_len(tx_data);
- if (tx_data->tx && tx_data->tx->flags) {
- HtpState *hstate = htp_connp_get_user_data(tx_data->tx->connp);
- HTPErrorCheckTxRequestFlags(hstate, tx_data->tx);
+ if (tx && htp_tx_flags(tx)) {
+ HtpState *hstate = htp_connp_user_data(connp);
+ HTPErrorCheckTxRequestFlags(hstate, tx);
}
- return HTP_OK;
+ return HTP_STATUS_OK;
}
-static int HTPCallbackResponseHeaderData(htp_tx_data_t *tx_data)
+static int HTPCallbackResponseHeaderData(const htp_connp_t *connp, htp_tx_data_t *tx_data)
{
void *ptmp;
- if (tx_data->len == 0 || tx_data->tx == NULL)
- return HTP_OK;
+ const htp_tx_t *tx = htp_tx_data_tx(tx_data);
+ if (htp_tx_data_is_empty(tx_data) || tx == NULL)
+ return HTP_STATUS_OK;
- HtpTxUserData *tx_ud = htp_tx_get_user_data(tx_data->tx);
+ HtpTxUserData *tx_ud = htp_tx_user_data(tx);
if (tx_ud == NULL) {
- return HTP_OK;
+ return HTP_STATUS_OK;
}
- ptmp = HTPRealloc(tx_ud->response_headers_raw,
- tx_ud->response_headers_raw_len,
- tx_ud->response_headers_raw_len + tx_data->len);
+ ptmp = HTPRealloc(tx_ud->response_headers_raw, tx_ud->response_headers_raw_len,
+ tx_ud->response_headers_raw_len + htp_tx_data_len(tx_data));
if (ptmp == NULL) {
- return HTP_OK;
+ return HTP_STATUS_OK;
}
tx_ud->response_headers_raw = ptmp;
- memcpy(tx_ud->response_headers_raw + tx_ud->response_headers_raw_len,
- tx_data->data, tx_data->len);
- tx_ud->response_headers_raw_len += tx_data->len;
+ memcpy(tx_ud->response_headers_raw + tx_ud->response_headers_raw_len, htp_tx_data_data(tx_data),
+ htp_tx_data_len(tx_data));
+ tx_ud->response_headers_raw_len += htp_tx_data_len(tx_data);
- return HTP_OK;
+ return HTP_STATUS_OK;
}
/*
@@ -2456,7 +2297,7 @@ static int HTPCallbackResponseHeaderData(htp_tx_data_t *tx_data)
*/
static void HTPConfigSetDefaultsPhase1(HTPCfgRec *cfg_prec)
{
- cfg_prec->uri_include_all = FALSE;
+ htp_config_set_normalized_uri_include_all(cfg_prec->cfg, FALSE);
cfg_prec->request.body_limit = HTP_CONFIG_DEFAULT_REQUEST_BODY_LIMIT;
cfg_prec->response.body_limit = HTP_CONFIG_DEFAULT_RESPONSE_BODY_LIMIT;
cfg_prec->request.inspect_min_size = HTP_CONFIG_DEFAULT_REQUEST_INSPECT_MIN_SIZE;
@@ -2491,33 +2332,16 @@ static void HTPConfigSetDefaultsPhase1(HTPCfgRec *cfg_prec)
htp_config_set_parse_request_cookies(cfg_prec->cfg, 0);
/* don't convert + to space by default */
- htp_config_set_plusspace_decode(cfg_prec->cfg, HTP_DECODER_URLENCODED, 0);
+ htp_config_set_plusspace_decode(cfg_prec->cfg, 0);
// enables request decompression
htp_config_set_request_decompression(cfg_prec->cfg, 1);
-#ifdef HAVE_HTP_CONFIG_SET_LZMA_LAYERS
- // disable by default
htp_config_set_lzma_layers(cfg_prec->cfg, HTP_CONFIG_DEFAULT_LZMA_LAYERS);
-#endif
-#ifdef HAVE_HTP_CONFIG_SET_LZMA_MEMLIMIT
htp_config_set_lzma_memlimit(cfg_prec->cfg,
HTP_CONFIG_DEFAULT_LZMA_MEMLIMIT);
-#endif
-#ifdef HAVE_HTP_CONFIG_SET_COMPRESSION_BOMB_LIMIT
htp_config_set_compression_bomb_limit(cfg_prec->cfg,
HTP_CONFIG_DEFAULT_COMPRESSION_BOMB_LIMIT);
-#endif
-#ifdef HAVE_HTP_CONFIG_SET_COMPRESSION_TIME_LIMIT
htp_config_set_compression_time_limit(cfg_prec->cfg, HTP_CONFIG_DEFAULT_COMPRESSION_TIME_LIMIT);
-#endif
- /* libhtp <= 0.5.9 doesn't use soft limit, but it's impossible to set
- * only the hard limit. So we set both here to the (current) htp defaults.
- * The reason we do this is that if the user sets the hard limit in the
- * config, we have to set the soft limit as well. If libhtp starts using
- * the soft limit in the future, we at least make sure we control what
- * it's value is. */
- htp_config_set_field_limits(cfg_prec->cfg,
- (size_t)HTP_CONFIG_DEFAULT_FIELD_LIMIT_SOFT,
- (size_t)HTP_CONFIG_DEFAULT_FIELD_LIMIT_HARD);
+ htp_config_set_field_limit(cfg_prec->cfg, (size_t)HTP_CONFIG_DEFAULT_FIELD_LIMIT);
return;
}
@@ -2624,7 +2448,8 @@ static void HTPConfigParseParameters(HTPCfgRec *cfg_prec, ConfNode *s,
if (personality >= 0) {
SCLogDebug("LIBHTP default: %s=%s (%d)", p->name, p->val,
personality);
- if (htp_config_set_server_personality(cfg_prec->cfg, personality) == HTP_ERROR){
+ if (htp_config_set_server_personality(cfg_prec->cfg, personality) ==
+ HTP_STATUS_ERROR) {
SCLogWarning("LIBHTP Failed adding "
"personality \"%s\", ignoring",
p->val);
@@ -2636,7 +2461,7 @@ static void HTPConfigParseParameters(HTPCfgRec *cfg_prec, ConfNode *s,
/* The IDS personality by default converts the path (and due to
* our query string callback also the query string) to lowercase.
* Signatures do not expect this, so override it. */
- htp_config_set_convert_lowercase(cfg_prec->cfg, HTP_DECODER_URL_PATH, 0);
+ htp_config_set_convert_lowercase(cfg_prec->cfg, 0);
} else {
SCLogWarning("LIBHTP Unknown personality "
"\"%s\", ignoring",
@@ -2678,16 +2503,10 @@ static void HTPConfigParseParameters(HTPCfgRec *cfg_prec, ConfNode *s,
}
} else if (strcasecmp("double-decode-query", p->name) == 0) {
- if (ConfValIsTrue(p->val)) {
- htp_config_register_request_line(cfg_prec->cfg,
- HTPCallbackDoubleDecodeQuery);
- }
+ htp_config_set_double_decode_normalized_query(cfg_prec->cfg, ConfValIsTrue(p->val));
} else if (strcasecmp("double-decode-path", p->name) == 0) {
- if (ConfValIsTrue(p->val)) {
- htp_config_register_request_line(cfg_prec->cfg,
- HTPCallbackDoubleDecodePath);
- }
+ htp_config_set_double_decode_normalized_path(cfg_prec->cfg, ConfValIsTrue(p->val));
} else if (strcasecmp("response-body-minimal-inspect-size", p->name) == 0) {
if (ParseSizeStringU32(p->val, &cfg_prec->response.inspect_min_size) < 0) {
@@ -2713,21 +2532,13 @@ static void HTPConfigParseParameters(HTPCfgRec *cfg_prec, ConfNode *s,
p->val);
exit(EXIT_FAILURE);
}
-#ifdef HAVE_HTP_CONFIG_SET_RESPONSE_DECOMPRESSION_LAYER_LIMIT
- htp_config_set_response_decompression_layer_limit(cfg_prec->cfg, value);
-#else
- SCLogWarning("can't set response-body-decompress-layer-limit "
- "to %u, libhtp version too old",
- value);
-#endif
+ htp_config_set_decompression_layer_limit(cfg_prec->cfg, value);
} else if (strcasecmp("path-convert-backslash-separators", p->name) == 0) {
htp_config_set_backslash_convert_slashes(cfg_prec->cfg,
- HTP_DECODER_URL_PATH,
ConfValIsTrue(p->val));
} else if (strcasecmp("path-bestfit-replacement-char", p->name) == 0) {
if (strlen(p->val) == 1) {
htp_config_set_bestfit_replacement_byte(cfg_prec->cfg,
- HTP_DECODER_URL_PATH,
p->val[0]);
} else {
SCLogError("Invalid entry "
@@ -2735,55 +2546,45 @@ static void HTPConfigParseParameters(HTPCfgRec *cfg_prec, ConfNode *s,
}
} else if (strcasecmp("path-convert-lowercase", p->name) == 0) {
htp_config_set_convert_lowercase(cfg_prec->cfg,
- HTP_DECODER_URL_PATH,
ConfValIsTrue(p->val));
} else if (strcasecmp("path-nul-encoded-terminates", p->name) == 0) {
htp_config_set_nul_encoded_terminates(cfg_prec->cfg,
- HTP_DECODER_URL_PATH,
ConfValIsTrue(p->val));
} else if (strcasecmp("path-nul-raw-terminates", p->name) == 0) {
htp_config_set_nul_raw_terminates(cfg_prec->cfg,
- HTP_DECODER_URL_PATH,
ConfValIsTrue(p->val));
} else if (strcasecmp("path-separators-compress", p->name) == 0) {
htp_config_set_path_separators_compress(cfg_prec->cfg,
- HTP_DECODER_URL_PATH,
ConfValIsTrue(p->val));
} else if (strcasecmp("path-separators-decode", p->name) == 0) {
htp_config_set_path_separators_decode(cfg_prec->cfg,
- HTP_DECODER_URL_PATH,
ConfValIsTrue(p->val));
} else if (strcasecmp("path-u-encoding-decode", p->name) == 0) {
htp_config_set_u_encoding_decode(cfg_prec->cfg,
- HTP_DECODER_URL_PATH,
ConfValIsTrue(p->val));
} else if (strcasecmp("path-url-encoding-invalid-handling", p->name) == 0) {
enum htp_url_encoding_handling_t handling;
if (strcasecmp(p->val, "preserve_percent") == 0) {
- handling = HTP_URL_DECODE_PRESERVE_PERCENT;
+ handling = HTP_URL_ENCODING_HANDLING_PRESERVE_PERCENT;
} else if (strcasecmp(p->val, "remove_percent") == 0) {
- handling = HTP_URL_DECODE_REMOVE_PERCENT;
+ handling = HTP_URL_ENCODING_HANDLING_REMOVE_PERCENT;
} else if (strcasecmp(p->val, "decode_invalid") == 0) {
- handling = HTP_URL_DECODE_PROCESS_INVALID;
+ handling = HTP_URL_ENCODING_HANDLING_PROCESS_INVALID;
} else {
SCLogError("Invalid entry "
"for libhtp param path-url-encoding-invalid-handling");
return;
}
htp_config_set_url_encoding_invalid_handling(cfg_prec->cfg,
- HTP_DECODER_URL_PATH,
handling);
} else if (strcasecmp("path-utf8-convert-bestfit", p->name) == 0) {
htp_config_set_utf8_convert_bestfit(cfg_prec->cfg,
- HTP_DECODER_URL_PATH,
ConfValIsTrue(p->val));
} else if (strcasecmp("uri-include-all", p->name) == 0) {
- cfg_prec->uri_include_all = ConfValIsTrue(p->val);
- SCLogDebug("uri-include-all %s",
- cfg_prec->uri_include_all ? "enabled" : "disabled");
+ htp_config_set_normalized_uri_include_all(cfg_prec->cfg, ConfValIsTrue(p->val));
+ SCLogDebug("uri-include-all %s", ConfValIsTrue(p->val) ? "enabled" : "disabled");
} else if (strcasecmp("query-plusspace-decode", p->name) == 0) {
htp_config_set_plusspace_decode(cfg_prec->cfg,
- HTP_DECODER_URLENCODED,
ConfValIsTrue(p->val));
} else if (strcasecmp("meta-field-limit", p->name) == 0) {
uint32_t limit = 0;
@@ -2798,10 +2599,7 @@ static void HTPConfigParseParameters(HTPCfgRec *cfg_prec, ConfNode *s,
"from conf file cannot be 0. Killing engine");
}
/* set default soft-limit with our new hard limit */
- htp_config_set_field_limits(cfg_prec->cfg,
- (size_t)HTP_CONFIG_DEFAULT_FIELD_LIMIT_SOFT,
- (size_t)limit);
-#ifdef HAVE_HTP_CONFIG_SET_LZMA_MEMLIMIT
+ htp_config_set_field_limit(cfg_prec->cfg, (size_t)limit);
} else if (strcasecmp("lzma-memlimit", p->name) == 0) {
uint32_t limit = 0;
if (ParseSizeStringU32(p->val, &limit) < 0) {
@@ -2816,8 +2614,6 @@ static void HTPConfigParseParameters(HTPCfgRec *cfg_prec, ConfNode *s,
/* set default soft-limit with our new hard limit */
SCLogConfig("Setting HTTP LZMA memory limit to %"PRIu32" bytes", limit);
htp_config_set_lzma_memlimit(cfg_prec->cfg, (size_t)limit);
-#endif
-#ifdef HAVE_HTP_CONFIG_SET_LZMA_LAYERS
} else if (strcasecmp("lzma-enabled", p->name) == 0) {
if (ConfValIsTrue(p->val)) {
htp_config_set_lzma_layers(cfg_prec->cfg, 1);
@@ -2831,8 +2627,6 @@ static void HTPConfigParseParameters(HTPCfgRec *cfg_prec, ConfNode *s,
SCLogConfig("Setting HTTP LZMA decompression layers to %" PRIu32 "", (int)limit);
htp_config_set_lzma_layers(cfg_prec->cfg, limit);
}
-#endif
-#ifdef HAVE_HTP_CONFIG_SET_COMPRESSION_BOMB_LIMIT
} else if (strcasecmp("compression-bomb-limit", p->name) == 0) {
uint32_t limit = 0;
if (ParseSizeStringU32(p->val, &limit) < 0) {
@@ -2847,8 +2641,6 @@ static void HTPConfigParseParameters(HTPCfgRec *cfg_prec, ConfNode *s,
/* set default soft-limit with our new hard limit */
SCLogConfig("Setting HTTP compression bomb limit to %"PRIu32" bytes", limit);
htp_config_set_compression_bomb_limit(cfg_prec->cfg, (size_t)limit);
-#endif
-#ifdef HAVE_HTP_CONFIG_SET_COMPRESSION_TIME_LIMIT
} else if (strcasecmp("decompression-time-limit", p->name) == 0) {
uint32_t limit = 0;
// between 1 usec and 1 second
@@ -2859,7 +2651,6 @@ static void HTPConfigParseParameters(HTPCfgRec *cfg_prec, ConfNode *s,
}
SCLogConfig("Setting HTTP decompression time limit to %" PRIu32 " usec", limit);
htp_config_set_compression_time_limit(cfg_prec->cfg, (size_t)limit);
-#endif
} else if (strcasecmp("randomize-inspection-sizes", p->name) == 0) {
if (!g_disable_randomness) {
cfg_prec->randomize = ConfValIsTrue(p->val);
@@ -3042,7 +2833,7 @@ static AppLayerGetFileState HTPGetTxFiles(void *state, void *txv, uint8_t direct
{
AppLayerGetFileState files = { .fc = NULL, .cfg = &htp_sbcfg };
htp_tx_t *tx = (htp_tx_t *)txv;
- HtpTxUserData *tx_ud = htp_tx_get_user_data(tx);
+ HtpTxUserData *tx_ud = htp_tx_user_data(tx);
if (tx_ud) {
if (direction & STREAM_TOCLIENT) {
files.fc = &tx_ud->files_tc;
@@ -3056,17 +2847,17 @@ static AppLayerGetFileState HTPGetTxFiles(void *state, void *txv, uint8_t direct
static int HTPStateGetAlstateProgress(void *tx, uint8_t direction)
{
if (direction & STREAM_TOSERVER)
- return ((htp_tx_t *)tx)->request_progress;
+ return htp_tx_request_progress((htp_tx_t *)tx);
else
- return ((htp_tx_t *)tx)->response_progress;
+ return htp_tx_response_progress((htp_tx_t *)tx);
}
static uint64_t HTPStateGetTxCnt(void *alstate)
{
HtpState *http_state = (HtpState *)alstate;
- if (http_state != NULL && http_state->conn != NULL) {
- const int64_t size = (int64_t)htp_list_size(http_state->conn->transactions);
+ if (http_state != NULL && http_state->connp != NULL) {
+ const int64_t size = htp_connp_tx_size(http_state->connp);
if (size < 0)
return 0ULL;
SCLogDebug("size %"PRIu64, size);
@@ -3080,8 +2871,8 @@ static void *HTPStateGetTx(void *alstate, uint64_t tx_id)
{
HtpState *http_state = (HtpState *)alstate;
- if (http_state != NULL && http_state->conn != NULL)
- return htp_list_get(http_state->conn->transactions, tx_id);
+ if (http_state != NULL && http_state->connp != NULL)
+ return (void *)htp_connp_tx(http_state->connp, tx_id);
else
return NULL;
}
@@ -3090,10 +2881,10 @@ void *HtpGetTxForH2(void *alstate)
{
// gets last transaction
HtpState *http_state = (HtpState *)alstate;
- if (http_state != NULL && http_state->conn != NULL) {
- size_t txid = htp_list_array_size(http_state->conn->transactions);
+ if (http_state != NULL && http_state->connp != NULL) {
+ size_t txid = htp_connp_tx_size(http_state->connp);
if (txid > 0) {
- return htp_list_get(http_state->conn->transactions, txid - 1);
+ return (void *)htp_connp_tx(http_state->connp, txid - 1);
}
}
return NULL;
@@ -3136,7 +2927,7 @@ static int HTPStateGetEventInfoById(int event_id, const char **event_name,
static AppLayerTxData *HTPGetTxData(void *vtx)
{
htp_tx_t *tx = (htp_tx_t *)vtx;
- HtpTxUserData *tx_ud = htp_tx_get_user_data(tx);
+ HtpTxUserData *tx_ud = htp_tx_user_data(tx);
if (tx_ud) {
return &tx_ud->tx_data;
}
@@ -3228,7 +3019,7 @@ void RegisterHTPParsers(void)
AppLayerParserRegisterGetTx(IPPROTO_TCP, ALPROTO_HTTP1, HTPStateGetTx);
AppLayerParserRegisterStateProgressCompletionStatus(
- ALPROTO_HTTP1, HTP_REQUEST_COMPLETE, HTP_RESPONSE_COMPLETE);
+ ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_COMPLETE, HTP_RESPONSE_PROGRESS_COMPLETE);
AppLayerParserRegisterGetEventInfo(IPPROTO_TCP, ALPROTO_HTTP1, HTPStateGetEventInfo);
AppLayerParserRegisterGetEventInfoById(
IPPROTO_TCP, ALPROTO_HTTP1, HTPStateGetEventInfoById);
@@ -3327,12 +3118,12 @@ static int HTPParserTest01(void)
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
FAIL_IF_NULL(tx);
- htp_header_t *h = htp_table_get_index(tx->request_headers, 0, NULL);
+ const htp_header_t *h = htp_tx_request_header_index(tx, 0);
FAIL_IF_NULL(h);
- FAIL_IF(strcmp(bstr_util_strdup_to_c(h->value), "Victor/1.0"));
- FAIL_IF(tx->request_method_number != HTP_M_POST);
- FAIL_IF(tx->request_protocol_number != HTP_PROTOCOL_1_0);
+ FAIL_IF(bstr_cmp_c(htp_header_value(h), "Victor/1.0"));
+ FAIL_IF(htp_tx_request_method_number(tx) != HTP_METHOD_POST);
+ FAIL_IF(htp_tx_request_protocol_number(tx) != HTP_PROTOCOL_V1_0);
AppLayerParserThreadCtxFree(alp_tctx);
StreamTcpFreeConfig(true);
@@ -3371,12 +3162,12 @@ static int HTPParserTest01b(void)
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
FAIL_IF_NULL(tx);
- htp_header_t *h = htp_table_get_index(tx->request_headers, 0, NULL);
+ const htp_header_t *h = htp_tx_request_header_index(tx, 0);
FAIL_IF_NULL(h);
- FAIL_IF(strcmp(bstr_util_strdup_to_c(h->value), "Victor/1.0"));
- FAIL_IF(tx->request_method_number != HTP_M_POST);
- FAIL_IF(tx->request_protocol_number != HTP_PROTOCOL_1_0);
+ FAIL_IF(strcmp(bstr_util_strdup_to_c(htp_header_value(h)), "Victor/1.0"));
+ FAIL_IF(htp_tx_request_method_number(tx) != HTP_METHOD_POST);
+ FAIL_IF(htp_tx_request_protocol_number(tx) != HTP_PROTOCOL_V1_0);
AppLayerParserThreadCtxFree(alp_tctx);
StreamTcpFreeConfig(true);
@@ -3426,12 +3217,12 @@ static int HTPParserTest01c(void)
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
FAIL_IF_NULL(tx);
- htp_header_t *h = htp_table_get_index(tx->request_headers, 0, NULL);
+ const htp_header_t *h = htp_tx_request_header_index(tx, 0);
FAIL_IF_NULL(h);
- FAIL_IF(strcmp(bstr_util_strdup_to_c(h->value), "Victor/1.0"));
- FAIL_IF(tx->request_method_number != HTP_M_POST);
- FAIL_IF(tx->request_protocol_number != HTP_PROTOCOL_1_0);
+ FAIL_IF(strcmp(bstr_util_strdup_to_c(htp_header_value(h)), "Victor/1.0"));
+ FAIL_IF(htp_tx_request_method_number(tx) != HTP_METHOD_POST);
+ FAIL_IF(htp_tx_request_protocol_number(tx) != HTP_PROTOCOL_V1_0);
AppLayerParserThreadCtxFree(alp_tctx);
StreamTcpFreeConfig(true);
@@ -3490,16 +3281,16 @@ static int HTPParserTest01a(void)
}
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
- htp_header_t *h = htp_table_get_index(tx->request_headers, 0, NULL);
- if (strcmp(bstr_util_strdup_to_c(h->value), "Victor/1.0")
- || tx->request_method_number != HTP_M_POST ||
- tx->request_protocol_number != HTP_PROTOCOL_1_0)
- {
+ const htp_header_t *h = htp_tx_request_header_index(tx, 0);
+ if (strcmp(bstr_util_strdup_to_c(htp_header_value(h)), "Victor/1.0") ||
+ htp_tx_request_method_number(tx) != HTP_METHOD_POST ||
+ htp_tx_request_protocol_number(tx) != HTP_PROTOCOL_V1_0) {
printf("expected header value: Victor/1.0 and got %s: and expected"
- " method: POST and got %s, expected protocol number HTTP/1.0"
- " and got: %s \n", bstr_util_strdup_to_c(h->value),
- bstr_util_strdup_to_c(tx->request_method),
- bstr_util_strdup_to_c(tx->request_protocol));
+ " method: POST and got %s, expected protocol number HTTP/1.0"
+ " and got: %s \n",
+ bstr_util_strdup_to_c(htp_header_value(h)),
+ bstr_util_strdup_to_c(htp_tx_request_method(tx)),
+ bstr_util_strdup_to_c(htp_tx_request_protocol(tx)));
goto end;
}
result = 1;
@@ -3548,11 +3339,11 @@ static int HTPParserTest02(void)
htp_tx_t *tx = HTPStateGetTx(http_state, 0);
FAIL_IF_NULL(tx);
- htp_header_t *h = htp_table_get_index(tx->request_headers, 0, NULL);
+ const htp_header_t *h = htp_tx_request_header_index(tx, 0);
FAIL_IF_NOT_NULL(h);
- FAIL_IF_NULL(tx->request_method);
- char *method = bstr_util_strdup_to_c(tx->request_method);
+ FAIL_IF_NULL(htp_tx_request_method(tx));
+ char *method = bstr_util_strdup_to_c(htp_tx_request_method(tx));
FAIL_IF_NULL(method);
FAIL_IF(strcmp(method, "POST") != 0);
@@ -3614,13 +3405,13 @@ static int HTPParserTest03(void)
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
- htp_header_t *h = htp_table_get_index(tx->request_headers, 0, NULL);
- if (tx->request_method_number != HTP_M_UNKNOWN ||
- h != NULL || tx->request_protocol_number != HTP_PROTOCOL_1_0)
- {
+ const htp_header_t *h = htp_tx_request_header_index(tx, 0);
+ if (htp_tx_request_method_number(tx) != HTP_METHOD_UNKNOWN || h != NULL ||
+ htp_tx_request_protocol_number(tx) != HTP_PROTOCOL_V1_0) {
printf("expected method M_UNKNOWN and got %s: , expected protocol "
- "HTTP/1.0 and got %s \n", bstr_util_strdup_to_c(tx->request_method),
- bstr_util_strdup_to_c(tx->request_protocol));
+ "HTTP/1.0 and got %s \n",
+ bstr_util_strdup_to_c(htp_tx_request_method(tx)),
+ bstr_util_strdup_to_c(htp_tx_request_protocol(tx)));
goto end;
}
result = 1;
@@ -3669,13 +3460,13 @@ static int HTPParserTest04(void)
}
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
- htp_header_t *h = htp_table_get_index(tx->request_headers, 0, NULL);
- if (tx->request_method_number != HTP_M_UNKNOWN ||
- h != NULL || tx->request_protocol_number != HTP_PROTOCOL_0_9)
- {
+ const htp_header_t *h = htp_tx_request_header_index(tx, 0);
+ if (htp_tx_request_method_number(tx) != HTP_METHOD_UNKNOWN || h != NULL ||
+ htp_tx_request_protocol_number(tx) != HTP_PROTOCOL_V0_9) {
printf("expected method M_UNKNOWN and got %s: , expected protocol "
- "NULL and got %s \n", bstr_util_strdup_to_c(tx->request_method),
- bstr_util_strdup_to_c(tx->request_protocol));
+ "NULL and got %s \n",
+ bstr_util_strdup_to_c(htp_tx_request_method(tx)),
+ bstr_util_strdup_to_c(htp_tx_request_protocol(tx)));
goto end;
}
result = 1;
@@ -3746,13 +3537,13 @@ static int HTPParserTest05(void)
htp_tx_t *tx = HTPStateGetTx(http_state, 0);
FAIL_IF_NULL(tx);
- FAIL_IF_NOT(tx->request_method_number == HTP_M_POST);
- FAIL_IF_NOT(tx->request_protocol_number == HTP_PROTOCOL_1_0);
+ FAIL_IF_NOT(htp_tx_request_method_number(tx) == HTP_METHOD_POST);
+ FAIL_IF_NOT(htp_tx_request_protocol_number(tx) == HTP_PROTOCOL_V1_0);
- htp_header_t *h = htp_table_get_index(tx->request_headers, 0, NULL);
+ const htp_header_t *h = htp_tx_request_header_index(tx, 0);
FAIL_IF_NULL(h);
- FAIL_IF_NOT(tx->response_status_number == 200);
+ FAIL_IF_NOT(htp_tx_response_status_number(tx) == 200);
AppLayerParserThreadCtxFree(alp_tctx);
StreamTcpFreeConfig(true);
@@ -3834,13 +3625,13 @@ static int HTPParserTest06(void)
htp_tx_t *tx = HTPStateGetTx(http_state, 0);
FAIL_IF_NULL(tx);
- FAIL_IF(tx->request_method_number != HTP_M_GET);
- FAIL_IF(tx->request_protocol_number != HTP_PROTOCOL_1_1);
+ FAIL_IF(htp_tx_request_method_number(tx) != HTP_METHOD_GET);
+ FAIL_IF(htp_tx_request_protocol_number(tx) != HTP_PROTOCOL_V1_1);
- FAIL_IF(tx->response_status_number != 200);
- FAIL_IF(tx->request_protocol_number != HTP_PROTOCOL_1_1);
+ FAIL_IF(htp_tx_response_status_number(tx) != 200);
+ FAIL_IF(htp_tx_request_protocol_number(tx) != HTP_PROTOCOL_V1_1);
- htp_header_t *h = htp_table_get_index(tx->request_headers, 0, NULL);
+ const htp_header_t *h = htp_tx_request_header_index(tx, 0);
FAIL_IF_NULL(h);
AppLayerParserThreadCtxFree(alp_tctx);
@@ -3904,20 +3695,18 @@ static int HTPParserTest07(void)
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
if (tx == NULL)
goto end;
- HtpTxUserData *tx_ud = (HtpTxUserData *) htp_tx_get_user_data(tx);
- if (tx_ud != NULL && tx_ud->request_uri_normalized != NULL) {
- if (reflen != bstr_len(tx_ud->request_uri_normalized)) {
- printf("normalized uri len should be %"PRIuMAX", is %"PRIuMAX,
- (uintmax_t)reflen,
- (uintmax_t)bstr_len(tx_ud->request_uri_normalized));
+ bstr *request_uri_normalized = (bstr *)htp_tx_normalized_uri(tx);
+ if (request_uri_normalized != NULL) {
+ if (reflen != bstr_len(request_uri_normalized)) {
+ printf("normalized uri len should be %" PRIuMAX ", is %" PRIuMAX, (uintmax_t)reflen,
+ (uintmax_t)bstr_len(request_uri_normalized));
goto end;
}
- if (memcmp(bstr_ptr(tx_ud->request_uri_normalized), ref,
- bstr_len(tx_ud->request_uri_normalized)) != 0)
- {
+ if (memcmp(bstr_ptr(request_uri_normalized), ref, bstr_len(request_uri_normalized)) != 0) {
printf("normalized uri \"");
- PrintRawUriFp(stdout, bstr_ptr(tx_ud->request_uri_normalized), bstr_len(tx_ud->request_uri_normalized));
+ PrintRawUriFp(
+ stdout, bstr_ptr(request_uri_normalized), bstr_len(request_uri_normalized));
printf("\" != \"");
PrintRawUriFp(stdout, ref, reflen);
printf("\": ");
@@ -3997,11 +3786,10 @@ libhtp:\n\
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
if (tx == NULL)
goto end;
- HtpTxUserData *tx_ud = (HtpTxUserData *) htp_tx_get_user_data(tx);
- if (tx_ud != NULL && tx_ud->request_uri_normalized != NULL) {
- //printf("uri %s\n", bstr_util_strdup_to_c(tx->request_uri_normalized));
- PrintRawDataFp(stdout, bstr_ptr(tx_ud->request_uri_normalized),
- bstr_len(tx_ud->request_uri_normalized));
+ bstr *request_uri_normalized = (bstr *)htp_tx_normalized_uri(tx);
+ if (request_uri_normalized != NULL) {
+ // printf("uri %s\n", bstr_util_strdup_to_c(htp_tx_request_uri_normalized(tx)));
+ PrintRawDataFp(stdout, bstr_ptr(request_uri_normalized), bstr_len(request_uri_normalized));
}
result = 1;
@@ -4077,11 +3865,10 @@ libhtp:\n\
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
if (tx == NULL)
goto end;
- HtpTxUserData *tx_ud = (HtpTxUserData *) htp_tx_get_user_data(tx);
- if (tx_ud != NULL && tx_ud->request_uri_normalized != NULL) {
- //printf("uri %s\n", bstr_util_strdup_to_c(tx->request_uri_normalized));
- PrintRawDataFp(stdout, bstr_ptr(tx_ud->request_uri_normalized),
- bstr_len(tx_ud->request_uri_normalized));
+ bstr *request_uri_normalized = (bstr *)htp_tx_normalized_uri(tx);
+ if (request_uri_normalized != NULL) {
+ // printf("uri %s\n", bstr_util_strdup_to_c(htp_tx_request_uri_normalized(tx)));
+ PrintRawDataFp(stdout, bstr_ptr(request_uri_normalized), bstr_len(request_uri_normalized));
}
result = 1;
@@ -4147,34 +3934,20 @@ static int HTPParserTest10(void)
}
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
- htp_header_t *h = htp_table_get_index(tx->request_headers, 0, NULL);
- if (h == NULL) {
- goto end;
- }
-
- char *name = bstr_util_strdup_to_c(h->name);
- if (name == NULL) {
- goto end;
- }
+ const htp_header_t *h = htp_tx_request_header_index(tx, 0);
- if (strcmp(name, "Host") != 0) {
+ if (bstr_cmp_c(htp_header_name(h), "Host") != 0) {
+ char *name = bstr_util_strdup_to_c(htp_header_name(h));
printf("header name not \"Host\", instead \"%s\": ", name);
free(name);
goto end;
}
- free(name);
-
- char *value = bstr_util_strdup_to_c(h->value);
- if (value == NULL) {
- goto end;
- }
-
- if (strcmp(value, "www.google.com") != 0) {
+ if (bstr_cmp_c(htp_header_value(h), "www.google.com") != 0) {
+ char *value = bstr_util_strdup_to_c(htp_header_value(h));
printf("header value not \"www.google.com\", instead \"%s\": ", value);
free(value);
goto end;
}
- free(value);
result = 1;
end:
@@ -4237,21 +4010,21 @@ static int HTPParserTest11(void)
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
if (tx == NULL)
goto end;
- HtpTxUserData *tx_ud = (HtpTxUserData *)htp_tx_get_user_data(tx);
- if (tx != NULL && tx_ud != NULL && tx_ud->request_uri_normalized != NULL) {
- if (4 != bstr_len(tx_ud->request_uri_normalized)) {
- printf("normalized uri len should be 2, is %"PRIuMAX,
- (uintmax_t)bstr_len(tx_ud->request_uri_normalized));
+ bstr *request_uri_normalized = (bstr *)htp_tx_normalized_uri(tx);
+ if (request_uri_normalized != NULL) {
+ if (4 != bstr_len(request_uri_normalized)) {
+ printf("normalized uri len should be 2, is %" PRIuMAX,
+ (uintmax_t)bstr_len(request_uri_normalized));
goto end;
}
- if (bstr_ptr(tx_ud->request_uri_normalized)[0] != '/' ||
- bstr_ptr(tx_ud->request_uri_normalized)[1] != '%' ||
- bstr_ptr(tx_ud->request_uri_normalized)[2] != '0' ||
- bstr_ptr(tx_ud->request_uri_normalized)[3] != '0')
- {
+ if (bstr_ptr(request_uri_normalized)[0] != '/' ||
+ bstr_ptr(request_uri_normalized)[1] != '%' ||
+ bstr_ptr(request_uri_normalized)[2] != '0' ||
+ bstr_ptr(request_uri_normalized)[3] != '0') {
printf("normalized uri \"");
- PrintRawUriFp(stdout, bstr_ptr(tx_ud->request_uri_normalized), bstr_len(tx_ud->request_uri_normalized));
+ PrintRawUriFp(
+ stdout, bstr_ptr(request_uri_normalized), bstr_len(request_uri_normalized));
printf("\": ");
goto end;
}
@@ -4318,24 +4091,24 @@ static int HTPParserTest12(void)
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
if (tx == NULL)
goto end;
- HtpTxUserData *tx_ud = (HtpTxUserData *) htp_tx_get_user_data(tx);
- if (tx_ud != NULL && tx_ud->request_uri_normalized != NULL) {
- if (7 != bstr_len(tx_ud->request_uri_normalized)) {
- printf("normalized uri len should be 5, is %"PRIuMAX,
- (uintmax_t)bstr_len(tx_ud->request_uri_normalized));
+ bstr *request_uri_normalized = (bstr *)htp_tx_normalized_uri(tx);
+ if (request_uri_normalized != NULL) {
+ if (7 != bstr_len(request_uri_normalized)) {
+ printf("normalized uri len should be 5, is %" PRIuMAX,
+ (uintmax_t)bstr_len(request_uri_normalized));
goto end;
}
- if (bstr_ptr(tx_ud->request_uri_normalized)[0] != '/' ||
- bstr_ptr(tx_ud->request_uri_normalized)[1] != '?' ||
- bstr_ptr(tx_ud->request_uri_normalized)[2] != 'a' ||
- bstr_ptr(tx_ud->request_uri_normalized)[3] != '=' ||
- bstr_ptr(tx_ud->request_uri_normalized)[4] != '%' ||
- bstr_ptr(tx_ud->request_uri_normalized)[5] != '0' ||
- bstr_ptr(tx_ud->request_uri_normalized)[6] != '0')
- {
+ if (bstr_ptr(request_uri_normalized)[0] != '/' ||
+ bstr_ptr(request_uri_normalized)[1] != '?' ||
+ bstr_ptr(request_uri_normalized)[2] != 'a' ||
+ bstr_ptr(request_uri_normalized)[3] != '=' ||
+ bstr_ptr(request_uri_normalized)[4] != '%' ||
+ bstr_ptr(request_uri_normalized)[5] != '0' ||
+ bstr_ptr(request_uri_normalized)[6] != '0') {
printf("normalized uri \"");
- PrintRawUriFp(stdout, bstr_ptr(tx_ud->request_uri_normalized), bstr_len(tx_ud->request_uri_normalized));
+ PrintRawUriFp(
+ stdout, bstr_ptr(request_uri_normalized), bstr_len(request_uri_normalized));
printf("\": ");
goto end;
}
@@ -4400,12 +4173,12 @@ static int HTPParserTest13(void)
}
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
- htp_header_t *h = htp_table_get_index(tx->request_headers, 0, NULL);
+ const htp_header_t *h = htp_tx_request_header_index(tx, 0);
if (h == NULL) {
goto end;
}
- char *name = bstr_util_strdup_to_c(h->name);
+ char *name = bstr_util_strdup_to_c(htp_header_name(h));
if (name == NULL) {
goto end;
}
@@ -4417,7 +4190,7 @@ static int HTPParserTest13(void)
}
free(name);
- char *value = bstr_util_strdup_to_c(h->value);
+ char *value = bstr_util_strdup_to_c(htp_header_value(h));
if (value == NULL) {
goto end;
}
@@ -4816,17 +4589,17 @@ libhtp:\n\
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
if (tx == NULL)
goto end;
- if (tx->cfg != htp) {
- printf("wrong HTP config (%p instead of %p - default=%p): ",
- tx->cfg, htp, cfglist.cfg);
+ if (htp_tx_cfg(tx) != htp) {
+ printf("wrong HTP config (%p instead of %p - default=%p): ", htp_tx_cfg(tx), htp,
+ cfglist.cfg);
goto end;
}
tx = HTPStateGetTx(htp_state, 1);
if (tx == NULL)
goto end;
- if (tx->cfg != htp) {
- printf("wrong HTP config (%p instead of %p - default=%p): ",
- tx->cfg, htp, cfglist.cfg);
+ if (htp_tx_cfg(tx) != htp) {
+ printf("wrong HTP config (%p instead of %p - default=%p): ", htp_tx_cfg(tx), htp,
+ cfglist.cfg);
goto end;
}
@@ -4978,37 +4751,37 @@ libhtp:\n\
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
FAIL_IF_NULL(tx);
- HtpTxUserData *tx_ud = (HtpTxUserData *)htp_tx_get_user_data(tx);
+ HtpTxUserData *tx_ud = (HtpTxUserData *)htp_tx_user_data(tx);
+ bstr *request_uri_normalized = (bstr *)htp_tx_normalized_uri(tx);
FAIL_IF_NULL(tx_ud);
- FAIL_IF_NULL(tx_ud->request_uri_normalized);
- FAIL_IF(reflen != bstr_len(tx_ud->request_uri_normalized));
- FAIL_IF(memcmp(bstr_ptr(tx_ud->request_uri_normalized), ref1,
- bstr_len(tx_ud->request_uri_normalized)) != 0);
+ FAIL_IF_NULL(request_uri_normalized);
+ FAIL_IF(reflen != bstr_len(request_uri_normalized));
+ FAIL_IF(memcmp(bstr_ptr(request_uri_normalized), ref1, bstr_len(request_uri_normalized)) != 0);
uint8_t ref2[] = "/abc/def?ghi/jkl";
reflen = sizeof(ref2) - 1;
tx = HTPStateGetTx(htp_state, 1);
FAIL_IF_NULL(tx);
- tx_ud = (HtpTxUserData *)htp_tx_get_user_data(tx);
- FAIL_IF_NULL(tx_ud);
- FAIL_IF_NULL(tx_ud->request_uri_normalized);
- FAIL_IF(reflen != bstr_len(tx_ud->request_uri_normalized));
- FAIL_IF(memcmp(bstr_ptr(tx_ud->request_uri_normalized), ref2,
- bstr_len(tx_ud->request_uri_normalized)) != 0);
+ tx_ud = (HtpTxUserData *)htp_tx_user_data(tx);
+ request_uri_normalized = (bstr *)htp_tx_normalized_uri(tx);
+ FAIL_IF_NULL(tx_ud);
+ FAIL_IF_NULL(request_uri_normalized);
+ FAIL_IF(reflen != bstr_len(request_uri_normalized));
+ FAIL_IF(memcmp(bstr_ptr(request_uri_normalized), ref2, bstr_len(request_uri_normalized)) != 0);
uint8_t ref3[] = "/abc/def?ghi%2fjkl";
reflen = sizeof(ref3) - 1;
tx = HTPStateGetTx(htp_state, 2);
FAIL_IF_NULL(tx);
- tx_ud = (HtpTxUserData *) htp_tx_get_user_data(tx);
- FAIL_IF_NULL(tx_ud);
- FAIL_IF_NULL(tx_ud->request_uri_normalized);
- FAIL_IF(reflen != bstr_len(tx_ud->request_uri_normalized));
- FAIL_IF(memcmp(bstr_ptr(tx_ud->request_uri_normalized), ref3,
- bstr_len(tx_ud->request_uri_normalized)) != 0);
+ tx_ud = (HtpTxUserData *)htp_tx_user_data(tx);
+ request_uri_normalized = (bstr *)htp_tx_normalized_uri(tx);
+ FAIL_IF_NULL(tx_ud);
+ FAIL_IF_NULL(request_uri_normalized);
+ FAIL_IF(reflen != bstr_len(request_uri_normalized));
+ FAIL_IF(memcmp(bstr_ptr(request_uri_normalized), ref3, bstr_len(request_uri_normalized)) != 0);
AppLayerParserThreadCtxFree(alp_tctx);
HTPFreeConfig();
@@ -5069,37 +4842,37 @@ libhtp:\n\
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
FAIL_IF_NULL(tx);
- HtpTxUserData *tx_ud = (HtpTxUserData *)htp_tx_get_user_data(tx);
+ HtpTxUserData *tx_ud = (HtpTxUserData *)htp_tx_user_data(tx);
+ bstr *request_uri_normalized = (bstr *)htp_tx_normalized_uri(tx);
FAIL_IF_NULL(tx_ud);
- FAIL_IF_NULL(tx_ud->request_uri_normalized);
- FAIL_IF(reflen != bstr_len(tx_ud->request_uri_normalized));
- FAIL_IF(memcmp(bstr_ptr(tx_ud->request_uri_normalized), ref1,
- bstr_len(tx_ud->request_uri_normalized)) != 0);
+ FAIL_IF_NULL(request_uri_normalized);
+ FAIL_IF(reflen != bstr_len(request_uri_normalized));
+ FAIL_IF(memcmp(bstr_ptr(request_uri_normalized), ref1, bstr_len(request_uri_normalized)) != 0);
uint8_t ref2[] = "/abc/def?ghi/jkl";
reflen = sizeof(ref2) - 1;
tx = HTPStateGetTx(htp_state, 1);
FAIL_IF_NULL(tx);
- tx_ud = (HtpTxUserData *)htp_tx_get_user_data(tx);
+ tx_ud = (HtpTxUserData *)htp_tx_user_data(tx);
+ request_uri_normalized = (bstr *)htp_tx_normalized_uri(tx);
FAIL_IF_NULL(tx_ud);
- FAIL_IF_NULL(tx_ud->request_uri_normalized);
- FAIL_IF(reflen != bstr_len(tx_ud->request_uri_normalized));
+ FAIL_IF_NULL(request_uri_normalized);
+ FAIL_IF(reflen != bstr_len(request_uri_normalized));
- FAIL_IF(memcmp(bstr_ptr(tx_ud->request_uri_normalized), ref2,
- bstr_len(tx_ud->request_uri_normalized)) != 0);
+ FAIL_IF(memcmp(bstr_ptr(request_uri_normalized), ref2, bstr_len(request_uri_normalized)) != 0);
uint8_t ref3[] = "/abc/def?ghi%2fjkl";
reflen = sizeof(ref3) - 1;
tx = HTPStateGetTx(htp_state, 2);
FAIL_IF_NULL(tx);
- tx_ud = (HtpTxUserData *)htp_tx_get_user_data(tx);
+ tx_ud = (HtpTxUserData *)htp_tx_user_data(tx);
+ request_uri_normalized = (bstr *)htp_tx_normalized_uri(tx);
FAIL_IF_NULL(tx_ud);
- FAIL_IF_NULL(tx_ud->request_uri_normalized);
- FAIL_IF(reflen != bstr_len(tx_ud->request_uri_normalized));
+ FAIL_IF_NULL(request_uri_normalized);
+ FAIL_IF(reflen != bstr_len(request_uri_normalized));
- FAIL_IF(memcmp(bstr_ptr(tx_ud->request_uri_normalized), ref3,
- bstr_len(tx_ud->request_uri_normalized)) != 0);
+ FAIL_IF(memcmp(bstr_ptr(request_uri_normalized), ref3, bstr_len(request_uri_normalized)) != 0);
AppLayerParserThreadCtxFree(alp_tctx);
HTPFreeConfig();
@@ -5188,20 +4961,18 @@ libhtp:\n\
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
if (tx == NULL)
goto end;
- HtpTxUserData *tx_ud = (HtpTxUserData *)htp_tx_get_user_data(tx);
- if (tx_ud != NULL && tx_ud->request_uri_normalized != NULL) {
- if (reflen != bstr_len(tx_ud->request_uri_normalized)) {
- printf("normalized uri len should be %"PRIuMAX", is %"PRIuMAX,
- (uintmax_t)reflen,
- (uintmax_t)bstr_len(tx_ud->request_uri_normalized));
+ bstr *request_uri_normalized = (bstr *)htp_tx_normalized_uri(tx);
+ if (request_uri_normalized != NULL) {
+ if (reflen != bstr_len(request_uri_normalized)) {
+ printf("normalized uri len should be %" PRIuMAX ", is %" PRIuMAX, (uintmax_t)reflen,
+ (uintmax_t)bstr_len(request_uri_normalized));
goto end;
}
- if (memcmp(bstr_ptr(tx_ud->request_uri_normalized), ref1,
- bstr_len(tx_ud->request_uri_normalized)) != 0)
- {
+ if (memcmp(bstr_ptr(request_uri_normalized), ref1, bstr_len(request_uri_normalized)) != 0) {
printf("normalized uri \"");
- PrintRawUriFp(stdout, bstr_ptr(tx_ud->request_uri_normalized), bstr_len(tx_ud->request_uri_normalized));
+ PrintRawUriFp(
+ stdout, bstr_ptr(request_uri_normalized), bstr_len(request_uri_normalized));
printf("\" != \"");
PrintRawUriFp(stdout, ref1, reflen);
printf("\": ");
@@ -5215,20 +4986,18 @@ libhtp:\n\
tx = HTPStateGetTx(htp_state, 1);
if (tx == NULL)
goto end;
- tx_ud = (HtpTxUserData *)htp_tx_get_user_data(tx);
- if (tx_ud != NULL && tx_ud->request_uri_normalized != NULL) {
- if (reflen != bstr_len(tx_ud->request_uri_normalized)) {
- printf("normalized uri len should be %"PRIuMAX", is %"PRIuMAX,
- (uintmax_t)reflen,
- (uintmax_t)bstr_len(tx_ud->request_uri_normalized));
+ request_uri_normalized = (bstr *)htp_tx_normalized_uri(tx);
+ if (request_uri_normalized != NULL) {
+ if (reflen != bstr_len(request_uri_normalized)) {
+ printf("normalized uri len should be %" PRIuMAX ", is %" PRIuMAX, (uintmax_t)reflen,
+ (uintmax_t)bstr_len(request_uri_normalized));
goto end;
}
- if (memcmp(bstr_ptr(tx_ud->request_uri_normalized), ref2,
- bstr_len(tx_ud->request_uri_normalized)) != 0)
- {
+ if (memcmp(bstr_ptr(request_uri_normalized), ref2, bstr_len(request_uri_normalized)) != 0) {
printf("normalized uri \"");
- PrintRawUriFp(stdout, bstr_ptr(tx_ud->request_uri_normalized), bstr_len(tx_ud->request_uri_normalized));
+ PrintRawUriFp(
+ stdout, bstr_ptr(request_uri_normalized), bstr_len(request_uri_normalized));
printf("\" != \"");
PrintRawUriFp(stdout, ref2, reflen);
printf("\": ");
@@ -5241,20 +5010,18 @@ libhtp:\n\
tx = HTPStateGetTx(htp_state, 2);
if (tx == NULL)
goto end;
- tx_ud = (HtpTxUserData *) htp_tx_get_user_data(tx);
- if (tx_ud != NULL && tx_ud->request_uri_normalized != NULL) {
- if (reflen != bstr_len(tx_ud->request_uri_normalized)) {
- printf("normalized uri len should be %"PRIuMAX", is %"PRIuMAX" (3): ",
- (uintmax_t)reflen,
- (uintmax_t)bstr_len(tx_ud->request_uri_normalized));
+ request_uri_normalized = (bstr *)htp_tx_normalized_uri(tx);
+ if (request_uri_normalized != NULL) {
+ if (reflen != bstr_len(request_uri_normalized)) {
+ printf("normalized uri len should be %" PRIuMAX ", is %" PRIuMAX " (3): ",
+ (uintmax_t)reflen, (uintmax_t)bstr_len(request_uri_normalized));
goto end;
}
- if (memcmp(bstr_ptr(tx_ud->request_uri_normalized), ref3,
- bstr_len(tx_ud->request_uri_normalized)) != 0)
- {
+ if (memcmp(bstr_ptr(request_uri_normalized), ref3, bstr_len(request_uri_normalized)) != 0) {
printf("normalized uri \"");
- PrintRawUriFp(stdout, bstr_ptr(tx_ud->request_uri_normalized), bstr_len(tx_ud->request_uri_normalized));
+ PrintRawUriFp(
+ stdout, bstr_ptr(request_uri_normalized), bstr_len(request_uri_normalized));
printf("\" != \"");
PrintRawUriFp(stdout, ref3, reflen);
printf("\": ");
@@ -5351,20 +5118,18 @@ libhtp:\n\
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
if (tx == NULL)
goto end;
- HtpTxUserData *tx_ud = (HtpTxUserData *) htp_tx_get_user_data(tx);
- if (tx_ud != NULL && tx_ud->request_uri_normalized != NULL) {
- if (reflen != bstr_len(tx_ud->request_uri_normalized)) {
- printf("normalized uri len should be %"PRIuMAX", is %"PRIuMAX,
- (uintmax_t)reflen,
- (uintmax_t)bstr_len(tx_ud->request_uri_normalized));
+ bstr *request_uri_normalized = (bstr *)htp_tx_normalized_uri(tx);
+ if (request_uri_normalized != NULL) {
+ if (reflen != bstr_len(request_uri_normalized)) {
+ printf("normalized uri len should be %" PRIuMAX ", is %" PRIuMAX, (uintmax_t)reflen,
+ (uintmax_t)bstr_len(request_uri_normalized));
goto end;
}
- if (memcmp(bstr_ptr(tx_ud->request_uri_normalized), ref1,
- bstr_len(tx_ud->request_uri_normalized)) != 0)
- {
+ if (memcmp(bstr_ptr(request_uri_normalized), ref1, bstr_len(request_uri_normalized)) != 0) {
printf("normalized uri \"");
- PrintRawUriFp(stdout, bstr_ptr(tx_ud->request_uri_normalized), bstr_len(tx_ud->request_uri_normalized));
+ PrintRawUriFp(
+ stdout, bstr_ptr(request_uri_normalized), bstr_len(request_uri_normalized));
printf("\" != \"");
PrintRawUriFp(stdout, ref1, reflen);
printf("\": ");
@@ -5378,20 +5143,18 @@ libhtp:\n\
tx = HTPStateGetTx(htp_state, 1);
if (tx == NULL)
goto end;
- tx_ud = (HtpTxUserData *)htp_tx_get_user_data(tx);
- if (tx_ud != NULL && tx_ud->request_uri_normalized != NULL) {
- if (reflen != bstr_len(tx_ud->request_uri_normalized)) {
- printf("normalized uri len should be %"PRIuMAX", is %"PRIuMAX,
- (uintmax_t)reflen,
- (uintmax_t)bstr_len(tx_ud->request_uri_normalized));
+ request_uri_normalized = (bstr *)htp_tx_normalized_uri(tx);
+ if (request_uri_normalized != NULL) {
+ if (reflen != bstr_len(request_uri_normalized)) {
+ printf("normalized uri len should be %" PRIuMAX ", is %" PRIuMAX, (uintmax_t)reflen,
+ (uintmax_t)bstr_len(request_uri_normalized));
goto end;
}
- if (memcmp(bstr_ptr(tx_ud->request_uri_normalized), ref2,
- bstr_len(tx_ud->request_uri_normalized)) != 0)
- {
+ if (memcmp(bstr_ptr(request_uri_normalized), ref2, bstr_len(request_uri_normalized)) != 0) {
printf("normalized uri \"");
- PrintRawUriFp(stdout, bstr_ptr(tx_ud->request_uri_normalized), bstr_len(tx_ud->request_uri_normalized));
+ PrintRawUriFp(
+ stdout, bstr_ptr(request_uri_normalized), bstr_len(request_uri_normalized));
printf("\" != \"");
PrintRawUriFp(stdout, ref2, reflen);
printf("\": ");
@@ -5484,20 +5247,18 @@ libhtp:\n\
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
if (tx == NULL)
goto end;
- HtpTxUserData *tx_ud = (HtpTxUserData *) htp_tx_get_user_data(tx);
- if (tx_ud != NULL && tx_ud->request_uri_normalized != NULL) {
- if (reflen != bstr_len(tx_ud->request_uri_normalized)) {
- printf("normalized uri len should be %"PRIuMAX", is %"PRIuMAX,
- (uintmax_t)reflen,
- (uintmax_t)bstr_len(tx_ud->request_uri_normalized));
+ bstr *request_uri_normalized = (bstr *)htp_tx_normalized_uri(tx);
+ if (request_uri_normalized != NULL) {
+ if (reflen != bstr_len(request_uri_normalized)) {
+ printf("normalized uri len should be %" PRIuMAX ", is %" PRIuMAX, (uintmax_t)reflen,
+ (uintmax_t)bstr_len(request_uri_normalized));
goto end;
}
- if (memcmp(bstr_ptr(tx_ud->request_uri_normalized), ref1,
- bstr_len(tx_ud->request_uri_normalized)) != 0)
- {
+ if (memcmp(bstr_ptr(request_uri_normalized), ref1, bstr_len(request_uri_normalized)) != 0) {
printf("normalized uri \"");
- PrintRawUriFp(stdout, bstr_ptr(tx_ud->request_uri_normalized), bstr_len(tx_ud->request_uri_normalized));
+ PrintRawUriFp(
+ stdout, bstr_ptr(request_uri_normalized), bstr_len(request_uri_normalized));
printf("\" != \"");
PrintRawUriFp(stdout, ref1, reflen);
printf("\": ");
@@ -5590,20 +5351,18 @@ libhtp:\n\
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
if (tx == NULL)
goto end;
- HtpTxUserData *tx_ud = (HtpTxUserData *) htp_tx_get_user_data(tx);
- if (tx_ud != NULL && tx_ud->request_uri_normalized != NULL) {
- if (reflen != bstr_len(tx_ud->request_uri_normalized)) {
- printf("normalized uri len should be %"PRIuMAX", is %"PRIuMAX,
- (uintmax_t)reflen,
- (uintmax_t)bstr_len(tx_ud->request_uri_normalized));
+ bstr *request_uri_normalized = (bstr *)htp_tx_normalized_uri(tx);
+ if (request_uri_normalized != NULL) {
+ if (reflen != bstr_len(request_uri_normalized)) {
+ printf("normalized uri len should be %" PRIuMAX ", is %" PRIuMAX, (uintmax_t)reflen,
+ (uintmax_t)bstr_len(request_uri_normalized));
goto end;
}
- if (memcmp(bstr_ptr(tx_ud->request_uri_normalized), ref1,
- bstr_len(tx_ud->request_uri_normalized)) != 0)
- {
+ if (memcmp(bstr_ptr(request_uri_normalized), ref1, bstr_len(request_uri_normalized)) != 0) {
printf("normalized uri \"");
- PrintRawUriFp(stdout, bstr_ptr(tx_ud->request_uri_normalized), bstr_len(tx_ud->request_uri_normalized));
+ PrintRawUriFp(
+ stdout, bstr_ptr(request_uri_normalized), bstr_len(request_uri_normalized));
printf("\" != \"");
PrintRawUriFp(stdout, ref1, reflen);
printf("\": ");
@@ -5696,20 +5455,18 @@ libhtp:\n\
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
if (tx == NULL)
goto end;
- HtpTxUserData *tx_ud = (HtpTxUserData *) htp_tx_get_user_data(tx);
- if (tx_ud != NULL && tx_ud->request_uri_normalized != NULL) {
- if (reflen != bstr_len(tx_ud->request_uri_normalized)) {
- printf("normalized uri len should be %"PRIuMAX", is %"PRIuMAX,
- (uintmax_t)reflen,
- (uintmax_t)bstr_len(tx_ud->request_uri_normalized));
+ bstr *request_uri_normalized = (bstr *)htp_tx_normalized_uri(tx);
+ if (request_uri_normalized != NULL) {
+ if (reflen != bstr_len(request_uri_normalized)) {
+ printf("normalized uri len should be %" PRIuMAX ", is %" PRIuMAX, (uintmax_t)reflen,
+ (uintmax_t)bstr_len(request_uri_normalized));
goto end;
}
- if (memcmp(bstr_ptr(tx_ud->request_uri_normalized), ref1,
- bstr_len(tx_ud->request_uri_normalized)) != 0)
- {
+ if (memcmp(bstr_ptr(request_uri_normalized), ref1, bstr_len(request_uri_normalized)) != 0) {
printf("normalized uri \"");
- PrintRawUriFp(stdout, bstr_ptr(tx_ud->request_uri_normalized), bstr_len(tx_ud->request_uri_normalized));
+ PrintRawUriFp(
+ stdout, bstr_ptr(request_uri_normalized), bstr_len(request_uri_normalized));
printf("\" != \"");
PrintRawUriFp(stdout, ref1, reflen);
printf("\": ");
@@ -5803,20 +5560,18 @@ libhtp:\n\
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
if (tx == NULL)
goto end;
- HtpTxUserData *tx_ud = (HtpTxUserData *) htp_tx_get_user_data(tx);
- if (tx_ud != NULL && tx_ud->request_uri_normalized != NULL) {
- if (reflen != bstr_len(tx_ud->request_uri_normalized)) {
- printf("normalized uri len should be %"PRIuMAX", is %"PRIuMAX,
- (uintmax_t)reflen,
- (uintmax_t)bstr_len(tx_ud->request_uri_normalized));
+ bstr *request_uri_normalized = (bstr *)htp_tx_normalized_uri(tx);
+ if (request_uri_normalized != NULL) {
+ if (reflen != bstr_len(request_uri_normalized)) {
+ printf("normalized uri len should be %" PRIuMAX ", is %" PRIuMAX, (uintmax_t)reflen,
+ (uintmax_t)bstr_len(request_uri_normalized));
goto end;
}
- if (memcmp(bstr_ptr(tx_ud->request_uri_normalized), ref1,
- bstr_len(tx_ud->request_uri_normalized)) != 0)
- {
+ if (memcmp(bstr_ptr(request_uri_normalized), ref1, bstr_len(request_uri_normalized)) != 0) {
printf("normalized uri \"");
- PrintRawUriFp(stdout, bstr_ptr(tx_ud->request_uri_normalized), bstr_len(tx_ud->request_uri_normalized));
+ PrintRawUriFp(
+ stdout, bstr_ptr(request_uri_normalized), bstr_len(request_uri_normalized));
printf("\" != \"");
PrintRawUriFp(stdout, ref1, reflen);
printf("\": ");
@@ -5907,20 +5662,18 @@ libhtp:\n\
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
if (tx == NULL)
goto end;
- HtpTxUserData *tx_ud = (HtpTxUserData *) htp_tx_get_user_data(tx);
- if (tx_ud != NULL && tx_ud->request_uri_normalized != NULL) {
- if (reflen != bstr_len(tx_ud->request_uri_normalized)) {
- printf("normalized uri len should be %"PRIuMAX", is %"PRIuMAX,
- (uintmax_t)reflen,
- (uintmax_t)bstr_len(tx_ud->request_uri_normalized));
+ bstr *request_uri_normalized = (bstr *)htp_tx_normalized_uri(tx);
+ if (request_uri_normalized != NULL) {
+ if (reflen != bstr_len(request_uri_normalized)) {
+ printf("normalized uri len should be %" PRIuMAX ", is %" PRIuMAX, (uintmax_t)reflen,
+ (uintmax_t)bstr_len(request_uri_normalized));
goto end;
}
- if (memcmp(bstr_ptr(tx_ud->request_uri_normalized), ref1,
- bstr_len(tx_ud->request_uri_normalized)) != 0)
- {
+ if (memcmp(bstr_ptr(request_uri_normalized), ref1, bstr_len(request_uri_normalized)) != 0) {
printf("normalized uri \"");
- PrintRawUriFp(stdout, bstr_ptr(tx_ud->request_uri_normalized), bstr_len(tx_ud->request_uri_normalized));
+ PrintRawUriFp(
+ stdout, bstr_ptr(request_uri_normalized), bstr_len(request_uri_normalized));
printf("\" != \"");
PrintRawUriFp(stdout, ref1, reflen);
printf("\": ");
@@ -6012,20 +5765,18 @@ libhtp:\n\
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
if (tx == NULL)
goto end;
- HtpTxUserData *tx_ud = (HtpTxUserData *) htp_tx_get_user_data(tx);
- if (tx_ud != NULL && tx_ud->request_uri_normalized != NULL) {
- if (reflen != bstr_len(tx_ud->request_uri_normalized)) {
- printf("normalized uri len should be %"PRIuMAX", is %"PRIuMAX,
- (uintmax_t)reflen,
- (uintmax_t)bstr_len(tx_ud->request_uri_normalized));
+ bstr *request_uri_normalized = (bstr *)htp_tx_normalized_uri(tx);
+ if (request_uri_normalized != NULL) {
+ if (reflen != bstr_len(request_uri_normalized)) {
+ printf("normalized uri len should be %" PRIuMAX ", is %" PRIuMAX, (uintmax_t)reflen,
+ (uintmax_t)bstr_len(request_uri_normalized));
goto end;
}
- if (memcmp(bstr_ptr(tx_ud->request_uri_normalized), ref1,
- bstr_len(tx_ud->request_uri_normalized)) != 0)
- {
+ if (memcmp(bstr_ptr(request_uri_normalized), ref1, bstr_len(request_uri_normalized)) != 0) {
printf("normalized uri \"");
- PrintRawUriFp(stdout, bstr_ptr(tx_ud->request_uri_normalized), bstr_len(tx_ud->request_uri_normalized));
+ PrintRawUriFp(
+ stdout, bstr_ptr(request_uri_normalized), bstr_len(request_uri_normalized));
printf("\" != \"");
PrintRawUriFp(stdout, ref1, reflen);
printf("\": ");
@@ -6059,8 +5810,12 @@ static int HTPBodyReassemblyTest01(void)
Flow flow;
memset(&flow, 0x00, sizeof(flow));
AppLayerParserState *parser = AppLayerParserStateAlloc();
- htp_tx_t tx;
- memset(&tx, 0, sizeof(tx));
+ htp_cfg_t *cfg = htp_config_create();
+ BUG_ON(cfg == NULL);
+ htp_connp_t *connp = htp_connp_create(cfg);
+ BUG_ON(connp == NULL);
+ const htp_tx_t *tx = htp_connp_get_request_tx(connp);
+ BUG_ON(tx == NULL);
hstate.f = &flow;
flow.alparser = parser;
@@ -6097,6 +5852,10 @@ static int HTPBodyReassemblyTest01(void)
result = 1;
end:
+ htp_tx_destroy(connp, tx);
+ htp_connp_destroy_all(connp);
+ htp_config_destroy(cfg);
+
return result;
}
@@ -6253,15 +6012,15 @@ libhtp:\n\
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
FAIL_IF_NULL(tx);
- FAIL_IF(tx->request_method_number != HTP_M_GET);
- FAIL_IF(tx->request_protocol_number != HTP_PROTOCOL_1_1);
+ FAIL_IF(htp_tx_request_method_number(tx) != HTP_METHOD_GET);
+ FAIL_IF(htp_tx_request_protocol_number(tx) != HTP_PROTOCOL_V1_1);
void *txtmp = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, f->alstate, 0);
AppLayerDecoderEvents *decoder_events =
AppLayerParserGetEventsByTx(IPPROTO_TCP, ALPROTO_HTTP1, txtmp);
FAIL_IF_NULL(decoder_events);
- FAIL_IF(decoder_events->events[0] != HTTP_DECODER_EVENT_REQUEST_FIELD_TOO_LONG);
+ FAIL_IF(decoder_events->events[0] != HTP_LOG_CODE_REQUEST_FIELD_TOO_LONG);
AppLayerParserThreadCtxFree(alp_tctx);
StreamTcpFreeConfig(true);
@@ -6362,11 +6121,12 @@ libhtp:\n\
}
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
- if (tx == NULL || tx->request_method_number != HTP_M_GET || tx->request_protocol_number != HTP_PROTOCOL_1_1)
- {
+ if (tx == NULL || htp_tx_request_method_number(tx) != HTP_METHOD_GET ||
+ htp_tx_request_protocol_number(tx) != HTP_PROTOCOL_V1_1) {
printf("expected method M_GET and got %s: , expected protocol "
- "HTTP/1.1 and got %s \n", bstr_util_strdup_to_c(tx->request_method),
- bstr_util_strdup_to_c(tx->request_protocol));
+ "HTTP/1.1 and got %s \n",
+ bstr_util_strdup_to_c(htp_tx_request_method(tx)),
+ bstr_util_strdup_to_c(htp_tx_request_protocol(tx)));
goto end;
}
@@ -6439,11 +6199,12 @@ static int HTPParserTest16(void)
}
htp_tx_t *tx = HTPStateGetTx(htp_state, 0);
- if (tx == NULL || tx->request_method_number != HTP_M_GET || tx->request_protocol_number != HTP_PROTOCOL_1_1)
- {
+ if (tx == NULL || htp_tx_request_method_number(tx) != HTP_METHOD_GET ||
+ htp_tx_request_protocol_number(tx) != HTP_PROTOCOL_V1_1) {
printf("expected method M_GET and got %s: , expected protocol "
- "HTTP/1.1 and got %s \n", tx ? bstr_util_strdup_to_c(tx->request_method) : "tx null",
- tx ? bstr_util_strdup_to_c(tx->request_protocol) : "tx null");
+ "HTTP/1.1 and got %s \n",
+ tx ? bstr_util_strdup_to_c(htp_tx_request_method(tx)) : "tx null",
+ tx ? bstr_util_strdup_to_c(htp_tx_request_protocol(tx)) : "tx null");
goto end;
}
@@ -6457,13 +6218,13 @@ static int HTPParserTest16(void)
goto end;
}
- if (decoder_events->events[0] != HTTP_DECODER_EVENT_METHOD_DELIM_NON_COMPLIANT) {
- printf("HTTP_DECODER_EVENT_METHOD_DELIM_NON_COMPLIANT not set: ");
+ if (decoder_events->events[0] != HTP_LOG_CODE_METHOD_DELIM_NON_COMPLIANT) {
+ printf("HTP_LOG_CODE_METHOD_DELIM_NON_COMPLIANT not set: ");
goto end;
}
- if (decoder_events->events[1] != HTTP_DECODER_EVENT_URI_DELIM_NON_COMPLIANT) {
- printf("HTTP_DECODER_EVENT_URI_DELIM_NON_COMPLIANT not set: ");
+ if (decoder_events->events[1] != HTP_LOG_CODE_URI_DELIM_NON_COMPLIANT) {
+ printf("HTP_LOG_CODE_URI_DELIM_NON_COMPLIANT not set: ");
goto end;
}
#endif
@@ -6521,14 +6282,14 @@ static int HTPParserTest20(void)
FAIL_IF_NULL(http_state);
htp_tx_t *tx = HTPStateGetTx(http_state, 0);
FAIL_IF_NULL(tx);
- htp_header_t *h = htp_table_get_index(tx->request_headers, 0, NULL);
+ const htp_header_t *h = htp_tx_request_header_index(tx, 0);
FAIL_IF_NULL(h);
- FAIL_IF(tx->request_method_number != HTP_M_GET);
- FAIL_IF(tx->request_protocol_number != HTP_PROTOCOL_1_1);
+ FAIL_IF(htp_tx_request_method_number(tx) != HTP_METHOD_GET);
+ FAIL_IF(htp_tx_request_protocol_number(tx) != HTP_PROTOCOL_V1_1);
- FAIL_IF(tx->response_status_number != 0);
- FAIL_IF(tx->response_protocol_number != -1);
+ FAIL_IF(htp_tx_response_status_number(tx) != 0);
+ FAIL_IF(htp_tx_response_protocol_number(tx) != -1);
AppLayerParserThreadCtxFree(alp_tctx);
StreamTcpFreeConfig(true);
@@ -6580,14 +6341,14 @@ static int HTPParserTest21(void)
FAIL_IF_NULL(http_state);
htp_tx_t *tx = HTPStateGetTx(http_state, 0);
FAIL_IF_NULL(tx);
- htp_header_t *h = htp_table_get_index(tx->request_headers, 0, NULL);
+ const htp_header_t *h = htp_tx_request_header_index(tx, 0);
FAIL_IF_NULL(h);
- FAIL_IF(tx->request_method_number != HTP_M_GET);
- FAIL_IF(tx->request_protocol_number != HTP_PROTOCOL_1_1);
+ FAIL_IF(htp_tx_request_method_number(tx) != HTP_METHOD_GET);
+ FAIL_IF(htp_tx_request_protocol_number(tx) != HTP_PROTOCOL_V1_1);
- FAIL_IF(tx->response_status_number != 0);
- FAIL_IF(tx->response_protocol_number != -1);
+ FAIL_IF(htp_tx_response_status_number(tx) != 0);
+ FAIL_IF(htp_tx_response_protocol_number(tx) != -1);
AppLayerParserThreadCtxFree(alp_tctx);
StreamTcpFreeConfig(true);
@@ -6634,14 +6395,14 @@ static int HTPParserTest22(void)
FAIL_IF_NULL(http_state);
htp_tx_t *tx = HTPStateGetTx(http_state, 0);
FAIL_IF_NULL(tx);
- htp_header_t *h = htp_table_get_index(tx->request_headers, 0, NULL);
+ const htp_header_t *h = htp_tx_request_header_index(tx, 0);
FAIL_IF_NULL(h);
- FAIL_IF(tx->request_method_number != HTP_M_GET);
- FAIL_IF(tx->request_protocol_number != HTP_PROTOCOL_1_1);
+ FAIL_IF(htp_tx_request_method_number(tx) != HTP_METHOD_GET);
+ FAIL_IF(htp_tx_request_protocol_number(tx) != HTP_PROTOCOL_V1_1);
- FAIL_IF(tx->response_status_number != -0);
- FAIL_IF(tx->response_protocol_number != -1);
+ FAIL_IF(htp_tx_response_status_number(tx) != -0);
+ FAIL_IF(htp_tx_response_protocol_number(tx) != -1);
AppLayerParserThreadCtxFree(alp_tctx);
StreamTcpFreeConfig(true);
@@ -6688,14 +6449,14 @@ static int HTPParserTest23(void)
FAIL_IF_NULL(http_state);
htp_tx_t *tx = HTPStateGetTx(http_state, 0);
FAIL_IF_NULL(tx);
- htp_header_t *h = htp_table_get_index(tx->request_headers, 0, NULL);
+ const htp_header_t *h = htp_tx_request_header_index(tx, 0);
FAIL_IF_NULL(h);
- FAIL_IF(tx->request_method_number != HTP_M_GET);
- FAIL_IF(tx->request_protocol_number != HTP_PROTOCOL_1_1);
+ FAIL_IF(htp_tx_request_method_number(tx) != HTP_METHOD_GET);
+ FAIL_IF(htp_tx_request_protocol_number(tx) != HTP_PROTOCOL_V1_1);
- FAIL_IF(tx->response_status_number != -1);
- FAIL_IF(tx->response_protocol_number != -2);
+ FAIL_IF(htp_tx_response_status_number(tx) != -1);
+ FAIL_IF(htp_tx_response_protocol_number(tx) != -2);
AppLayerParserThreadCtxFree(alp_tctx);
StreamTcpFreeConfig(true);
@@ -6742,14 +6503,14 @@ static int HTPParserTest24(void)
FAIL_IF_NULL(http_state);
htp_tx_t *tx = HTPStateGetTx(http_state, 0);
FAIL_IF_NULL(tx);
- htp_header_t *h = htp_table_get_index(tx->request_headers, 0, NULL);
+ const htp_header_t *h = htp_tx_request_header_index(tx, 0);
FAIL_IF_NULL(h);
- FAIL_IF(tx->request_method_number != HTP_M_GET);
- FAIL_IF(tx->request_protocol_number != HTP_PROTOCOL_1_1);
+ FAIL_IF(htp_tx_request_method_number(tx) != HTP_METHOD_GET);
+ FAIL_IF(htp_tx_request_protocol_number(tx) != HTP_PROTOCOL_V1_1);
- FAIL_IF(tx->response_status_number != -1);
- FAIL_IF(tx->response_protocol_number != HTP_PROTOCOL_1_0);
+ FAIL_IF(htp_tx_response_status_number(tx) != -1);
+ FAIL_IF(htp_tx_response_protocol_number(tx) != HTP_PROTOCOL_V1_0);
AppLayerParserThreadCtxFree(alp_tctx);
StreamTcpFreeConfig(true);
diff --git a/src/app-layer-htp.h b/src/app-layer-htp.h
index 5adda7343ecc..d4e2fbfc3118 100644
--- a/src/app-layer-htp.h
+++ b/src/app-layer-htp.h
@@ -36,7 +36,7 @@
#include "rust.h"
#include "app-layer-frames.h"
-#include
+#include "htp/htp_rs.h"
/* default request body limit */
#define HTP_CONFIG_DEFAULT_REQUEST_BODY_LIMIT 4096U
@@ -45,8 +45,7 @@
#define HTP_CONFIG_DEFAULT_REQUEST_INSPECT_WINDOW 4096U
#define HTP_CONFIG_DEFAULT_RESPONSE_INSPECT_MIN_SIZE 32768U
#define HTP_CONFIG_DEFAULT_RESPONSE_INSPECT_WINDOW 4096U
-#define HTP_CONFIG_DEFAULT_FIELD_LIMIT_SOFT 9000U
-#define HTP_CONFIG_DEFAULT_FIELD_LIMIT_HARD 18000U
+#define HTP_CONFIG_DEFAULT_FIELD_LIMIT 18000U
#define HTP_CONFIG_DEFAULT_LZMA_LAYERS 0U
/* default libhtp lzma limit, taken from libhtp. */
@@ -76,66 +75,15 @@ enum {
};
enum {
- /* libhtp errors/warnings */
- HTTP_DECODER_EVENT_UNKNOWN_ERROR,
- HTTP_DECODER_EVENT_GZIP_DECOMPRESSION_FAILED,
- HTTP_DECODER_EVENT_REQUEST_FIELD_MISSING_COLON,
- HTTP_DECODER_EVENT_RESPONSE_FIELD_MISSING_COLON,
- HTTP_DECODER_EVENT_INVALID_REQUEST_CHUNK_LEN,
- HTTP_DECODER_EVENT_INVALID_RESPONSE_CHUNK_LEN,
- HTTP_DECODER_EVENT_INVALID_TRANSFER_ENCODING_VALUE_IN_REQUEST,
- HTTP_DECODER_EVENT_INVALID_TRANSFER_ENCODING_VALUE_IN_RESPONSE,
- HTTP_DECODER_EVENT_INVALID_CONTENT_LENGTH_FIELD_IN_REQUEST,
- HTTP_DECODER_EVENT_INVALID_CONTENT_LENGTH_FIELD_IN_RESPONSE,
- HTTP_DECODER_EVENT_DUPLICATE_CONTENT_LENGTH_FIELD_IN_REQUEST,
- HTTP_DECODER_EVENT_DUPLICATE_CONTENT_LENGTH_FIELD_IN_RESPONSE,
- HTTP_DECODER_EVENT_100_CONTINUE_ALREADY_SEEN,
- HTTP_DECODER_EVENT_UNABLE_TO_MATCH_RESPONSE_TO_REQUEST,
- HTTP_DECODER_EVENT_INVALID_SERVER_PORT_IN_REQUEST,
- HTTP_DECODER_EVENT_INVALID_AUTHORITY_PORT,
- HTTP_DECODER_EVENT_REQUEST_HEADER_INVALID,
- HTTP_DECODER_EVENT_RESPONSE_HEADER_INVALID,
- HTTP_DECODER_EVENT_MISSING_HOST_HEADER,
- HTTP_DECODER_EVENT_HOST_HEADER_AMBIGUOUS,
- HTTP_DECODER_EVENT_INVALID_REQUEST_FIELD_FOLDING,
- HTTP_DECODER_EVENT_INVALID_RESPONSE_FIELD_FOLDING,
- HTTP_DECODER_EVENT_REQUEST_FIELD_TOO_LONG,
- HTTP_DECODER_EVENT_RESPONSE_FIELD_TOO_LONG,
- HTTP_DECODER_EVENT_FILE_NAME_TOO_LONG,
- HTTP_DECODER_EVENT_REQUEST_SERVER_PORT_TCP_PORT_MISMATCH,
- HTTP_DECODER_EVENT_URI_HOST_INVALID,
- HTTP_DECODER_EVENT_HEADER_HOST_INVALID,
- HTTP_DECODER_EVENT_METHOD_DELIM_NON_COMPLIANT,
- HTTP_DECODER_EVENT_URI_DELIM_NON_COMPLIANT,
- HTTP_DECODER_EVENT_REQUEST_LINE_LEADING_WHITESPACE,
- HTTP_DECODER_EVENT_TOO_MANY_ENCODING_LAYERS,
- HTTP_DECODER_EVENT_ABNORMAL_CE_HEADER,
- HTTP_DECODER_EVENT_AUTH_UNRECOGNIZED,
- HTTP_DECODER_EVENT_REQUEST_HEADER_REPETITION,
- HTTP_DECODER_EVENT_RESPONSE_HEADER_REPETITION,
- HTTP_DECODER_EVENT_RESPONSE_MULTIPART_BYTERANGES,
- HTTP_DECODER_EVENT_RESPONSE_ABNORMAL_TRANSFER_ENCODING,
- HTTP_DECODER_EVENT_RESPONSE_CHUNKED_OLD_PROTO,
- HTTP_DECODER_EVENT_RESPONSE_INVALID_PROTOCOL,
- HTTP_DECODER_EVENT_RESPONSE_INVALID_STATUS,
- HTTP_DECODER_EVENT_REQUEST_LINE_INCOMPLETE,
- HTTP_DECODER_EVENT_DOUBLE_ENCODED_URI,
- HTTP_DECODER_EVENT_REQUEST_LINE_INVALID,
- HTTP_DECODER_EVENT_REQUEST_BODY_UNEXPECTED,
-
- HTTP_DECODER_EVENT_LZMA_MEMLIMIT_REACHED,
- HTTP_DECODER_EVENT_COMPRESSION_BOMB,
-
- HTTP_DECODER_EVENT_RANGE_INVALID,
-
/* suricata errors/warnings */
- HTTP_DECODER_EVENT_MULTIPART_GENERIC_ERROR,
- HTTP_DECODER_EVENT_MULTIPART_NO_FILEDATA,
- HTTP_DECODER_EVENT_MULTIPART_INVALID_HEADER,
-
- HTTP_DECODER_EVENT_TOO_MANY_WARNINGS,
-
- HTTP_DECODER_EVENT_FAILED_PROTOCOL_CHANGE,
+ HTTP_DECODER_EVENT_MULTIPART_GENERIC_ERROR = 200,
+ HTTP_DECODER_EVENT_MULTIPART_NO_FILEDATA = 201,
+ HTTP_DECODER_EVENT_MULTIPART_INVALID_HEADER = 202,
+
+ HTTP_DECODER_EVENT_TOO_MANY_WARNINGS = 203,
+ HTTP_DECODER_EVENT_RANGE_INVALID = 204,
+ HTTP_DECODER_EVENT_FILE_NAME_TOO_LONG = 205,
+ HTTP_DECODER_EVENT_FAILED_PROTOCOL_CHANGE = 206,
};
typedef enum HtpSwfCompressType_ {
@@ -156,8 +104,6 @@ typedef struct HTPCfgRec_ {
htp_cfg_t *cfg;
struct HTPCfgRec_ *next;
- int uri_include_all; /**< use all info in uri (bool) */
-
/** max size of the client body we inspect */
int randomize;
int randomize_range;
@@ -220,8 +166,6 @@ typedef struct HtpTxUserData_ {
HtpBody request_body;
HtpBody response_body;
- bstr *request_uri_normalized;
-
uint8_t *request_headers_raw;
uint8_t *response_headers_raw;
uint32_t request_headers_raw_len;
@@ -249,8 +193,8 @@ typedef struct HtpState_ {
const struct HTPCfgRec_ *cfg;
uint16_t flags;
uint16_t events;
- uint16_t htp_messages_offset; /**< offset into conn->messages list */
- uint32_t file_track_id; /**< used to assign file track ids to files */
+ uint16_t htp_messages_count; /**< Number of already logged messages */
+ uint32_t file_track_id; /**< used to assign file track ids to files */
uint64_t last_request_data_stamp;
uint64_t last_response_data_stamp;
StreamSlice *slice;
diff --git a/src/app-layer-http2.c b/src/app-layer-http2.c
index dd0b3ec53f93..2dcc5dd9985d 100644
--- a/src/app-layer-http2.c
+++ b/src/app-layer-http2.c
@@ -77,21 +77,25 @@ void HTTP2MimicHttp1Request(void *alstate_orig, void *h2s)
if (h2s == NULL || h1tx == NULL) {
return;
}
- if (h1tx->request_method == NULL) {
+ if (htp_tx_request_method(h1tx) == NULL) {
// may happen if we only got the reply, not the HTTP1 request
return;
}
// else
- rs_http2_tx_set_method(h2s, bstr_ptr(h1tx->request_method), bstr_len(h1tx->request_method));
- if (h1tx->request_uri != NULL) {
+ rs_http2_tx_set_method(
+ h2s, bstr_ptr(htp_tx_request_method(h1tx)), bstr_len(htp_tx_request_method(h1tx)));
+ if (htp_tx_request_uri(h1tx) != NULL) {
// A request line without spaces gets interpreted as a request_method
// and has request_uri=NULL
- rs_http2_tx_set_uri(h2s, bstr_ptr(h1tx->request_uri), bstr_len(h1tx->request_uri));
+ rs_http2_tx_set_uri(
+ h2s, bstr_ptr(htp_tx_request_uri(h1tx)), bstr_len(htp_tx_request_uri(h1tx)));
}
- size_t nbheaders = htp_table_size(h1tx->request_headers);
+ size_t nbheaders = htp_tx_request_headers_size(h1tx);
for (size_t i = 0; i < nbheaders; i++) {
- htp_header_t *h = htp_table_get_index(h1tx->request_headers, i, NULL);
- rs_http2_tx_add_header(
- h2s, bstr_ptr(h->name), bstr_len(h->name), bstr_ptr(h->value), bstr_len(h->value));
+ const htp_header_t *h = htp_tx_request_header_index(h1tx, i);
+ if (h != NULL) {
+ rs_http2_tx_add_header(h2s, htp_header_name_ptr(h), htp_header_name_len(h),
+ htp_header_value_ptr(h), htp_header_value_len(h));
+ }
}
}
diff --git a/src/detect-engine-file.c b/src/detect-engine-file.c
index 1738c9458919..825aa60937b2 100644
--- a/src/detect-engine-file.c
+++ b/src/detect-engine-file.c
@@ -50,7 +50,7 @@
#include "util-validate.h"
FileAppProto file_protos_ts_static[] = {
- { ALPROTO_HTTP1, HTP_REQUEST_BODY },
+ { ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_BODY },
{ ALPROTO_SMTP, 0 },
{ ALPROTO_FTP, 0 },
{ ALPROTO_FTPDATA, 0 },
@@ -61,7 +61,7 @@ FileAppProto file_protos_ts_static[] = {
};
FileAppProto file_protos_tc_static[] = {
- { ALPROTO_HTTP1, HTP_RESPONSE_BODY },
+ { ALPROTO_HTTP1, HTP_RESPONSE_PROGRESS_BODY },
{ ALPROTO_FTP, 0 },
{ ALPROTO_FTPDATA, 0 },
{ ALPROTO_SMB, 0 },
diff --git a/src/detect-engine-state.c b/src/detect-engine-state.c
index 6fd7f96e58be..ac56d0e53176 100644
--- a/src/detect-engine-state.c
+++ b/src/detect-engine-state.c
@@ -714,7 +714,7 @@ static int DeStateSigTest03(void)
FAIL_IF_NULL(http_state);
void *tx = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, f->alstate, 0);
FAIL_IF_NULL(tx);
- HtpTxUserData *tx_ud = htp_tx_get_user_data(tx);
+ HtpTxUserData *tx_ud = htp_tx_user_data(tx);
FAIL_IF_NULL(tx_ud);
SigMatchSignatures(&th_v, de_ctx, det_ctx, p);
@@ -797,7 +797,7 @@ static int DeStateSigTest04(void)
FAIL_IF_NULL(http_state);
void *tx = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, f->alstate, 0);
FAIL_IF_NULL(tx);
- HtpTxUserData *tx_ud = htp_tx_get_user_data(tx);
+ HtpTxUserData *tx_ud = htp_tx_user_data(tx);
FAIL_IF_NULL(tx_ud);
AppLayerGetFileState files = AppLayerParserGetTxFiles(p->flow, http_state, tx, STREAM_TOSERVER);
@@ -872,7 +872,7 @@ static int DeStateSigTest05(void)
FAIL_IF_NULL(http_state);
void *tx = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, f->alstate, 0);
FAIL_IF_NULL(tx);
- HtpTxUserData *tx_ud = htp_tx_get_user_data(tx);
+ HtpTxUserData *tx_ud = htp_tx_user_data(tx);
FAIL_IF_NULL(tx_ud);
AppLayerGetFileState files = AppLayerParserGetTxFiles(p->flow, http_state, tx, STREAM_TOSERVER);
@@ -958,7 +958,7 @@ static int DeStateSigTest06(void)
FAIL_IF_NULL(http_state);
void *tx = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, f->alstate, 0);
FAIL_IF_NULL(tx);
- HtpTxUserData *tx_ud = htp_tx_get_user_data(tx);
+ HtpTxUserData *tx_ud = htp_tx_user_data(tx);
FAIL_IF_NULL(tx_ud);
AppLayerGetFileState files = AppLayerParserGetTxFiles(p->flow, http_state, tx, STREAM_TOSERVER);
@@ -1046,7 +1046,7 @@ static int DeStateSigTest07(void)
FAIL_IF_NULL(http_state);
void *tx = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, f->alstate, 0);
FAIL_IF_NULL(tx);
- HtpTxUserData *tx_ud = htp_tx_get_user_data(tx);
+ HtpTxUserData *tx_ud = htp_tx_user_data(tx);
FAIL_IF_NULL(tx_ud);
AppLayerGetFileState files = AppLayerParserGetTxFiles(p->flow, http_state, tx, STREAM_TOSERVER);
@@ -1145,7 +1145,7 @@ static int DeStateSigTest08(void)
FAIL_IF_NULL(http_state);
void *tx = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, f->alstate, 0);
FAIL_IF_NULL(tx);
- HtpTxUserData *tx_ud = htp_tx_get_user_data(tx);
+ HtpTxUserData *tx_ud = htp_tx_user_data(tx);
FAIL_IF_NULL(tx_ud);
AppLayerGetFileState files = AppLayerParserGetTxFiles(p->flow, http_state, tx, STREAM_TOSERVER);
@@ -1172,7 +1172,7 @@ static int DeStateSigTest08(void)
FAIL_IF_NULL(http_state);
tx = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, f->alstate, 0);
FAIL_IF_NULL(tx);
- tx_ud = htp_tx_get_user_data(tx);
+ tx_ud = htp_tx_user_data(tx);
FAIL_IF_NULL(tx_ud);
files = AppLayerParserGetTxFiles(p->flow, http_state, tx, STREAM_TOSERVER);
@@ -1273,7 +1273,7 @@ static int DeStateSigTest09(void)
FAIL_IF_NULL(http_state);
void *tx = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, f->alstate, 0);
FAIL_IF_NULL(tx);
- HtpTxUserData *tx_ud = htp_tx_get_user_data(tx);
+ HtpTxUserData *tx_ud = htp_tx_user_data(tx);
FAIL_IF_NULL(tx_ud);
AppLayerGetFileState files = AppLayerParserGetTxFiles(p->flow, http_state, tx, STREAM_TOSERVER);
@@ -1300,7 +1300,7 @@ static int DeStateSigTest09(void)
FAIL_IF_NULL(http_state);
tx = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, f->alstate, 0);
FAIL_IF_NULL(tx);
- tx_ud = htp_tx_get_user_data(tx);
+ tx_ud = htp_tx_user_data(tx);
FAIL_IF_NULL(tx_ud);
files = AppLayerParserGetTxFiles(p->flow, http_state, tx, STREAM_TOSERVER);
@@ -1399,7 +1399,7 @@ static int DeStateSigTest10(void)
FAIL_IF_NULL(http_state);
void *tx = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, f->alstate, 0);
FAIL_IF_NULL(tx);
- HtpTxUserData *tx_ud = htp_tx_get_user_data(tx);
+ HtpTxUserData *tx_ud = htp_tx_user_data(tx);
FAIL_IF_NULL(tx_ud);
AppLayerGetFileState files = AppLayerParserGetTxFiles(p->flow, http_state, tx, STREAM_TOSERVER);
@@ -1426,7 +1426,7 @@ static int DeStateSigTest10(void)
FAIL_IF_NULL(http_state);
tx = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, f->alstate, 0);
FAIL_IF_NULL(tx);
- tx_ud = htp_tx_get_user_data(tx);
+ tx_ud = htp_tx_user_data(tx);
FAIL_IF_NULL(tx_ud);
files = AppLayerParserGetTxFiles(p->flow, http_state, tx, STREAM_TOSERVER);
diff --git a/src/detect-file-data.c b/src/detect-file-data.c
index e8f70803ded9..f5303c1388b9 100644
--- a/src/detect-file-data.c
+++ b/src/detect-file-data.c
@@ -99,9 +99,10 @@ void DetectFiledataRegister(void)
if (file_protos_tc[i].alproto == ALPROTO_HTTP1) {
// special case for HTTP1
DetectAppLayerMpmRegister2("file_data", SIG_FLAG_TOCLIENT, 2,
- PrefilterMpmHTTPFiledataRegister, NULL, ALPROTO_HTTP1, HTP_RESPONSE_BODY);
+ PrefilterMpmHTTPFiledataRegister, NULL, ALPROTO_HTTP1,
+ HTP_RESPONSE_PROGRESS_BODY);
DetectAppLayerInspectEngineRegister2("file_data", ALPROTO_HTTP1, SIG_FLAG_TOCLIENT,
- HTP_RESPONSE_BODY, DetectEngineInspectBufferHttpBody, NULL);
+ HTP_RESPONSE_PROGRESS_BODY, DetectEngineInspectBufferHttpBody, NULL);
continue;
}
DetectAppLayerMpmRegister2("file_data", SIG_FLAG_TOCLIENT, 2, PrefilterMpmFiledataRegister,
@@ -201,7 +202,7 @@ static void PrefilterMpmFiledataFree(void *ptr)
static inline HtpBody *GetResponseBody(htp_tx_t *tx)
{
- HtpTxUserData *htud = (HtpTxUserData *)htp_tx_get_user_data(tx);
+ HtpTxUserData *htud = (HtpTxUserData *)htp_tx_user_data(tx);
if (htud == NULL) {
SCLogDebug("no htud");
return NULL;
@@ -262,7 +263,7 @@ static InspectionBuffer *HttpServerBodyGetDataCallback(DetectEngineThreadCtx *de
htp_state->cfg->response.body_limit, body->content_len_so_far,
htp_state->cfg->response.inspect_min_size, flags & STREAM_EOF ? "true" : "false",
(AppLayerParserGetStateProgress(IPPROTO_TCP, ALPROTO_HTTP1, tx, flags) >
- HTP_RESPONSE_BODY)
+ HTP_RESPONSE_PROGRESS_BODY)
? "true"
: "false");
@@ -273,7 +274,7 @@ static InspectionBuffer *HttpServerBodyGetDataCallback(DetectEngineThreadCtx *de
body->content_len_so_far < htp_state->cfg->response.body_limit) &&
body->content_len_so_far < htp_state->cfg->response.inspect_min_size &&
!(AppLayerParserGetStateProgress(IPPROTO_TCP, ALPROTO_HTTP1, tx, flags) >
- HTP_RESPONSE_BODY) &&
+ HTP_RESPONSE_PROGRESS_BODY) &&
!(flags & STREAM_EOF)) {
SCLogDebug("we still haven't seen the entire response body. "
"Let's defer body inspection till we see the "
@@ -369,11 +370,11 @@ static uint8_t DetectEngineInspectBufferHttpBody(DetectEngineCtx *de_ctx,
if (flags & STREAM_TOSERVER) {
if (AppLayerParserGetStateProgress(IPPROTO_TCP, ALPROTO_HTTP1, txv, flags) >
- HTP_REQUEST_BODY)
+ HTP_REQUEST_PROGRESS_BODY)
return DETECT_ENGINE_INSPECT_SIG_CANT_MATCH;
} else {
if (AppLayerParserGetStateProgress(IPPROTO_TCP, ALPROTO_HTTP1, txv, flags) >
- HTP_RESPONSE_BODY)
+ HTP_RESPONSE_PROGRESS_BODY)
return DETECT_ENGINE_INSPECT_SIG_CANT_MATCH;
}
return DETECT_ENGINE_INSPECT_SIG_NO_MATCH;
diff --git a/src/detect-http-client-body.c b/src/detect-http-client-body.c
index 41b2552e9b99..4af1b97696fb 100644
--- a/src/detect-http-client-body.c
+++ b/src/detect-http-client-body.c
@@ -104,10 +104,10 @@ void DetectHttpClientBodyRegister(void)
sigmatch_table[DETECT_HTTP_REQUEST_BODY].flags |= SIGMATCH_INFO_STICKY_BUFFER;
DetectAppLayerInspectEngineRegister2("http_client_body", ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_BODY, DetectEngineInspectBufferHttpBody, NULL);
+ HTP_REQUEST_PROGRESS_BODY, DetectEngineInspectBufferHttpBody, NULL);
DetectAppLayerMpmRegister2("http_client_body", SIG_FLAG_TOSERVER, 2,
- PrefilterMpmHttpRequestBodyRegister, NULL, ALPROTO_HTTP1, HTP_REQUEST_BODY);
+ PrefilterMpmHttpRequestBodyRegister, NULL, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_BODY);
DetectAppLayerInspectEngineRegister2("http_client_body", ALPROTO_HTTP2, SIG_FLAG_TOSERVER,
HTTP2StateDataClient, DetectEngineInspectFiledata, NULL);
@@ -172,7 +172,7 @@ static int DetectHttpClientBodySetupSticky(DetectEngineCtx *de_ctx, Signature *s
static inline HtpBody *GetRequestBody(htp_tx_t *tx)
{
- HtpTxUserData *htud = (HtpTxUserData *)htp_tx_get_user_data(tx);
+ HtpTxUserData *htud = (HtpTxUserData *)htp_tx_user_data(tx);
if (htud == NULL) {
SCLogDebug("no htud");
return NULL;
@@ -245,7 +245,7 @@ static InspectionBuffer *HttpRequestBodyGetDataCallback(DetectEngineThreadCtx *d
htp_state->cfg->request.body_limit, body->content_len_so_far,
htp_state->cfg->request.inspect_min_size, flags & STREAM_EOF ? "true" : "false",
(AppLayerParserGetStateProgress(IPPROTO_TCP, ALPROTO_HTTP1, tx, flags) >
- HTP_REQUEST_BODY)
+ HTP_REQUEST_PROGRESS_BODY)
? "true"
: "false");
@@ -256,7 +256,7 @@ static InspectionBuffer *HttpRequestBodyGetDataCallback(DetectEngineThreadCtx *d
body->content_len_so_far < htp_state->cfg->request.body_limit) &&
body->content_len_so_far < htp_state->cfg->request.inspect_min_size &&
!(AppLayerParserGetStateProgress(IPPROTO_TCP, ALPROTO_HTTP1, tx, flags) >
- HTP_REQUEST_BODY) &&
+ HTP_REQUEST_PROGRESS_BODY) &&
!(flags & STREAM_EOF)) {
SCLogDebug("we still haven't seen the entire request body. "
"Let's defer body inspection till we see the "
@@ -337,11 +337,11 @@ static uint8_t DetectEngineInspectBufferHttpBody(DetectEngineCtx *de_ctx,
if (flags & STREAM_TOSERVER) {
if (AppLayerParserGetStateProgress(IPPROTO_TCP, ALPROTO_HTTP1, txv, flags) >
- HTP_REQUEST_BODY)
+ HTP_REQUEST_PROGRESS_BODY)
return DETECT_ENGINE_INSPECT_SIG_CANT_MATCH;
} else {
if (AppLayerParserGetStateProgress(IPPROTO_TCP, ALPROTO_HTTP1, txv, flags) >
- HTP_RESPONSE_BODY)
+ HTP_RESPONSE_PROGRESS_BODY)
return DETECT_ENGINE_INSPECT_SIG_CANT_MATCH;
}
return DETECT_ENGINE_INSPECT_SIG_NO_MATCH;
diff --git a/src/detect-http-cookie.c b/src/detect-http-cookie.c
index e2754138fd44..6937f05aaa25 100644
--- a/src/detect-http-cookie.c
+++ b/src/detect-http-cookie.c
@@ -107,14 +107,14 @@ void DetectHttpCookieRegister(void)
sigmatch_table[DETECT_HTTP_COOKIE].flags |= SIGMATCH_INFO_STICKY_BUFFER;
DetectAppLayerInspectEngineRegister2("http_cookie", ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_HEADERS, DetectEngineInspectBufferGeneric, GetRequestData);
+ HTP_REQUEST_PROGRESS_HEADERS, DetectEngineInspectBufferGeneric, GetRequestData);
DetectAppLayerInspectEngineRegister2("http_cookie", ALPROTO_HTTP1, SIG_FLAG_TOCLIENT,
- HTP_REQUEST_HEADERS, DetectEngineInspectBufferGeneric, GetResponseData);
+ HTP_REQUEST_PROGRESS_HEADERS, DetectEngineInspectBufferGeneric, GetResponseData);
DetectAppLayerMpmRegister2("http_cookie", SIG_FLAG_TOSERVER, 2, PrefilterGenericMpmRegister,
- GetRequestData, ALPROTO_HTTP1, HTP_REQUEST_HEADERS);
+ GetRequestData, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_HEADERS);
DetectAppLayerMpmRegister2("http_cookie", SIG_FLAG_TOCLIENT, 2, PrefilterGenericMpmRegister,
- GetResponseData, ALPROTO_HTTP1, HTP_REQUEST_HEADERS);
+ GetResponseData, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_HEADERS);
DetectAppLayerInspectEngineRegister2("http_cookie", ALPROTO_HTTP2, SIG_FLAG_TOSERVER,
HTTP2StateDataClient, DetectEngineInspectBufferGeneric, GetRequestData2);
@@ -177,18 +177,17 @@ static InspectionBuffer *GetRequestData(DetectEngineThreadCtx *det_ctx,
if (buffer->inspect == NULL) {
htp_tx_t *tx = (htp_tx_t *)txv;
- if (tx->request_headers == NULL)
+ if (htp_tx_request_headers(tx) == NULL)
return NULL;
- htp_header_t *h = (htp_header_t *)htp_table_get_c(tx->request_headers,
- "Cookie");
- if (h == NULL || h->value == NULL) {
+ const htp_header_t *h = htp_tx_request_header(tx, "Cookie");
+ if (h == NULL || htp_header_value(h) == NULL) {
SCLogDebug("HTTP cookie header not present in this request");
return NULL;
}
- const uint32_t data_len = bstr_len(h->value);
- const uint8_t *data = bstr_ptr(h->value);
+ const uint32_t data_len = htp_header_value_len(h);
+ const uint8_t *data = htp_header_value_ptr(h);
InspectionBufferSetup(det_ctx, list_id, buffer, data, data_len);
InspectionBufferApplyTransforms(buffer, transforms);
@@ -205,18 +204,17 @@ static InspectionBuffer *GetResponseData(DetectEngineThreadCtx *det_ctx,
if (buffer->inspect == NULL) {
htp_tx_t *tx = (htp_tx_t *)txv;
- if (tx->response_headers == NULL)
+ if (htp_tx_response_headers(tx) == NULL)
return NULL;
- htp_header_t *h = (htp_header_t *)htp_table_get_c(tx->response_headers,
- "Set-Cookie");
- if (h == NULL || h->value == NULL) {
+ const htp_header_t *h = htp_tx_response_header(tx, "Set-Cookie");
+ if (h == NULL || htp_header_value(h) == NULL) {
SCLogDebug("HTTP cookie header not present in this request");
return NULL;
}
- const uint32_t data_len = bstr_len(h->value);
- const uint8_t *data = bstr_ptr(h->value);
+ const uint32_t data_len = htp_header_value_len(h);
+ const uint8_t *data = htp_header_value_ptr(h);
InspectionBufferSetup(det_ctx, list_id, buffer, data, data_len);
InspectionBufferApplyTransforms(buffer, transforms);
diff --git a/src/detect-http-header-names.c b/src/detect-http-header-names.c
index 58989a1825df..584ffeb3024e 100644
--- a/src/detect-http-header-names.c
+++ b/src/detect-http-header-names.c
@@ -86,27 +86,27 @@ static uint8_t *GetBufferForTX(
return NULL;
}
- htp_table_t *headers;
+ const htp_headers_t *headers;
if (flags & STREAM_TOSERVER) {
if (AppLayerParserGetStateProgress(IPPROTO_TCP, ALPROTO_HTTP1, tx, flags) <=
- HTP_REQUEST_HEADERS)
+ HTP_REQUEST_PROGRESS_HEADERS)
return NULL;
- headers = tx->request_headers;
+ headers = htp_tx_request_headers(tx);
} else {
if (AppLayerParserGetStateProgress(IPPROTO_TCP, ALPROTO_HTTP1, tx, flags) <=
- HTP_RESPONSE_HEADERS)
+ HTP_RESPONSE_PROGRESS_HEADERS)
return NULL;
- headers = tx->response_headers;
+ headers = htp_tx_response_headers(tx);
}
if (headers == NULL)
return NULL;
/* fill the buffer. \r\nName1\r\nName2\r\n\r\n */
size_t i = 0;
- size_t no_of_headers = htp_table_size(headers);
+ size_t no_of_headers = htp_headers_size(headers);
for (; i < no_of_headers; i++) {
- htp_header_t *h = htp_table_get_index(headers, i, NULL);
- size_t size = bstr_size(h->name) + 2; // for \r\n
+ const htp_header_t *h = htp_headers_get_index(headers, i);
+ size_t size = htp_header_name_len(h) + 2; // for \r\n
if (i == 0)
size += 2;
if (i + 1 == no_of_headers)
@@ -126,8 +126,8 @@ static uint8_t *GetBufferForTX(
buf->buffer[buf->len++] = '\n';
}
- memcpy(buf->buffer + buf->len, bstr_ptr(h->name), bstr_size(h->name));
- buf->len += bstr_size(h->name);
+ memcpy(buf->buffer + buf->len, htp_header_name_ptr(h), htp_header_name_len(h));
+ buf->len += htp_header_name_len(h);
buf->buffer[buf->len++] = '\r';
buf->buffer[buf->len++] = '\n';
@@ -220,14 +220,14 @@ void DetectHttpHeaderNamesRegister(void)
/* http1 */
DetectAppLayerMpmRegister2(BUFFER_NAME, SIG_FLAG_TOSERVER, 2, PrefilterGenericMpmRegister,
- GetBuffer1ForTX, ALPROTO_HTTP1, HTP_REQUEST_HEADERS);
+ GetBuffer1ForTX, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_HEADERS);
DetectAppLayerMpmRegister2(BUFFER_NAME, SIG_FLAG_TOCLIENT, 2, PrefilterGenericMpmRegister,
- GetBuffer1ForTX, ALPROTO_HTTP1, HTP_RESPONSE_HEADERS);
+ GetBuffer1ForTX, ALPROTO_HTTP1, HTP_RESPONSE_PROGRESS_HEADERS);
DetectAppLayerInspectEngineRegister2(BUFFER_NAME, ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_HEADERS, DetectEngineInspectBufferGeneric, GetBuffer1ForTX);
+ HTP_REQUEST_PROGRESS_HEADERS, DetectEngineInspectBufferGeneric, GetBuffer1ForTX);
DetectAppLayerInspectEngineRegister2(BUFFER_NAME, ALPROTO_HTTP1, SIG_FLAG_TOCLIENT,
- HTP_RESPONSE_HEADERS, DetectEngineInspectBufferGeneric, GetBuffer1ForTX);
+ HTP_RESPONSE_PROGRESS_HEADERS, DetectEngineInspectBufferGeneric, GetBuffer1ForTX);
/* http2 */
DetectAppLayerMpmRegister2(BUFFER_NAME, SIG_FLAG_TOSERVER, 2, PrefilterGenericMpmRegister,
diff --git a/src/detect-http-header.c b/src/detect-http-header.c
index cc11cdf0c0da..076b54578147 100644
--- a/src/detect-http-header.c
+++ b/src/detect-http-header.c
@@ -78,36 +78,34 @@ static uint8_t *GetBufferForTX(
return NULL;
}
- htp_table_t *headers;
+ const htp_headers_t *headers;
if (flags & STREAM_TOSERVER) {
if (AppLayerParserGetStateProgress(IPPROTO_TCP, ALPROTO_HTTP1, tx, flags) <=
- HTP_REQUEST_HEADERS)
+ HTP_REQUEST_PROGRESS_HEADERS)
return NULL;
- headers = tx->request_headers;
+ headers = htp_tx_request_headers(tx);
} else {
if (AppLayerParserGetStateProgress(IPPROTO_TCP, ALPROTO_HTTP1, tx, flags) <=
- HTP_RESPONSE_HEADERS)
+ HTP_RESPONSE_PROGRESS_HEADERS)
return NULL;
- headers = tx->response_headers;
+ headers = htp_tx_response_headers(tx);
}
if (headers == NULL)
return NULL;
size_t i = 0;
- size_t no_of_headers = htp_table_size(headers);
+ size_t no_of_headers = htp_headers_size(headers);
for (; i < no_of_headers; i++) {
- htp_header_t *h = htp_table_get_index(headers, i, NULL);
- size_t size1 = bstr_size(h->name);
- size_t size2 = bstr_size(h->value);
+ const htp_header_t *h = htp_headers_get_index(headers, i);
+ size_t size1 = htp_header_name_len(h);
+ size_t size2 = htp_header_value_len(h);
if (flags & STREAM_TOSERVER) {
- if (size1 == 6 &&
- SCMemcmpLowercase("cookie", bstr_ptr(h->name), 6) == 0) {
+ if (size1 == 6 && SCMemcmpLowercase("cookie", htp_header_name_ptr(h), 6) == 0) {
continue;
}
} else {
- if (size1 == 10 &&
- SCMemcmpLowercase("set-cookie", bstr_ptr(h->name), 10) == 0) {
+ if (size1 == 10 && SCMemcmpLowercase("set-cookie", htp_header_name_ptr(h), 10) == 0) {
continue;
}
}
@@ -123,12 +121,12 @@ static uint8_t *GetBufferForTX(
}
}
- memcpy(buf->buffer + buf->len, bstr_ptr(h->name), bstr_size(h->name));
- buf->len += bstr_size(h->name);
+ memcpy(buf->buffer + buf->len, htp_header_name_ptr(h), htp_header_name_len(h));
+ buf->len += htp_header_name_len(h);
buf->buffer[buf->len++] = ':';
buf->buffer[buf->len++] = ' ';
- memcpy(buf->buffer + buf->len, bstr_ptr(h->value), bstr_size(h->value));
- buf->len += bstr_size(h->value);
+ memcpy(buf->buffer + buf->len, htp_header_value_ptr(h), htp_header_value_len(h));
+ buf->len += htp_header_value_len(h);
buf->buffer[buf->len++] = '\r';
buf->buffer[buf->len++] = '\n';
#if 0 // looks like this breaks existing rules
@@ -215,11 +213,11 @@ static uint8_t DetectEngineInspectBufferHttpHeader(DetectEngineCtx *de_ctx,
end:
if (flags & STREAM_TOSERVER) {
if (AppLayerParserGetStateProgress(IPPROTO_TCP, ALPROTO_HTTP1, txv, flags) >
- HTP_REQUEST_HEADERS)
+ HTP_REQUEST_PROGRESS_HEADERS)
return DETECT_ENGINE_INSPECT_SIG_CANT_MATCH;
} else {
if (AppLayerParserGetStateProgress(IPPROTO_TCP, ALPROTO_HTTP1, txv, flags) >
- HTP_RESPONSE_HEADERS)
+ HTP_RESPONSE_PROGRESS_HEADERS)
return DETECT_ENGINE_INSPECT_SIG_CANT_MATCH;
}
return DETECT_ENGINE_INSPECT_SIG_NO_MATCH;
@@ -280,7 +278,7 @@ static void PrefilterMpmHttpTrailer(DetectEngineThreadCtx *det_ctx, const void *
SCEnter();
htp_tx_t *tx = txv;
- const HtpTxUserData *htud = (const HtpTxUserData *)htp_tx_get_user_data(tx);
+ const HtpTxUserData *htud = (const HtpTxUserData *)htp_tx_user_data(tx);
/* if the request wasn't flagged as having a trailer, we skip */
if (htud && (
((flags & STREAM_TOSERVER) && !htud->request_has_trailers) ||
@@ -309,9 +307,8 @@ static int PrefilterMpmHttpHeaderRequestRegister(DetectEngineCtx *de_ctx, SigGro
pectx->mpm_ctx = mpm_ctx;
pectx->transforms = &mpm_reg->transforms;
- int r = PrefilterAppendTxEngine(de_ctx, sgh, PrefilterMpmHttpHeader,
- mpm_reg->app_v2.alproto, HTP_REQUEST_HEADERS,
- pectx, PrefilterMpmHttpHeaderFree, mpm_reg->pname);
+ int r = PrefilterAppendTxEngine(de_ctx, sgh, PrefilterMpmHttpHeader, mpm_reg->app_v2.alproto,
+ HTP_REQUEST_PROGRESS_HEADERS, pectx, PrefilterMpmHttpHeaderFree, mpm_reg->pname);
if (r != 0) {
SCFree(pectx);
return r;
@@ -325,9 +322,8 @@ static int PrefilterMpmHttpHeaderRequestRegister(DetectEngineCtx *de_ctx, SigGro
pectx->mpm_ctx = mpm_ctx;
pectx->transforms = &mpm_reg->transforms;
- r = PrefilterAppendTxEngine(de_ctx, sgh, PrefilterMpmHttpTrailer,
- mpm_reg->app_v2.alproto, HTP_REQUEST_TRAILER,
- pectx, PrefilterMpmHttpHeaderFree, mpm_reg->pname);
+ r = PrefilterAppendTxEngine(de_ctx, sgh, PrefilterMpmHttpTrailer, mpm_reg->app_v2.alproto,
+ HTP_REQUEST_PROGRESS_TRAILER, pectx, PrefilterMpmHttpHeaderFree, mpm_reg->pname);
if (r != 0) {
SCFree(pectx);
}
@@ -347,9 +343,8 @@ static int PrefilterMpmHttpHeaderResponseRegister(DetectEngineCtx *de_ctx, SigGr
pectx->mpm_ctx = mpm_ctx;
pectx->transforms = &mpm_reg->transforms;
- int r = PrefilterAppendTxEngine(de_ctx, sgh, PrefilterMpmHttpHeader,
- mpm_reg->app_v2.alproto, HTP_RESPONSE_HEADERS,
- pectx, PrefilterMpmHttpHeaderFree, mpm_reg->pname);
+ int r = PrefilterAppendTxEngine(de_ctx, sgh, PrefilterMpmHttpHeader, mpm_reg->app_v2.alproto,
+ HTP_RESPONSE_PROGRESS_HEADERS, pectx, PrefilterMpmHttpHeaderFree, mpm_reg->pname);
if (r != 0) {
SCFree(pectx);
return r;
@@ -363,9 +358,8 @@ static int PrefilterMpmHttpHeaderResponseRegister(DetectEngineCtx *de_ctx, SigGr
pectx->mpm_ctx = mpm_ctx;
pectx->transforms = &mpm_reg->transforms;
- r = PrefilterAppendTxEngine(de_ctx, sgh, PrefilterMpmHttpTrailer,
- mpm_reg->app_v2.alproto, HTP_RESPONSE_TRAILER,
- pectx, PrefilterMpmHttpHeaderFree, mpm_reg->pname);
+ r = PrefilterAppendTxEngine(de_ctx, sgh, PrefilterMpmHttpTrailer, mpm_reg->app_v2.alproto,
+ HTP_RESPONSE_PROGRESS_TRAILER, pectx, PrefilterMpmHttpHeaderFree, mpm_reg->pname);
if (r != 0) {
SCFree(pectx);
}
@@ -435,13 +429,13 @@ void DetectHttpHeaderRegister(void)
sigmatch_table[DETECT_HTTP_HEADER].flags |= SIGMATCH_INFO_STICKY_BUFFER;
DetectAppLayerInspectEngineRegister2("http_header", ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_HEADERS, DetectEngineInspectBufferHttpHeader, NULL);
+ HTP_REQUEST_PROGRESS_HEADERS, DetectEngineInspectBufferHttpHeader, NULL);
DetectAppLayerMpmRegister2("http_header", SIG_FLAG_TOSERVER, 2,
PrefilterMpmHttpHeaderRequestRegister, NULL, ALPROTO_HTTP1,
0); /* not used, registered twice: HEADERS/TRAILER */
DetectAppLayerInspectEngineRegister2("http_header", ALPROTO_HTTP1, SIG_FLAG_TOCLIENT,
- HTP_RESPONSE_HEADERS, DetectEngineInspectBufferHttpHeader, NULL);
+ HTP_RESPONSE_PROGRESS_HEADERS, DetectEngineInspectBufferHttpHeader, NULL);
DetectAppLayerMpmRegister2("http_header", SIG_FLAG_TOCLIENT, 2,
PrefilterMpmHttpHeaderResponseRegister, NULL, ALPROTO_HTTP1,
0); /* not used, registered twice: HEADERS/TRAILER */
@@ -601,26 +595,26 @@ static InspectionBuffer *GetHttp1HeaderData(DetectEngineThreadCtx *det_ctx, cons
}
htp_tx_t *tx = (htp_tx_t *)cbdata->txv;
- htp_table_t *headers;
+ const htp_headers_t *headers;
if (flags & STREAM_TOSERVER) {
- headers = tx->request_headers;
+ headers = htp_tx_request_headers(tx);
} else {
- headers = tx->response_headers;
+ headers = htp_tx_response_headers(tx);
}
- if (cbdata->local_id < htp_table_size(headers)) {
- htp_header_t *h = htp_table_get_index(headers, cbdata->local_id, NULL);
- size_t size1 = bstr_size(h->name);
- size_t size2 = bstr_size(h->value);
+ if (cbdata->local_id < htp_headers_size(headers)) {
+ const htp_header_t *h = htp_headers_get_index(headers, cbdata->local_id);
+ size_t size1 = htp_header_name_len(h);
+ size_t size2 = htp_header_value_len(h);
size_t b_len = size1 + 2 + size2;
if (b_len > buf->size) {
if (HttpHeaderExpandBuffer(hdr_td, buf, b_len) != 0) {
return NULL;
}
}
- memcpy(buf->buffer, bstr_ptr(h->name), bstr_size(h->name));
+ memcpy(buf->buffer, htp_header_name_ptr(h), htp_header_name_len(h));
buf->buffer[size1] = ':';
buf->buffer[size1 + 1] = ' ';
- memcpy(buf->buffer + size1 + 2, bstr_ptr(h->value), bstr_size(h->value));
+ memcpy(buf->buffer + size1 + 2, htp_header_value_ptr(h), htp_header_value_len(h));
buf->len = b_len;
} else {
InspectionBufferSetupMultiEmpty(buffer);
@@ -746,7 +740,7 @@ void DetectHttpRequestHeaderRegister(void)
DetectAppLayerMpmRegister2("http_request_header", SIG_FLAG_TOSERVER, 2,
PrefilterMpmHttp1HeaderRegister, NULL, ALPROTO_HTTP1, 0);
DetectAppLayerInspectEngineRegister2("http_request_header", ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_HEADERS, DetectEngineInspectHttp1Header, NULL);
+ HTP_REQUEST_PROGRESS_HEADERS, DetectEngineInspectHttp1Header, NULL);
DetectBufferTypeSetDescriptionByName("http_request_header", "HTTP header name and value");
g_http_request_header_buffer_id = DetectBufferTypeGetByName("http_request_header");
@@ -780,7 +774,7 @@ void DetectHttpResponseHeaderRegister(void)
DetectAppLayerMpmRegister2("http_response_header", SIG_FLAG_TOCLIENT, 2,
PrefilterMpmHttp1HeaderRegister, NULL, ALPROTO_HTTP1, 0);
DetectAppLayerInspectEngineRegister2("http_response_header", ALPROTO_HTTP1, SIG_FLAG_TOCLIENT,
- HTP_RESPONSE_HEADERS, DetectEngineInspectHttp1Header, NULL);
+ HTP_RESPONSE_PROGRESS_HEADERS, DetectEngineInspectHttp1Header, NULL);
DetectBufferTypeSetDescriptionByName("http_response_header", "HTTP header name and value");
g_http_response_header_buffer_id = DetectBufferTypeGetByName("http_response_header");
diff --git a/src/detect-http-headers-stub.h b/src/detect-http-headers-stub.h
index 3a036d62209e..5b6daa73ffb0 100644
--- a/src/detect-http-headers-stub.h
+++ b/src/detect-http-headers-stub.h
@@ -29,7 +29,7 @@
#include "suricata-common.h"
#include "flow.h"
-#include
+#include "htp/htp_rs.h"
#include "detect.h"
#include "detect-parse.h"
@@ -53,19 +53,18 @@ static InspectionBuffer *GetRequestData(DetectEngineThreadCtx *det_ctx,
if (buffer->inspect == NULL) {
htp_tx_t *tx = (htp_tx_t *)txv;
- if (tx->request_headers == NULL)
+ if (htp_tx_request_headers(tx) == NULL)
return NULL;
- htp_header_t *h = (htp_header_t *)htp_table_get_c(tx->request_headers,
- HEADER_NAME);
- if (h == NULL || h->value == NULL) {
+ const htp_header_t *h = htp_tx_request_header(tx, HEADER_NAME);
+ if (h == NULL || htp_header_value(h) == NULL) {
SCLogDebug("HTTP %s header not present in this request",
HEADER_NAME);
return NULL;
}
- const uint32_t data_len = bstr_len(h->value);
- const uint8_t *data = bstr_ptr(h->value);
+ const uint32_t data_len = htp_header_value_len(h);
+ const uint8_t *data = htp_header_value_ptr(h);
InspectionBufferSetup(det_ctx, list_id, buffer, data, data_len);
InspectionBufferApplyTransforms(buffer, transforms);
@@ -109,19 +108,18 @@ static InspectionBuffer *GetResponseData(DetectEngineThreadCtx *det_ctx,
if (buffer->inspect == NULL) {
htp_tx_t *tx = (htp_tx_t *)txv;
- if (tx->response_headers == NULL)
+ if (htp_tx_response_headers(tx) == NULL)
return NULL;
- htp_header_t *h = (htp_header_t *)htp_table_get_c(tx->response_headers,
- HEADER_NAME);
- if (h == NULL || h->value == NULL) {
+ const htp_header_t *h = htp_tx_response_header(tx, HEADER_NAME);
+ if (h == NULL || htp_header_value(h) == NULL) {
SCLogDebug("HTTP %s header not present in this request",
HEADER_NAME);
return NULL;
}
- const uint32_t data_len = bstr_len(h->value);
- const uint8_t *data = bstr_ptr(h->value);
+ const uint32_t data_len = htp_header_value_len(h);
+ const uint8_t *data = htp_header_value_ptr(h);
InspectionBufferSetup(det_ctx, list_id, buffer, data, data_len);
InspectionBufferApplyTransforms(buffer, transforms);
@@ -187,25 +185,25 @@ static void DetectHttpHeadersRegisterStub(void)
#ifdef KEYWORD_TOSERVER
DetectAppLayerMpmRegister2(BUFFER_NAME, SIG_FLAG_TOSERVER, 2, PrefilterGenericMpmRegister,
- GetRequestData, ALPROTO_HTTP1, HTP_REQUEST_HEADERS);
+ GetRequestData, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_HEADERS);
DetectAppLayerMpmRegister2(BUFFER_NAME, SIG_FLAG_TOSERVER, 2, PrefilterGenericMpmRegister,
GetRequestData2, ALPROTO_HTTP2, HTTP2StateDataClient);
#endif
#ifdef KEYWORD_TOCLIENT
DetectAppLayerMpmRegister2(BUFFER_NAME, SIG_FLAG_TOCLIENT, 2, PrefilterGenericMpmRegister,
- GetResponseData, ALPROTO_HTTP1, HTP_RESPONSE_HEADERS);
+ GetResponseData, ALPROTO_HTTP1, HTP_RESPONSE_PROGRESS_HEADERS);
DetectAppLayerMpmRegister2(BUFFER_NAME, SIG_FLAG_TOCLIENT, 2, PrefilterGenericMpmRegister,
GetResponseData2, ALPROTO_HTTP2, HTTP2StateDataServer);
#endif
#ifdef KEYWORD_TOSERVER
DetectAppLayerInspectEngineRegister2(BUFFER_NAME, ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_HEADERS, DetectEngineInspectBufferGeneric, GetRequestData);
+ HTP_REQUEST_PROGRESS_HEADERS, DetectEngineInspectBufferGeneric, GetRequestData);
DetectAppLayerInspectEngineRegister2(BUFFER_NAME, ALPROTO_HTTP2, SIG_FLAG_TOSERVER,
HTTP2StateDataClient, DetectEngineInspectBufferGeneric, GetRequestData2);
#endif
#ifdef KEYWORD_TOCLIENT
DetectAppLayerInspectEngineRegister2(BUFFER_NAME, ALPROTO_HTTP1, SIG_FLAG_TOCLIENT,
- HTP_RESPONSE_HEADERS, DetectEngineInspectBufferGeneric, GetResponseData);
+ HTP_RESPONSE_PROGRESS_HEADERS, DetectEngineInspectBufferGeneric, GetResponseData);
DetectAppLayerInspectEngineRegister2(BUFFER_NAME, ALPROTO_HTTP2, SIG_FLAG_TOCLIENT,
HTTP2StateDataServer, DetectEngineInspectBufferGeneric, GetResponseData2);
#endif
diff --git a/src/detect-http-host.c b/src/detect-http-host.c
index 6f32044a112c..bae36e22e5e8 100644
--- a/src/detect-http-host.c
+++ b/src/detect-http-host.c
@@ -106,10 +106,10 @@ void DetectHttpHHRegister(void)
sigmatch_table[DETECT_HTTP_HOST].flags |= SIGMATCH_NOOPT|SIGMATCH_INFO_STICKY_BUFFER;
DetectAppLayerInspectEngineRegister2("http_host", ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_HEADERS, DetectEngineInspectBufferGeneric, GetData);
+ HTP_REQUEST_PROGRESS_HEADERS, DetectEngineInspectBufferGeneric, GetData);
DetectAppLayerMpmRegister2("http_host", SIG_FLAG_TOSERVER, 2, PrefilterGenericMpmRegister,
- GetData, ALPROTO_HTTP1, HTP_REQUEST_HEADERS);
+ GetData, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_HEADERS);
DetectAppLayerInspectEngineRegister2("http_host", ALPROTO_HTTP2, SIG_FLAG_TOSERVER,
HTTP2StateDataClient, DetectEngineInspectBufferGeneric, GetData2);
@@ -141,10 +141,10 @@ void DetectHttpHHRegister(void)
sigmatch_table[DETECT_HTTP_HOST_RAW].flags |= SIGMATCH_NOOPT|SIGMATCH_INFO_STICKY_BUFFER;
DetectAppLayerInspectEngineRegister2("http_raw_host", ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_HEADERS, DetectEngineInspectBufferGeneric, GetRawData);
+ HTP_REQUEST_PROGRESS_HEADERS, DetectEngineInspectBufferGeneric, GetRawData);
DetectAppLayerMpmRegister2("http_raw_host", SIG_FLAG_TOSERVER, 2, PrefilterGenericMpmRegister,
- GetRawData, ALPROTO_HTTP1, HTP_REQUEST_HEADERS);
+ GetRawData, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_HEADERS);
DetectAppLayerInspectEngineRegister2("http_raw_host", ALPROTO_HTTP2, SIG_FLAG_TOSERVER,
HTTP2StateDataClient, DetectEngineInspectBufferGeneric, GetRawData2);
@@ -242,11 +242,11 @@ static InspectionBuffer *GetData(DetectEngineThreadCtx *det_ctx,
if (buffer->inspect == NULL) {
htp_tx_t *tx = (htp_tx_t *)txv;
- if (tx->request_hostname == NULL)
+ if (htp_tx_request_hostname(tx) == NULL)
return NULL;
- const uint32_t data_len = bstr_len(tx->request_hostname);
- const uint8_t *data = bstr_ptr(tx->request_hostname);
+ const uint32_t data_len = bstr_len(htp_tx_request_hostname(tx));
+ const uint8_t *data = bstr_ptr(htp_tx_request_hostname(tx));
InspectionBufferSetup(det_ctx, list_id, buffer, data, data_len);
InspectionBufferApplyTransforms(buffer, transforms);
@@ -345,20 +345,19 @@ static InspectionBuffer *GetRawData(DetectEngineThreadCtx *det_ctx,
const uint8_t *data = NULL;
uint32_t data_len = 0;
- if (tx->parsed_uri == NULL || tx->parsed_uri->hostname == NULL) {
- if (tx->request_headers == NULL)
+ if (htp_uri_hostname(htp_tx_parsed_uri(tx)) == NULL) {
+ if (htp_tx_request_headers(tx) == NULL)
return NULL;
- htp_header_t *h = (htp_header_t *)htp_table_get_c(tx->request_headers,
- "Host");
- if (h == NULL || h->value == NULL)
+ const htp_header_t *h = htp_tx_request_header(tx, "Host");
+ if (htp_header_value(h) == NULL)
return NULL;
- data = (const uint8_t *)bstr_ptr(h->value);
- data_len = bstr_len(h->value);
+ data = htp_header_value_ptr(h);
+ data_len = htp_header_value_len(h);
} else {
- data = (const uint8_t *)bstr_ptr(tx->parsed_uri->hostname);
- data_len = bstr_len(tx->parsed_uri->hostname);
+ data = (const uint8_t *)bstr_ptr(htp_uri_hostname(htp_tx_parsed_uri(tx)));
+ data_len = bstr_len(htp_uri_hostname(htp_tx_parsed_uri(tx)));
}
InspectionBufferSetup(det_ctx, list_id, buffer, data, data_len);
diff --git a/src/detect-http-method.c b/src/detect-http-method.c
index 0ce246359ce9..4877c42c5209 100644
--- a/src/detect-http-method.c
+++ b/src/detect-http-method.c
@@ -98,10 +98,10 @@ void DetectHttpMethodRegister(void)
sigmatch_table[DETECT_HTTP_METHOD].flags |= SIGMATCH_NOOPT|SIGMATCH_INFO_STICKY_BUFFER;
DetectAppLayerInspectEngineRegister2("http_method", ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_LINE, DetectEngineInspectBufferGeneric, GetData);
+ HTP_REQUEST_PROGRESS_LINE, DetectEngineInspectBufferGeneric, GetData);
DetectAppLayerMpmRegister2("http_method", SIG_FLAG_TOSERVER, 4, PrefilterGenericMpmRegister,
- GetData, ALPROTO_HTTP1, HTP_REQUEST_LINE);
+ GetData, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_LINE);
DetectAppLayerInspectEngineRegister2("http_method", ALPROTO_HTTP2, SIG_FLAG_TOSERVER,
HTTP2StateDataClient, DetectEngineInspectBufferGeneric, GetData2);
@@ -203,11 +203,11 @@ static InspectionBuffer *GetData(DetectEngineThreadCtx *det_ctx,
if (buffer->inspect == NULL) {
htp_tx_t *tx = (htp_tx_t *)txv;
- if (tx->request_method == NULL)
+ if (htp_tx_request_method(tx) == NULL)
return NULL;
- const uint32_t data_len = bstr_len(tx->request_method);
- const uint8_t *data = bstr_ptr(tx->request_method);
+ const uint32_t data_len = bstr_len(htp_tx_request_method(tx));
+ const uint8_t *data = bstr_ptr(htp_tx_request_method(tx));
InspectionBufferSetup(det_ctx, list_id, buffer, data, data_len);
InspectionBufferApplyTransforms(buffer, transforms);
diff --git a/src/detect-http-protocol.c b/src/detect-http-protocol.c
index 9dc3455d2149..ba523ce1bb13 100644
--- a/src/detect-http-protocol.c
+++ b/src/detect-http-protocol.c
@@ -87,13 +87,13 @@ static InspectionBuffer *GetData(DetectEngineThreadCtx *det_ctx,
{
InspectionBuffer *buffer = InspectionBufferGet(det_ctx, list_id);
if (buffer->inspect == NULL) {
- bstr *str = NULL;
+ const bstr *str = NULL;
htp_tx_t *tx = (htp_tx_t *)txv;
if (flow_flags & STREAM_TOSERVER)
- str = tx->request_protocol;
+ str = htp_tx_request_protocol(tx);
else if (flow_flags & STREAM_TOCLIENT)
- str = tx->response_protocol;
+ str = htp_tx_response_protocol(tx);
if (str == NULL) {
SCLogDebug("HTTP protocol not set");
@@ -141,13 +141,13 @@ void DetectHttpProtocolRegister(void)
sigmatch_table[DETECT_AL_HTTP_PROTOCOL].flags |= SIGMATCH_INFO_STICKY_BUFFER | SIGMATCH_NOOPT;
DetectAppLayerMpmRegister2(BUFFER_NAME, SIG_FLAG_TOSERVER, 2, PrefilterGenericMpmRegister,
- GetData, ALPROTO_HTTP1, HTP_REQUEST_LINE);
+ GetData, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_LINE);
DetectAppLayerMpmRegister2(BUFFER_NAME, SIG_FLAG_TOCLIENT, 2, PrefilterGenericMpmRegister,
- GetData, ALPROTO_HTTP1, HTP_RESPONSE_LINE);
+ GetData, ALPROTO_HTTP1, HTP_RESPONSE_PROGRESS_LINE);
DetectAppLayerInspectEngineRegister2(BUFFER_NAME, ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_LINE, DetectEngineInspectBufferGeneric, GetData);
+ HTP_REQUEST_PROGRESS_LINE, DetectEngineInspectBufferGeneric, GetData);
DetectAppLayerInspectEngineRegister2(BUFFER_NAME, ALPROTO_HTTP1, SIG_FLAG_TOCLIENT,
- HTP_RESPONSE_LINE, DetectEngineInspectBufferGeneric, GetData);
+ HTP_RESPONSE_PROGRESS_LINE, DetectEngineInspectBufferGeneric, GetData);
DetectAppLayerInspectEngineRegister2(BUFFER_NAME, ALPROTO_HTTP2, SIG_FLAG_TOSERVER,
HTTP2StateDataClient, DetectEngineInspectBufferGeneric, GetData2);
diff --git a/src/detect-http-raw-header.c b/src/detect-http-raw-header.c
index 946c2233e5c2..b9b640ac05b8 100644
--- a/src/detect-http-raw-header.c
+++ b/src/detect-http-raw-header.c
@@ -96,9 +96,9 @@ void DetectHttpRawHeaderRegister(void)
sigmatch_table[DETECT_HTTP_RAW_HEADER].flags |= SIGMATCH_NOOPT|SIGMATCH_INFO_STICKY_BUFFER;
DetectAppLayerInspectEngineRegister2("http_raw_header", ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_HEADERS + 1, DetectEngineInspectBufferGeneric, GetData);
+ HTP_REQUEST_PROGRESS_HEADERS + 1, DetectEngineInspectBufferGeneric, GetData);
DetectAppLayerInspectEngineRegister2("http_raw_header", ALPROTO_HTTP1, SIG_FLAG_TOCLIENT,
- HTP_RESPONSE_HEADERS + 1, DetectEngineInspectBufferGeneric, GetData);
+ HTP_RESPONSE_PROGRESS_HEADERS + 1, DetectEngineInspectBufferGeneric, GetData);
DetectAppLayerMpmRegister2("http_raw_header", SIG_FLAG_TOSERVER, 2,
PrefilterMpmHttpHeaderRawRequestRegister, NULL, ALPROTO_HTTP1,
@@ -185,7 +185,7 @@ static InspectionBuffer *GetData(DetectEngineThreadCtx *det_ctx,
if (buffer->inspect == NULL) {
htp_tx_t *tx = (htp_tx_t *)txv;
- HtpTxUserData *tx_ud = htp_tx_get_user_data(tx);
+ HtpTxUserData *tx_ud = htp_tx_user_data(tx);
if (tx_ud == NULL)
return NULL;
@@ -274,7 +274,7 @@ static void PrefilterMpmHttpTrailerRaw(DetectEngineThreadCtx *det_ctx, const voi
SCEnter();
htp_tx_t *tx = txv;
- const HtpTxUserData *htud = (const HtpTxUserData *)htp_tx_get_user_data(tx);
+ const HtpTxUserData *htud = (const HtpTxUserData *)htp_tx_user_data(tx);
/* if the request wasn't flagged as having a trailer, we skip */
if (htud && (
((flags & STREAM_TOSERVER) && !htud->request_has_trailers) ||
@@ -303,9 +303,8 @@ static int PrefilterMpmHttpHeaderRawRequestRegister(DetectEngineCtx *de_ctx, Sig
pectx->mpm_ctx = mpm_ctx;
pectx->transforms = &mpm_reg->transforms;
- int r = PrefilterAppendTxEngine(de_ctx, sgh, PrefilterMpmHttpHeaderRaw,
- mpm_reg->app_v2.alproto, HTP_REQUEST_HEADERS+1,
- pectx, PrefilterMpmHttpHeaderRawFree, mpm_reg->pname);
+ int r = PrefilterAppendTxEngine(de_ctx, sgh, PrefilterMpmHttpHeaderRaw, mpm_reg->app_v2.alproto,
+ HTP_REQUEST_PROGRESS_HEADERS + 1, pectx, PrefilterMpmHttpHeaderRawFree, mpm_reg->pname);
if (r != 0) {
SCFree(pectx);
return r;
@@ -319,9 +318,8 @@ static int PrefilterMpmHttpHeaderRawRequestRegister(DetectEngineCtx *de_ctx, Sig
pectx->mpm_ctx = mpm_ctx;
pectx->transforms = &mpm_reg->transforms;
- r = PrefilterAppendTxEngine(de_ctx, sgh, PrefilterMpmHttpTrailerRaw,
- mpm_reg->app_v2.alproto, HTP_REQUEST_TRAILER+1,
- pectx, PrefilterMpmHttpHeaderRawFree, mpm_reg->pname);
+ r = PrefilterAppendTxEngine(de_ctx, sgh, PrefilterMpmHttpTrailerRaw, mpm_reg->app_v2.alproto,
+ HTP_REQUEST_PROGRESS_TRAILER + 1, pectx, PrefilterMpmHttpHeaderRawFree, mpm_reg->pname);
if (r != 0) {
SCFree(pectx);
}
@@ -341,9 +339,8 @@ static int PrefilterMpmHttpHeaderRawResponseRegister(DetectEngineCtx *de_ctx, Si
pectx->mpm_ctx = mpm_ctx;
pectx->transforms = &mpm_reg->transforms;
- int r = PrefilterAppendTxEngine(de_ctx, sgh, PrefilterMpmHttpHeaderRaw,
- mpm_reg->app_v2.alproto, HTP_RESPONSE_HEADERS,
- pectx, PrefilterMpmHttpHeaderRawFree, mpm_reg->pname);
+ int r = PrefilterAppendTxEngine(de_ctx, sgh, PrefilterMpmHttpHeaderRaw, mpm_reg->app_v2.alproto,
+ HTP_RESPONSE_PROGRESS_HEADERS, pectx, PrefilterMpmHttpHeaderRawFree, mpm_reg->pname);
if (r != 0) {
SCFree(pectx);
return r;
@@ -357,9 +354,8 @@ static int PrefilterMpmHttpHeaderRawResponseRegister(DetectEngineCtx *de_ctx, Si
pectx->mpm_ctx = mpm_ctx;
pectx->transforms = &mpm_reg->transforms;
- r = PrefilterAppendTxEngine(de_ctx, sgh, PrefilterMpmHttpTrailerRaw,
- mpm_reg->app_v2.alproto, HTP_RESPONSE_TRAILER,
- pectx, PrefilterMpmHttpHeaderRawFree, mpm_reg->pname);
+ r = PrefilterAppendTxEngine(de_ctx, sgh, PrefilterMpmHttpTrailerRaw, mpm_reg->app_v2.alproto,
+ HTP_RESPONSE_PROGRESS_TRAILER, pectx, PrefilterMpmHttpHeaderRawFree, mpm_reg->pname);
if (r != 0) {
SCFree(pectx);
}
diff --git a/src/detect-http-request-line.c b/src/detect-http-request-line.c
index 89d38cbd0a8a..851dddfad762 100644
--- a/src/detect-http-request-line.c
+++ b/src/detect-http-request-line.c
@@ -110,10 +110,10 @@ void DetectHttpRequestLineRegister(void)
sigmatch_table[DETECT_AL_HTTP_REQUEST_LINE].flags |= SIGMATCH_NOOPT|SIGMATCH_INFO_STICKY_BUFFER;
DetectAppLayerInspectEngineRegister2("http_request_line", ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_LINE, DetectEngineInspectBufferGeneric, GetData);
+ HTP_REQUEST_PROGRESS_LINE, DetectEngineInspectBufferGeneric, GetData);
DetectAppLayerMpmRegister2("http_request_line", SIG_FLAG_TOSERVER, 2,
- PrefilterGenericMpmRegister, GetData, ALPROTO_HTTP1, HTP_REQUEST_LINE);
+ PrefilterGenericMpmRegister, GetData, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_LINE);
DetectAppLayerInspectEngineRegister2("http_request_line", ALPROTO_HTTP2, SIG_FLAG_TOSERVER,
HTTP2StateDataClient, DetectEngineInspectBufferGeneric, GetData2);
@@ -158,11 +158,11 @@ static InspectionBuffer *GetData(DetectEngineThreadCtx *det_ctx,
InspectionBuffer *buffer = InspectionBufferGet(det_ctx, list_id);
if (buffer->inspect == NULL) {
htp_tx_t *tx = (htp_tx_t *)txv;
- if (unlikely(tx->request_line == NULL)) {
+ if (unlikely(htp_tx_request_line(tx) == NULL)) {
return NULL;
}
- const uint32_t data_len = bstr_len(tx->request_line);
- const uint8_t *data = bstr_ptr(tx->request_line);
+ const uint32_t data_len = bstr_len(htp_tx_request_line(tx));
+ const uint8_t *data = bstr_ptr(htp_tx_request_line(tx));
InspectionBufferSetup(det_ctx, list_id, buffer, data, data_len);
InspectionBufferApplyTransforms(buffer, transforms);
diff --git a/src/detect-http-response-line.c b/src/detect-http-response-line.c
index 8758644681c7..e0420a75eb7b 100644
--- a/src/detect-http-response-line.c
+++ b/src/detect-http-response-line.c
@@ -109,10 +109,10 @@ void DetectHttpResponseLineRegister(void)
sigmatch_table[DETECT_AL_HTTP_RESPONSE_LINE].flags |= SIGMATCH_NOOPT|SIGMATCH_INFO_STICKY_BUFFER;
DetectAppLayerInspectEngineRegister2("http_response_line", ALPROTO_HTTP1, SIG_FLAG_TOCLIENT,
- HTP_RESPONSE_LINE, DetectEngineInspectBufferGeneric, GetData);
+ HTP_RESPONSE_PROGRESS_LINE, DetectEngineInspectBufferGeneric, GetData);
DetectAppLayerMpmRegister2("http_response_line", SIG_FLAG_TOCLIENT, 2,
- PrefilterGenericMpmRegister, GetData, ALPROTO_HTTP1, HTP_RESPONSE_LINE);
+ PrefilterGenericMpmRegister, GetData, ALPROTO_HTTP1, HTP_RESPONSE_PROGRESS_LINE);
DetectAppLayerInspectEngineRegister2("http_response_line", ALPROTO_HTTP2, SIG_FLAG_TOCLIENT,
HTTP2StateDataServer, DetectEngineInspectBufferGeneric, GetData2);
@@ -157,11 +157,11 @@ static InspectionBuffer *GetData(DetectEngineThreadCtx *det_ctx,
InspectionBuffer *buffer = InspectionBufferGet(det_ctx, list_id);
if (buffer->inspect == NULL) {
htp_tx_t *tx = (htp_tx_t *)txv;
- if (unlikely(tx->response_line == NULL)) {
+ if (unlikely(htp_tx_response_line(tx) == NULL)) {
return NULL;
}
- const uint32_t data_len = bstr_len(tx->response_line);
- const uint8_t *data = bstr_ptr(tx->response_line);
+ const uint32_t data_len = bstr_len(htp_tx_response_line(tx));
+ const uint8_t *data = bstr_ptr(htp_tx_response_line(tx));
InspectionBufferSetup(det_ctx, list_id, buffer, data, data_len);
InspectionBufferApplyTransforms(buffer, transforms);
diff --git a/src/detect-http-start.c b/src/detect-http-start.c
index fed1abc96256..f66ac7f4c18d 100644
--- a/src/detect-http-start.c
+++ b/src/detect-http-start.c
@@ -85,20 +85,20 @@ static uint8_t *GetBufferForTX(
return NULL;
}
- bstr *line = NULL;
- htp_table_t *headers;
+ const bstr *line = NULL;
+ const htp_headers_t *headers;
if (flags & STREAM_TOSERVER) {
if (AppLayerParserGetStateProgress(IPPROTO_TCP, ALPROTO_HTTP1, tx, flags) <=
- HTP_REQUEST_HEADERS)
+ HTP_REQUEST_PROGRESS_HEADERS)
return NULL;
- line = tx->request_line;
- headers = tx->request_headers;
+ line = htp_tx_request_line(tx);
+ headers = htp_tx_request_headers(tx);
} else {
if (AppLayerParserGetStateProgress(IPPROTO_TCP, ALPROTO_HTTP1, tx, flags) <=
- HTP_RESPONSE_HEADERS)
+ HTP_RESPONSE_PROGRESS_HEADERS)
return NULL;
- headers = tx->response_headers;
- line = tx->response_line;
+ headers = htp_tx_response_headers(tx);
+ line = htp_tx_response_line(tx);
}
if (line == NULL || headers == NULL)
return NULL;
@@ -115,11 +115,11 @@ static uint8_t *GetBufferForTX(
buf->buffer[buf->len++] = '\n';
size_t i = 0;
- size_t no_of_headers = htp_table_size(headers);
+ size_t no_of_headers = htp_headers_size(headers);
for (; i < no_of_headers; i++) {
- htp_header_t *h = htp_table_get_index(headers, i, NULL);
- size_t size1 = bstr_size(h->name);
- size_t size2 = bstr_size(h->value);
+ const htp_header_t *h = htp_headers_get_index(headers, i);
+ size_t size1 = htp_header_name_len(h);
+ size_t size2 = htp_header_value_len(h);
size_t size = size1 + size2 + 4;
if (i + 1 == no_of_headers)
size += 2;
@@ -129,12 +129,12 @@ static uint8_t *GetBufferForTX(
}
}
- memcpy(buf->buffer + buf->len, bstr_ptr(h->name), bstr_size(h->name));
- buf->len += bstr_size(h->name);
+ memcpy(buf->buffer + buf->len, htp_header_name_ptr(h), htp_header_name_len(h));
+ buf->len += htp_header_name_len(h);
buf->buffer[buf->len++] = ':';
buf->buffer[buf->len++] = ' ';
- memcpy(buf->buffer + buf->len, bstr_ptr(h->value), bstr_size(h->value));
- buf->len += bstr_size(h->value);
+ memcpy(buf->buffer + buf->len, htp_header_value_ptr(h), htp_header_value_len(h));
+ buf->len += htp_header_value_len(h);
buf->buffer[buf->len++] = '\r';
buf->buffer[buf->len++] = '\n';
if (i + 1 == no_of_headers) {
@@ -189,14 +189,14 @@ void DetectHttpStartRegister(void)
sigmatch_table[DETECT_AL_HTTP_START].flags |= SIGMATCH_NOOPT|SIGMATCH_INFO_STICKY_BUFFER;
DetectAppLayerMpmRegister2(BUFFER_NAME, SIG_FLAG_TOSERVER, 2, PrefilterGenericMpmRegister,
- GetBuffer1ForTX, ALPROTO_HTTP1, HTP_REQUEST_HEADERS);
+ GetBuffer1ForTX, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_HEADERS);
DetectAppLayerMpmRegister2(BUFFER_NAME, SIG_FLAG_TOCLIENT, 2, PrefilterGenericMpmRegister,
- GetBuffer1ForTX, ALPROTO_HTTP1, HTP_RESPONSE_HEADERS);
+ GetBuffer1ForTX, ALPROTO_HTTP1, HTP_RESPONSE_PROGRESS_HEADERS);
DetectAppLayerInspectEngineRegister2(BUFFER_NAME, ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_HEADERS, DetectEngineInspectBufferGeneric, GetBuffer1ForTX);
+ HTP_REQUEST_PROGRESS_HEADERS, DetectEngineInspectBufferGeneric, GetBuffer1ForTX);
DetectAppLayerInspectEngineRegister2(BUFFER_NAME, ALPROTO_HTTP1, SIG_FLAG_TOCLIENT,
- HTP_RESPONSE_HEADERS, DetectEngineInspectBufferGeneric, GetBuffer1ForTX);
+ HTP_RESPONSE_PROGRESS_HEADERS, DetectEngineInspectBufferGeneric, GetBuffer1ForTX);
DetectBufferTypeSetDescriptionByName(BUFFER_NAME,
BUFFER_DESC);
diff --git a/src/detect-http-stat-code.c b/src/detect-http-stat-code.c
index 1e7087a318b3..9415985d1d20 100644
--- a/src/detect-http-stat-code.c
+++ b/src/detect-http-stat-code.c
@@ -99,10 +99,10 @@ void DetectHttpStatCodeRegister (void)
sigmatch_table[DETECT_HTTP_STAT_CODE].flags |= SIGMATCH_NOOPT|SIGMATCH_INFO_STICKY_BUFFER;
DetectAppLayerInspectEngineRegister2("http_stat_code", ALPROTO_HTTP1, SIG_FLAG_TOCLIENT,
- HTP_RESPONSE_LINE, DetectEngineInspectBufferGeneric, GetData);
+ HTP_RESPONSE_PROGRESS_LINE, DetectEngineInspectBufferGeneric, GetData);
DetectAppLayerMpmRegister2("http_stat_code", SIG_FLAG_TOCLIENT, 4, PrefilterGenericMpmRegister,
- GetData, ALPROTO_HTTP1, HTP_RESPONSE_LINE);
+ GetData, ALPROTO_HTTP1, HTP_RESPONSE_PROGRESS_LINE);
DetectAppLayerInspectEngineRegister2("http_stat_code", ALPROTO_HTTP2, SIG_FLAG_TOCLIENT,
HTTP2StateDataServer, DetectEngineInspectBufferGeneric, GetData2);
@@ -161,11 +161,11 @@ static InspectionBuffer *GetData(DetectEngineThreadCtx *det_ctx,
if (buffer->inspect == NULL) {
htp_tx_t *tx = (htp_tx_t *)txv;
- if (tx->response_status == NULL)
+ if (htp_tx_response_status(tx) == NULL)
return NULL;
- const uint32_t data_len = bstr_len(tx->response_status);
- const uint8_t *data = bstr_ptr(tx->response_status);
+ const uint32_t data_len = bstr_len(htp_tx_response_status(tx));
+ const uint8_t *data = bstr_ptr(htp_tx_response_status(tx));
InspectionBufferSetup(det_ctx, list_id, buffer, data, data_len);
InspectionBufferApplyTransforms(buffer, transforms);
diff --git a/src/detect-http-stat-msg.c b/src/detect-http-stat-msg.c
index 6be7de64f756..14f93e5979e2 100644
--- a/src/detect-http-stat-msg.c
+++ b/src/detect-http-stat-msg.c
@@ -109,10 +109,10 @@ void DetectHttpStatMsgRegister (void)
sigmatch_table[DETECT_HTTP_STAT_MSG].flags |= SIGMATCH_NOOPT|SIGMATCH_INFO_STICKY_BUFFER;
DetectAppLayerInspectEngineRegister2("http_stat_msg", ALPROTO_HTTP1, SIG_FLAG_TOCLIENT,
- HTP_RESPONSE_LINE, DetectEngineInspectBufferGeneric, GetData);
+ HTP_RESPONSE_PROGRESS_LINE, DetectEngineInspectBufferGeneric, GetData);
DetectAppLayerMpmRegister2("http_stat_msg", SIG_FLAG_TOCLIENT, 3, PrefilterGenericMpmRegister,
- GetData, ALPROTO_HTTP1, HTP_RESPONSE_LINE);
+ GetData, ALPROTO_HTTP1, HTP_RESPONSE_PROGRESS_LINE);
DetectAppLayerInspectEngineRegister2("http_stat_msg", ALPROTO_HTTP2, SIG_FLAG_TOCLIENT,
HTTP2StateDataServer, DetectEngineInspectBufferGeneric, GetData2);
@@ -170,11 +170,11 @@ static InspectionBuffer *GetData(DetectEngineThreadCtx *det_ctx,
if (buffer->inspect == NULL) {
htp_tx_t *tx = (htp_tx_t *)txv;
- if (tx->response_message == NULL)
+ if (htp_tx_response_message(tx) == NULL)
return NULL;
- const uint32_t data_len = bstr_len(tx->response_message);
- const uint8_t *data = bstr_ptr(tx->response_message);
+ const uint32_t data_len = bstr_len(htp_tx_response_message(tx));
+ const uint8_t *data = bstr_ptr(htp_tx_response_message(tx));
InspectionBufferSetup(det_ctx, list_id, buffer, data, data_len);
InspectionBufferApplyTransforms(buffer, transforms);
diff --git a/src/detect-http-ua.c b/src/detect-http-ua.c
index 7138cf93fea4..408384948982 100644
--- a/src/detect-http-ua.c
+++ b/src/detect-http-ua.c
@@ -99,10 +99,10 @@ void DetectHttpUARegister(void)
sigmatch_table[DETECT_HTTP_UA].flags |= SIGMATCH_INFO_STICKY_BUFFER;
DetectAppLayerInspectEngineRegister2("http_user_agent", ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_HEADERS, DetectEngineInspectBufferGeneric, GetData);
+ HTP_REQUEST_PROGRESS_HEADERS, DetectEngineInspectBufferGeneric, GetData);
DetectAppLayerMpmRegister2("http_user_agent", SIG_FLAG_TOSERVER, 2, PrefilterGenericMpmRegister,
- GetData, ALPROTO_HTTP1, HTP_REQUEST_HEADERS);
+ GetData, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_HEADERS);
DetectAppLayerInspectEngineRegister2("http_user_agent", ALPROTO_HTTP2, SIG_FLAG_TOSERVER,
HTTP2StateDataClient, DetectEngineInspectBufferGeneric, GetData2);
@@ -161,18 +161,17 @@ static InspectionBuffer *GetData(DetectEngineThreadCtx *det_ctx,
if (buffer->inspect == NULL) {
htp_tx_t *tx = (htp_tx_t *)txv;
- if (tx->request_headers == NULL)
+ if (htp_tx_request_headers(tx) == NULL)
return NULL;
- htp_header_t *h = (htp_header_t *)htp_table_get_c(tx->request_headers,
- "User-Agent");
- if (h == NULL || h->value == NULL) {
+ const htp_header_t *h = htp_tx_request_header(tx, "User-Agent");
+ if (h == NULL || htp_header_value(h) == NULL) {
SCLogDebug("HTTP UA header not present in this request");
return NULL;
}
- const uint32_t data_len = bstr_len(h->value);
- const uint8_t *data = bstr_ptr(h->value);
+ const uint32_t data_len = htp_header_value_len(h);
+ const uint8_t *data = htp_header_value_ptr(h);
InspectionBufferSetup(det_ctx, list_id, buffer, data, data_len);
InspectionBufferApplyTransforms(buffer, transforms);
diff --git a/src/detect-http-uri.c b/src/detect-http-uri.c
index cc43023a783a..e38fa43eb1af 100644
--- a/src/detect-http-uri.c
+++ b/src/detect-http-uri.c
@@ -108,10 +108,10 @@ void DetectHttpUriRegister (void)
sigmatch_table[DETECT_HTTP_URI].flags |= SIGMATCH_NOOPT|SIGMATCH_INFO_STICKY_BUFFER;
DetectAppLayerInspectEngineRegister2("http_uri", ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_LINE, DetectEngineInspectBufferGeneric, GetData);
+ HTP_REQUEST_PROGRESS_LINE, DetectEngineInspectBufferGeneric, GetData);
DetectAppLayerMpmRegister2("http_uri", SIG_FLAG_TOSERVER, 2, PrefilterGenericMpmRegister,
- GetData, ALPROTO_HTTP1, HTP_REQUEST_LINE);
+ GetData, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_LINE);
DetectAppLayerInspectEngineRegister2("http_uri", ALPROTO_HTTP2, SIG_FLAG_TOSERVER,
HTTP2StateDataClient, DetectEngineInspectBufferGeneric, GetData2);
@@ -146,10 +146,10 @@ void DetectHttpUriRegister (void)
sigmatch_table[DETECT_HTTP_URI_RAW].flags |= SIGMATCH_NOOPT|SIGMATCH_INFO_STICKY_BUFFER;
DetectAppLayerInspectEngineRegister2("http_raw_uri", ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_LINE, DetectEngineInspectBufferGeneric, GetRawData);
+ HTP_REQUEST_PROGRESS_LINE, DetectEngineInspectBufferGeneric, GetRawData);
DetectAppLayerMpmRegister2("http_raw_uri", SIG_FLAG_TOSERVER, 2, PrefilterGenericMpmRegister,
- GetRawData, ALPROTO_HTTP1, HTP_REQUEST_LINE);
+ GetRawData, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_LINE);
// no difference between raw and decoded uri for HTTP2
DetectAppLayerInspectEngineRegister2("http_raw_uri", ALPROTO_HTTP2, SIG_FLAG_TOSERVER,
@@ -226,15 +226,12 @@ static InspectionBuffer *GetData(DetectEngineThreadCtx *det_ctx,
InspectionBuffer *buffer = InspectionBufferGet(det_ctx, list_id);
if (!buffer->initialized) {
htp_tx_t *tx = (htp_tx_t *)txv;
- HtpTxUserData *tx_ud = htp_tx_get_user_data(tx);
-
- if (tx_ud == NULL || tx_ud->request_uri_normalized == NULL) {
- SCLogDebug("no tx_id or uri");
+ bstr *request_uri_normalized = (bstr *)htp_tx_normalized_uri(tx);
+ if (request_uri_normalized == NULL)
return NULL;
- }
- const uint32_t data_len = bstr_len(tx_ud->request_uri_normalized);
- const uint8_t *data = bstr_ptr(tx_ud->request_uri_normalized);
+ const uint32_t data_len = bstr_len(request_uri_normalized);
+ const uint8_t *data = bstr_ptr(request_uri_normalized);
InspectionBufferSetup(det_ctx, list_id, buffer, data, data_len);
InspectionBufferApplyTransforms(buffer, transforms);
@@ -321,11 +318,11 @@ static InspectionBuffer *GetRawData(DetectEngineThreadCtx *det_ctx,
InspectionBuffer *buffer = InspectionBufferGet(det_ctx, list_id);
if (!buffer->initialized) {
htp_tx_t *tx = (htp_tx_t *)txv;
- if (unlikely(tx->request_uri == NULL)) {
+ if (unlikely(htp_tx_request_uri(tx) == NULL)) {
return NULL;
}
- const uint32_t data_len = bstr_len(tx->request_uri);
- const uint8_t *data = bstr_ptr(tx->request_uri);
+ const uint32_t data_len = bstr_len(htp_tx_request_uri(tx));
+ const uint8_t *data = bstr_ptr(htp_tx_request_uri(tx));
InspectionBufferSetup(det_ctx, list_id, buffer, data, data_len);
InspectionBufferApplyTransforms(buffer, transforms);
diff --git a/src/detect-lua.c b/src/detect-lua.c
index 18302cf7bdad..519386b557f4 100644
--- a/src/detect-lua.c
+++ b/src/detect-lua.c
@@ -377,12 +377,12 @@ static int DetectLuaMatch (DetectEngineThreadCtx *det_ctx,
if (tx == NULL)
continue;
- if ((tlua->flags & DATATYPE_HTTP_REQUEST_LINE) && tx->request_line != NULL &&
- bstr_len(tx->request_line) > 0) {
+ if ((tlua->flags & DATATYPE_HTTP_REQUEST_LINE) && htp_tx_request_line(tx) != NULL &&
+ bstr_len(htp_tx_request_line(tx)) > 0) {
lua_pushliteral(tlua->luastate, "http.request_line"); /* stack at -2 */
LuaPushStringBuffer(tlua->luastate,
- (const uint8_t *)bstr_ptr(tx->request_line),
- bstr_len(tx->request_line));
+ (const uint8_t *)bstr_ptr(htp_tx_request_line(tx)),
+ bstr_len(htp_tx_request_line(tx)));
lua_settable(tlua->luastate, -3);
}
}
@@ -487,12 +487,12 @@ static int DetectLuaAppMatchCommon (DetectEngineThreadCtx *det_ctx,
htp_tx_t *tx = NULL;
tx = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, htp_state, det_ctx->tx_id);
if (tx != NULL) {
- if ((tlua->flags & DATATYPE_HTTP_REQUEST_LINE) && tx->request_line != NULL &&
- bstr_len(tx->request_line) > 0) {
+ if ((tlua->flags & DATATYPE_HTTP_REQUEST_LINE) && htp_tx_request_line(tx) != NULL &&
+ bstr_len(htp_tx_request_line(tx)) > 0) {
lua_pushliteral(tlua->luastate, "http.request_line"); /* stack at -2 */
LuaPushStringBuffer(tlua->luastate,
- (const uint8_t *)bstr_ptr(tx->request_line),
- bstr_len(tx->request_line));
+ (const uint8_t *)bstr_ptr(htp_tx_request_line(tx)),
+ bstr_len(htp_tx_request_line(tx)));
lua_settable(tlua->luastate, -3);
}
}
diff --git a/src/detect-pcre.c b/src/detect-pcre.c
index 5b095bfbbc11..b710a6b4f536 100644
--- a/src/detect-pcre.c
+++ b/src/detect-pcre.c
@@ -1617,7 +1617,7 @@ static int DetectPcreTxBodyChunksTest01(void)
htp_tx_t *t1 = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, htp_state, 0);
htp_tx_t *t2 = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, htp_state, 1);
- HtpTxUserData *htud = (HtpTxUserData *) htp_tx_get_user_data(t1);
+ HtpTxUserData *htud = (HtpTxUserData *)htp_tx_user_data(t1);
FAIL_IF(htud == NULL);
HtpBodyChunk *cur = htud->request_body.first;
@@ -1625,7 +1625,7 @@ static int DetectPcreTxBodyChunksTest01(void)
FAIL_IF(StreamingBufferSegmentCompareRawData(htud->request_body.sb, &cur->sbseg, (uint8_t *)"Body one!!", 10) != 1);
- htud = (HtpTxUserData *) htp_tx_get_user_data(t2);
+ htud = (HtpTxUserData *)htp_tx_user_data(t2);
cur = htud->request_body.first;
FAIL_IF(htud->request_body.first == NULL);
@@ -1765,14 +1765,14 @@ static int DetectPcreTxBodyChunksTest02(void)
htp_tx_t *t1 = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, htp_state, 0);
htp_tx_t *t2 = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, htp_state, 1);
- HtpTxUserData *htud = (HtpTxUserData *) htp_tx_get_user_data(t1);
+ HtpTxUserData *htud = (HtpTxUserData *)htp_tx_user_data(t1);
HtpBodyChunk *cur = htud->request_body.first;
FAIL_IF(htud->request_body.first == NULL);
FAIL_IF(StreamingBufferSegmentCompareRawData(htud->request_body.sb, &cur->sbseg, (uint8_t *)"Body one!!", 10) != 1);
- htud = (HtpTxUserData *) htp_tx_get_user_data(t2);
+ htud = (HtpTxUserData *)htp_tx_user_data(t2);
cur = htud->request_body.first;
FAIL_IF(htud->request_body.first == NULL);
diff --git a/src/log-httplog.c b/src/log-httplog.c
index 1e45053abb2c..3ab6a169f71e 100644
--- a/src/log-httplog.c
+++ b/src/log-httplog.c
@@ -100,12 +100,12 @@ typedef struct LogHttpLogThread_ {
} LogHttpLogThread;
/* Retrieves the selected cookie value */
-static uint32_t GetCookieValue(uint8_t *rawcookies, uint32_t rawcookies_len, char *cookiename,
- uint8_t **cookievalue)
+static uint32_t GetCookieValue(const uint8_t *rawcookies, uint32_t rawcookies_len, char *cookiename,
+ const uint8_t **cookievalue)
{
- uint8_t *p = rawcookies;
- uint8_t *cn = p; /* ptr to cookie name start */
- uint8_t *cv = NULL; /* ptr to cookie value start */
+ const uint8_t *p = rawcookies;
+ const uint8_t *cn = p; /* ptr to cookie name start */
+ const uint8_t *cv = NULL; /* ptr to cookie value start */
while (p < rawcookies + rawcookies_len) {
if (cv == NULL && *p == '=') {
cv = p + 1;
@@ -134,11 +134,11 @@ static void LogHttpLogCustom(LogHttpLogThread *aft, htp_tx_t *tx, const SCTime_t
uint32_t datalen;
char buf[128];
- uint8_t *cvalue = NULL;
+ const uint8_t *cvalue = NULL;
uint32_t cvalue_len = 0;
- htp_header_t *h_request_hdr;
- htp_header_t *h_response_hdr;
+ const htp_header_t *h_request_hdr;
+ const htp_header_t *h_response_hdr;
for (i = 0; i < httplog_ctx->cf->cf_n; i++) {
h_request_hdr = NULL;
@@ -183,80 +183,73 @@ static void LogHttpLogCustom(LogHttpLogThread *aft, htp_tx_t *tx, const SCTime_t
break;
case LOG_HTTP_CF_REQUEST_METHOD:
/* METHOD */
- if (tx->request_method != NULL) {
- PrintRawUriBuf((char *)aft->buffer->buffer, &aft->buffer->offset,
- aft->buffer->size, (uint8_t *)bstr_ptr(tx->request_method),
- bstr_len(tx->request_method));
- } else {
- MemBufferWriteString(aft->buffer, LOG_CF_NONE);
- }
+ if (htp_tx_request_method(tx) != NULL) {
+ PrintRawUriBuf((char *)aft->buffer->buffer, &aft->buffer->offset, aft->buffer->size,
+ (uint8_t *)bstr_ptr(htp_tx_request_method(tx)),
+ bstr_len(htp_tx_request_method(tx)));
+ } else {
+ MemBufferWriteString(aft->buffer, LOG_CF_NONE);
+ }
break;
case LOG_HTTP_CF_REQUEST_URI:
/* URI */
- if (tx->request_uri != NULL) {
- datalen = node->maxlen;
- if (datalen == 0 || datalen > bstr_len(tx->request_uri)) {
- datalen = bstr_len(tx->request_uri);
- }
- PrintRawUriBuf((char *)aft->buffer->buffer, &aft->buffer->offset,
- aft->buffer->size, (uint8_t *)bstr_ptr(tx->request_uri),
- datalen);
- } else {
- MemBufferWriteString(aft->buffer, LOG_CF_NONE);
+ if (htp_tx_request_uri(tx) != NULL) {
+ datalen = node->maxlen;
+ if (datalen == 0 || datalen > bstr_len(htp_tx_request_uri(tx))) {
+ datalen = bstr_len(htp_tx_request_uri(tx));
}
+ PrintRawUriBuf((char *)aft->buffer->buffer, &aft->buffer->offset, aft->buffer->size,
+ (uint8_t *)bstr_ptr(htp_tx_request_uri(tx)), datalen);
+ } else {
+ MemBufferWriteString(aft->buffer, LOG_CF_NONE);
+ }
break;
case LOG_HTTP_CF_REQUEST_HOST:
/* HOSTNAME */
- if (tx->request_hostname != NULL)
- {
- datalen = node->maxlen;
- if (datalen == 0 || datalen > bstr_len(tx->request_hostname)) {
- datalen = bstr_len(tx->request_hostname);
- }
- PrintRawUriBuf((char *)aft->buffer->buffer, &aft->buffer->offset,
- aft->buffer->size, (uint8_t *)bstr_ptr(tx->request_hostname),
- datalen);
- } else {
- MemBufferWriteString(aft->buffer, LOG_CF_NONE);
+ if (htp_tx_request_hostname(tx) != NULL) {
+ datalen = node->maxlen;
+ if (datalen == 0 || datalen > bstr_len(htp_tx_request_hostname(tx))) {
+ datalen = bstr_len(htp_tx_request_hostname(tx));
}
+ PrintRawUriBuf((char *)aft->buffer->buffer, &aft->buffer->offset, aft->buffer->size,
+ (uint8_t *)bstr_ptr(htp_tx_request_hostname(tx)), datalen);
+ } else {
+ MemBufferWriteString(aft->buffer, LOG_CF_NONE);
+ }
break;
case LOG_HTTP_CF_REQUEST_PROTOCOL:
/* PROTOCOL */
- if (tx->request_protocol != NULL) {
- PrintRawUriBuf((char *)aft->buffer->buffer, &aft->buffer->offset,
- aft->buffer->size, (uint8_t *)bstr_ptr(tx->request_protocol),
- bstr_len(tx->request_protocol));
- } else {
- MemBufferWriteString(aft->buffer, LOG_CF_NONE);
- }
+ if (htp_tx_request_protocol(tx) != NULL) {
+ PrintRawUriBuf((char *)aft->buffer->buffer, &aft->buffer->offset, aft->buffer->size,
+ (uint8_t *)bstr_ptr(htp_tx_request_protocol(tx)),
+ bstr_len(htp_tx_request_protocol(tx)));
+ } else {
+ MemBufferWriteString(aft->buffer, LOG_CF_NONE);
+ }
break;
case LOG_HTTP_CF_REQUEST_HEADER:
/* REQUEST HEADER */
- if (tx->request_headers != NULL) {
- h_request_hdr = htp_table_get_c(tx->request_headers, node->data);
- }
- if (h_request_hdr != NULL) {
- datalen = node->maxlen;
- if (datalen == 0 || datalen > bstr_len(h_request_hdr->value)) {
- datalen = bstr_len(h_request_hdr->value);
- }
- PrintRawUriBuf((char *)aft->buffer->buffer, &aft->buffer->offset,
- aft->buffer->size, (uint8_t *)bstr_ptr(h_request_hdr->value),
- datalen);
- } else {
- MemBufferWriteString(aft->buffer, LOG_CF_NONE);
+ h_request_hdr = htp_tx_request_header(tx, node->data);
+ if (h_request_hdr != NULL) {
+ datalen = node->maxlen;
+ if (datalen == 0 || datalen > htp_header_value_len(h_request_hdr)) {
+ datalen = htp_header_value_len(h_request_hdr);
}
+ PrintRawUriBuf((char *)aft->buffer->buffer, &aft->buffer->offset, aft->buffer->size,
+ htp_header_value_ptr(h_request_hdr), datalen);
+ } else {
+ MemBufferWriteString(aft->buffer, LOG_CF_NONE);
+ }
break;
case LOG_HTTP_CF_REQUEST_COOKIE:
/* REQUEST COOKIE */
- if (tx->request_headers != NULL) {
- h_request_hdr = htp_table_get_c(tx->request_headers, "Cookie");
- if (h_request_hdr != NULL) {
- cvalue_len = GetCookieValue((uint8_t *) bstr_ptr(h_request_hdr->value),
- bstr_len(h_request_hdr->value), (char *) node->data,
- &cvalue);
- }
+ if (htp_tx_request_headers(tx) != NULL) {
+ h_request_hdr = htp_tx_request_header(tx, "Cookie");
+ if (h_request_hdr != NULL) {
+ cvalue_len = GetCookieValue(htp_header_value_ptr(h_request_hdr),
+ htp_header_value_len(h_request_hdr), (char *)node->data, &cvalue);
}
+ }
if (cvalue_len > 0 && cvalue != NULL) {
datalen = node->maxlen;
if (datalen == 0 || datalen > cvalue_len) {
@@ -270,40 +263,40 @@ static void LogHttpLogCustom(LogHttpLogThread *aft, htp_tx_t *tx, const SCTime_t
break;
case LOG_HTTP_CF_REQUEST_LEN:
/* REQUEST LEN */
- MemBufferWriteString(aft->buffer, "%"PRIuMAX"", (uintmax_t)tx->request_message_len);
- break;
+ MemBufferWriteString(
+ aft->buffer, "%" PRIuMAX "", (uintmax_t)htp_tx_request_message_len(tx));
+ break;
case LOG_HTTP_CF_RESPONSE_STATUS:
/* RESPONSE STATUS */
- if (tx->response_status != NULL) {
- PrintRawUriBuf((char *)aft->buffer->buffer, &aft->buffer->offset,
- aft->buffer->size, (uint8_t *)bstr_ptr(tx->response_status),
- bstr_len(tx->response_status));
- } else {
- MemBufferWriteString(aft->buffer, LOG_CF_NONE);
- }
+ if (htp_tx_response_status(tx) != NULL) {
+ PrintRawUriBuf((char *)aft->buffer->buffer, &aft->buffer->offset, aft->buffer->size,
+ (uint8_t *)bstr_ptr(htp_tx_response_status(tx)),
+ bstr_len(htp_tx_response_status(tx)));
+ } else {
+ MemBufferWriteString(aft->buffer, LOG_CF_NONE);
+ }
break;
case LOG_HTTP_CF_RESPONSE_HEADER:
/* RESPONSE HEADER */
- if (tx->response_headers != NULL) {
- h_response_hdr = htp_table_get_c(tx->response_headers,
- node->data);
- }
+ if (htp_tx_response_headers(tx) != NULL) {
+ h_response_hdr = htp_tx_response_header(tx, node->data);
+ }
if (h_response_hdr != NULL) {
datalen = node->maxlen;
- if (datalen == 0 || datalen > bstr_len(h_response_hdr->value)) {
- datalen = bstr_len(h_response_hdr->value);
+ if (datalen == 0 || datalen > htp_header_value_len(h_response_hdr)) {
+ datalen = htp_header_value_len(h_response_hdr);
}
PrintRawUriBuf((char *)aft->buffer->buffer, &aft->buffer->offset,
- aft->buffer->size, (uint8_t *)bstr_ptr(h_response_hdr->value),
- datalen);
+ aft->buffer->size, htp_header_value_ptr(h_response_hdr), datalen);
} else {
MemBufferWriteString(aft->buffer, LOG_CF_NONE);
}
break;
case LOG_HTTP_CF_RESPONSE_LEN:
/* RESPONSE LEN */
- MemBufferWriteString(aft->buffer, "%"PRIuMAX"", (uintmax_t)tx->response_message_len);
- break;
+ MemBufferWriteString(
+ aft->buffer, "%" PRIuMAX "", (uintmax_t)htp_tx_response_message_len(tx));
+ break;
default:
/* NO MATCH */
MemBufferWriteString(aft->buffer, LOG_CF_NONE);
@@ -319,14 +312,11 @@ static void LogHttpLogExtended(LogHttpLogThread *aft, htp_tx_t *tx)
LOG_CF_WRITE_STAR_SEPARATOR(aft->buffer);
/* referer */
- htp_header_t *h_referer = NULL;
- if (tx->request_headers != NULL) {
- h_referer = htp_table_get_c(tx->request_headers, "referer");
- }
+ const htp_header_t *h_referer = htp_tx_request_header(tx, "referer");
+
if (h_referer != NULL) {
PrintRawUriBuf((char *)aft->buffer->buffer, &aft->buffer->offset, aft->buffer->size,
- (uint8_t *)bstr_ptr(h_referer->value),
- bstr_len(h_referer->value));
+ htp_header_value_ptr(h_referer), htp_header_value_len(h_referer));
} else {
MemBufferWriteString(aft->buffer, "");
}
@@ -334,37 +324,37 @@ static void LogHttpLogExtended(LogHttpLogThread *aft, htp_tx_t *tx)
LOG_CF_WRITE_STAR_SEPARATOR(aft->buffer);
/* method */
- if (tx->request_method != NULL) {
+ if (htp_tx_request_method(tx) != NULL) {
PrintRawUriBuf((char *)aft->buffer->buffer, &aft->buffer->offset, aft->buffer->size,
- (uint8_t *)bstr_ptr(tx->request_method),
- bstr_len(tx->request_method));
+ (uint8_t *)bstr_ptr(htp_tx_request_method(tx)),
+ bstr_len(htp_tx_request_method(tx)));
}
LOG_CF_WRITE_STAR_SEPARATOR(aft->buffer);
/* protocol */
- if (tx->request_protocol != NULL) {
+ if (htp_tx_request_protocol(tx) != NULL) {
PrintRawUriBuf((char *)aft->buffer->buffer, &aft->buffer->offset, aft->buffer->size,
- (uint8_t *)bstr_ptr(tx->request_protocol),
- bstr_len(tx->request_protocol));
+ (uint8_t *)bstr_ptr(htp_tx_request_protocol(tx)),
+ bstr_len(htp_tx_request_protocol(tx)));
} else {
MemBufferWriteString(aft->buffer, "");
}
LOG_CF_WRITE_STAR_SEPARATOR(aft->buffer);
/* response status */
- if (tx->response_status != NULL) {
+ if (htp_tx_response_status(tx) != NULL) {
PrintRawUriBuf((char *)aft->buffer->buffer, &aft->buffer->offset, aft->buffer->size,
- (uint8_t *)bstr_ptr(tx->response_status),
- bstr_len(tx->response_status));
+ (uint8_t *)bstr_ptr(htp_tx_response_status(tx)),
+ bstr_len(htp_tx_response_status(tx)));
/* Redirect? */
- if ((tx->response_status_number > 300) && ((tx->response_status_number) < 303)) {
- htp_header_t *h_location = htp_table_get_c(tx->response_headers, "location");
+ if ((htp_tx_response_status_number(tx) > 300) &&
+ ((htp_tx_response_status_number(tx)) < 303)) {
+ const htp_header_t *h_location = htp_tx_response_header(tx, "location");
if (h_location != NULL) {
MemBufferWriteString(aft->buffer, " => ");
PrintRawUriBuf((char *)aft->buffer->buffer, &aft->buffer->offset, aft->buffer->size,
- (uint8_t *)bstr_ptr(h_location->value),
- bstr_len(h_location->value));
+ htp_header_value_ptr(h_location), htp_header_value_len(h_location));
}
}
} else {
@@ -373,7 +363,8 @@ static void LogHttpLogExtended(LogHttpLogThread *aft, htp_tx_t *tx)
/* length */
LOG_CF_WRITE_STAR_SEPARATOR(aft->buffer);
- MemBufferWriteString(aft->buffer, "%"PRIuMAX" bytes", (uintmax_t)tx->response_message_len);
+ MemBufferWriteString(
+ aft->buffer, "%" PRIuMAX " bytes", (uintmax_t)htp_tx_response_message_len(tx));
}
static TmEcode LogHttpLogIPWrapper(ThreadVars *tv, void *data, const Packet *p, Flow *f, HtpState *htp_state, htp_tx_t *tx, uint64_t tx_id, int ipproto)
@@ -433,32 +424,27 @@ static TmEcode LogHttpLogIPWrapper(ThreadVars *tv, void *data, const Packet *p,
MemBufferWriteString(aft->buffer, "%s ", timebuf);
/* hostname */
- if (tx->request_hostname != NULL) {
+ if (htp_tx_request_hostname(tx) != NULL) {
PrintRawUriBuf((char *)aft->buffer->buffer, &aft->buffer->offset, aft->buffer->size,
- (uint8_t *)bstr_ptr(tx->request_hostname),
- bstr_len(tx->request_hostname));
+ (uint8_t *)bstr_ptr(htp_tx_request_hostname(tx)),
+ bstr_len(htp_tx_request_hostname(tx)));
} else {
MemBufferWriteString(aft->buffer, "");
}
LOG_CF_WRITE_STAR_SEPARATOR(aft->buffer);
/* uri */
- if (tx->request_uri != NULL) {
+ if (htp_tx_request_uri(tx) != NULL) {
PrintRawUriBuf((char *)aft->buffer->buffer, &aft->buffer->offset, aft->buffer->size,
- (uint8_t *)bstr_ptr(tx->request_uri),
- bstr_len(tx->request_uri));
+ (uint8_t *)bstr_ptr(htp_tx_request_uri(tx)), bstr_len(htp_tx_request_uri(tx)));
}
LOG_CF_WRITE_STAR_SEPARATOR(aft->buffer);
/* user agent */
- htp_header_t *h_user_agent = NULL;
- if (tx->request_headers != NULL) {
- h_user_agent = htp_table_get_c(tx->request_headers, "user-agent");
- }
+ const htp_header_t *h_user_agent = htp_tx_request_header(tx, "user-agent");
if (h_user_agent != NULL) {
PrintRawUriBuf((char *)aft->buffer->buffer, &aft->buffer->offset, aft->buffer->size,
- (uint8_t *)bstr_ptr(h_user_agent->value),
- bstr_len(h_user_agent->value));
+ htp_header_value_ptr(h_user_agent), htp_header_value_len(h_user_agent));
} else {
MemBufferWriteString(aft->buffer, "");
}
diff --git a/src/output-json-http.c b/src/output-json-http.c
index 5f44e955573d..fa9091eff713 100644
--- a/src/output-json-http.c
+++ b/src/output-json-http.c
@@ -197,9 +197,9 @@ struct {
static void EveHttpLogJSONBasic(JsonBuilder *js, htp_tx_t *tx)
{
/* hostname */
- if (tx->request_hostname != NULL) {
- jb_set_string_from_bytes(
- js, "hostname", bstr_ptr(tx->request_hostname), bstr_len(tx->request_hostname));
+ if (htp_tx_request_hostname(tx) != NULL) {
+ jb_set_string_from_bytes(js, "hostname", bstr_ptr(htp_tx_request_hostname(tx)),
+ bstr_len(htp_tx_request_hostname(tx)));
}
/* port */
@@ -208,50 +208,52 @@ static void EveHttpLogJSONBasic(JsonBuilder *js, htp_tx_t *tx)
* There is no connection (from the suricata point of view) between this
* port and the TCP destination port of the flow.
*/
- if (tx->request_port_number >= 0) {
- jb_set_uint(js, "http_port", tx->request_port_number);
+ if (htp_tx_request_port_number(tx) >= 0) {
+ jb_set_uint(js, "http_port", htp_tx_request_port_number(tx));
}
/* uri */
- if (tx->request_uri != NULL) {
- jb_set_string_from_bytes(js, "url", bstr_ptr(tx->request_uri), bstr_len(tx->request_uri));
+ if (htp_tx_request_uri(tx) != NULL) {
+ jb_set_string_from_bytes(
+ js, "url", bstr_ptr(htp_tx_request_uri(tx)), bstr_len(htp_tx_request_uri(tx)));
}
- if (tx->request_headers != NULL) {
+ if (htp_tx_request_headers(tx) != NULL) {
/* user agent */
- htp_header_t *h_user_agent = htp_table_get_c(tx->request_headers, "user-agent");
+ const htp_header_t *h_user_agent = htp_tx_request_header(tx, "user-agent");
if (h_user_agent != NULL) {
- jb_set_string_from_bytes(js, "http_user_agent", bstr_ptr(h_user_agent->value),
- bstr_len(h_user_agent->value));
+ jb_set_string_from_bytes(js, "http_user_agent", htp_header_value_ptr(h_user_agent),
+ htp_header_value_len(h_user_agent));
}
/* x-forwarded-for */
- htp_header_t *h_x_forwarded_for = htp_table_get_c(tx->request_headers, "x-forwarded-for");
+ const htp_header_t *h_x_forwarded_for = htp_tx_request_header(tx, "x-forwarded-for");
if (h_x_forwarded_for != NULL) {
- jb_set_string_from_bytes(js, "xff", bstr_ptr(h_x_forwarded_for->value),
- bstr_len(h_x_forwarded_for->value));
+ jb_set_string_from_bytes(js, "xff", htp_header_value_ptr(h_x_forwarded_for),
+ htp_header_value_len(h_x_forwarded_for));
}
}
/* content-type */
- if (tx->response_headers != NULL) {
- htp_header_t *h_content_type = htp_table_get_c(tx->response_headers, "content-type");
+ if (htp_tx_response_headers(tx) != NULL) {
+ const htp_header_t *h_content_type = htp_tx_response_header(tx, "content-type");
if (h_content_type != NULL) {
- const size_t size = bstr_len(h_content_type->value) * 2 + 1;
+ const size_t size = htp_header_value_len(h_content_type) * 2 + 1;
char string[size];
- BytesToStringBuffer(bstr_ptr(h_content_type->value), bstr_len(h_content_type->value), string, size);
+ BytesToStringBuffer(htp_header_value_ptr(h_content_type),
+ htp_header_value_len(h_content_type), string, size);
char *p = strchr(string, ';');
if (p != NULL)
*p = '\0';
jb_set_string(js, "http_content_type", string);
}
- htp_header_t *h_content_range = htp_table_get_c(tx->response_headers, "content-range");
+ const htp_header_t *h_content_range = htp_tx_response_header(tx, "content-range");
if (h_content_range != NULL) {
jb_open_object(js, "content_range");
- jb_set_string_from_bytes(
- js, "raw", bstr_ptr(h_content_range->value), bstr_len(h_content_range->value));
+ jb_set_string_from_bytes(js, "raw", htp_header_value_ptr(h_content_range),
+ htp_header_value_len(h_content_range));
HTTPContentRange crparsed;
- if (HTPParseContentRange(h_content_range->value, &crparsed) == 0) {
+ if (HTPParseContentRange(htp_header_value(h_content_range), &crparsed) == 0) {
if (crparsed.start >= 0)
jb_set_uint(js, "start", crparsed.start);
if (crparsed.end >= 0)
@@ -267,61 +269,61 @@ static void EveHttpLogJSONBasic(JsonBuilder *js, htp_tx_t *tx)
static void EveHttpLogJSONExtended(JsonBuilder *js, htp_tx_t *tx)
{
/* referer */
- htp_header_t *h_referer = NULL;
- if (tx->request_headers != NULL) {
- h_referer = htp_table_get_c(tx->request_headers, "referer");
+ const htp_header_t *h_referer = NULL;
+ if (htp_tx_request_headers(tx) != NULL) {
+ h_referer = htp_tx_request_header(tx, "referer");
}
if (h_referer != NULL) {
jb_set_string_from_bytes(
- js, "http_refer", bstr_ptr(h_referer->value), bstr_len(h_referer->value));
+ js, "http_refer", htp_header_value_ptr(h_referer), htp_header_value_len(h_referer));
}
/* method */
- if (tx->request_method != NULL) {
- jb_set_string_from_bytes(
- js, "http_method", bstr_ptr(tx->request_method), bstr_len(tx->request_method));
+ if (htp_tx_request_method(tx) != NULL) {
+ jb_set_string_from_bytes(js, "http_method", bstr_ptr(htp_tx_request_method(tx)),
+ bstr_len(htp_tx_request_method(tx)));
}
/* protocol */
- if (tx->request_protocol != NULL) {
- jb_set_string_from_bytes(
- js, "protocol", bstr_ptr(tx->request_protocol), bstr_len(tx->request_protocol));
+ if (htp_tx_request_protocol(tx) != NULL) {
+ jb_set_string_from_bytes(js, "protocol", bstr_ptr(htp_tx_request_protocol(tx)),
+ bstr_len(htp_tx_request_protocol(tx)));
}
/* response status */
- if (tx->response_status != NULL) {
- const size_t status_size = bstr_len(tx->response_status) * 2 + 1;
+ if (htp_tx_response_status(tx) != NULL) {
+ const size_t status_size = bstr_len(htp_tx_response_status(tx)) * 2 + 1;
char status_string[status_size];
- BytesToStringBuffer(bstr_ptr(tx->response_status), bstr_len(tx->response_status),
- status_string, status_size);
+ BytesToStringBuffer(bstr_ptr(htp_tx_response_status(tx)),
+ bstr_len(htp_tx_response_status(tx)), status_string, status_size);
unsigned int val = strtoul(status_string, NULL, 10);
jb_set_uint(js, "status", val);
- htp_header_t *h_location = htp_table_get_c(tx->response_headers, "location");
+ const htp_header_t *h_location = htp_tx_response_header(tx, "location");
if (h_location != NULL) {
- jb_set_string_from_bytes(
- js, "redirect", bstr_ptr(h_location->value), bstr_len(h_location->value));
+ jb_set_string_from_bytes(js, "redirect", htp_header_value_ptr(h_location),
+ htp_header_value_len(h_location));
}
}
/* length */
- jb_set_uint(js, "length", tx->response_message_len);
+ jb_set_uint(js, "length", htp_tx_response_message_len(tx));
}
static void EveHttpLogJSONHeaders(
JsonBuilder *js, uint32_t direction, htp_tx_t *tx, LogHttpFileCtx *http_ctx)
{
- htp_table_t * headers = direction & LOG_HTTP_REQ_HEADERS ?
- tx->request_headers : tx->response_headers;
+ const htp_headers_t *headers = direction & LOG_HTTP_REQ_HEADERS ? htp_tx_request_headers(tx)
+ : htp_tx_response_headers(tx);
char name[MAX_SIZE_HEADER_NAME] = {0};
char value[MAX_SIZE_HEADER_VALUE] = {0};
- size_t n = htp_table_size(headers);
+ size_t n = htp_headers_size(headers);
JsonBuilderMark mark = { 0, 0, 0 };
jb_get_mark(js, &mark);
bool array_empty = true;
jb_open_array(js, direction & LOG_HTTP_REQ_HEADERS ? "request_headers" : "response_headers");
for (size_t i = 0; i < n; i++) {
- htp_header_t *h = htp_table_get_index(headers, i, NULL);
+ const htp_header_t *h = htp_headers_get_index(headers, i);
if ((http_ctx->flags & direction) == 0 && http_ctx->fields != 0) {
bool tolog = false;
for (HttpField f = HTTP_FIELD_ACCEPT; f < HTTP_FIELD_SIZE; f++) {
@@ -331,7 +333,7 @@ static void EveHttpLogJSONHeaders(
if (((http_ctx->flags & LOG_HTTP_EXTENDED) == 0) ||
((http_ctx->flags & LOG_HTTP_EXTENDED) !=
(http_fields[f].flags & LOG_HTTP_EXTENDED))) {
- if (bstr_cmp_c_nocase(h->name, http_fields[f].htp_field) == 0) {
+ if (bstr_cmp_c_nocase(htp_header_name(h), http_fields[f].htp_field) == 0) {
tolog = true;
break;
}
@@ -344,14 +346,16 @@ static void EveHttpLogJSONHeaders(
}
array_empty = false;
jb_start_object(js);
- size_t size_name = bstr_len(h->name) < MAX_SIZE_HEADER_NAME - 1 ?
- bstr_len(h->name) : MAX_SIZE_HEADER_NAME - 1;
- memcpy(name, bstr_ptr(h->name), size_name);
+ size_t size_name = htp_header_name_len(h) < MAX_SIZE_HEADER_NAME - 1
+ ? htp_header_name_len(h)
+ : MAX_SIZE_HEADER_NAME - 1;
+ memcpy(name, htp_header_name_ptr(h), size_name);
name[size_name] = '\0';
jb_set_string(js, "name", name);
- size_t size_value = bstr_len(h->value) < MAX_SIZE_HEADER_VALUE - 1 ?
- bstr_len(h->value) : MAX_SIZE_HEADER_VALUE - 1;
- memcpy(value, bstr_ptr(h->value), size_value);
+ size_t size_value = htp_header_value_len(h) < MAX_SIZE_HEADER_VALUE - 1
+ ? htp_header_value_len(h)
+ : MAX_SIZE_HEADER_VALUE - 1;
+ memcpy(value, htp_header_value_ptr(h), size_value);
value[size_value] = '\0';
jb_set_string(js, "value", value);
jb_close(js);
@@ -393,7 +397,7 @@ void EveHttpLogJSONBodyPrintable(JsonBuilder *js, Flow *f, uint64_t tx_id)
if (htp_state) {
htp_tx_t *tx = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, htp_state, tx_id);
if (tx) {
- HtpTxUserData *htud = (HtpTxUserData *)htp_tx_get_user_data(tx);
+ HtpTxUserData *htud = (HtpTxUserData *)htp_tx_user_data(tx);
if (htud != NULL) {
BodyPrintableBuffer(js, &htud->request_body, "http_request_body_printable");
BodyPrintableBuffer(js, &htud->response_body, "http_response_body_printable");
@@ -424,7 +428,7 @@ void EveHttpLogJSONBodyBase64(JsonBuilder *js, Flow *f, uint64_t tx_id)
if (htp_state) {
htp_tx_t *tx = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, htp_state, tx_id);
if (tx) {
- HtpTxUserData *htud = (HtpTxUserData *)htp_tx_get_user_data(tx);
+ HtpTxUserData *htud = (HtpTxUserData *)htp_tx_user_data(tx);
if (htud != NULL) {
BodyBase64Buffer(js, &htud->request_body, "http_request_body");
BodyBase64Buffer(js, &htud->response_body, "http_response_body");
diff --git a/src/output-streaming.c b/src/output-streaming.c
index 4aca9546d4a7..8631045047c4 100644
--- a/src/output-streaming.c
+++ b/src/output-streaming.c
@@ -183,7 +183,7 @@ static int HttpBodyIterator(Flow *f, int close, void *cbdata, uint8_t iflags)
}
SCLogDebug("tx %p", tx);
- HtpTxUserData *htud = (HtpTxUserData *) htp_tx_get_user_data(tx);
+ HtpTxUserData *htud = (HtpTxUserData *)htp_tx_user_data(tx);
if (htud != NULL) {
SCLogDebug("htud %p", htud);
HtpBody *body = NULL;
diff --git a/src/suricata.c b/src/suricata.c
index 7172a49dba40..4824f0f4e13b 100644
--- a/src/suricata.c
+++ b/src/suricata.c
@@ -738,9 +738,7 @@ static void PrintBuildInfo(void)
#ifdef HAVE_LIBNET11
strlcat(features, "LIBNET1.1 ", sizeof(features));
#endif
-#ifdef HAVE_HTP_URI_NORMALIZE_HOOK
strlcat(features, "HAVE_HTP_URI_NORMALIZE_HOOK ", sizeof(features));
-#endif
#ifdef PCRE2_HAVE_JIT
strlcat(features, "PCRE_JIT ", sizeof(features));
#endif
@@ -877,8 +875,7 @@ static void PrintBuildInfo(void)
#endif
printf("thread local storage method: %s\n", tls);
- printf("compiled with %s, linked against %s\n",
- HTP_VERSION_STRING_FULL, htp_get_version());
+ printf("compiled with %s\n", htp_get_version());
printf("\n");
#include "build-info.h"
}
diff --git a/src/tests/detect-http-client-body.c b/src/tests/detect-http-client-body.c
index c87d66756b9f..0546d7b9a21f 100644
--- a/src/tests/detect-http-client-body.c
+++ b/src/tests/detect-http-client-body.c
@@ -2153,7 +2153,7 @@ static int DetectHttpClientBodyTest15(void)
htp_tx_t *t1 = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, htp_state, 0);
htp_tx_t *t2 = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_HTTP1, htp_state, 1);
- HtpTxUserData *htud = (HtpTxUserData *) htp_tx_get_user_data(t1);
+ HtpTxUserData *htud = (HtpTxUserData *)htp_tx_user_data(t1);
HtpBodyChunk *cur = htud->request_body.first;
if (htud->request_body.first == NULL) {
@@ -2168,7 +2168,7 @@ static int DetectHttpClientBodyTest15(void)
goto end;
}
- htud = (HtpTxUserData *) htp_tx_get_user_data(t2);
+ htud = (HtpTxUserData *)htp_tx_user_data(t2);
cur = htud->request_body.first;
if (htud->request_body.first == NULL) {
diff --git a/src/tests/detect-http-server-body.c b/src/tests/detect-http-server-body.c
index 29340fb4aa77..a1c0f223b935 100644
--- a/src/tests/detect-http-server-body.c
+++ b/src/tests/detect-http-server-body.c
@@ -2622,9 +2622,7 @@ static int DetectEngineHttpServerBodyTest20(void)
/* do detect */
SigMatchSignatures(&th_v, de_ctx, det_ctx, p2);
-#ifdef HAVE_HTP_CONFIG_SET_RESPONSE_DECOMPRESSION_LAYER_LIMIT
FAIL_IF(!(PacketAlertCheck(p2, 1)));
-#endif
result = 1;
@@ -2751,9 +2749,7 @@ static int DetectEngineHttpServerBodyTest21(void)
/* do detect */
SigMatchSignatures(&th_v, de_ctx, det_ctx, p2);
-#ifdef HAVE_HTP_CONFIG_SET_RESPONSE_DECOMPRESSION_LAYER_LIMIT
FAIL_IF(!(PacketAlertCheck(p2, 1)));
-#endif
result = 1;
@@ -2882,9 +2878,7 @@ static int DetectEngineHttpServerBodyTest22(void)
/* do detect */
SigMatchSignatures(&th_v, de_ctx, det_ctx, p2);
-#ifdef HAVE_HTP_CONFIG_SET_RESPONSE_DECOMPRESSION_LAYER_LIMIT
FAIL_IF(!(PacketAlertCheck(p2, 1)));
-#endif
result = 1;
diff --git a/src/util-lua-http.c b/src/util-lua-http.c
index e04c168fa6ea..bd44eabee167 100644
--- a/src/util-lua-http.c
+++ b/src/util-lua-http.c
@@ -65,11 +65,11 @@ static int HttpGetRequestHost(lua_State *luastate)
if (tx == NULL)
return LuaCallbackError(luastate, "internal error: no tx");
- if (tx->request_hostname == NULL)
+ if (htp_tx_request_hostname(tx) == NULL)
return LuaCallbackError(luastate, "no request hostname");
- return LuaPushStringBuffer(luastate,
- bstr_ptr(tx->request_hostname), bstr_len(tx->request_hostname));
+ return LuaPushStringBuffer(
+ luastate, bstr_ptr(htp_tx_request_hostname(tx)), bstr_len(htp_tx_request_hostname(tx)));
}
static int HttpGetRequestUriRaw(lua_State *luastate)
@@ -81,11 +81,11 @@ static int HttpGetRequestUriRaw(lua_State *luastate)
if (tx == NULL)
return LuaCallbackError(luastate, "internal error: no tx");
- if (tx->request_uri == NULL)
+ if (htp_tx_request_uri(tx) == NULL)
return LuaCallbackError(luastate, "no request uri");
- return LuaPushStringBuffer(luastate,
- bstr_ptr(tx->request_uri), bstr_len(tx->request_uri));
+ return LuaPushStringBuffer(
+ luastate, bstr_ptr(htp_tx_request_uri(tx)), bstr_len(htp_tx_request_uri(tx)));
}
static int HttpGetRequestUriNormalized(lua_State *luastate)
@@ -97,18 +97,14 @@ static int HttpGetRequestUriNormalized(lua_State *luastate)
if (tx == NULL)
return LuaCallbackError(luastate, "internal error: no tx");
- HtpTxUserData *htud = (HtpTxUserData *) htp_tx_get_user_data(tx);
- if (htud == NULL)
- return LuaCallbackError(luastate, "no htud in tx");
+ bstr *request_uri_normalized = (bstr *)htp_tx_normalized_uri(tx);
- if (htud->request_uri_normalized == NULL ||
- bstr_ptr(htud->request_uri_normalized) == NULL ||
- bstr_len(htud->request_uri_normalized) == 0)
+ if (request_uri_normalized == NULL || bstr_ptr(request_uri_normalized) == NULL ||
+ bstr_len(request_uri_normalized) == 0)
return LuaCallbackError(luastate, "no normalized uri");
- return LuaPushStringBuffer(luastate,
- bstr_ptr(htud->request_uri_normalized),
- bstr_len(htud->request_uri_normalized));
+ return LuaPushStringBuffer(
+ luastate, bstr_ptr(request_uri_normalized), bstr_len(request_uri_normalized));
}
static int HttpGetRequestLine(lua_State *luastate)
@@ -120,11 +116,11 @@ static int HttpGetRequestLine(lua_State *luastate)
if (tx == NULL)
return LuaCallbackError(luastate, "internal error: no tx");
- if (tx->request_line == NULL)
+ if (htp_tx_request_line(tx) == NULL)
return LuaCallbackError(luastate, "no request_line");
- return LuaPushStringBuffer(luastate,
- bstr_ptr(tx->request_line), bstr_len(tx->request_line));
+ return LuaPushStringBuffer(
+ luastate, bstr_ptr(htp_tx_request_line(tx)), bstr_len(htp_tx_request_line(tx)));
}
static int HttpGetResponseLine(lua_State *luastate)
@@ -136,11 +132,11 @@ static int HttpGetResponseLine(lua_State *luastate)
if (tx == NULL)
return LuaCallbackError(luastate, "internal error: no tx");
- if (tx->response_line == NULL)
+ if (htp_tx_response_line(tx) == NULL)
return LuaCallbackError(luastate, "no response_line");
- return LuaPushStringBuffer(luastate,
- bstr_ptr(tx->response_line), bstr_len(tx->response_line));
+ return LuaPushStringBuffer(
+ luastate, bstr_ptr(htp_tx_response_line(tx)), bstr_len(htp_tx_response_line(tx)));
}
static int HttpGetHeader(lua_State *luastate, int dir)
@@ -156,18 +152,17 @@ static int HttpGetHeader(lua_State *luastate, int dir)
if (name == NULL)
return LuaCallbackError(luastate, "1st argument missing, empty or wrong type");
- htp_table_t *headers = tx->request_headers;
- if (dir == 1)
- headers = tx->response_headers;
- if (headers == NULL)
- return LuaCallbackError(luastate, "tx has no headers");
+ const htp_header_t *h = NULL;
+ if (dir == 0) {
+ h = htp_tx_request_header(tx, name);
+ } else {
+ h = htp_tx_response_header(tx, name);
+ }
- htp_header_t *h = (htp_header_t *)htp_table_get_c(headers, name);
- if (h == NULL || bstr_len(h->value) == 0)
+ if (h == NULL || htp_header_value_len(h) == 0)
return LuaCallbackError(luastate, "header not found");
- return LuaPushStringBuffer(luastate,
- bstr_ptr(h->value), bstr_len(h->value));
+ return LuaPushStringBuffer(luastate, htp_header_value_ptr(h), htp_header_value_len(h));
}
static int HttpGetRequestHeader(lua_State *luastate)
@@ -189,7 +184,7 @@ static int HttpGetRawHeaders(lua_State *luastate, int dir)
if (tx == NULL)
return LuaCallbackError(luastate, "internal error: no tx");
- HtpTxUserData *htud = (HtpTxUserData *) htp_tx_get_user_data(tx);
+ HtpTxUserData *htud = (HtpTxUserData *)htp_tx_user_data(tx);
if (htud == NULL)
return LuaCallbackError(luastate, "no htud in tx");
@@ -226,20 +221,20 @@ static int HttpGetHeaders(lua_State *luastate, int dir)
if (tx == NULL)
return LuaCallbackError(luastate, "internal error: no tx");
- htp_table_t *table = tx->request_headers;
+ const htp_headers_t *table = htp_tx_request_headers(tx);
if (dir == 1)
- table = tx->response_headers;
- if (tx->request_headers == NULL)
+ table = htp_tx_response_headers(tx);
+ if (table == NULL)
return LuaCallbackError(luastate, "no headers");
lua_newtable(luastate);
- htp_header_t *h = NULL;
+ const htp_header_t *h = NULL;
size_t i = 0;
- size_t no_of_headers = htp_table_size(table);
+ size_t no_of_headers = htp_headers_size(table);
for (; i < no_of_headers; i++) {
- h = htp_table_get_index(table, i, NULL);
- LuaPushStringBuffer(luastate, bstr_ptr(h->name), bstr_len(h->name));
- LuaPushStringBuffer(luastate, bstr_ptr(h->value), bstr_len(h->value));
+ h = htp_headers_get_index(table, i);
+ LuaPushStringBuffer(luastate, htp_header_name_ptr(h), htp_header_name_len(h));
+ LuaPushStringBuffer(luastate, htp_header_value_ptr(h), htp_header_value_len(h));
lua_settable(luastate, -3);
}
return 1;
@@ -268,7 +263,7 @@ static int HttpGetBody(lua_State *luastate, int dir)
if (tx == NULL)
return LuaCallbackError(luastate, "internal error: no tx");
- HtpTxUserData *htud = (HtpTxUserData *) htp_tx_get_user_data(tx);
+ HtpTxUserData *htud = (HtpTxUserData *)htp_tx_user_data(tx);
if (htud == NULL)
return LuaCallbackError(luastate, "no htud in tx");
diff --git a/src/util-print.c b/src/util-print.c
index ef69efe4b1ed..817f05cc8197 100644
--- a/src/util-print.c
+++ b/src/util-print.c
@@ -92,7 +92,7 @@ void PrintRawJsonFp(FILE *fp, uint8_t *buf, uint32_t buflen)
fprintf(fp, "%s", nbuf);
}
-void PrintRawUriFp(FILE *fp, uint8_t *buf, uint32_t buflen)
+void PrintRawUriFp(FILE *fp, const uint8_t *buf, uint32_t buflen)
{
#define BUFFER_LENGTH 2048
char nbuf[BUFFER_LENGTH] = "";
@@ -117,8 +117,8 @@ void PrintRawUriFp(FILE *fp, uint8_t *buf, uint32_t buflen)
fprintf(fp, "%s", nbuf);
}
-void PrintRawUriBuf(char *retbuf, uint32_t *offset, uint32_t retbuflen,
- uint8_t *buf, uint32_t buflen)
+void PrintRawUriBuf(
+ char *retbuf, uint32_t *offset, uint32_t retbuflen, const uint8_t *buf, uint32_t buflen)
{
uint32_t u = 0;
diff --git a/src/util-print.h b/src/util-print.h
index 249ec20f7353..5f6707bacd8e 100644
--- a/src/util-print.h
+++ b/src/util-print.h
@@ -42,9 +42,8 @@
} while (0)
void PrintBufferRawLineHex(char *, int *,int, const uint8_t *, uint32_t);
-void PrintRawUriFp(FILE *, uint8_t *, uint32_t);
-void PrintRawUriBuf(char *, uint32_t *, uint32_t,
- uint8_t *, uint32_t);
+void PrintRawUriFp(FILE *, const uint8_t *, uint32_t);
+void PrintRawUriBuf(char *, uint32_t *, uint32_t, const uint8_t *, uint32_t);
void PrintRawJsonFp(FILE *, uint8_t *, uint32_t);
void PrintRawDataFp(FILE *, const uint8_t *, uint32_t);
void PrintRawDataToBuffer(uint8_t *dst_buf, uint32_t *dst_buf_offset_ptr, uint32_t dst_buf_size,