net/content_disposition — total parser for the mojibake-prone header: RFC 6266 filename (quoted/token), RFC 5987 filename* ext-values (charset'lang'pct-encoded, incl. RFC 2231 continuations), legacy RFC 2047 encoded-words (=?UTF-8?B?..?= / ?Q?), and raw Latin-1 bytes; prefers filename* over filename; strips path components AFTER decoding (a base64 payload can hold '/'). 22-case test table. net/text_codec (internal) — percent-decode, UTF-8 validation, Latin-1-> UTF-8, base64, RFC 2047 — shared by the CD parser and the URL splitter. net/url — a small total URL splitter (scheme/userinfo/host/port/path/ query/fragment, http(s) validity) and url_filename() for the last path segment; used for the filename fallback. net/probe — HEAD then a ranged GET bytes=0-0 that PROVES resumability (206 + matching Content-Range + a validator), rather than trusting Accept-Ranges which servers lie about; the ranged GET is also the HEAD- refused (403/405/501) fallback. 401/407 -> success result with requires_auth, not an error. Runs on its own pool (max_concurrent, default 4) outside the segment budget per ADR 0011 §5. suggest_filename() does the resolution order (explicit -> disposition -> URL -> download.bin) with a light strip; rules/ (stage 9) owns the authoritative sanitize. tools/fuzz — libFuzzer targets for the CD parser and the URL splitter, compiling the parser sources directly so they're fully instrumented; self-guards on VELOX_BUILD_FUZZ + Clang (the top-level CMake adds every tools/* unconditionally). Seed corpora included. Fixed on the way: a p -> Transfer -> State -> cbs -> p reference cycle in Prober that leaked every probe (drop the stored Transfer; the worker keeps State alive). Tests green under ASan/UBSan and TSan. Co-Authored-By: Claude Sonnet 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HPPSGhiArbvQgwC2DNiURS
48 lines
1.7 KiB
CMake
48 lines
1.7 KiB
CMake
# libveloxcore — the download engine. Lane CORE.
|
|
#
|
|
# No JSON, no SQL, no Qt, no RPC in this tree (CLAUDE.md §3, AGENT-CORE brief).
|
|
# This file is self-contained; it is wired into the build by PKG uncommenting
|
|
# `add_subdirectory(core)` in the root CMakeLists.txt (see core/docs/pkg-requests-m1.md).
|
|
|
|
find_package(Threads REQUIRED)
|
|
find_package(CURL 8.0 REQUIRED)
|
|
|
|
add_library(veloxcore STATIC
|
|
src/util/error.cpp
|
|
src/util/log.cpp
|
|
src/util/thread_pool.cpp
|
|
src/net/curl_error.cpp
|
|
src/net/http_client.cpp
|
|
src/net/text_codec.cpp
|
|
src/net/content_disposition.cpp
|
|
src/net/url.cpp
|
|
src/net/probe.cpp
|
|
)
|
|
add_library(velox::core ALIAS veloxcore)
|
|
|
|
target_include_directories(veloxcore
|
|
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include
|
|
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src # net/*.cpp -> "net/curl_error.hpp"
|
|
)
|
|
|
|
target_compile_features(veloxcore PUBLIC cxx_std_23)
|
|
|
|
# Warnings are set at target scope, not via CMAKE_CXX_FLAGS: the dev/tsan presets
|
|
# overwrite that cache variable wholesale (see core/docs/pkg-requests-m1.md P4).
|
|
target_compile_options(veloxcore PRIVATE
|
|
-Wall -Wextra -Wpedantic -Werror
|
|
)
|
|
|
|
target_link_libraries(veloxcore PUBLIC Threads::Threads CURL::libcurl)
|
|
|
|
# Later stages add: find_package(OpenSSL) for meta/ (streaming SHA-256 + resume CRC).
|
|
|
|
if(VELOX_BUILD_TESTS)
|
|
add_subdirectory(tests)
|
|
endif()
|
|
|
|
# Fuzz targets live in ${CMAKE_SOURCE_DIR}/tools/fuzz (lane CORE) and are wired in by the
|
|
# top-level CMakeLists.txt, which add_subdirectory()s every tools/* with a CMakeLists.
|
|
# tools/fuzz/CMakeLists.txt self-guards on VELOX_BUILD_FUZZ + a Clang compiler.
|
|
# Present: Content-Disposition, URL (stage 3). Coming: .veloxpart.meta (stage 5).
|