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