Coverage Report

Created: 2025-11-24 06:24

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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()() const
Line
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()() const
Line
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()() const
Line
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()() const
Line
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()() const
Line
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()() const
Line
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()() const
Line
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()() const
Line
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()() const
Line
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()() const
Line
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()() const
Line
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
}