/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 | 125k | { |
15 | 125k | try |
16 | 125k | { |
17 | 125k | func(); |
18 | 125k | } |
19 | 125k | catch (...) |
20 | 125k | { |
21 | 55.9k | } |
22 | 125k | } 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 | 3.01k | { | 15 | 3.01k | try | 16 | 3.01k | { | 17 | 3.01k | func(); | 18 | 3.01k | } | 19 | 3.01k | catch (...) | 20 | 3.01k | { | 21 | 0 | } | 22 | 3.01k | } |
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 | 3.01k | { | 15 | 3.01k | try | 16 | 3.01k | { | 17 | 3.01k | func(); | 18 | 3.01k | } | 19 | 3.01k | catch (...) | 20 | 3.01k | { | 21 | 0 | } | 22 | 3.01k | } |
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 | 3.01k | { | 15 | 3.01k | try | 16 | 3.01k | { | 17 | 3.01k | func(); | 18 | 3.01k | } | 19 | 3.01k | catch (...) | 20 | 3.01k | { | 21 | 2.67k | } | 22 | 3.01k | } |
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 | 3.01k | { | 15 | 3.01k | try | 16 | 3.01k | { | 17 | 3.01k | func(); | 18 | 3.01k | } | 19 | 3.01k | catch (...) | 20 | 3.01k | { | 21 | 2.77k | } | 22 | 3.01k | } |
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 | 3.01k | { | 15 | 3.01k | try | 16 | 3.01k | { | 17 | 3.01k | func(); | 18 | 3.01k | } | 19 | 3.01k | catch (...) | 20 | 3.01k | { | 21 | 2.80k | } | 22 | 3.01k | } |
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 | 3.01k | { | 15 | 3.01k | try | 16 | 3.01k | { | 17 | 3.01k | func(); | 18 | 3.01k | } | 19 | 3.01k | catch (...) | 20 | 3.01k | { | 21 | 0 | } | 22 | 3.01k | } |
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 | 3.01k | { | 15 | 3.01k | try | 16 | 3.01k | { | 17 | 3.01k | func(); | 18 | 3.01k | } | 19 | 3.01k | catch (...) | 20 | 3.01k | { | 21 | 0 | } | 22 | 3.01k | } |
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 | 3.01k | { | 15 | 3.01k | try | 16 | 3.01k | { | 17 | 3.01k | func(); | 18 | 3.01k | } | 19 | 3.01k | catch (...) | 20 | 3.01k | { | 21 | 0 | } | 22 | 3.01k | } |
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 | 3.01k | { | 15 | 3.01k | try | 16 | 3.01k | { | 17 | 3.01k | func(); | 18 | 3.01k | } | 19 | 3.01k | catch (...) | 20 | 3.01k | { | 21 | 10 | } | 22 | 3.01k | } |
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 | 3.01k | { | 15 | 3.01k | try | 16 | 3.01k | { | 17 | 3.01k | func(); | 18 | 3.01k | } | 19 | 3.01k | catch (...) | 20 | 3.01k | { | 21 | 2.58k | } | 22 | 3.01k | } |
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 | 3.01k | { | 15 | 3.01k | try | 16 | 3.01k | { | 17 | 3.01k | func(); | 18 | 3.01k | } | 19 | 3.01k | catch (...) | 20 | 3.01k | { | 21 | 2.81k | } | 22 | 3.01k | } |
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 | 3.01k | { | 15 | 3.01k | try | 16 | 3.01k | { | 17 | 3.01k | func(); | 18 | 3.01k | } | 19 | 3.01k | catch (...) | 20 | 3.01k | { | 21 | 0 | } | 22 | 3.01k | } |
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 | 3.01k | { | 15 | 3.01k | try | 16 | 3.01k | { | 17 | 3.01k | func(); | 18 | 3.01k | } | 19 | 3.01k | catch (...) | 20 | 3.01k | { | 21 | 731 | } | 22 | 3.01k | } |
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 | 3.01k | { | 15 | 3.01k | try | 16 | 3.01k | { | 17 | 3.01k | func(); | 18 | 3.01k | } | 19 | 3.01k | catch (...) | 20 | 3.01k | { | 21 | 0 | } | 22 | 3.01k | } |
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.21k | { | 15 | 1.21k | try | 16 | 1.21k | { | 17 | 1.21k | func(); | 18 | 1.21k | } | 19 | 1.21k | catch (...) | 20 | 1.21k | { | 21 | 113 | } | 22 | 1.21k | } |
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.21k | { | 15 | 1.21k | try | 16 | 1.21k | { | 17 | 1.21k | func(); | 18 | 1.21k | } | 19 | 1.21k | catch (...) | 20 | 1.21k | { | 21 | 402 | } | 22 | 1.21k | } |
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 | 1.78k | { | 15 | 1.78k | try | 16 | 1.78k | { | 17 | 1.78k | func(); | 18 | 1.78k | } | 19 | 1.78k | catch (...) | 20 | 1.78k | { | 21 | 383 | } | 22 | 1.78k | } |
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 | 1.34k | { | 15 | 1.34k | try | 16 | 1.34k | { | 17 | 1.34k | func(); | 18 | 1.34k | } | 19 | 1.34k | catch (...) | 20 | 1.34k | { | 21 | 0 | } | 22 | 1.34k | } |
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 | 209 | { | 15 | 209 | try | 16 | 209 | { | 17 | 209 | func(); | 18 | 209 | } | 19 | 209 | catch (...) | 20 | 209 | { | 21 | 133 | } | 22 | 209 | } |
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 | 75 | { | 15 | 75 | try | 16 | 75 | { | 17 | 75 | func(); | 18 | 75 | } | 19 | 75 | catch (...) | 20 | 75 | { | 21 | 0 | } | 22 | 75 | } |
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 | 52.9k | { | 15 | 52.9k | try | 16 | 52.9k | { | 17 | 52.9k | func(); | 18 | 52.9k | } | 19 | 52.9k | catch (...) | 20 | 52.9k | { | 21 | 32.8k | } | 22 | 52.9k | } |
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 | 15.3k | { | 15 | 15.3k | try | 16 | 15.3k | { | 17 | 15.3k | func(); | 18 | 15.3k | } | 19 | 15.3k | catch (...) | 20 | 15.3k | { | 21 | 7.75k | } | 22 | 15.3k | } |
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 | 8.82k | { | 15 | 8.82k | try | 16 | 8.82k | { | 17 | 8.82k | func(); | 18 | 8.82k | } | 19 | 8.82k | catch (...) | 20 | 8.82k | { | 21 | 0 | } | 22 | 8.82k | } |
|
23 | | |
24 | | template <class T> |
25 | | void parseHttpHeader(const std::string& input) |
26 | 33.1k | { |
27 | 33.1k | T header; |
28 | 33.1k | 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 | 3.01k | 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 | 3.01k | 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 | 3.01k | 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 | 3.01k | 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 | 3.01k | 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 | 3.01k | 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 | 3.01k | 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 | 3.01k | 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 | 3.01k | 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 | 3.01k | 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 | 3.01k | ignoreExceptions([&] { header.parse(input); }); |
|
29 | | |
30 | 33.1k | std::stringstream oss; |
31 | 33.1k | header.write(oss); |
32 | 33.1k | } 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 | 3.01k | { | 27 | 3.01k | T header; | 28 | 3.01k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 3.01k | std::stringstream oss; | 31 | 3.01k | header.write(oss); | 32 | 3.01k | } |
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 | 3.01k | { | 27 | 3.01k | T header; | 28 | 3.01k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 3.01k | std::stringstream oss; | 31 | 3.01k | header.write(oss); | 32 | 3.01k | } |
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 | 3.01k | { | 27 | 3.01k | T header; | 28 | 3.01k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 3.01k | std::stringstream oss; | 31 | 3.01k | header.write(oss); | 32 | 3.01k | } |
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 | 3.01k | { | 27 | 3.01k | T header; | 28 | 3.01k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 3.01k | std::stringstream oss; | 31 | 3.01k | header.write(oss); | 32 | 3.01k | } |
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 | 3.01k | { | 27 | 3.01k | T header; | 28 | 3.01k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 3.01k | std::stringstream oss; | 31 | 3.01k | header.write(oss); | 32 | 3.01k | } |
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 | 3.01k | { | 27 | 3.01k | T header; | 28 | 3.01k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 3.01k | std::stringstream oss; | 31 | 3.01k | header.write(oss); | 32 | 3.01k | } |
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 | 3.01k | { | 27 | 3.01k | T header; | 28 | 3.01k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 3.01k | std::stringstream oss; | 31 | 3.01k | header.write(oss); | 32 | 3.01k | } |
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 | 3.01k | { | 27 | 3.01k | T header; | 28 | 3.01k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 3.01k | std::stringstream oss; | 31 | 3.01k | header.write(oss); | 32 | 3.01k | } |
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 | 3.01k | { | 27 | 3.01k | T header; | 28 | 3.01k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 3.01k | std::stringstream oss; | 31 | 3.01k | header.write(oss); | 32 | 3.01k | } |
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 | 3.01k | { | 27 | 3.01k | T header; | 28 | 3.01k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 3.01k | std::stringstream oss; | 31 | 3.01k | header.write(oss); | 32 | 3.01k | } |
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 | 3.01k | { | 27 | 3.01k | T header; | 28 | 3.01k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 3.01k | std::stringstream oss; | 31 | 3.01k | header.write(oss); | 32 | 3.01k | } |
|
33 | | |
34 | | template <> |
35 | | void parseHttpHeader<Pistache::Http::Header::Authorization>(const std::string& input) |
36 | 3.01k | { |
37 | 3.01k | Pistache::Http::Header::Authorization header; |
38 | 3.01k | ignoreExceptions([&] { header.parse(input); }); |
39 | 3.01k | ignoreExceptions([&] { header.getMethod(); }); |
40 | 3.01k | ignoreExceptions( |
41 | 3.01k | [&] { |
42 | 3.01k | const auto user = header.getBasicUser(); |
43 | 3.01k | const auto password = header.getBasicPassword(); |
44 | 3.01k | header.setBasicUserPassword(user, password); |
45 | 3.01k | }); |
46 | | |
47 | 3.01k | std::stringstream oss; |
48 | 3.01k | header.write(oss); |
49 | 3.01k | } |
50 | | |
51 | | void fuzz_headers(const std::string& input) |
52 | 3.01k | { |
53 | 3.01k | parseHttpHeader<Pistache::Http::Header::Accept>(input); |
54 | 3.01k | parseHttpHeader<Pistache::Http::Header::CacheControl>(input); |
55 | 3.01k | parseHttpHeader<Pistache::Http::Header::Connection>(input); |
56 | 3.01k | parseHttpHeader<Pistache::Http::Header::AcceptEncoding>(input); |
57 | 3.01k | parseHttpHeader<Pistache::Http::Header::ContentEncoding>(input); |
58 | 3.01k | parseHttpHeader<Pistache::Http::Header::ContentLength>(input); |
59 | 3.01k | parseHttpHeader<Pistache::Http::Header::ContentType>(input); |
60 | 3.01k | parseHttpHeader<Pistache::Http::Header::Authorization>(input); |
61 | 3.01k | parseHttpHeader<Pistache::Http::Header::Date>(input); |
62 | 3.01k | parseHttpHeader<Pistache::Http::Header::Expect>(input); |
63 | 3.01k | parseHttpHeader<Pistache::Http::Header::Host>(input); |
64 | 3.01k | parseHttpHeader<Pistache::Http::Header::Server>(input); |
65 | 3.01k | } |
66 | | |
67 | | void fuzz_cookies(const std::string& input) |
68 | 1.21k | { |
69 | 1.21k | Pistache::Http::CookieJar cookie_jar; |
70 | 1.21k | ignoreExceptions([&] { Pistache::Http::Cookie::fromString(input); }); |
71 | 1.21k | ignoreExceptions([&] { cookie_jar.addFromRaw(input.data(), input.size()); }); |
72 | 1.21k | } |
73 | | |
74 | | void fuzz_request_parser(const std::string& input) |
75 | 1.78k | { |
76 | 1.78k | constexpr size_t maxDataSize = 4096; |
77 | 1.78k | Pistache::Http::RequestParser rparser(maxDataSize); |
78 | | |
79 | 1.78k | if (rparser.feed(input.data(), input.size())) |
80 | 1.78k | { |
81 | 1.78k | auto state = Pistache::Http::Private::State::Done; |
82 | 1.78k | ignoreExceptions([&] { state = rparser.parse(); }); |
83 | | |
84 | 1.78k | if (state == Pistache::Http::Private::State::Again) |
85 | 1.34k | ignoreExceptions([&] { rparser.parse(); }); |
86 | 1.78k | } |
87 | 1.78k | } |
88 | | |
89 | | void fuzz_response_parser(const std::string& input) |
90 | 210 | { |
91 | 210 | constexpr size_t maxDataSize = 4096; |
92 | 210 | Pistache::Http::ResponseParser rparser(maxDataSize); |
93 | | |
94 | 210 | if (rparser.feed(input.data(), input.size())) |
95 | 209 | { |
96 | 209 | auto state = Pistache::Http::Private::State::Done; |
97 | 209 | ignoreExceptions([&] { state = rparser.parse(); }); |
98 | | |
99 | 209 | if (state == Pistache::Http::Private::State::Again) |
100 | 75 | ignoreExceptions([&] { rparser.parse(); }); |
101 | 209 | } |
102 | 210 | } |
103 | | |
104 | | void fuzz_router(const std::string& input) |
105 | 1.54k | { |
106 | 1.54k | std::string path_input; |
107 | 1.54k | std::stringstream input_stream(input); |
108 | 1.54k | Pistache::Rest::SegmentTreeNode tree; |
109 | | |
110 | 105k | while (std::getline(input_stream, path_input, '\n')) |
111 | 103k | { |
112 | 103k | if (path_input.size() < 2) |
113 | 11.5k | continue; |
114 | | |
115 | 91.9k | const int test_case = path_input.back(); |
116 | 91.9k | path_input.pop_back(); |
117 | | |
118 | 91.9k | const auto sanitized = Pistache::Rest::SegmentTreeNode::sanitizeResource(path_input); |
119 | 91.9k | std::shared_ptr<char> ptr(new char[sanitized.length()], std::default_delete<char[]>()); |
120 | 91.9k | std::memcpy(ptr.get(), sanitized.data(), sanitized.length()); |
121 | 91.9k | const std::string_view path { ptr.get(), sanitized.length() }; |
122 | | |
123 | 91.9k | switch (test_case) |
124 | 91.9k | { |
125 | 52.9k | case 'A': |
126 | 52.9k | ignoreExceptions([&] { |
127 | 52.9k | Pistache::Rest::Route::Handler handler = [](auto...) { return Pistache::Rest::Route::Result::Ok; }; |
128 | 52.9k | std::shared_ptr<char> ptr(new char[sanitized.length()], std::default_delete<char[]>()); |
129 | 52.9k | std::memcpy(ptr.get(), sanitized.data(), sanitized.length()); |
130 | 52.9k | const std::string_view path { ptr.get(), sanitized.length() }; |
131 | 52.9k | tree.addRoute(path, handler, ptr); |
132 | 52.9k | }); |
133 | 52.9k | break; |
134 | 15.3k | case 'R': |
135 | 15.3k | ignoreExceptions([&] { tree.removeRoute(path); }); |
136 | 15.3k | break; |
137 | 8.82k | case 'F': |
138 | 8.82k | ignoreExceptions([&] { tree.findRoute(path); }); |
139 | 8.82k | break; |
140 | 91.9k | } |
141 | 91.9k | } |
142 | 1.54k | } |
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 | 7.78k | { |
153 | 7.78k | if (size < 1) |
154 | 0 | return -1; |
155 | | |
156 | 7.78k | const uint8_t type = data[0]; |
157 | 7.78k | const std::string input(reinterpret_cast<const char*>(data + 1), size - 1); |
158 | | |
159 | 7.78k | switch (type) |
160 | 7.78k | { |
161 | 3.01k | case 'H': |
162 | 3.01k | fuzz_headers(input); |
163 | 3.01k | break; |
164 | 1.21k | case 'C': |
165 | 1.21k | fuzz_cookies(input); |
166 | 1.21k | break; |
167 | 1.78k | case 'R': |
168 | 1.78k | fuzz_request_parser(input); |
169 | 1.78k | break; |
170 | 210 | case 'A': |
171 | 210 | fuzz_response_parser(input); |
172 | 210 | break; |
173 | 1.54k | case 'S': |
174 | 1.54k | fuzz_router(input); |
175 | 1.54k | break; |
176 | 3 | case 'O': |
177 | 3 | fuzz_other(input); |
178 | 3 | break; |
179 | 7.78k | } |
180 | | |
181 | 7.78k | return 0; |
182 | 7.78k | } |