diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index b62c865f9667..85e1682d56b7 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -26,6 +26,4 @@ SV_REPO=
SV_BRANCH=
SU_REPO=
SU_BRANCH=
-LIBHTP_REPO=
-LIBHTP_BRANCH=
```
diff --git a/.github/workflows/build-centos-7.yml b/.github/workflows/build-centos-7.yml
index 49744252de25..13451406ab9b 100644
--- a/.github/workflows/build-centos-7.yml
+++ b/.github/workflows/build-centos-7.yml
@@ -5,8 +5,6 @@ on:
pull_request:
workflow_dispatch:
inputs:
- LIBHTP_REPO:
- LIBHTP_BRANCH:
SU_REPO:
SU_BRANCH:
SV_REPO:
@@ -90,9 +88,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 }')
@@ -100,8 +95,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 }}
@@ -109,9 +102,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
@@ -119,9 +109,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}
@@ -130,8 +117,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}"
diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml
index d17b4fa7e38e..ac1379f727dc 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:
@@ -56,9 +54,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 }')
@@ -66,8 +61,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 }}
@@ -75,9 +68,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
@@ -85,9 +75,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}
@@ -96,8 +83,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}"
@@ -108,10 +93,6 @@ jobs:
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
- run: git config --global --add safe.directory /__w/suricata/suricata
- - 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
@@ -143,7 +124,6 @@ jobs:
with:
name: prep
path: |
- libhtp.tar.gz
suricata-update.tar.gz
suricata-verify.tar.gz
@@ -257,7 +237,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: Configuring
@@ -400,7 +379,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: Build
@@ -498,7 +476,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
- uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427
@@ -775,7 +752,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
@@ -871,7 +847,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" ./configure --disable-shared
@@ -965,7 +940,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
@@ -1065,7 +1039,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
@@ -1156,7 +1129,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
@@ -1242,7 +1214,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
@@ -1335,7 +1306,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- run: ./autogen.sh
- run: |
if ./configure; then
@@ -1408,7 +1378,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: ./autogen.sh
@@ -1485,7 +1454,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427
with:
name: cbindgen
@@ -1530,14 +1498,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@c16abc29c95fcf9174b58eb7e1abf4c866893bc8
with:
@@ -1615,7 +1575,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427
with:
name: cbindgen
@@ -1715,7 +1674,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- run: tar xf prep/suricata-update.tar.gz
- uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427
with:
@@ -1874,7 +1832,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427
with:
name: cbindgen
@@ -1961,7 +1918,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427
with:
name: cbindgen
@@ -2055,7 +2011,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427
with:
name: cbindgen
@@ -2160,7 +2115,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427
with:
name: cbindgen
@@ -2258,7 +2212,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: ./autogen.sh
@@ -2344,7 +2297,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: CFLAGS="${DEFAULT_CFLAGS}" ./configure
@@ -2438,7 +2390,6 @@ jobs:
mkdir -p $HOME/.cargo/bin
cp prep/cbindgen $HOME/.cargo/bin
chmod 755 $HOME/.cargo/bin/cbindgen
- - run: tar xf prep/libhtp.tar.gz
- run: tar xf prep/suricata-update.tar.gz
- run: tar xf prep/suricata-verify.tar.gz
- run: ./autogen.sh
@@ -2516,7 +2467,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- run: tar xf prep/suricata-update.tar.gz
- uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427
with:
@@ -2597,7 +2547,6 @@ jobs:
with:
name: prep
path: prep
- - run: tar xf prep/libhtp.tar.gz
- run: tar xf prep/suricata-update.tar.gz
- uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427
with:
@@ -2659,13 +2608,12 @@ 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: CPATH="$HOMEBREW_PREFIX/include:$CPATH" LIBRARY_PATH="$HOMEBREW_PREFIX/lib:$LIBRARY_PATH" PATH="/opt/homebrew/opt/libtool/libexec/gnubin:$PATH" CFLAGS="${DEFAULT_CFLAGS}" ./configure --enable-unittests --prefix="$HOME/.local/"
- run: CPATH="$HOMEBREW_PREFIX/include:$CPATH" LIBRARY_PATH="$HOMEBREW_PREFIX/lib:$LIBRARY_PATH" PATH="/opt/homebrew/opt/libtool/libexec/gnubin:$PATH" CFLAGS="${DEFAULT_CFLAGS}" 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 --debug-failed
@@ -2701,7 +2649,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: |
@@ -2757,7 +2704,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
@@ -2801,7 +2747,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 d148067bf913..e847583d8826 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -54,7 +54,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 7d1d87350bf8..326a47294dae 100644
--- a/.github/workflows/commits.yml
+++ b/.github/workflows/commits.yml
@@ -80,7 +80,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 5adf1dd86f2e..05c3e11c98f1 100644
--- a/.github/workflows/formatting.yml
+++ b/.github/workflows/formatting.yml
@@ -128,7 +128,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/.github/workflows/rust-checks.yml b/.github/workflows/rust-checks.yml
index 5ac2739bf3d7..86076b8c1740 100644
--- a/.github/workflows/rust-checks.yml
+++ b/.github/workflows/rust-checks.yml
@@ -86,7 +86,6 @@ jobs:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
- name: Configure Suricata
run: |
- ./scripts/bundle.sh libhtp
./autogen.sh
./configure
- name: Run Cargo Audit
@@ -169,7 +168,6 @@ jobs:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
- name: Configure Suricata
run: |
- ./scripts/bundle.sh libhtp
./autogen.sh
./configure
- name: Cargo Update and Build
diff --git a/.github/workflows/scan-build.yml b/.github/workflows/scan-build.yml
index 6910f508af49..5ffd6e492343 100644
--- a/.github/workflows/scan-build.yml
+++ b/.github/workflows/scan-build.yml
@@ -75,11 +75,10 @@ jobs:
- run: scan-build-16 ./configure --enable-dpdk --enable-nfqueue --enable-nflog
env:
CC: clang-16
- # exclude libhtp from the analysis
# disable security.insecureAPI.DeprecatedOrUnsafeBufferHandling explicitly as
# this will require significant effort to address.
- run: |
- scan-build-16 --status-bugs --exclude libhtp/ \
+ scan-build-16 --status-bugs \
-enable-checker valist.Uninitialized \
-enable-checker valist.CopyToSelf \
-enable-checker valist.Unterminated \
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 b60180de2aa1..710f8b5883cc 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -50,7 +50,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 232ee9bed2b2..7cf1c9dc5cf5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1543,104 +1543,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.45],[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.45, 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])
- AC_CHECK_LIB([htp], [htp_config_set_max_tx],AC_DEFINE_UNQUOTED([HAVE_HTP_CONFIG_SET_MAX_TX],[1],[Found htp_config_set_max_tx 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])
- AC_DEFINE_UNQUOTED([HAVE_HTP_CONFIG_SET_MAX_TX],[1],[Assuming htp_config_set_max_tx 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
-
- AM_CONDITIONAL([HTP_LDADD], [test "x${HTP_LDADD}" != "x"])
-
# Check for libcap-ng
case $host in
*-*-linux*)
@@ -2637,7 +2539,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"])
@@ -2683,7 +2584,6 @@ SURICATA_BUILD_CONF="Suricata Configuration:
GeoIP2 support: ${enable_geoip}
JA3 support: ${enable_ja3}
JA4 support: ${enable_ja4}
- 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 9d7a45a54392..373a6e4fe968 100644
--- a/doc/userguide/devguide/codebase/installation-from-git.rst
+++ b/doc/userguide/devguide/codebase/installation-from-git.rst
@@ -72,7 +72,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 92473d52c35e..f74d845b6c13 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 81e487fc0cdc..4bf8c8f2cf31 100644
--- a/doc/userguide/upgrade.rst
+++ b/doc/userguide/upgrade.rst
@@ -56,6 +56,10 @@ Major changes
Due to SDP being encapsulated within other protocols, such as SIP, they cannot be directly enabled or disabled.
Instead, both the SDP parser and logger depend on being invoked by another parser (or logger).
+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 22fc4543a34d..c110daa439a5 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/ examples/
+INPUT = src/ examples/
# 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/examples/lib/simple/Makefile.am b/examples/lib/simple/Makefile.am
index afc6505c3bae..383849486b96 100644
--- a/examples/lib/simple/Makefile.am
+++ b/examples/lib/simple/Makefile.am
@@ -6,7 +6,4 @@ AM_CPPFLAGS = -I$(top_srcdir)/src
simple_LDFLAGS = $(all_libraries) $(SECLDFLAGS)
simple_LDADD = $(top_builddir)/src/libsuricata_c.a ../../$(RUST_SURICATA_LIB) $(RUST_LDADD)
-if HTP_LDADD
-simple_LDADD += ../../$(HTP_LDADD)
-endif
simple_DEPENDENCIES = $(top_builddir)/src/libsuricata_c.a ../../$(RUST_SURICATA_LIB)
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 6df1358f075f..537f896bfd79 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.x
suricata-update https://github.com/OISF/suricata-update master
diff --git a/rules/http-events.rules b/rules/http-events.rules
index b5cce76bf235..a301959f23b6 100644
--- a/rules/http-events.rules
+++ b/rules/http-events.rules
@@ -93,4 +93,6 @@ alert http any any -> any any (msg:"SURICATA HTTP failed protocol change"; flow:
alert http any any -> any any (msg:"SURICATA HTTP request missing protocol"; flow:established,to_server; app-layer-event:http.request_line_missing_protocol; classtype:protocol-command-decode; sid:2221055; rev:1;)
-# next sid 2221056
+#alert http any any -> any any (msg:"SURICATA HTTP response chunk extension"; flow:established; app-layer-event:http.response_chunk_extension; classtype:protocol-command-decode; sid:2221056; rev:1;)
+
+# next sid 2221057
diff --git a/rust/Cargo.toml.in b/rust/Cargo.toml.in
index e53d50054f83..c9e0e5fc78fd 100644
--- a/rust/Cargo.toml.in
+++ b/rust/Cargo.toml.in
@@ -45,6 +45,7 @@ aes-gcm = "~0.9.4"
der-parser = { version = "~9.0.0", default_features = false }
kerberos-parser = { version = "~0.8.0", default_features = false }
+htp = { git = "https://github.com/catenacyber/libhtp-rs.git", branch = "main", version = "2.0.0" }
sawp-modbus = "~0.12.1"
sawp = "~0.12.1"
diff --git a/rust/Makefile.am b/rust/Makefile.am
index 4b04a71a90f2..32dcb76025ad 100644
--- a/rust/Makefile.am
+++ b/rust/Makefile.am
@@ -4,7 +4,8 @@ EXTRA_DIST = src derive \
dist/rust-bindings.h \
vendor \
Cargo.toml Cargo.lock \
- derive/Cargo.toml
+ derive/Cargo.toml \
+ dist/htp
if !DEBUG
RELEASE = --release
@@ -43,12 +44,14 @@ if HAVE_CYGPATH
cd $(abs_top_srcdir)/rust && \
@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
cd $(abs_top_srcdir)/rust && \
@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
@@ -71,6 +74,7 @@ uninstall-local:
clean-local:
rm -rf target
+ rm -rf gen/htp/htp_rs.h
if HAVE_CBINDGEN
rm -rf gen dist
endif
@@ -109,6 +113,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 9b434ce61a26..724c0efcb621 100644
--- a/rust/src/lib.rs
+++ b/rust/src/lib.rs
@@ -124,3 +124,6 @@ pub mod util;
pub mod ffi;
pub mod feature;
pub mod sdp;
+
+//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 fc69e49dbf31..dc658fb82b9c 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 d2fd1e29ea11..1156c8ae4633 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 \
@@ -637,7 +636,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 \
@@ -1287,7 +1285,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
@@ -1323,7 +1321,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 b2c8776a7192..3be9b23c53d6 100644
--- a/src/app-layer-htp-file.c
+++ b/src/app-layer-htp-file.c
@@ -91,9 +91,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);
@@ -108,7 +108,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) {
@@ -147,8 +147,8 @@ static int HTPParseAndCheckContentRange(
* \retval -1 error
*/
int HTPFileOpenWithRange(HtpState *s, HtpTxUserData *txud, const uint8_t *filename,
- uint16_t filename_len, const uint8_t *data, uint32_t data_len, htp_tx_t *tx, bstr *rawvalue,
- HtpTxUserData *htud)
+ uint16_t filename_len, const uint8_t *data, uint32_t data_len, const htp_tx_t *tx,
+ const bstr *rawvalue, HtpTxUserData *htud)
{
SCEnter();
uint16_t flags;
@@ -181,14 +181,15 @@ int HTPFileOpenWithRange(HtpState *s, HtpTxUserData *txud, const uint8_t *filena
// Then, we will try to handle reassembly of different ranges of the same file
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);
@@ -399,9 +400,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);
@@ -473,9 +474,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);
@@ -565,11 +566,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);
@@ -661,11 +662,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);
@@ -727,11 +728,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);
@@ -802,11 +803,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);
@@ -867,10 +868,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);
@@ -1189,11 +1190,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 5e05bcb28b17..59421c38c15a 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, uint8_t);
int HTPFileOpenWithRange(HtpState *, HtpTxUserData *, const uint8_t *, uint16_t, const uint8_t *,
- uint32_t, htp_tx_t *, bstr *rawvalue, HtpTxUserData *htud);
+ uint32_t, const htp_tx_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 dcc4a92b8bb0..000000000000
--- a/src/app-layer-htp-libhtp.c
+++ /dev/null
@@ -1,174 +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.
- ***************************************************************************/
-
-/**
- * \file
- *
- * \author Anoop Saldanha
- *
- * APIs from libhtp 0.5.x.
- */
-
-#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, bool 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 fa9a9ecc3b25..000000000000
--- a/src/app-layer-htp-libhtp.h
+++ /dev/null
@@ -1,53 +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.
- ***************************************************************************/
-
-/**
- * \file
- *
- * \author Anoop Saldanha
- *
- * APIs from libhtp 0.5.x.
- */
-
-#ifndef SURICATA_APP_LAYER_HTP_LIBHTP__H
-#define SURICATA_APP_LAYER_HTP_LIBHTP__H
-
-#include "suricata-common.h"
-
-bstr *SCHTPGenerateNormalizedUri(htp_tx_t *tx, htp_uri_t *uri, bool uri_include_all);
-
-#endif /* SURICATA_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 a325f34c22a6..f4f5470e6637 100644
--- a/src/app-layer-htp.c
+++ b/src/app-layer-htp.c
@@ -61,7 +61,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"
@@ -108,74 +107,113 @@ 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 },
- { "REQUEST_CHUNK_EXTENSION", HTTP_DECODER_EVENT_REQUEST_CHUNK_EXTENSION },
- { "REQUEST_LINE_MISSING_PROTOCOL", HTTP_DECODER_EVENT_REQUEST_LINE_MISSING_PROTOCOL },
+ 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_MISSING_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 },
+ { "REQUEST_CHUNK_EXTENSION", HTP_LOG_CODE_REQUEST_CHUNK_EXTENSION },
+ { "RESPONSE_CHUNK_EXTENSION", HTP_LOG_CODE_RESPONSE_CHUNK_EXTENSION },
+
+ { "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 },
@@ -244,8 +282,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);
@@ -273,8 +312,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);
@@ -298,7 +338,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;
@@ -322,7 +362,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++;
@@ -362,7 +402,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,10 +442,10 @@ void HTPStateFree(void *state)
uint64_t total_txs = HTPStateGetTxCnt(state);
/* free the list of body chunks */
if (s->conn != NULL) {
- for (tx_id = s->tx_freed; tx_id < total_txs; tx_id++) {
+ 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);
}
@@ -431,8 +470,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)
{
@@ -445,25 +482,11 @@ 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;
- }
- // replaces tx in the s->conn->transactions list by NULL
- htp_tx_destroy(tx);
+ htp_tx_destroy(s->connp, tx);
}
- s->tx_freed += htp_connp_tx_freed(s->connp);
}
/**
@@ -526,7 +549,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) {
@@ -575,130 +598,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 },
- { "Request chunk extension", HTTP_DECODER_EVENT_REQUEST_CHUNK_EXTENSION },
- { "Request line: missing protocol", HTTP_DECODER_EVENT_REQUEST_LINE_MISSING_PROTOCOL },
-};
-
-#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
*
@@ -709,99 +608,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)
- 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)
+ if (htp_tx_flags(tx) & HTP_FLAGS_REQUEST_INVALID_T_E)
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);
}
}
@@ -848,7 +729,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;
@@ -899,12 +780,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:
@@ -917,7 +798,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");
}
@@ -966,28 +847,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");
+ case HTP_STREAM_STATE_TUNNEL:
+ tx = htp_connp_get_response_tx(hstate->connp);
+ if (tx != NULL && htp_tx_response_status_number(tx) == 101) {
+ htp_header_t *h = htp_tx_response_header(tx, "Upgrade");
if (h == NULL) {
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);
if (bstr_cmp_c(h->value, "h2c") == 0) {
if (AppLayerProtoDetectGetProtoName(ALPROTO_HTTP2) == NULL) {
// if HTTP2 is disabled, keep the HTP_STREAM_TUNNEL mode
@@ -1049,8 +929,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");
@@ -1068,7 +948,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
@@ -1083,7 +963,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) {
@@ -1103,7 +983,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] == '\"') {
@@ -1133,8 +1013,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
@@ -1154,7 +1034,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
@@ -1169,7 +1049,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) {
@@ -1189,7 +1069,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] == '\"') {
@@ -1229,17 +1109,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");
@@ -1271,15 +1149,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
@@ -1390,7 +1266,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;
@@ -1426,10 +1302,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;
@@ -1449,7 +1326,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;
}
@@ -1522,9 +1399,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;
@@ -1722,8 +1599,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;
@@ -1734,9 +1611,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) {
@@ -1778,44 +1655,43 @@ 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)) {
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;
@@ -1823,7 +1699,7 @@ static int HtpResponseBodyHandle(HtpState *hstate, HtpTxUserData *htud,
}
if (h_content_range != NULL) {
result = HTPFileOpenWithRange(hstate, htud, filename, (uint16_t)filename_len, data,
- data_len, tx, h_content_range->value, htud);
+ data_len, tx, htp_header_value(h_content_range), htud);
} else {
result = HTPFileOpen(hstate, htud, filename, (uint16_t)filename_len, data, data_len,
STREAM_TOCLIENT);
@@ -1863,51 +1739,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;
}
}
@@ -1922,13 +1801,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;
@@ -1949,11 +1826,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 {
@@ -1966,10 +1844,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
@@ -1977,11 +1856,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 */
@@ -1993,35 +1875,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) {
@@ -2038,15 +1923,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");
@@ -2056,21 +1939,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 */
@@ -2082,7 +1969,7 @@ static int HTPCallbackResponseBodyData(htp_tx_data_t *d)
StreamTcpReassemblySetMinInspectDepth(hstate->f->protoctx, STREAM_TOCLIENT, 0);
}
}
- SCReturnInt(HTP_OK);
+ SCReturnInt(HTP_STATUS_OK);
}
/**
@@ -2125,39 +2012,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);
@@ -2172,32 +2058,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);
@@ -2211,40 +2097,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) {
@@ -2269,7 +2155,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");
@@ -2286,29 +2172,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);
@@ -2324,7 +2210,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");
@@ -2338,147 +2224,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;
-}
-
-static int HTPCallbackDoubleDecodeQuery(htp_tx_t *tx)
-{
- if (tx->parsed_uri == NULL)
- return HTP_OK;
-
- return HTPCallbackDoubleDecodeUriPart(tx, tx->parsed_uri->query);
+ return HTP_STATUS_OK;
}
-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;
}
/*
@@ -2486,7 +2320,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;
@@ -2521,37 +2355,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_lzma_memlimit(cfg_prec->cfg, HTP_CONFIG_DEFAULT_LZMA_MEMLIMIT);
+ htp_config_set_compression_bomb_limit(cfg_prec->cfg, HTP_CONFIG_DEFAULT_COMPRESSION_BOMB_LIMIT);
htp_config_set_compression_time_limit(cfg_prec->cfg, HTP_CONFIG_DEFAULT_COMPRESSION_TIME_LIMIT);
-#endif
-#ifdef HAVE_HTP_CONFIG_SET_MAX_TX
#define HTP_CONFIG_DEFAULT_MAX_TX_LIMIT 512
htp_config_set_max_tx(cfg_prec->cfg, HTP_CONFIG_DEFAULT_MAX_TX_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;
}
@@ -2658,7 +2471,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);
@@ -2670,7 +2484,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",
@@ -2712,16 +2526,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) {
@@ -2747,78 +2555,49 @@ 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));
+ htp_config_set_backslash_convert_slashes(cfg_prec->cfg, 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]);
+ htp_config_set_bestfit_replacement_byte(cfg_prec->cfg, p->val[0]);
} else {
SCLogError("Invalid entry "
"for libhtp param path-bestfit-replacement-char");
}
} else if (strcasecmp("path-convert-lowercase", p->name) == 0) {
- htp_config_set_convert_lowercase(cfg_prec->cfg,
- HTP_DECODER_URL_PATH,
- ConfValIsTrue(p->val));
+ htp_config_set_convert_lowercase(cfg_prec->cfg, 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));
+ htp_config_set_nul_encoded_terminates(cfg_prec->cfg, 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));
+ htp_config_set_nul_raw_terminates(cfg_prec->cfg, 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));
+ htp_config_set_path_separators_compress(cfg_prec->cfg, 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));
+ htp_config_set_path_separators_decode(cfg_prec->cfg, 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));
+ htp_config_set_u_encoding_decode(cfg_prec->cfg, 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);
+ htp_config_set_url_encoding_invalid_handling(cfg_prec->cfg, 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));
+ htp_config_set_utf8_convert_bestfit(cfg_prec->cfg, ConfValIsTrue(p->val));
} else if (strcasecmp("uri-include-all", p->name) == 0) {
- cfg_prec->uri_include_all = (1 == 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));
+ htp_config_set_plusspace_decode(cfg_prec->cfg, ConfValIsTrue(p->val));
} else if (strcasecmp("meta-field-limit", p->name) == 0) {
uint32_t limit = 0;
if (ParseSizeStringU32(p->val, &limit) < 0) {
@@ -2832,10 +2611,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) {
@@ -2850,8 +2626,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);
@@ -2865,8 +2639,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) {
@@ -2881,8 +2653,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
@@ -2893,8 +2663,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
-#ifdef HAVE_HTP_CONFIG_SET_MAX_TX
} else if (strcasecmp("max-tx", p->name) == 0) {
uint32_t limit = 0;
if (ParseSizeStringU32(p->val, &limit) < 0) {
@@ -2905,7 +2673,6 @@ static void HTPConfigParseParameters(HTPCfgRec *cfg_prec, ConfNode *s,
/* set default soft-limit with our new hard limit */
SCLogConfig("Setting HTTP max-tx limit to %" PRIu32 " bytes", limit);
htp_config_set_max_tx(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);
@@ -3087,7 +2854,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;
@@ -3101,21 +2868,21 @@ 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);
- return (uint64_t)size + http_state->tx_freed;
+ return (uint64_t)size;
} else {
return 0ULL;
}
@@ -3125,8 +2892,8 @@ static void *HTPStateGetTx(void *alstate, uint64_t tx_id)
{
HtpState *http_state = (HtpState *)alstate;
- if (http_state != NULL && http_state->conn != NULL && tx_id >= http_state->tx_freed)
- return htp_list_get(http_state->conn->transactions, tx_id - http_state->tx_freed);
+ if (http_state != NULL && http_state->connp != NULL)
+ return (void *)htp_connp_tx(http_state->connp, tx_id);
else
return NULL;
}
@@ -3135,10 +2902,10 @@ void *HtpGetTxForH2(void *alstate)
{
// gets last transaction
HtpState *http_state = (HtpState *)alstate;
- if (http_state != NULL && http_state->conn != NULL) {
- size_t txid = HTPStateGetTxCnt(http_state);
- if (txid > http_state->tx_freed) {
- return htp_list_get(http_state->conn->transactions, txid - http_state->tx_freed - 1);
+ if (http_state != NULL && http_state->connp != NULL) {
+ size_t txid = htp_connp_tx_size(http_state->connp);
+ if (txid > 0) {
+ return (void *)htp_connp_tx(http_state->connp, txid - 1);
}
}
return NULL;
@@ -3181,7 +2948,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;
}
@@ -3273,7 +3040,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);
@@ -3371,12 +3138,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);
@@ -3415,12 +3182,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);
@@ -3470,12 +3237,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);
@@ -3534,16 +3301,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;
@@ -3592,11 +3359,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);
@@ -3658,13 +3425,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;
@@ -3713,13 +3480,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;
@@ -3790,13 +3557,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);
@@ -3878,13 +3645,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);
@@ -3948,20 +3715,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("\": ");
@@ -4041,10 +3806,9 @@ 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) {
- 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) {
+ PrintRawDataFp(stdout, bstr_ptr(request_uri_normalized), bstr_len(request_uri_normalized));
}
result = 1;
@@ -4120,10 +3884,9 @@ 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) {
- 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) {
+ PrintRawDataFp(stdout, bstr_ptr(request_uri_normalized), bstr_len(request_uri_normalized));
}
result = 1;
@@ -4189,34 +3952,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:
@@ -4279,21 +4028,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;
}
@@ -4360,24 +4109,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;
}
@@ -4442,12 +4191,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;
}
@@ -4459,7 +4208,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;
}
@@ -4858,17 +4607,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;
}
@@ -4946,37 +4695,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();
@@ -5037,37 +4786,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();
@@ -5156,20 +4905,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("\": ");
@@ -5183,20 +4930,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("\": ");
@@ -5209,20 +4954,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("\": ");
@@ -5319,20 +5062,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("\": ");
@@ -5346,20 +5087,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("\": ");
@@ -5452,20 +5191,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("\": ");
@@ -5558,20 +5295,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("\": ");
@@ -5664,20 +5399,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("\": ");
@@ -5771,20 +5504,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("\": ");
@@ -5875,20 +5606,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("\": ");
@@ -5980,20 +5709,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("\": ");
@@ -6027,8 +5754,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;
@@ -6065,6 +5796,10 @@ static int HTPBodyReassemblyTest01(void)
result = 1;
end:
+ htp_tx_destroy(connp, tx);
+ htp_connp_destroy_all(connp);
+ htp_config_destroy(cfg);
+
return result;
}
@@ -6221,15 +5956,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);
@@ -6330,11 +6065,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;
}
@@ -6407,11 +6143,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;
}
@@ -6425,13 +6162,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
@@ -6489,14 +6226,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);
@@ -6548,14 +6285,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);
@@ -6602,14 +6339,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);
@@ -6656,14 +6393,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);
@@ -6710,14 +6447,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 f3a5aedaab51..0f9e318904ff 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,68 +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,
- HTTP_DECODER_EVENT_REQUEST_CHUNK_EXTENSION,
- HTTP_DECODER_EVENT_REQUEST_LINE_MISSING_PROTOCOL,
-
/* 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_ {
@@ -222,8 +168,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;
@@ -248,18 +192,11 @@ typedef struct HtpState_ {
htp_conn_t *conn;
Flow *f; /**< Needed to retrieve the original flow when using HTPLib callbacks */
uint64_t transaction_cnt;
- // tx_freed is the number of already freed transactions
- // This is needed as libhtp only keeps the live transactions :
- // To get the total number of transactions, we need to add
- // the number of transactions tracked by libhtp to this number.
- // It is also needed as an offset to translate between suricata
- // transaction id to libhtp offset in its list/array
- uint64_t tx_freed;
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-state.c b/src/detect-engine-state.c
index 74f87ff938f1..276812b75e40 100644
--- a/src/detect-engine-state.c
+++ b/src/detect-engine-state.c
@@ -712,7 +712,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);
@@ -795,7 +795,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);
@@ -870,7 +870,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);
@@ -956,7 +956,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);
@@ -1044,7 +1044,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);
@@ -1143,7 +1143,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);
@@ -1170,7 +1170,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);
@@ -1271,7 +1271,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);
@@ -1298,7 +1298,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);
@@ -1397,7 +1397,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);
@@ -1424,7 +1424,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 533fc8441d93..50a54c9934e0 100644
--- a/src/detect-file-data.c
+++ b/src/detect-file-data.c
@@ -257,7 +257,7 @@ static InspectionBuffer *FiledataGetDataCallback(DetectEngineThreadCtx *det_ctx,
ips = htp_state->cfg->http_body_inline;
const bool body_done = AppLayerParserGetStateProgress(IPPROTO_TCP, ALPROTO_HTTP1, tx,
- flow_flags) > HTP_RESPONSE_BODY;
+ flow_flags) > HTP_RESPONSE_PROGRESS_BODY;
SCLogDebug("response.body_limit %u file_size %" PRIu64
", cur_file->inspect_min_size %" PRIu32 ", EOF %s, progress > body? %s",
diff --git a/src/detect-http-client-body.c b/src/detect-http-client-body.c
index 5e5604ea594d..a27d164d7dd9 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;
DetectAppLayerInspectEngineRegister("http_client_body", ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_BODY, DetectEngineInspectBufferHttpBody, NULL);
+ HTP_REQUEST_PROGRESS_BODY, DetectEngineInspectBufferHttpBody, NULL);
DetectAppLayerMpmRegister("http_client_body", SIG_FLAG_TOSERVER, 2,
- PrefilterMpmHttpRequestBodyRegister, NULL, ALPROTO_HTTP1, HTP_REQUEST_BODY);
+ PrefilterMpmHttpRequestBodyRegister, NULL, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_BODY);
DetectAppLayerInspectEngineRegister("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 "
@@ -333,11 +333,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 5f4898285460..3eaff220a493 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;
DetectAppLayerInspectEngineRegister("http_cookie", ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_HEADERS, DetectEngineInspectBufferGeneric, GetRequestData);
+ HTP_REQUEST_PROGRESS_HEADERS, DetectEngineInspectBufferGeneric, GetRequestData);
DetectAppLayerInspectEngineRegister("http_cookie", ALPROTO_HTTP1, SIG_FLAG_TOCLIENT,
- HTP_REQUEST_HEADERS, DetectEngineInspectBufferGeneric, GetResponseData);
+ HTP_REQUEST_PROGRESS_HEADERS, DetectEngineInspectBufferGeneric, GetResponseData);
DetectAppLayerMpmRegister("http_cookie", SIG_FLAG_TOSERVER, 2, PrefilterGenericMpmRegister,
- GetRequestData, ALPROTO_HTTP1, HTP_REQUEST_HEADERS);
+ GetRequestData, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_HEADERS);
DetectAppLayerMpmRegister("http_cookie", SIG_FLAG_TOCLIENT, 2, PrefilterGenericMpmRegister,
- GetResponseData, ALPROTO_HTTP1, HTP_REQUEST_HEADERS);
+ GetResponseData, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_HEADERS);
DetectAppLayerInspectEngineRegister("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 66bc73d44c80..5cd395dfcc79 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 */
DetectAppLayerMpmRegister(BUFFER_NAME, SIG_FLAG_TOSERVER, 2, PrefilterGenericMpmRegister,
- GetBuffer1ForTX, ALPROTO_HTTP1, HTP_REQUEST_HEADERS);
+ GetBuffer1ForTX, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_HEADERS);
DetectAppLayerMpmRegister(BUFFER_NAME, SIG_FLAG_TOCLIENT, 2, PrefilterGenericMpmRegister,
- GetBuffer1ForTX, ALPROTO_HTTP1, HTP_RESPONSE_HEADERS);
+ GetBuffer1ForTX, ALPROTO_HTTP1, HTP_RESPONSE_PROGRESS_HEADERS);
DetectAppLayerInspectEngineRegister(BUFFER_NAME, ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_HEADERS, DetectEngineInspectBufferGeneric, GetBuffer1ForTX);
+ HTP_REQUEST_PROGRESS_HEADERS, DetectEngineInspectBufferGeneric, GetBuffer1ForTX);
DetectAppLayerInspectEngineRegister(BUFFER_NAME, ALPROTO_HTTP1, SIG_FLAG_TOCLIENT,
- HTP_RESPONSE_HEADERS, DetectEngineInspectBufferGeneric, GetBuffer1ForTX);
+ HTP_RESPONSE_PROGRESS_HEADERS, DetectEngineInspectBufferGeneric, GetBuffer1ForTX);
/* http2 */
DetectAppLayerMpmRegister(BUFFER_NAME, SIG_FLAG_TOSERVER, 2, PrefilterGenericMpmRegister,
diff --git a/src/detect-http-header.c b/src/detect-http-header.c
index f433d9fc9f07..afb4392ac219 100644
--- a/src/detect-http-header.c
+++ b/src/detect-http-header.c
@@ -79,36 +79,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;
}
}
@@ -124,12 +122,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
@@ -211,11 +209,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;
@@ -276,7 +274,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) ||
@@ -305,9 +303,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;
@@ -321,9 +318,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);
}
@@ -343,9 +339,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;
@@ -359,9 +354,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);
}
@@ -431,13 +425,13 @@ void DetectHttpHeaderRegister(void)
sigmatch_table[DETECT_HTTP_HEADER].flags |= SIGMATCH_INFO_STICKY_BUFFER;
DetectAppLayerInspectEngineRegister("http_header", ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_HEADERS, DetectEngineInspectBufferHttpHeader, NULL);
+ HTP_REQUEST_PROGRESS_HEADERS, DetectEngineInspectBufferHttpHeader, NULL);
DetectAppLayerMpmRegister("http_header", SIG_FLAG_TOSERVER, 2,
PrefilterMpmHttpHeaderRequestRegister, NULL, ALPROTO_HTTP1,
0); /* not used, registered twice: HEADERS/TRAILER */
DetectAppLayerInspectEngineRegister("http_header", ALPROTO_HTTP1, SIG_FLAG_TOCLIENT,
- HTP_RESPONSE_HEADERS, DetectEngineInspectBufferHttpHeader, NULL);
+ HTP_RESPONSE_PROGRESS_HEADERS, DetectEngineInspectBufferHttpHeader, NULL);
DetectAppLayerMpmRegister("http_header", SIG_FLAG_TOCLIENT, 2,
PrefilterMpmHttpHeaderResponseRegister, NULL, ALPROTO_HTTP1,
0); /* not used, registered twice: HEADERS/TRAILER */
@@ -636,13 +630,13 @@ 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);
}
- size_t no_of_headers = htp_table_size(headers);
+ size_t no_of_headers = htp_headers_size(headers);
if (cbdata->local_id == 0) {
// We initialize a big buffer on first item
// Then, we will just use parts of it
@@ -659,9 +653,9 @@ static InspectionBuffer *GetHttp1HeaderData(DetectEngineThreadCtx *det_ctx, cons
hdr_td->cap = no_of_headers;
}
for (size_t i = 0; 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 + 2;
if (hdr_td->items[i].len < size) {
// Use realloc, as this pointer is not freed until HttpMultiBufHeaderThreadDataFree
@@ -671,10 +665,10 @@ static InspectionBuffer *GetHttp1HeaderData(DetectEngineThreadCtx *det_ctx, cons
}
hdr_td->items[i].buffer = tmp;
}
- memcpy(hdr_td->items[i].buffer, bstr_ptr(h->name), size1);
+ memcpy(hdr_td->items[i].buffer, htp_header_name_ptr(h), size1);
hdr_td->items[i].buffer[size1] = ':';
hdr_td->items[i].buffer[size1 + 1] = ' ';
- memcpy(hdr_td->items[i].buffer + size1 + 2, bstr_ptr(h->value), size2);
+ memcpy(hdr_td->items[i].buffer + size1 + 2, htp_header_value_ptr(h), size2);
hdr_td->items[i].len = size;
}
hdr_td->len = no_of_headers;
@@ -797,7 +791,7 @@ void DetectHttpRequestHeaderRegister(void)
DetectAppLayerMpmRegister("http_request_header", SIG_FLAG_TOSERVER, 2,
PrefilterMpmHttp1HeaderRegister, NULL, ALPROTO_HTTP1, 0);
DetectAppLayerInspectEngineRegister("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");
@@ -834,7 +828,7 @@ void DetectHttpResponseHeaderRegister(void)
DetectAppLayerMpmRegister("http_response_header", SIG_FLAG_TOCLIENT, 2,
PrefilterMpmHttp1HeaderRegister, NULL, ALPROTO_HTTP1, 0);
DetectAppLayerInspectEngineRegister("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 82d5f543d7a9..38729e0caa07 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
DetectAppLayerMpmRegister(BUFFER_NAME, SIG_FLAG_TOSERVER, 2, PrefilterGenericMpmRegister,
- GetRequestData, ALPROTO_HTTP1, HTP_REQUEST_HEADERS);
+ GetRequestData, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_HEADERS);
DetectAppLayerMpmRegister(BUFFER_NAME, SIG_FLAG_TOSERVER, 2, PrefilterGenericMpmRegister,
GetRequestData2, ALPROTO_HTTP2, HTTP2StateDataClient);
#endif
#ifdef KEYWORD_TOCLIENT
DetectAppLayerMpmRegister(BUFFER_NAME, SIG_FLAG_TOCLIENT, 2, PrefilterGenericMpmRegister,
- GetResponseData, ALPROTO_HTTP1, HTP_RESPONSE_HEADERS);
+ GetResponseData, ALPROTO_HTTP1, HTP_RESPONSE_PROGRESS_HEADERS);
DetectAppLayerMpmRegister(BUFFER_NAME, SIG_FLAG_TOCLIENT, 2, PrefilterGenericMpmRegister,
GetResponseData2, ALPROTO_HTTP2, HTTP2StateDataServer);
#endif
#ifdef KEYWORD_TOSERVER
DetectAppLayerInspectEngineRegister(BUFFER_NAME, ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_HEADERS, DetectEngineInspectBufferGeneric, GetRequestData);
+ HTP_REQUEST_PROGRESS_HEADERS, DetectEngineInspectBufferGeneric, GetRequestData);
DetectAppLayerInspectEngineRegister(BUFFER_NAME, ALPROTO_HTTP2, SIG_FLAG_TOSERVER,
HTTP2StateDataClient, DetectEngineInspectBufferGeneric, GetRequestData2);
#endif
#ifdef KEYWORD_TOCLIENT
DetectAppLayerInspectEngineRegister(BUFFER_NAME, ALPROTO_HTTP1, SIG_FLAG_TOCLIENT,
- HTP_RESPONSE_HEADERS, DetectEngineInspectBufferGeneric, GetResponseData);
+ HTP_RESPONSE_PROGRESS_HEADERS, DetectEngineInspectBufferGeneric, GetResponseData);
DetectAppLayerInspectEngineRegister(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 fe36a261e6cc..e57fc44d6a8c 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;
DetectAppLayerInspectEngineRegister("http_host", ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_HEADERS, DetectEngineInspectBufferGeneric, GetData);
+ HTP_REQUEST_PROGRESS_HEADERS, DetectEngineInspectBufferGeneric, GetData);
DetectAppLayerMpmRegister("http_host", SIG_FLAG_TOSERVER, 2, PrefilterGenericMpmRegister,
- GetData, ALPROTO_HTTP1, HTP_REQUEST_HEADERS);
+ GetData, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_HEADERS);
DetectAppLayerInspectEngineRegister("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;
DetectAppLayerInspectEngineRegister("http_raw_host", ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_HEADERS, DetectEngineInspectBufferGeneric, GetRawData);
+ HTP_REQUEST_PROGRESS_HEADERS, DetectEngineInspectBufferGeneric, GetRawData);
DetectAppLayerMpmRegister("http_raw_host", SIG_FLAG_TOSERVER, 2, PrefilterGenericMpmRegister,
- GetRawData, ALPROTO_HTTP1, HTP_REQUEST_HEADERS);
+ GetRawData, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_HEADERS);
DetectAppLayerInspectEngineRegister("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 8d08f0369e90..4fdc2466fd8a 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;
DetectAppLayerInspectEngineRegister("http_method", ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_LINE, DetectEngineInspectBufferGeneric, GetData);
+ HTP_REQUEST_PROGRESS_LINE, DetectEngineInspectBufferGeneric, GetData);
DetectAppLayerMpmRegister("http_method", SIG_FLAG_TOSERVER, 4, PrefilterGenericMpmRegister,
- GetData, ALPROTO_HTTP1, HTP_REQUEST_LINE);
+ GetData, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_LINE);
DetectAppLayerInspectEngineRegister("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 ce81c5eb9804..480c4a3be54e 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;
DetectAppLayerMpmRegister(BUFFER_NAME, SIG_FLAG_TOSERVER, 2, PrefilterGenericMpmRegister,
- GetData, ALPROTO_HTTP1, HTP_REQUEST_LINE);
+ GetData, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_LINE);
DetectAppLayerMpmRegister(BUFFER_NAME, SIG_FLAG_TOCLIENT, 2, PrefilterGenericMpmRegister,
- GetData, ALPROTO_HTTP1, HTP_RESPONSE_LINE);
+ GetData, ALPROTO_HTTP1, HTP_RESPONSE_PROGRESS_LINE);
DetectAppLayerInspectEngineRegister(BUFFER_NAME, ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_LINE, DetectEngineInspectBufferGeneric, GetData);
+ HTP_REQUEST_PROGRESS_LINE, DetectEngineInspectBufferGeneric, GetData);
DetectAppLayerInspectEngineRegister(BUFFER_NAME, ALPROTO_HTTP1, SIG_FLAG_TOCLIENT,
- HTP_RESPONSE_LINE, DetectEngineInspectBufferGeneric, GetData);
+ HTP_RESPONSE_PROGRESS_LINE, DetectEngineInspectBufferGeneric, GetData);
DetectAppLayerInspectEngineRegister(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 0bb834b7726a..9dee7d5e30cd 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;
DetectAppLayerInspectEngineRegister("http_raw_header", ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_HEADERS + 1, DetectEngineInspectBufferGeneric, GetData);
+ HTP_REQUEST_PROGRESS_HEADERS + 1, DetectEngineInspectBufferGeneric, GetData);
DetectAppLayerInspectEngineRegister("http_raw_header", ALPROTO_HTTP1, SIG_FLAG_TOCLIENT,
- HTP_RESPONSE_HEADERS + 1, DetectEngineInspectBufferGeneric, GetData);
+ HTP_RESPONSE_PROGRESS_HEADERS + 1, DetectEngineInspectBufferGeneric, GetData);
DetectAppLayerMpmRegister("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 886e643a3eda..287a45209d22 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;
DetectAppLayerInspectEngineRegister("http_request_line", ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_LINE, DetectEngineInspectBufferGeneric, GetData);
+ HTP_REQUEST_PROGRESS_LINE, DetectEngineInspectBufferGeneric, GetData);
DetectAppLayerMpmRegister("http_request_line", SIG_FLAG_TOSERVER, 2,
- PrefilterGenericMpmRegister, GetData, ALPROTO_HTTP1, HTP_REQUEST_LINE);
+ PrefilterGenericMpmRegister, GetData, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_LINE);
DetectAppLayerInspectEngineRegister("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 69ee8c2709ab..ab4d7f9dba5b 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;
DetectAppLayerInspectEngineRegister("http_response_line", ALPROTO_HTTP1, SIG_FLAG_TOCLIENT,
- HTP_RESPONSE_LINE, DetectEngineInspectBufferGeneric, GetData);
+ HTP_RESPONSE_PROGRESS_LINE, DetectEngineInspectBufferGeneric, GetData);
DetectAppLayerMpmRegister("http_response_line", SIG_FLAG_TOCLIENT, 2,
- PrefilterGenericMpmRegister, GetData, ALPROTO_HTTP1, HTP_RESPONSE_LINE);
+ PrefilterGenericMpmRegister, GetData, ALPROTO_HTTP1, HTP_RESPONSE_PROGRESS_LINE);
DetectAppLayerInspectEngineRegister("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 e88ac3cdf68f..fa6e11af0d36 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;
DetectAppLayerMpmRegister(BUFFER_NAME, SIG_FLAG_TOSERVER, 2, PrefilterGenericMpmRegister,
- GetBuffer1ForTX, ALPROTO_HTTP1, HTP_REQUEST_HEADERS);
+ GetBuffer1ForTX, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_HEADERS);
DetectAppLayerMpmRegister(BUFFER_NAME, SIG_FLAG_TOCLIENT, 2, PrefilterGenericMpmRegister,
- GetBuffer1ForTX, ALPROTO_HTTP1, HTP_RESPONSE_HEADERS);
+ GetBuffer1ForTX, ALPROTO_HTTP1, HTP_RESPONSE_PROGRESS_HEADERS);
DetectAppLayerInspectEngineRegister(BUFFER_NAME, ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_HEADERS, DetectEngineInspectBufferGeneric, GetBuffer1ForTX);
+ HTP_REQUEST_PROGRESS_HEADERS, DetectEngineInspectBufferGeneric, GetBuffer1ForTX);
DetectAppLayerInspectEngineRegister(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 37dfb2efbdcc..965027d67a6c 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;
DetectAppLayerInspectEngineRegister("http_stat_code", ALPROTO_HTTP1, SIG_FLAG_TOCLIENT,
- HTP_RESPONSE_LINE, DetectEngineInspectBufferGeneric, GetData);
+ HTP_RESPONSE_PROGRESS_LINE, DetectEngineInspectBufferGeneric, GetData);
DetectAppLayerMpmRegister("http_stat_code", SIG_FLAG_TOCLIENT, 4, PrefilterGenericMpmRegister,
- GetData, ALPROTO_HTTP1, HTP_RESPONSE_LINE);
+ GetData, ALPROTO_HTTP1, HTP_RESPONSE_PROGRESS_LINE);
DetectAppLayerInspectEngineRegister("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 b1a485d7a933..da17a579fb9e 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;
DetectAppLayerInspectEngineRegister("http_stat_msg", ALPROTO_HTTP1, SIG_FLAG_TOCLIENT,
- HTP_RESPONSE_LINE, DetectEngineInspectBufferGeneric, GetData);
+ HTP_RESPONSE_PROGRESS_LINE, DetectEngineInspectBufferGeneric, GetData);
DetectAppLayerMpmRegister("http_stat_msg", SIG_FLAG_TOCLIENT, 3, PrefilterGenericMpmRegister,
- GetData, ALPROTO_HTTP1, HTP_RESPONSE_LINE);
+ GetData, ALPROTO_HTTP1, HTP_RESPONSE_PROGRESS_LINE);
DetectAppLayerInspectEngineRegister("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 8babd9adcb50..4b3206856932 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;
DetectAppLayerInspectEngineRegister("http_user_agent", ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_HEADERS, DetectEngineInspectBufferGeneric, GetData);
+ HTP_REQUEST_PROGRESS_HEADERS, DetectEngineInspectBufferGeneric, GetData);
DetectAppLayerMpmRegister("http_user_agent", SIG_FLAG_TOSERVER, 2, PrefilterGenericMpmRegister,
- GetData, ALPROTO_HTTP1, HTP_REQUEST_HEADERS);
+ GetData, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_HEADERS);
DetectAppLayerInspectEngineRegister("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 12c6f8788549..0cbd2ecf9c56 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;
DetectAppLayerInspectEngineRegister("http_uri", ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_LINE, DetectEngineInspectBufferGeneric, GetData);
+ HTP_REQUEST_PROGRESS_LINE, DetectEngineInspectBufferGeneric, GetData);
DetectAppLayerMpmRegister("http_uri", SIG_FLAG_TOSERVER, 2, PrefilterGenericMpmRegister,
- GetData, ALPROTO_HTTP1, HTP_REQUEST_LINE);
+ GetData, ALPROTO_HTTP1, HTP_REQUEST_PROGRESS_LINE);
DetectAppLayerInspectEngineRegister("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;
DetectAppLayerInspectEngineRegister("http_raw_uri", ALPROTO_HTTP1, SIG_FLAG_TOSERVER,
- HTP_REQUEST_LINE, DetectEngineInspectBufferGeneric, GetRawData);
+ HTP_REQUEST_PROGRESS_LINE, DetectEngineInspectBufferGeneric, GetRawData);
DetectAppLayerMpmRegister("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
DetectAppLayerInspectEngineRegister("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 93f4a687f87d..d4af9293fc4f 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-parse.c b/src/detect-parse.c
index 028943920072..bb7bea0b3518 100644
--- a/src/detect-parse.c
+++ b/src/detect-parse.c
@@ -92,8 +92,8 @@ void DetectFileRegisterFileProtocols(DetectFileHandlerTableElmt *reg)
{ .al_proto = ALPROTO_FTPDATA, .direction = SIG_FLAG_TOSERVER | SIG_FLAG_TOCLIENT },
{ .al_proto = ALPROTO_HTTP1,
.direction = SIG_FLAG_TOSERVER | SIG_FLAG_TOCLIENT,
- .to_client_progress = HTP_RESPONSE_BODY,
- .to_server_progress = HTP_REQUEST_BODY },
+ .to_client_progress = HTP_RESPONSE_PROGRESS_BODY,
+ .to_server_progress = HTP_REQUEST_PROGRESS_BODY },
{ .al_proto = ALPROTO_HTTP2,
.direction = SIG_FLAG_TOSERVER | SIG_FLAG_TOCLIENT,
.to_client_progress = HTTP2StateDataServer,
diff --git a/src/detect-pcre.c b/src/detect-pcre.c
index 6d20dd08bb5d..0154bcda3e5f 100644
--- a/src/detect-pcre.c
+++ b/src/detect-pcre.c
@@ -1634,7 +1634,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;
@@ -1642,7 +1642,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);
@@ -1782,14 +1782,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 17a01442dab3..301db54b5cf9 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 abbeaf07edb6..912cb1c97acb 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,66 +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: from libhtp:
- * "Response status code, available only if we were able to parse it, HTP_STATUS_INVALID
- * otherwise. HTP_STATUS_UNKNOWN until parsing is attempted" .*/
- const int resp = tx->response_status_number;
- if (resp > 0) {
- jb_set_uint(js, "status", (uint32_t)resp);
- } else if (tx->response_status != NULL) {
- const size_t status_size = bstr_len(tx->response_status) * 2 + 1;
+ /* response status */
+ 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));
+ 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++) {
@@ -336,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;
}
@@ -349,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);
@@ -398,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");
@@ -429,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 75ee211022f6..278076f2ace5 100644
--- a/src/output-streaming.c
+++ b/src/output-streaming.c
@@ -182,7 +182,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 6d316771f9a0..ad13028203c6 100644
--- a/src/suricata.c
+++ b/src/suricata.c
@@ -733,9 +733,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
@@ -884,8 +882,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 bbeb4d33bde8..d029645e550b 100644
--- a/src/tests/detect-http-client-body.c
+++ b/src/tests/detect-http-client-body.c
@@ -2154,7 +2154,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) {
@@ -2169,7 +2169,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 fe64d8dd2b04..a6fa75ad4af8 100644
--- a/src/tests/detect-http-server-body.c
+++ b/src/tests/detect-http-server-body.c
@@ -2579,9 +2579,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;
@@ -2708,9 +2706,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;
@@ -2839,9 +2835,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 8fa2cba5969f..d486fcb9c5a5 100644
--- a/src/util-print.c
+++ b/src/util-print.c
@@ -66,7 +66,7 @@ void PrintRawLineHexBuf(char *retbuf, uint32_t retbuflen, const uint8_t *buf, ui
}
}
-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] = "";
@@ -90,8 +90,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)
{
for (uint32_t u = 0; u < buflen; u++) {
if (isprint(buf[u]) && buf[u] != '\"') {
diff --git a/src/util-print.h b/src/util-print.h
index e33de781997f..5008b25fabd5 100644
--- a/src/util-print.h
+++ b/src/util-print.h
@@ -40,8 +40,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 PrintRawDataFp(FILE *, const uint8_t *, uint32_t);
void PrintRawDataToBuffer(uint8_t *dst_buf, uint32_t *dst_buf_offset_ptr, uint32_t dst_buf_size,
const uint8_t *src_buf, uint32_t src_buf_len);