|
|
@@ -0,0 +1,59 @@
|
|
|
+#include <cstdint>
|
|
|
+#include <cstring>
|
|
|
+#include <string>
|
|
|
+
|
|
|
+#include <httplib.h>
|
|
|
+
|
|
|
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
|
|
|
+ if (size < 2) return 0;
|
|
|
+
|
|
|
+ uint8_t selector = data[0];
|
|
|
+ const char *payload = reinterpret_cast<const char *>(data + 1);
|
|
|
+ size_t payload_size = size - 1;
|
|
|
+ std::string input(payload, payload_size);
|
|
|
+
|
|
|
+ switch (selector % 7) {
|
|
|
+ case 0: {
|
|
|
+ // parse_range_header
|
|
|
+ httplib::Ranges ranges;
|
|
|
+ httplib::detail::parse_range_header(input, ranges);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 1: {
|
|
|
+ // parse_accept_header
|
|
|
+ std::vector<std::string> content_types;
|
|
|
+ httplib::detail::parse_accept_header(input, content_types);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 2: {
|
|
|
+ // extract_media_type with params
|
|
|
+ std::map<std::string, std::string> params;
|
|
|
+ httplib::detail::extract_media_type(input, ¶ms);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 3: {
|
|
|
+ // parse_multipart_boundary
|
|
|
+ std::string boundary;
|
|
|
+ httplib::detail::parse_multipart_boundary(input, boundary);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 4: {
|
|
|
+ // parse_disposition_params
|
|
|
+ httplib::Params params;
|
|
|
+ httplib::detail::parse_disposition_params(input, params);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 5: {
|
|
|
+ // parse_http_date
|
|
|
+ httplib::detail::parse_http_date(input);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 6: {
|
|
|
+ // can_compress_content_type
|
|
|
+ httplib::detail::can_compress_content_type(input);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|