diff --git a/test/fuzz/http_request.cpp b/test/fuzz/http_request.cpp new file mode 100644 index 00000000..1824a423 --- /dev/null +++ b/test/fuzz/http_request.cpp @@ -0,0 +1,25 @@ +// +// Copyright (c) 2024 Mikhail Khachayants +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#include +#include + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) +{ + using namespace boost::beast; + + error_code ec; + flat_buffer buffer; + net::io_context ioc; + test::stream stream{ioc, {reinterpret_cast(data), size}}; + stream.close_remote(); + + http::request_parser parser; + http::read(stream, buffer, parser, ec); + + return 0; +} diff --git a/test/fuzz/http_response.cpp b/test/fuzz/http_response.cpp new file mode 100644 index 00000000..5a10fb8b --- /dev/null +++ b/test/fuzz/http_response.cpp @@ -0,0 +1,33 @@ +// +// Copyright (c) 2024 Mikhail Khachayants +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#include +#include + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) +{ + using namespace boost::beast; + + error_code ec; + flat_buffer buffer; + net::io_context ioc; + test::stream stream{ioc, {reinterpret_cast(data), size}}; + stream.close_remote(); + + http::chunk_extensions ce; + http::response_parser parser; + + auto chunk_header_cb = [&ce](std::uint64_t, string_view extensions, error_code& ev) + { + ce.parse(extensions, ev); + }; + + parser.on_chunk_header(chunk_header_cb); + http::read(stream, buffer, parser, ec); + + return 0; +} diff --git a/test/fuzz/seeds.tar b/test/fuzz/seeds.tar new file mode 100644 index 00000000..002a79a6 Binary files /dev/null and b/test/fuzz/seeds.tar differ diff --git a/test/fuzz/websocket_server.cpp b/test/fuzz/websocket_server.cpp new file mode 100644 index 00000000..996c6391 --- /dev/null +++ b/test/fuzz/websocket_server.cpp @@ -0,0 +1,46 @@ +// +// Copyright (c) 2024 Mikhail Khachayants +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#include +#include + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) +{ + using namespace boost::beast; + + error_code ec; + flat_buffer buffer; + net::io_context ioc; + test::stream remote{ioc}; + + websocket::stream ws{ + ioc, string_view{reinterpret_cast(data), size}}; + + ws.set_option(websocket::stream_base::decorator( + [](websocket::response_type& res) + { + res.set(http::field::server, "websocket-server-sync"); + })); + + websocket::permessage_deflate pd; + pd.server_enable = (size % 2) != 0; + pd.compLevel = static_cast(size % 9); + ws.set_option(pd); + + ws.next_layer().connect(remote); + ws.next_layer().close_remote(); + ws.accept(ec); + + if(!ec) + { + ws.read(buffer, ec); + ws.text(ws.got_text()); + ws.write(buffer.data(), ec); + } + + return 0; +}