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