/src/pistache/tests/fuzzers/fuzz_parser.cpp
Line | Count | Source |
1 | | /* |
2 | | * SPDX-FileCopyrightText: 2021 David Korczynski |
3 | | * |
4 | | * SPDX-License-Identifier: Apache-2.0 |
5 | | */ |
6 | | |
7 | | #include <pistache/http.h> |
8 | | #include <pistache/router.h> |
9 | | |
10 | | using namespace Pistache; |
11 | | |
12 | | template <class F> |
13 | | void ignoreExceptions(const F& func) |
14 | 150k | { |
15 | 150k | try |
16 | 150k | { |
17 | 150k | func(); |
18 | 150k | } |
19 | 150k | catch (...) |
20 | 150k | { |
21 | 57.2k | } |
22 | 150k | } fuzz_parser.cpp:void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::Authorization>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0>(parseHttpHeader<Pistache::Http::Header::Authorization>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0 const&) Line | Count | Source | 14 | 4.49k | { | 15 | 4.49k | try | 16 | 4.49k | { | 17 | 4.49k | func(); | 18 | 4.49k | } | 19 | 4.49k | catch (...) | 20 | 4.49k | { | 21 | 0 | } | 22 | 4.49k | } |
fuzz_parser.cpp:void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::Authorization>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_1>(parseHttpHeader<Pistache::Http::Header::Authorization>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_1 const&) Line | Count | Source | 14 | 4.49k | { | 15 | 4.49k | try | 16 | 4.49k | { | 17 | 4.49k | func(); | 18 | 4.49k | } | 19 | 4.49k | catch (...) | 20 | 4.49k | { | 21 | 0 | } | 22 | 4.49k | } |
fuzz_parser.cpp:void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::Authorization>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_2>(parseHttpHeader<Pistache::Http::Header::Authorization>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_2 const&) Line | Count | Source | 14 | 4.49k | { | 15 | 4.49k | try | 16 | 4.49k | { | 17 | 4.49k | func(); | 18 | 4.49k | } | 19 | 4.49k | catch (...) | 20 | 4.49k | { | 21 | 3.98k | } | 22 | 4.49k | } |
void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::Accept>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}>(parseHttpHeader<Pistache::Http::Header::Accept>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1} const&)Line | Count | Source | 14 | 4.49k | { | 15 | 4.49k | try | 16 | 4.49k | { | 17 | 4.49k | func(); | 18 | 4.49k | } | 19 | 4.49k | catch (...) | 20 | 4.49k | { | 21 | 4.11k | } | 22 | 4.49k | } |
void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::CacheControl>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}>(parseHttpHeader<Pistache::Http::Header::CacheControl>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1} const&)Line | Count | Source | 14 | 4.49k | { | 15 | 4.49k | try | 16 | 4.49k | { | 17 | 4.49k | func(); | 18 | 4.49k | } | 19 | 4.49k | catch (...) | 20 | 4.49k | { | 21 | 4.20k | } | 22 | 4.49k | } |
void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::Connection>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}>(parseHttpHeader<Pistache::Http::Header::Connection>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1} const&)Line | Count | Source | 14 | 4.49k | { | 15 | 4.49k | try | 16 | 4.49k | { | 17 | 4.49k | func(); | 18 | 4.49k | } | 19 | 4.49k | catch (...) | 20 | 4.49k | { | 21 | 0 | } | 22 | 4.49k | } |
void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::AcceptEncoding>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}>(parseHttpHeader<Pistache::Http::Header::AcceptEncoding>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1} const&)Line | Count | Source | 14 | 4.49k | { | 15 | 4.49k | try | 16 | 4.49k | { | 17 | 4.49k | func(); | 18 | 4.49k | } | 19 | 4.49k | catch (...) | 20 | 4.49k | { | 21 | 0 | } | 22 | 4.49k | } |
void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::ContentEncoding>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}>(parseHttpHeader<Pistache::Http::Header::ContentEncoding>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1} const&)Line | Count | Source | 14 | 4.49k | { | 15 | 4.49k | try | 16 | 4.49k | { | 17 | 4.49k | func(); | 18 | 4.49k | } | 19 | 4.49k | catch (...) | 20 | 4.49k | { | 21 | 0 | } | 22 | 4.49k | } |
void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::ContentLength>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}>(parseHttpHeader<Pistache::Http::Header::ContentLength>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1} const&)Line | Count | Source | 14 | 4.49k | { | 15 | 4.49k | try | 16 | 4.49k | { | 17 | 4.49k | func(); | 18 | 4.49k | } | 19 | 4.49k | catch (...) | 20 | 4.49k | { | 21 | 8 | } | 22 | 4.49k | } |
void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::ContentType>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}>(parseHttpHeader<Pistache::Http::Header::ContentType>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1} const&)Line | Count | Source | 14 | 4.49k | { | 15 | 4.49k | try | 16 | 4.49k | { | 17 | 4.49k | func(); | 18 | 4.49k | } | 19 | 4.49k | catch (...) | 20 | 4.49k | { | 21 | 3.83k | } | 22 | 4.49k | } |
void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::Date>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}>(parseHttpHeader<Pistache::Http::Header::Date>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1} const&)Line | Count | Source | 14 | 4.49k | { | 15 | 4.49k | try | 16 | 4.49k | { | 17 | 4.49k | func(); | 18 | 4.49k | } | 19 | 4.49k | catch (...) | 20 | 4.49k | { | 21 | 4.19k | } | 22 | 4.49k | } |
void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::Expect>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}>(parseHttpHeader<Pistache::Http::Header::Expect>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1} const&)Line | Count | Source | 14 | 4.49k | { | 15 | 4.49k | try | 16 | 4.49k | { | 17 | 4.49k | func(); | 18 | 4.49k | } | 19 | 4.49k | catch (...) | 20 | 4.49k | { | 21 | 0 | } | 22 | 4.49k | } |
void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::Host>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}>(parseHttpHeader<Pistache::Http::Header::Host>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1} const&)Line | Count | Source | 14 | 4.49k | { | 15 | 4.49k | try | 16 | 4.49k | { | 17 | 4.49k | func(); | 18 | 4.49k | } | 19 | 4.49k | catch (...) | 20 | 4.49k | { | 21 | 1.15k | } | 22 | 4.49k | } |
void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::Server>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}>(parseHttpHeader<Pistache::Http::Header::Server>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1} const&)Line | Count | Source | 14 | 4.49k | { | 15 | 4.49k | try | 16 | 4.49k | { | 17 | 4.49k | func(); | 18 | 4.49k | } | 19 | 4.49k | catch (...) | 20 | 4.49k | { | 21 | 0 | } | 22 | 4.49k | } |
fuzz_parser.cpp:void ignoreExceptions<fuzz_cookies(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0>(fuzz_cookies(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0 const&) Line | Count | Source | 14 | 1.74k | { | 15 | 1.74k | try | 16 | 1.74k | { | 17 | 1.74k | func(); | 18 | 1.74k | } | 19 | 1.74k | catch (...) | 20 | 1.74k | { | 21 | 158 | } | 22 | 1.74k | } |
fuzz_parser.cpp:void ignoreExceptions<fuzz_cookies(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_1>(fuzz_cookies(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_1 const&) Line | Count | Source | 14 | 1.74k | { | 15 | 1.74k | try | 16 | 1.74k | { | 17 | 1.74k | func(); | 18 | 1.74k | } | 19 | 1.74k | catch (...) | 20 | 1.74k | { | 21 | 587 | } | 22 | 1.74k | } |
fuzz_parser.cpp:void ignoreExceptions<fuzz_request_parser(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0>(fuzz_request_parser(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0 const&) Line | Count | Source | 14 | 2.75k | { | 15 | 2.75k | try | 16 | 2.75k | { | 17 | 2.75k | func(); | 18 | 2.75k | } | 19 | 2.75k | catch (...) | 20 | 2.75k | { | 21 | 618 | } | 22 | 2.75k | } |
fuzz_parser.cpp:void ignoreExceptions<fuzz_request_parser(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_1>(fuzz_request_parser(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_1 const&) Line | Count | Source | 14 | 2.05k | { | 15 | 2.05k | try | 16 | 2.05k | { | 17 | 2.05k | func(); | 18 | 2.05k | } | 19 | 2.05k | catch (...) | 20 | 2.05k | { | 21 | 0 | } | 22 | 2.05k | } |
fuzz_parser.cpp:void ignoreExceptions<fuzz_response_parser(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0>(fuzz_response_parser(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0 const&) Line | Count | Source | 14 | 320 | { | 15 | 320 | try | 16 | 320 | { | 17 | 320 | func(); | 18 | 320 | } | 19 | 320 | catch (...) | 20 | 320 | { | 21 | 194 | } | 22 | 320 | } |
fuzz_parser.cpp:void ignoreExceptions<fuzz_response_parser(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_1>(fuzz_response_parser(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_1 const&) Line | Count | Source | 14 | 126 | { | 15 | 126 | try | 16 | 126 | { | 17 | 126 | func(); | 18 | 126 | } | 19 | 126 | catch (...) | 20 | 126 | { | 21 | 0 | } | 22 | 126 | } |
fuzz_parser.cpp:void ignoreExceptions<fuzz_router(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0>(fuzz_router(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0 const&) Line | Count | Source | 14 | 53.3k | { | 15 | 53.3k | try | 16 | 53.3k | { | 17 | 53.3k | func(); | 18 | 53.3k | } | 19 | 53.3k | catch (...) | 20 | 53.3k | { | 21 | 25.1k | } | 22 | 53.3k | } |
fuzz_parser.cpp:void ignoreExceptions<fuzz_router(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_1>(fuzz_router(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_1 const&) Line | Count | Source | 14 | 18.2k | { | 15 | 18.2k | try | 16 | 18.2k | { | 17 | 18.2k | func(); | 18 | 18.2k | } | 19 | 18.2k | catch (...) | 20 | 18.2k | { | 21 | 9.04k | } | 22 | 18.2k | } |
fuzz_parser.cpp:void ignoreExceptions<fuzz_router(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_2>(fuzz_router(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_2 const&) Line | Count | Source | 14 | 6.79k | { | 15 | 6.79k | try | 16 | 6.79k | { | 17 | 6.79k | func(); | 18 | 6.79k | } | 19 | 6.79k | catch (...) | 20 | 6.79k | { | 21 | 0 | } | 22 | 6.79k | } |
|
23 | | |
24 | | template <class T> |
25 | | void parseHttpHeader(const std::string& input) |
26 | 49.4k | { |
27 | 49.4k | T header; |
28 | 49.4k | ignoreExceptions([&] { header.parse(input); });parseHttpHeader<Pistache::Http::Header::Accept>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}::operator()() constLine | Count | Source | 28 | 4.49k | ignoreExceptions([&] { header.parse(input); }); |
parseHttpHeader<Pistache::Http::Header::CacheControl>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}::operator()() constLine | Count | Source | 28 | 4.49k | ignoreExceptions([&] { header.parse(input); }); |
parseHttpHeader<Pistache::Http::Header::Connection>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}::operator()() constLine | Count | Source | 28 | 4.49k | ignoreExceptions([&] { header.parse(input); }); |
parseHttpHeader<Pistache::Http::Header::AcceptEncoding>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}::operator()() constLine | Count | Source | 28 | 4.49k | ignoreExceptions([&] { header.parse(input); }); |
parseHttpHeader<Pistache::Http::Header::ContentEncoding>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}::operator()() constLine | Count | Source | 28 | 4.49k | ignoreExceptions([&] { header.parse(input); }); |
parseHttpHeader<Pistache::Http::Header::ContentLength>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}::operator()() constLine | Count | Source | 28 | 4.49k | ignoreExceptions([&] { header.parse(input); }); |
parseHttpHeader<Pistache::Http::Header::ContentType>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}::operator()() constLine | Count | Source | 28 | 4.49k | ignoreExceptions([&] { header.parse(input); }); |
parseHttpHeader<Pistache::Http::Header::Date>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}::operator()() constLine | Count | Source | 28 | 4.49k | ignoreExceptions([&] { header.parse(input); }); |
parseHttpHeader<Pistache::Http::Header::Expect>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}::operator()() constLine | Count | Source | 28 | 4.49k | ignoreExceptions([&] { header.parse(input); }); |
parseHttpHeader<Pistache::Http::Header::Host>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}::operator()() constLine | Count | Source | 28 | 4.49k | ignoreExceptions([&] { header.parse(input); }); |
parseHttpHeader<Pistache::Http::Header::Server>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}::operator()() constLine | Count | Source | 28 | 4.49k | ignoreExceptions([&] { header.parse(input); }); |
|
29 | | |
30 | 49.4k | std::stringstream oss; |
31 | 49.4k | header.write(oss); |
32 | 49.4k | } void parseHttpHeader<Pistache::Http::Header::Accept>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 26 | 4.49k | { | 27 | 4.49k | T header; | 28 | 4.49k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 4.49k | std::stringstream oss; | 31 | 4.49k | header.write(oss); | 32 | 4.49k | } |
void parseHttpHeader<Pistache::Http::Header::CacheControl>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 26 | 4.49k | { | 27 | 4.49k | T header; | 28 | 4.49k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 4.49k | std::stringstream oss; | 31 | 4.49k | header.write(oss); | 32 | 4.49k | } |
void parseHttpHeader<Pistache::Http::Header::Connection>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 26 | 4.49k | { | 27 | 4.49k | T header; | 28 | 4.49k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 4.49k | std::stringstream oss; | 31 | 4.49k | header.write(oss); | 32 | 4.49k | } |
void parseHttpHeader<Pistache::Http::Header::AcceptEncoding>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 26 | 4.49k | { | 27 | 4.49k | T header; | 28 | 4.49k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 4.49k | std::stringstream oss; | 31 | 4.49k | header.write(oss); | 32 | 4.49k | } |
void parseHttpHeader<Pistache::Http::Header::ContentEncoding>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 26 | 4.49k | { | 27 | 4.49k | T header; | 28 | 4.49k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 4.49k | std::stringstream oss; | 31 | 4.49k | header.write(oss); | 32 | 4.49k | } |
void parseHttpHeader<Pistache::Http::Header::ContentLength>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 26 | 4.49k | { | 27 | 4.49k | T header; | 28 | 4.49k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 4.49k | std::stringstream oss; | 31 | 4.49k | header.write(oss); | 32 | 4.49k | } |
void parseHttpHeader<Pistache::Http::Header::ContentType>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 26 | 4.49k | { | 27 | 4.49k | T header; | 28 | 4.49k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 4.49k | std::stringstream oss; | 31 | 4.49k | header.write(oss); | 32 | 4.49k | } |
void parseHttpHeader<Pistache::Http::Header::Date>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 26 | 4.49k | { | 27 | 4.49k | T header; | 28 | 4.49k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 4.49k | std::stringstream oss; | 31 | 4.49k | header.write(oss); | 32 | 4.49k | } |
void parseHttpHeader<Pistache::Http::Header::Expect>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 26 | 4.49k | { | 27 | 4.49k | T header; | 28 | 4.49k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 4.49k | std::stringstream oss; | 31 | 4.49k | header.write(oss); | 32 | 4.49k | } |
void parseHttpHeader<Pistache::Http::Header::Host>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 26 | 4.49k | { | 27 | 4.49k | T header; | 28 | 4.49k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 4.49k | std::stringstream oss; | 31 | 4.49k | header.write(oss); | 32 | 4.49k | } |
void parseHttpHeader<Pistache::Http::Header::Server>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 26 | 4.49k | { | 27 | 4.49k | T header; | 28 | 4.49k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 4.49k | std::stringstream oss; | 31 | 4.49k | header.write(oss); | 32 | 4.49k | } |
|
33 | | |
34 | | template <> |
35 | | void parseHttpHeader<Pistache::Http::Header::Authorization>(const std::string& input) |
36 | 4.49k | { |
37 | 4.49k | Pistache::Http::Header::Authorization header; |
38 | 4.49k | ignoreExceptions([&] { header.parse(input); }); |
39 | 4.49k | ignoreExceptions([&] { header.getMethod(); }); |
40 | 4.49k | ignoreExceptions( |
41 | 4.49k | [&] { |
42 | 4.49k | const auto user = header.getBasicUser(); |
43 | 4.49k | const auto password = header.getBasicPassword(); |
44 | 4.49k | header.setBasicUserPassword(user, password); |
45 | 4.49k | }); |
46 | | |
47 | 4.49k | std::stringstream oss; |
48 | 4.49k | header.write(oss); |
49 | 4.49k | } |
50 | | |
51 | | void fuzz_headers(const std::string& input) |
52 | 4.49k | { |
53 | 4.49k | parseHttpHeader<Pistache::Http::Header::Accept>(input); |
54 | 4.49k | parseHttpHeader<Pistache::Http::Header::CacheControl>(input); |
55 | 4.49k | parseHttpHeader<Pistache::Http::Header::Connection>(input); |
56 | 4.49k | parseHttpHeader<Pistache::Http::Header::AcceptEncoding>(input); |
57 | 4.49k | parseHttpHeader<Pistache::Http::Header::ContentEncoding>(input); |
58 | 4.49k | parseHttpHeader<Pistache::Http::Header::ContentLength>(input); |
59 | 4.49k | parseHttpHeader<Pistache::Http::Header::ContentType>(input); |
60 | 4.49k | parseHttpHeader<Pistache::Http::Header::Authorization>(input); |
61 | 4.49k | parseHttpHeader<Pistache::Http::Header::Date>(input); |
62 | 4.49k | parseHttpHeader<Pistache::Http::Header::Expect>(input); |
63 | 4.49k | parseHttpHeader<Pistache::Http::Header::Host>(input); |
64 | 4.49k | parseHttpHeader<Pistache::Http::Header::Server>(input); |
65 | 4.49k | } |
66 | | |
67 | | void fuzz_cookies(const std::string& input) |
68 | 1.74k | { |
69 | 1.74k | Pistache::Http::CookieJar cookie_jar; |
70 | 1.74k | ignoreExceptions([&] { Pistache::Http::Cookie::fromString(input); }); |
71 | 1.74k | ignoreExceptions([&] { cookie_jar.addFromRaw(input.data(), input.size()); }); |
72 | 1.74k | } |
73 | | |
74 | | void fuzz_request_parser(const std::string& input) |
75 | 2.75k | { |
76 | 2.75k | constexpr size_t maxDataSize = 4096; |
77 | 2.75k | Pistache::Http::RequestParser rparser(maxDataSize); |
78 | | |
79 | 2.75k | if (rparser.feed(input.data(), input.size())) |
80 | 2.75k | { |
81 | 2.75k | auto state = Pistache::Http::Private::State::Done; |
82 | 2.75k | ignoreExceptions([&] { state = rparser.parse(); }); |
83 | | |
84 | 2.75k | if (state == Pistache::Http::Private::State::Again) |
85 | 2.05k | ignoreExceptions([&] { rparser.parse(); }); |
86 | 2.75k | } |
87 | 2.75k | } |
88 | | |
89 | | void fuzz_response_parser(const std::string& input) |
90 | 321 | { |
91 | 321 | constexpr size_t maxDataSize = 4096; |
92 | 321 | Pistache::Http::ResponseParser rparser(maxDataSize); |
93 | | |
94 | 321 | if (rparser.feed(input.data(), input.size())) |
95 | 320 | { |
96 | 320 | auto state = Pistache::Http::Private::State::Done; |
97 | 320 | ignoreExceptions([&] { state = rparser.parse(); }); |
98 | | |
99 | 320 | if (state == Pistache::Http::Private::State::Again) |
100 | 126 | ignoreExceptions([&] { rparser.parse(); }); |
101 | 320 | } |
102 | 321 | } |
103 | | |
104 | | void fuzz_router(const std::string& input) |
105 | 2.42k | { |
106 | 2.42k | std::string path_input; |
107 | 2.42k | std::stringstream input_stream(input); |
108 | 2.42k | Pistache::Rest::SegmentTreeNode tree; |
109 | | |
110 | 111k | while (std::getline(input_stream, path_input, '\n')) |
111 | 109k | { |
112 | 109k | if (path_input.size() < 2) |
113 | 10.7k | continue; |
114 | | |
115 | 98.3k | const int test_case = path_input.back(); |
116 | 98.3k | path_input.pop_back(); |
117 | | |
118 | 98.3k | const auto sanitized = Pistache::Rest::SegmentTreeNode::sanitizeResource(path_input); |
119 | 98.3k | std::shared_ptr<char> ptr(new char[sanitized.length()], std::default_delete<char[]>()); |
120 | 98.3k | std::memcpy(ptr.get(), sanitized.data(), sanitized.length()); |
121 | 98.3k | const std::string_view path { ptr.get(), sanitized.length() }; |
122 | | |
123 | 98.3k | switch (test_case) |
124 | 98.3k | { |
125 | 53.3k | case 'A': |
126 | 53.3k | ignoreExceptions([&] { |
127 | 53.3k | Pistache::Rest::Route::Handler handler = [](auto...) { return Pistache::Rest::Route::Result::Ok; }; |
128 | 53.3k | std::shared_ptr<char> ptr(new char[sanitized.length()], std::default_delete<char[]>()); |
129 | 53.3k | std::memcpy(ptr.get(), sanitized.data(), sanitized.length()); |
130 | 53.3k | const std::string_view path { ptr.get(), sanitized.length() }; |
131 | 53.3k | tree.addRoute(path, handler, ptr); |
132 | 53.3k | }); |
133 | 53.3k | break; |
134 | 18.2k | case 'R': |
135 | 18.2k | ignoreExceptions([&] { tree.removeRoute(path); }); |
136 | 18.2k | break; |
137 | 6.79k | case 'F': |
138 | 6.79k | ignoreExceptions([&] { tree.findRoute(path); }); |
139 | 6.79k | break; |
140 | 98.3k | } |
141 | 98.3k | } |
142 | 2.42k | } |
143 | | |
144 | | void fuzz_other(const std::string& input) |
145 | 3 | { |
146 | | // URI parsing |
147 | 3 | Http::Uri::Query query1; |
148 | 3 | query1.add(input, input); |
149 | 3 | } |
150 | | |
151 | | extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) |
152 | 11.7k | { |
153 | 11.7k | if (size < 1) |
154 | 0 | return -1; |
155 | | |
156 | 11.7k | const uint8_t type = data[0]; |
157 | 11.7k | const std::string input(reinterpret_cast<const char*>(data + 1), size - 1); |
158 | | |
159 | 11.7k | switch (type) |
160 | 11.7k | { |
161 | 4.49k | case 'H': |
162 | 4.49k | fuzz_headers(input); |
163 | 4.49k | break; |
164 | 1.74k | case 'C': |
165 | 1.74k | fuzz_cookies(input); |
166 | 1.74k | break; |
167 | 2.75k | case 'R': |
168 | 2.75k | fuzz_request_parser(input); |
169 | 2.75k | break; |
170 | 321 | case 'A': |
171 | 321 | fuzz_response_parser(input); |
172 | 321 | break; |
173 | 2.42k | case 'S': |
174 | 2.42k | fuzz_router(input); |
175 | 2.42k | break; |
176 | 3 | case 'O': |
177 | 3 | fuzz_other(input); |
178 | 3 | break; |
179 | 11.7k | } |
180 | | |
181 | 11.7k | return 0; |
182 | 11.7k | } |