From 990477f0e9f0054697d09844b911f55148d02b2f Mon Sep 17 00:00:00 2001 From: KoDer Date: Wed, 30 Sep 2026 20:17:37 +0700 Subject: [PATCH] Clean --- CMakeLists.txt | 5 +- KVCacheArch | 7 - libs/cpp-httplib-0.57.1/.gitattributes | 2 - .../.github/workflows/abidiff.yaml | 70 - .../.github/workflows/benchmark_ab.yaml | 62 - .../.github/workflows/benchmark_run.yaml | 106 - .../.github/workflows/cifuzz.yaml | 42 - .../.github/workflows/docs.yml | 37 - .../.github/workflows/release-docker.yml | 51 - .../.github/workflows/test-32bit.yml | 37 - .../.github/workflows/test.yaml | 629 - .../.github/workflows/test_benchmark.yaml | 79 - .../.github/workflows/test_no_exceptions.yaml | 20 - .../.github/workflows/test_offline.yaml | 62 - .../.github/workflows/test_proxy.yaml | 37 - libs/cpp-httplib-0.57.1/CMakeLists.txt | 470 - libs/cpp-httplib-0.57.1/Dockerfile | 13 - libs/cpp-httplib-0.57.1/README-sse.md | 204 - libs/cpp-httplib-0.57.1/README-stream.md | 317 - libs/cpp-httplib-0.57.1/README-websocket.md | 523 - libs/cpp-httplib-0.57.1/README.md | 1829 -- libs/cpp-httplib-0.57.1/benchmark/Makefile | 51 - libs/cpp-httplib-0.57.1/benchmark/ab.sh | 286 - .../benchmark/cpp-httplib/main.cpp | 139 - .../benchmark/crow/crow_all.h | 13796 -------- .../benchmark/crow/main.cpp | 17 - .../cpp-httplib-0.57.1/cmake/FindBrotli.cmake | 173 - .../cmake/httplibConfig.cmake.in | 119 - libs/cpp-httplib-0.57.1/cmake/modules.cmake | 19 - libs/cpp-httplib-0.57.1/docker-compose.yml | 7 - .../cpp-httplib-0.57.1/docker/html/index.html | 21 - libs/cpp-httplib-0.57.1/docker/main.cc | 303 - libs/cpp-httplib-0.57.1/docs-src/config.toml | 30 - .../en/cookbook/c01-get-response-body.md | 60 - .../docs-src/pages/en/cookbook/c02-json.md | 36 - .../pages/en/cookbook/c03-default-headers.md | 55 - .../pages/en/cookbook/c04-follow-location.md | 38 - .../pages/en/cookbook/c05-basic-auth.md | 46 - .../pages/en/cookbook/c06-bearer-token.md | 50 - .../pages/en/cookbook/c07-multipart-upload.md | 52 - .../pages/en/cookbook/c08-post-file-body.md | 34 - .../pages/en/cookbook/c09-chunked-upload.md | 47 - .../pages/en/cookbook/c10-stream-response.md | 52 - .../en/cookbook/c11-progress-callback.md | 59 - .../pages/en/cookbook/c12-timeouts.md | 52 - .../pages/en/cookbook/c13-max-timeout.md | 42 - .../pages/en/cookbook/c14-keep-alive.md | 53 - .../pages/en/cookbook/c15-compression.md | 47 - .../docs-src/pages/en/cookbook/c16-proxy.md | 87 - .../pages/en/cookbook/c17-error-codes.md | 63 - .../pages/en/cookbook/c18-ssl-errors.md | 51 - .../pages/en/cookbook/c19-client-logger.md | 57 - .../pages/en/cookbook/e01-sse-server.md | 87 - .../pages/en/cookbook/e02-sse-event-names.md | 84 - .../pages/en/cookbook/e03-sse-reconnect.md | 85 - .../pages/en/cookbook/e04-sse-client.md | 99 - .../docs-src/pages/en/cookbook/index.md | 101 - .../pages/en/cookbook/s01-handlers.md | 68 - .../pages/en/cookbook/s02-json-api.md | 74 - .../pages/en/cookbook/s03-path-params.md | 53 - .../pages/en/cookbook/s04-static-files.md | 55 - .../pages/en/cookbook/s05-stream-response.md | 63 - .../en/cookbook/s06-download-response.md | 50 - .../pages/en/cookbook/s07-multipart-reader.md | 103 - .../en/cookbook/s08-compress-response.md | 78 - .../pages/en/cookbook/s09-pre-routing.md | 54 - .../pages/en/cookbook/s10-post-routing.md | 56 - .../pages/en/cookbook/s11-pre-request.md | 51 - .../pages/en/cookbook/s12-user-data.md | 56 - .../pages/en/cookbook/s13-error-handler.md | 51 - .../en/cookbook/s14-exception-handler.md | 67 - .../pages/en/cookbook/s15-server-logger.md | 64 - .../pages/en/cookbook/s16-disconnect.md | 55 - .../pages/en/cookbook/s17-bind-any-port.md | 52 - .../en/cookbook/s18-listen-after-bind.md | 82 - .../en/cookbook/s19-graceful-shutdown.md | 57 - .../pages/en/cookbook/s20-keep-alive.md | 57 - .../pages/en/cookbook/s21-thread-pool.md | 69 - .../pages/en/cookbook/s22-unix-socket.md | 64 - .../pages/en/cookbook/s23-custom-methods.md | 59 - .../pages/en/cookbook/t01-tls-backends.md | 49 - .../en/cookbook/t02-cert-verification.md | 55 - .../pages/en/cookbook/t03-ssl-server.md | 78 - .../docs-src/pages/en/cookbook/t04-mtls.md | 86 - .../pages/en/cookbook/t05-peer-cert.md | 88 - .../pages/en/cookbook/w01-websocket-echo.md | 89 - .../pages/en/cookbook/w02-websocket-ping.md | 80 - .../pages/en/cookbook/w03-websocket-close.md | 91 - .../pages/en/cookbook/w04-websocket-binary.md | 88 - .../pages/en/cookbook/w05-websocket-tls.md | 49 - .../en/cookbook/w06-websocket-timeouts.md | 86 - .../docs-src/pages/en/index.md | 25 - .../docs-src/pages/en/llm-app/app.png | Bin 123216 -> 0 bytes .../docs-src/pages/en/llm-app/ch01-setup.md | 236 - .../pages/en/llm-app/ch02-rest-api.md | 212 - .../pages/en/llm-app/ch03-sse-streaming.md | 264 - .../pages/en/llm-app/ch04-model-management.md | 788 - .../docs-src/pages/en/llm-app/ch05-web-ui.md | 1223 - .../pages/en/llm-app/ch06-desktop-app.md | 724 - .../pages/en/llm-app/ch07-code-reading.md | 154 - .../pages/en/llm-app/ch08-customization.md | 120 - .../docs-src/pages/en/llm-app/index.md | 26 - .../docs-src/pages/en/llm-app/kv-cache.svg | 36 - .../docs-src/pages/en/llm-app/slots.svg | 24 - .../docs-src/pages/en/llm-app/webui.png | Bin 132922 -> 0 bytes .../pages/en/tour/01-getting-started.md | 88 - .../docs-src/pages/en/tour/02-basic-client.md | 266 - .../docs-src/pages/en/tour/03-basic-server.md | 280 - .../pages/en/tour/04-static-file-server.md | 134 - .../docs-src/pages/en/tour/05-tls-setup.md | 90 - .../docs-src/pages/en/tour/06-https-client.md | 122 - .../docs-src/pages/en/tour/07-https-server.md | 124 - .../docs-src/pages/en/tour/08-websocket.md | 141 - .../docs-src/pages/en/tour/09-whats-next.md | 228 - .../docs-src/pages/en/tour/index.md | 16 - .../ja/cookbook/c01-get-response-body.md | 60 - .../docs-src/pages/ja/cookbook/c02-json.md | 36 - .../pages/ja/cookbook/c03-default-headers.md | 55 - .../pages/ja/cookbook/c04-follow-location.md | 38 - .../pages/ja/cookbook/c05-basic-auth.md | 46 - .../pages/ja/cookbook/c06-bearer-token.md | 50 - .../pages/ja/cookbook/c07-multipart-upload.md | 52 - .../pages/ja/cookbook/c08-post-file-body.md | 34 - .../pages/ja/cookbook/c09-chunked-upload.md | 47 - .../pages/ja/cookbook/c10-stream-response.md | 52 - .../ja/cookbook/c11-progress-callback.md | 59 - .../pages/ja/cookbook/c12-timeouts.md | 52 - .../pages/ja/cookbook/c13-max-timeout.md | 42 - .../pages/ja/cookbook/c14-keep-alive.md | 53 - .../pages/ja/cookbook/c15-compression.md | 47 - .../docs-src/pages/ja/cookbook/c16-proxy.md | 87 - .../pages/ja/cookbook/c17-error-codes.md | 63 - .../pages/ja/cookbook/c18-ssl-errors.md | 51 - .../pages/ja/cookbook/c19-client-logger.md | 57 - .../pages/ja/cookbook/e01-sse-server.md | 87 - .../pages/ja/cookbook/e02-sse-event-names.md | 84 - .../pages/ja/cookbook/e03-sse-reconnect.md | 85 - .../pages/ja/cookbook/e04-sse-client.md | 99 - .../docs-src/pages/ja/cookbook/index.md | 101 - .../pages/ja/cookbook/s01-handlers.md | 68 - .../pages/ja/cookbook/s02-json-api.md | 74 - .../pages/ja/cookbook/s03-path-params.md | 53 - .../pages/ja/cookbook/s04-static-files.md | 55 - .../pages/ja/cookbook/s05-stream-response.md | 63 - .../ja/cookbook/s06-download-response.md | 50 - .../pages/ja/cookbook/s07-multipart-reader.md | 103 - .../ja/cookbook/s08-compress-response.md | 78 - .../pages/ja/cookbook/s09-pre-routing.md | 54 - .../pages/ja/cookbook/s10-post-routing.md | 56 - .../pages/ja/cookbook/s11-pre-request.md | 51 - .../pages/ja/cookbook/s12-user-data.md | 56 - .../pages/ja/cookbook/s13-error-handler.md | 51 - .../ja/cookbook/s14-exception-handler.md | 67 - .../pages/ja/cookbook/s15-server-logger.md | 64 - .../pages/ja/cookbook/s16-disconnect.md | 55 - .../pages/ja/cookbook/s17-bind-any-port.md | 52 - .../ja/cookbook/s18-listen-after-bind.md | 82 - .../ja/cookbook/s19-graceful-shutdown.md | 57 - .../pages/ja/cookbook/s20-keep-alive.md | 57 - .../pages/ja/cookbook/s21-thread-pool.md | 69 - .../pages/ja/cookbook/s22-unix-socket.md | 64 - .../pages/ja/cookbook/s23-custom-methods.md | 59 - .../pages/ja/cookbook/t01-tls-backends.md | 49 - .../ja/cookbook/t02-cert-verification.md | 55 - .../pages/ja/cookbook/t03-ssl-server.md | 78 - .../docs-src/pages/ja/cookbook/t04-mtls.md | 86 - .../pages/ja/cookbook/t05-peer-cert.md | 88 - .../pages/ja/cookbook/w01-websocket-echo.md | 89 - .../pages/ja/cookbook/w02-websocket-ping.md | 80 - .../pages/ja/cookbook/w03-websocket-close.md | 91 - .../pages/ja/cookbook/w04-websocket-binary.md | 88 - .../pages/ja/cookbook/w05-websocket-tls.md | 49 - .../ja/cookbook/w06-websocket-timeouts.md | 86 - .../docs-src/pages/ja/index.md | 25 - .../docs-src/pages/ja/llm-app/ch01-setup.md | 236 - .../pages/ja/llm-app/ch02-rest-api.md | 212 - .../pages/ja/llm-app/ch03-sse-streaming.md | 264 - .../pages/ja/llm-app/ch04-model-management.md | 788 - .../docs-src/pages/ja/llm-app/ch05-web-ui.md | 1223 - .../pages/ja/llm-app/ch06-desktop-app.md | 724 - .../pages/ja/llm-app/ch07-code-reading.md | 154 - .../pages/ja/llm-app/ch08-customization.md | 120 - .../docs-src/pages/ja/llm-app/index.md | 26 - .../docs-src/pages/ja/llm-app/kv-cache.svg | 36 - .../docs-src/pages/ja/llm-app/slots.svg | 24 - .../pages/ja/tour/01-getting-started.md | 88 - .../docs-src/pages/ja/tour/02-basic-client.md | 266 - .../docs-src/pages/ja/tour/03-basic-server.md | 280 - .../pages/ja/tour/04-static-file-server.md | 134 - .../docs-src/pages/ja/tour/05-tls-setup.md | 90 - .../docs-src/pages/ja/tour/06-https-client.md | 122 - .../docs-src/pages/ja/tour/07-https-server.md | 124 - .../docs-src/pages/ja/tour/08-websocket.md | 141 - .../docs-src/pages/ja/tour/09-whats-next.md | 228 - .../docs-src/pages/ja/tour/index.md | 16 - .../docs-util/llm-app/build_desktop_app.sh | 33 - .../docs-util/llm-app/build_web_app.sh | 33 - .../docs-util/llm-app/extract_code.sh | 18 - .../llm-app/generate_desktop_app_project.sh | 38 - .../docs-util/llm-app/justfile | 28 - .../docs-util/llm-app/test_book.sh | 561 - .../docs-util/llm-app/test_webui.cpp | 300 - .../docs-util/llm-app/webdriver.h | 278 - .../example/Dockerfile.hello | 12 - libs/cpp-httplib-0.57.1/example/Makefile | 70 - .../example/accept_header.cc | 144 - libs/cpp-httplib-0.57.1/example/benchmark.cc | 33 - libs/cpp-httplib-0.57.1/example/ca-bundle.crt | 3401 -- libs/cpp-httplib-0.57.1/example/client.cc | 38 - .../cpp-httplib-0.57.1/example/client.vcxproj | 160 - libs/cpp-httplib-0.57.1/example/example.sln | 46 - libs/cpp-httplib-0.57.1/example/hello.cc | 19 - .../example/one_time_request.cc | 56 - libs/cpp-httplib-0.57.1/example/redirect.cc | 60 - libs/cpp-httplib-0.57.1/example/server.cc | 113 - .../cpp-httplib-0.57.1/example/server.vcxproj | 160 - .../example/server_and_client.cc | 90 - libs/cpp-httplib-0.57.1/example/simplecli.cc | 29 - libs/cpp-httplib-0.57.1/example/simplesvr.cc | 148 - .../example/ssecli-stream.cc | 234 - libs/cpp-httplib-0.57.1/example/ssecli.cc | 57 - libs/cpp-httplib-0.57.1/example/ssesvr.cc | 106 - libs/cpp-httplib-0.57.1/example/upload.cc | 91 - libs/cpp-httplib-0.57.1/example/uploader.sh | 6 - libs/cpp-httplib-0.57.1/example/wsecho.cc | 135 - libs/cpp-httplib-0.57.1/generate_module.py | 77 - libs/cpp-httplib-0.57.1/justfile | 60 - libs/cpp-httplib-0.57.1/meson.build | 171 - libs/cpp-httplib-0.57.1/meson_options.txt | 24 - libs/cpp-httplib-0.57.1/scripts/release.sh | 195 - libs/cpp-httplib-0.57.1/split.py | 77 - libs/cpp-httplib-0.57.1/test/CMakeLists.txt | 151 - libs/cpp-httplib-0.57.1/test/Makefile | 325 - libs/cpp-httplib-0.57.1/test/ca-bundle.crt | 3401 -- .../test/dns_test_fixture.py | 87 - .../test/fuzzing/CMakeLists.txt | 10 - libs/cpp-httplib-0.57.1/test/fuzzing/Makefile | 42 - .../test/fuzzing/client_fuzzer.cc | 88 - libs/cpp-httplib-0.57.1/test/fuzzing/corpus/1 | 1 - libs/cpp-httplib-0.57.1/test/fuzzing/corpus/2 | 5 - libs/cpp-httplib-0.57.1/test/fuzzing/corpus/3 | Bin 54 -> 0 bytes ...e-minimized-client_fuzzer-5188033728282624 | 3 - ...e-minimized-client_fuzzer-6561074643271680 | 3 - ...ized-header_parser_fuzzer-4645558454386688 | Bin 58160 -> 0 bytes ...e-minimized-server_fuzzer-5042094968537088 | Bin 516575 -> 0 bytes ...e-minimized-server_fuzzer-5372331946541056 | Bin 1041826 -> 0 bytes ...e-minimized-server_fuzzer-5386708825800704 | Bin 787294 -> 0 bytes ...e-minimized-server_fuzzer-5667822731132928 | Bin 317 -> 0 bytes ...e-minimized-server_fuzzer-5886572146327552 | Bin 974479 -> 0 bytes ...e-minimized-server_fuzzer-5942767436562432 | Bin 395 -> 0 bytes ...e-minimized-server_fuzzer-6007379124158464 | Bin 452123 -> 0 bytes ...e-minimized-server_fuzzer-6508706672541696 | 7 - .../test/fuzzing/corpus/issue1264 | 19 - .../test/fuzzing/header_parser_fuzzer.cc | 59 - .../test/fuzzing/multipart_parser_fuzzer.cc | 37 - .../test/fuzzing/server_fuzzer.cc | 100 - .../test/fuzzing/server_fuzzer.dict | 224 - .../fuzzing/standalone_fuzz_target_runner.cpp | 35 - .../test/fuzzing/url_parser_fuzzer.cc | 52 - libs/cpp-httplib-0.57.1/test/gen-certs.sh | 35 - .../include/gtest/gtest-assertion-result.h | 237 - .../gtest/include/gtest/gtest-death-test.h | 345 - .../test/gtest/include/gtest/gtest-matchers.h | 956 - .../test/gtest/include/gtest/gtest-message.h | 218 - .../gtest/include/gtest/gtest-param-test.h | 510 - .../test/gtest/include/gtest/gtest-printers.h | 1048 - .../test/gtest/include/gtest/gtest-spi.h | 248 - .../gtest/include/gtest/gtest-test-part.h | 190 - .../gtest/include/gtest/gtest-typed-test.h | 331 - .../test/gtest/include/gtest/gtest.h | 2297 -- .../gtest/include/gtest/gtest_pred_impl.h | 279 - .../test/gtest/include/gtest/gtest_prod.h | 60 - .../include/gtest/internal/custom/README.md | 44 - .../gtest/internal/custom/gtest-port.h | 37 - .../gtest/internal/custom/gtest-printers.h | 42 - .../include/gtest/internal/custom/gtest.h | 37 - .../internal/gtest-death-test-internal.h | 306 - .../include/gtest/internal/gtest-filepath.h | 210 - .../include/gtest/internal/gtest-internal.h | 1570 - .../include/gtest/internal/gtest-param-util.h | 956 - .../include/gtest/internal/gtest-port-arch.h | 116 - .../gtest/include/gtest/internal/gtest-port.h | 2413 -- .../include/gtest/internal/gtest-string.h | 177 - .../include/gtest/internal/gtest-type-util.h | 186 - .../test/gtest/src/gtest-all.cc | 49 - .../test/gtest/src/gtest-assertion-result.cc | 77 - .../test/gtest/src/gtest-death-test.cc | 1620 - .../test/gtest/src/gtest-filepath.cc | 367 - .../test/gtest/src/gtest-internal-inl.h | 1212 - .../test/gtest/src/gtest-matchers.cc | 98 - .../test/gtest/src/gtest-port.cc | 1394 - .../test/gtest/src/gtest-printers.cc | 553 - .../test/gtest/src/gtest-test-part.cc | 105 - .../test/gtest/src/gtest-typed-test.cc | 104 - .../test/gtest/src/gtest.cc | 6795 ---- .../test/gtest/src/gtest_main.cc | 53 - libs/cpp-httplib-0.57.1/test/image.jpg | Bin 33653 -> 0 bytes .../test/include_httplib.cc | 5 - .../test/include_windows_h.cc | 6 - .../test/lsan_suppressions.txt | 7 - .../test/make-shared-library.sh | 28 - libs/cpp-httplib-0.57.1/test/meson.build | 185 - libs/cpp-httplib-0.57.1/test/proxy/Dockerfile | 13 - .../test/proxy/basic_passwd | 1 - .../test/proxy/basic_squid.conf | 82 - .../test/proxy/digest_passwd | 1 - .../test/proxy/digest_squid.conf | 82 - .../test/proxy/docker-compose.ci.yml | 8 - .../test/proxy/docker-compose.yml | 41 - .../test/proxy/httpbin_nginx.conf | 22 - .../test/run_issue_2431_repro.sh | 102 - libs/cpp-httplib-0.57.1/test/test.cc | 26185 ---------------- libs/cpp-httplib-0.57.1/test/test.conf | 21 - libs/cpp-httplib-0.57.1/test/test.rootCA.conf | 18 - libs/cpp-httplib-0.57.1/test/test.sln | 28 - libs/cpp-httplib-0.57.1/test/test.vcxproj | 180 - .../test/test_32bit_build.cpp | 9 - .../cpp-httplib-0.57.1/test/test_benchmark.cc | 78 - libs/cpp-httplib-0.57.1/test/test_proxy.cc | 383 - .../test/test_thread_pool.cc | 285 - .../test/test_websocket_heartbeat.cc | 309 - .../test/test_websocket_thread_safety.cc | 178 - libs/cpp-httplib-0.57.1/test/www/dir/1MB.txt | 8192 ----- .../test/www/dir/index.html | 8 - .../test/www/dir/meson.build | 8 - .../test/www/dir/test.abcde | 1 - .../cpp-httplib-0.57.1/test/www/dir/test.html | 1 - libs/cpp-httplib-0.57.1/test/www/empty_file | 0 libs/cpp-httplib-0.57.1/test/www/file | 1 - libs/cpp-httplib-0.57.1/test/www/meson.build | 8 - .../test/www/日本語Dir/meson.build | 4 - .../test/www/日本語Dir/日本語File.txt | 1 - .../test/www2/dir/index.html | 8 - .../test/www2/dir/meson.build | 6 - .../test/www2/dir/test.html | 1 - .../test/www3/dir/index.html | 8 - .../test/www3/dir/meson.build | 6 - .../test/www3/dir/test.html | 1 - libs/json-3.12.0/.cirrus.yml | 17 - libs/json-3.12.0/.clang-tidy | 77 - libs/json-3.12.0/.github/CODEOWNERS | 6 - libs/json-3.12.0/.github/CODE_OF_CONDUCT.md | 132 - libs/json-3.12.0/.github/CONTRIBUTING.md | 222 - libs/json-3.12.0/.github/FUNDING.yml | 2 - .../.github/ISSUE_TEMPLATE/bug.yaml | 93 - .../.github/ISSUE_TEMPLATE/config.yml | 5 - .../.github/PULL_REQUEST_TEMPLATE.md | 9 - libs/json-3.12.0/.github/SECURITY.md | 25 - libs/json-3.12.0/.github/config.yml | 22 - libs/json-3.12.0/.github/dependabot.yml | 31 - .../.github/external_ci/appveyor.yml | 91 - libs/json-3.12.0/.github/labeler.yml | 38 - .../.github/workflows/check_amalgamation.yml | 76 - libs/json-3.12.0/.github/workflows/cifuzz.yml | 35 - .../.github/workflows/codeql-analysis.yml | 49 - .../workflows/comment_check_amalgamation.yml | 81 - .../.github/workflows/dependency-review.yml | 27 - .../json-3.12.0/.github/workflows/labeler.yml | 26 - libs/json-3.12.0/.github/workflows/macos.yml | 120 - .../workflows/publish_documentation.yml | 46 - .../.github/workflows/scorecards.yml | 81 - libs/json-3.12.0/.github/workflows/stale.yml | 34 - libs/json-3.12.0/.github/workflows/ubuntu.yml | 251 - .../json-3.12.0/.github/workflows/windows.yml | 134 - libs/json-3.12.0/.gitignore | 47 - libs/json-3.12.0/.reuse/dep5 | 36 - libs/json-3.12.0/.reuse/templates/json.jinja2 | 11 - .../.reuse/templates/json_support.jinja2 | 11 - libs/json-3.12.0/BUILD.bazel | 80 - libs/json-3.12.0/CITATION.cff | 14 - libs/json-3.12.0/CMakeLists.txt | 225 - libs/json-3.12.0/ChangeLog.md | 3272 -- libs/json-3.12.0/FILES.md | 239 - libs/json-3.12.0/LICENSES/Apache-2.0.txt | 73 - libs/json-3.12.0/LICENSES/BSD-3-Clause.txt | 11 - libs/json-3.12.0/LICENSES/GPL-3.0-only.txt | 232 - libs/json-3.12.0/LICENSES/MIT.txt | 9 - libs/json-3.12.0/MODULE.bazel | 7 - libs/json-3.12.0/Makefile | 266 - libs/json-3.12.0/Package.swift | 22 - libs/json-3.12.0/README.md | 1866 -- libs/json-3.12.0/cmake/ci.cmake | 713 - libs/json-3.12.0/cmake/clang_flags.cmake | 20 - libs/json-3.12.0/cmake/config.cmake.in | 15 - .../cmake/download_test_data.cmake | 56 - libs/json-3.12.0/cmake/gcc_flags.cmake | 348 - .../cmake/nlohmann_jsonConfigVersion.cmake.in | 20 - libs/json-3.12.0/cmake/pkg-config.pc.in | 7 - .../requirements/requirements-cppcheck.txt | 1 - .../requirements/requirements-cpplint.txt | 1 - .../cmake/requirements/requirements-reuse.txt | 1 - .../cmake/scripts/gen_bazel_build_file.cmake | 24 - libs/json-3.12.0/cmake/test.cmake | 273 - libs/json-3.12.0/docs/Makefile | 44 - libs/json-3.12.0/docs/README.md | 20 - libs/json-3.12.0/docs/avatars.png | Bin 1715973 -> 0 bytes libs/json-3.12.0/docs/docset/Info.plist | 20 - libs/json-3.12.0/docs/docset/Makefile | 88 - libs/json-3.12.0/docs/docset/README.md | 19 - libs/json-3.12.0/docs/docset/docSet.sql | 244 - libs/json-3.12.0/docs/docset/docset.json | 10 - libs/json-3.12.0/docs/docset/icon.png | Bin 700 -> 0 bytes libs/json-3.12.0/docs/docset/icon@2x.png | Bin 1362 -> 0 bytes libs/json-3.12.0/docs/json.gif | Bin 1652828 -> 0 bytes libs/json-3.12.0/docs/mkdocs/Makefile | 45 - .../docs/api/adl_serializer/from_json.md | 73 - .../mkdocs/docs/api/adl_serializer/index.md | 35 - .../mkdocs/docs/api/adl_serializer/to_json.md | 43 - .../docs/mkdocs/docs/api/basic_json/accept.md | 113 - .../docs/mkdocs/docs/api/basic_json/array.md | 60 - .../mkdocs/docs/api/basic_json/array_t.md | 68 - .../docs/mkdocs/docs/api/basic_json/at.md | 226 - .../docs/mkdocs/docs/api/basic_json/back.md | 65 - .../mkdocs/docs/api/basic_json/basic_json.md | 402 - .../docs/mkdocs/docs/api/basic_json/begin.md | 42 - .../docs/mkdocs/docs/api/basic_json/binary.md | 66 - .../mkdocs/docs/api/basic_json/binary_t.md | 89 - .../mkdocs/docs/api/basic_json/boolean_t.md | 42 - .../docs/mkdocs/docs/api/basic_json/cbegin.md | 41 - .../docs/api/basic_json/cbor_tag_handler_t.md | 42 - .../docs/mkdocs/docs/api/basic_json/cend.md | 41 - .../docs/mkdocs/docs/api/basic_json/clear.md | 58 - .../mkdocs/docs/api/basic_json/contains.md | 118 - .../docs/mkdocs/docs/api/basic_json/count.md | 78 - .../mkdocs/docs/api/basic_json/crbegin.md | 41 - .../docs/mkdocs/docs/api/basic_json/crend.md | 42 - .../basic_json/default_object_comparator_t.md | 35 - .../docs/mkdocs/docs/api/basic_json/diff.md | 62 - .../docs/mkdocs/docs/api/basic_json/dump.md | 79 - .../mkdocs/docs/api/basic_json/emplace.md | 61 - .../docs/api/basic_json/emplace_back.md | 65 - .../docs/mkdocs/docs/api/basic_json/empty.md | 66 - .../docs/mkdocs/docs/api/basic_json/end.md | 42 - .../mkdocs/docs/api/basic_json/end_pos.md | 68 - .../docs/mkdocs/docs/api/basic_json/erase.md | 211 - .../docs/api/basic_json/error_handler_t.md | 42 - .../mkdocs/docs/api/basic_json/exception.md | 87 - .../docs/mkdocs/docs/api/basic_json/find.md | 86 - .../mkdocs/docs/api/basic_json/flatten.md | 50 - .../mkdocs/docs/api/basic_json/from_bjdata.md | 93 - .../mkdocs/docs/api/basic_json/from_bson.md | 110 - .../mkdocs/docs/api/basic_json/from_cbor.md | 117 - .../docs/api/basic_json/from_msgpack.md | 109 - .../mkdocs/docs/api/basic_json/from_ubjson.md | 106 - .../docs/mkdocs/docs/api/basic_json/front.md | 58 - .../docs/mkdocs/docs/api/basic_json/get.md | 136 - .../docs/api/basic_json/get_allocator.md | 31 - .../mkdocs/docs/api/basic_json/get_binary.md | 45 - .../mkdocs/docs/api/basic_json/get_ptr.md | 94 - .../mkdocs/docs/api/basic_json/get_ref.md | 68 - .../docs/mkdocs/docs/api/basic_json/get_to.md | 58 - .../docs/mkdocs/docs/api/basic_json/index.md | 336 - .../docs/api/basic_json/input_format_t.md | 52 - .../docs/mkdocs/docs/api/basic_json/insert.md | 190 - .../docs/api/basic_json/invalid_iterator.md | 77 - .../mkdocs/docs/api/basic_json/is_array.md | 39 - .../mkdocs/docs/api/basic_json/is_binary.md | 39 - .../mkdocs/docs/api/basic_json/is_boolean.md | 39 - .../docs/api/basic_json/is_discarded.md | 72 - .../mkdocs/docs/api/basic_json/is_null.md | 39 - .../mkdocs/docs/api/basic_json/is_number.md | 56 - .../docs/api/basic_json/is_number_float.md | 46 - .../docs/api/basic_json/is_number_integer.md | 47 - .../docs/api/basic_json/is_number_unsigned.md | 46 - .../mkdocs/docs/api/basic_json/is_object.md | 39 - .../docs/api/basic_json/is_primitive.md | 69 - .../mkdocs/docs/api/basic_json/is_string.md | 39 - .../docs/api/basic_json/is_structured.md | 63 - .../docs/mkdocs/docs/api/basic_json/items.md | 100 - .../docs/api/basic_json/json_base_class_t.md | 45 - .../docs/api/basic_json/json_serializer.md | 41 - .../mkdocs/docs/api/basic_json/max_size.md | 60 - .../mkdocs/docs/api/basic_json/merge_patch.md | 63 - .../docs/mkdocs/docs/api/basic_json/meta.md | 56 - .../docs/api/basic_json/number_float_t.md | 70 - .../docs/api/basic_json/number_integer_t.md | 76 - .../docs/api/basic_json/number_unsigned_t.md | 76 - .../docs/mkdocs/docs/api/basic_json/object.md | 63 - .../api/basic_json/object_comparator_t.md | 32 - .../mkdocs/docs/api/basic_json/object_t.md | 114 - .../mkdocs/docs/api/basic_json/operator+=.md | 124 - .../mkdocs/docs/api/basic_json/operator=.md | 43 - .../mkdocs/docs/api/basic_json/operator[].md | 250 - .../docs/api/basic_json/operator_ValueType.md | 82 - .../mkdocs/docs/api/basic_json/operator_eq.md | 168 - .../mkdocs/docs/api/basic_json/operator_ge.md | 86 - .../mkdocs/docs/api/basic_json/operator_gt.md | 86 - .../mkdocs/docs/api/basic_json/operator_le.md | 87 - .../mkdocs/docs/api/basic_json/operator_lt.md | 96 - .../mkdocs/docs/api/basic_json/operator_ne.md | 98 - .../docs/api/basic_json/operator_spaceship.md | 100 - .../docs/api/basic_json/operator_value_t.md | 54 - .../mkdocs/docs/api/basic_json/other_error.md | 77 - .../docs/api/basic_json/out_of_range.md | 78 - .../docs/mkdocs/docs/api/basic_json/parse.md | 211 - .../mkdocs/docs/api/basic_json/parse_error.md | 86 - .../docs/api/basic_json/parse_event_t.md | 29 - .../docs/api/basic_json/parser_callback_t.md | 73 - .../docs/mkdocs/docs/api/basic_json/patch.md | 73 - .../docs/api/basic_json/patch_inplace.md | 70 - .../mkdocs/docs/api/basic_json/push_back.md | 120 - .../docs/mkdocs/docs/api/basic_json/rbegin.md | 42 - .../docs/mkdocs/docs/api/basic_json/rend.md | 43 - .../mkdocs/docs/api/basic_json/sax_parse.md | 115 - .../docs/mkdocs/docs/api/basic_json/size.md | 57 - .../mkdocs/docs/api/basic_json/start_pos.md | 68 - .../mkdocs/docs/api/basic_json/std_hash.md | 34 - .../mkdocs/docs/api/basic_json/std_swap.md | 51 - .../mkdocs/docs/api/basic_json/string_t.md | 66 - .../docs/mkdocs/docs/api/basic_json/swap.md | 157 - .../mkdocs/docs/api/basic_json/to_bjdata.md | 78 - .../mkdocs/docs/api/basic_json/to_bson.md | 59 - .../mkdocs/docs/api/basic_json/to_cbor.md | 61 - .../mkdocs/docs/api/basic_json/to_msgpack.md | 59 - .../mkdocs/docs/api/basic_json/to_string.md | 65 - .../mkdocs/docs/api/basic_json/to_ubjson.md | 70 - .../docs/mkdocs/docs/api/basic_json/type.md | 54 - .../mkdocs/docs/api/basic_json/type_error.md | 78 - .../mkdocs/docs/api/basic_json/type_name.md | 54 - .../mkdocs/docs/api/basic_json/unflatten.md | 61 - .../docs/mkdocs/docs/api/basic_json/update.md | 147 - .../docs/mkdocs/docs/api/basic_json/value.md | 183 - .../mkdocs/docs/api/basic_json/value_t.md | 81 - .../mkdocs/docs/api/basic_json/~basic_json.md | 21 - .../byte_container_with_subtype.md | 46 - .../clear_subtype.md | 36 - .../has_subtype.md | 39 - .../api/byte_container_with_subtype/index.md | 35 - .../set_subtype.md | 41 - .../byte_container_with_subtype/subtype.md | 42 - libs/json-3.12.0/docs/mkdocs/docs/api/json.md | 28 - .../docs/mkdocs/docs/api/json_pointer/back.md | 40 - .../mkdocs/docs/api/json_pointer/empty.md | 39 - .../mkdocs/docs/api/json_pointer/index.md | 52 - .../docs/api/json_pointer/json_pointer.md | 41 - .../docs/api/json_pointer/operator_eq.md | 113 - .../docs/api/json_pointer/operator_ne.md | 109 - .../docs/api/json_pointer/operator_slash.md | 64 - .../docs/api/json_pointer/operator_slasheq.md | 61 - .../api/json_pointer/operator_string_t.md | 52 - .../docs/api/json_pointer/parent_pointer.md | 35 - .../mkdocs/docs/api/json_pointer/pop_back.md | 35 - .../mkdocs/docs/api/json_pointer/push_back.md | 39 - .../mkdocs/docs/api/json_pointer/string_t.md | 28 - .../mkdocs/docs/api/json_pointer/to_string.md | 40 - .../docs/mkdocs/docs/api/json_sax/binary.md | 40 - .../docs/mkdocs/docs/api/json_sax/boolean.md | 36 - .../mkdocs/docs/api/json_sax/end_array.md | 31 - .../mkdocs/docs/api/json_sax/end_object.md | 31 - .../docs/mkdocs/docs/api/json_sax/index.md | 44 - .../docs/mkdocs/docs/api/json_sax/key.md | 40 - .../docs/mkdocs/docs/api/json_sax/null.md | 31 - .../mkdocs/docs/api/json_sax/number_float.md | 39 - .../docs/api/json_sax/number_integer.md | 36 - .../docs/api/json_sax/number_unsigned.md | 36 - .../mkdocs/docs/api/json_sax/parse_error.md | 44 - .../mkdocs/docs/api/json_sax/start_array.md | 40 - .../mkdocs/docs/api/json_sax/start_object.md | 40 - .../docs/mkdocs/docs/api/json_sax/string.md | 40 - .../docs/mkdocs/docs/api/macros/index.md | 83 - .../mkdocs/docs/api/macros/json_assert.md | 88 - .../api/macros/json_diagnostic_positions.md | 119 - .../docs/api/macros/json_diagnostics.md | 94 - .../macros/json_disable_enum_serialization.md | 154 - .../mkdocs/docs/api/macros/json_has_cpp_11.md | 41 - .../docs/api/macros/json_has_filesystem.md | 43 - .../mkdocs/docs/api/macros/json_has_ranges.md | 31 - .../docs/api/macros/json_has_static_rtti.md | 31 - .../macros/json_has_three_way_comparison.md | 32 - .../docs/mkdocs/docs/api/macros/json_no_io.md | 35 - .../docs/api/macros/json_noexception.md | 45 - .../macros/json_skip_library_version_check.md | 37 - .../json_skip_unsupported_compiler_check.md | 33 - .../mkdocs/docs/api/macros/json_throw_user.md | 75 - .../docs/api/macros/json_use_global_udls.md | 99 - .../macros/json_use_implicit_conversions.md | 60 - ...n_use_legacy_discarded_value_comparison.md | 81 - .../macros/nlohmann_define_derived_type.md | 177 - .../macros/nlohmann_define_type_intrusive.md | 170 - .../nlohmann_define_type_non_intrusive.md | 171 - .../api/macros/nlohmann_json_namespace.md | 41 - .../macros/nlohmann_json_namespace_begin.md | 61 - .../nlohmann_json_namespace_no_version.md | 45 - .../macros/nlohmann_json_serialize_enum.md | 85 - .../api/macros/nlohmann_json_version_major.md | 40 - .../docs/mkdocs/docs/api/operator_gtgt.md | 64 - .../mkdocs/docs/api/operator_literal_json.md | 61 - .../docs/api/operator_literal_json_pointer.md | 64 - .../docs/mkdocs/docs/api/operator_ltlt.md | 87 - .../docs/mkdocs/docs/api/ordered_json.md | 39 - .../docs/mkdocs/docs/api/ordered_map.md | 82 - .../mkdocs/docs/community/code_of_conduct.md | 1 - .../docs/community/contribution_guidelines.md | 1 - .../docs/mkdocs/docs/community/governance.md | 122 - .../docs/mkdocs/docs/community/index.md | 7 - .../docs/community/quality_assurance.md | 214 - .../mkdocs/docs/community/security_policy.md | 1 - .../docs/mkdocs/docs/css/custom.css | 4 - .../docs/mkdocs/docs/examples/README.cpp | 39 - .../docs/mkdocs/docs/examples/README.output | 27 - .../mkdocs/docs/examples/accept__string.cpp | 26 - .../docs/examples/accept__string.output | 1 - .../docs/mkdocs/docs/examples/array.cpp | 19 - .../docs/mkdocs/docs/examples/array.output | 4 - .../docs/mkdocs/docs/examples/array_t.cpp | 10 - .../docs/mkdocs/docs/examples/array_t.output | 1 - .../mkdocs/docs/examples/at__json_pointer.cpp | 103 - .../docs/examples/at__json_pointer.output | 12 - .../docs/examples/at__json_pointer_const.cpp | 80 - .../examples/at__json_pointer_const.output | 9 - .../docs/examples/at__keytype.c++17.cpp | 49 - .../docs/examples/at__keytype.c++17.output | 4 - .../docs/examples/at__keytype_const.c++17.cpp | 43 - .../examples/at__keytype_const.c++17.output | 3 - .../docs/examples/at__object_t_key_type.cpp | 47 - .../examples/at__object_t_key_type.output | 4 - .../examples/at__object_t_key_type_const.cpp | 41 - .../at__object_t_key_type_const.output | 3 - .../mkdocs/docs/examples/at__size_type.cpp | 42 - .../mkdocs/docs/examples/at__size_type.output | 4 - .../docs/examples/at__size_type_const.cpp | 36 - .../docs/examples/at__size_type_const.output | 3 - .../docs/mkdocs/docs/examples/back.cpp | 38 - .../docs/mkdocs/docs/examples/back.output | 7 - .../examples/basic_json__CompatibleType.cpp | 214 - .../basic_json__CompatibleType.output | 39 - .../examples/basic_json__InputIt_InputIt.cpp | 32 - .../basic_json__InputIt_InputIt.output | 4 - .../docs/examples/basic_json__basic_json.cpp | 17 - .../examples/basic_json__basic_json.output | 2 - .../examples/basic_json__copyassignment.cpp | 18 - .../basic_json__copyassignment.output | 2 - .../docs/examples/basic_json__list_init_t.cpp | 21 - .../examples/basic_json__list_init_t.output | 5 - .../examples/basic_json__moveconstructor.cpp | 17 - .../basic_json__moveconstructor.output | 2 - .../docs/examples/basic_json__nullptr_t.cpp | 16 - .../examples/basic_json__nullptr_t.output | 2 - .../basic_json__size_type_basic_json.cpp | 18 - .../basic_json__size_type_basic_json.output | 3 - .../docs/examples/basic_json__value_t.cpp | 25 - .../docs/examples/basic_json__value_t.output | 7 - .../docs/mkdocs/docs/examples/begin.cpp | 16 - .../docs/mkdocs/docs/examples/begin.output | 1 - .../docs/mkdocs/docs/examples/binary.cpp | 16 - .../docs/mkdocs/docs/examples/binary.output | 1 - .../docs/mkdocs/docs/examples/binary_t.cpp | 10 - .../docs/mkdocs/docs/examples/binary_t.output | 1 - .../docs/mkdocs/docs/examples/boolean_t.cpp | 10 - .../mkdocs/docs/examples/boolean_t.output | 1 - ...h_subtype__byte_container_with_subtype.cpp | 23 - ...ubtype__byte_container_with_subtype.output | 3 - ..._container_with_subtype__clear_subtype.cpp | 21 - ...ntainer_with_subtype__clear_subtype.output | 2 - ...te_container_with_subtype__has_subtype.cpp | 19 - ...container_with_subtype__has_subtype.output | 2 - ...te_container_with_subtype__set_subtype.cpp | 22 - ...container_with_subtype__set_subtype.output | 2 - .../byte_container_with_subtype__subtype.cpp | 22 - ...yte_container_with_subtype__subtype.output | 2 - .../docs/mkdocs/docs/examples/cbegin.cpp | 16 - .../docs/mkdocs/docs/examples/cbegin.output | 1 - .../docs/examples/cbor_tag_handler_t.cpp | 28 - .../docs/examples/cbor_tag_handler_t.output | 3 - .../docs/mkdocs/docs/examples/cend.cpp | 19 - .../docs/mkdocs/docs/examples/cend.output | 1 - .../docs/mkdocs/docs/examples/clear.cpp | 34 - .../docs/mkdocs/docs/examples/clear.output | 7 - .../docs/examples/contains__json_pointer.cpp | 43 - .../examples/contains__json_pointer.output | 7 - .../docs/examples/contains__keytype.c++17.cpp | 20 - .../examples/contains__keytype.c++17.output | 3 - .../examples/contains__object_t_key_type.cpp | 18 - .../contains__object_t_key_type.output | 3 - .../docs/examples/count__keytype.c++17.cpp | 20 - .../docs/examples/count__keytype.c++17.output | 2 - .../examples/count__object_t_key_type.cpp | 18 - .../examples/count__object_t_key_type.output | 2 - .../docs/mkdocs/docs/examples/crbegin.cpp | 16 - .../docs/mkdocs/docs/examples/crbegin.output | 1 - .../docs/mkdocs/docs/examples/crend.cpp | 19 - .../docs/mkdocs/docs/examples/crend.output | 1 - .../examples/default_object_comparator_t.cpp | 11 - .../default_object_comparator_t.output | 2 - .../docs/examples/diagnostic_positions.cpp | 51 - .../docs/examples/diagnostic_positions.output | 50 - .../diagnostic_positions_exception.cpp | 30 - .../diagnostic_positions_exception.output | 1 - .../docs/examples/diagnostics_extended.cpp | 22 - .../docs/examples/diagnostics_extended.output | 1 - .../diagnostics_extended_positions.cpp | 31 - .../diagnostics_extended_positions.output | 1 - .../docs/examples/diagnostics_standard.cpp | 20 - .../docs/examples/diagnostics_standard.output | 1 - .../docs/mkdocs/docs/examples/diff.cpp | 37 - .../docs/mkdocs/docs/examples/diff.output | 25 - .../docs/mkdocs/docs/examples/dump.cpp | 48 - .../docs/mkdocs/docs/examples/dump.output | 55 - .../docs/mkdocs/docs/examples/emplace.cpp | 31 - .../docs/mkdocs/docs/examples/emplace.output | 6 - .../mkdocs/docs/examples/emplace_back.cpp | 24 - .../mkdocs/docs/examples/emplace_back.output | 4 - .../docs/mkdocs/docs/examples/empty.cpp | 30 - .../docs/mkdocs/docs/examples/empty.output | 9 - .../docs/mkdocs/docs/examples/end.cpp | 19 - .../docs/mkdocs/docs/examples/end.output | 1 - .../docs/examples/erase__IteratorType.cpp | 31 - .../docs/examples/erase__IteratorType.output | 6 - .../erase__IteratorType_IteratorType.cpp | 31 - .../erase__IteratorType_IteratorType.output | 6 - .../docs/examples/erase__keytype.c++17.cpp | 20 - .../docs/examples/erase__keytype.c++17.output | 2 - .../examples/erase__object_t_key_type.cpp | 18 - .../examples/erase__object_t_key_type.output | 2 - .../mkdocs/docs/examples/erase__size_type.cpp | 16 - .../docs/examples/erase__size_type.output | 1 - .../mkdocs/docs/examples/error_handler_t.cpp | 24 - .../docs/examples/error_handler_t.output | 3 - .../docs/mkdocs/docs/examples/exception.cpp | 20 - .../mkdocs/docs/examples/exception.output | 2 - .../docs/examples/find__keytype.c++17.cpp | 22 - .../docs/examples/find__keytype.c++17.output | 3 - .../docs/examples/find__object_t_key_type.cpp | 20 - .../examples/find__object_t_key_type.output | 3 - .../docs/mkdocs/docs/examples/flatten.cpp | 32 - .../docs/mkdocs/docs/examples/flatten.output | 12 - .../docs/mkdocs/docs/examples/from_bjdata.cpp | 20 - .../mkdocs/docs/examples/from_bjdata.output | 4 - .../docs/mkdocs/docs/examples/from_bson.cpp | 21 - .../mkdocs/docs/examples/from_bson.output | 4 - .../docs/mkdocs/docs/examples/from_cbor.cpp | 20 - .../mkdocs/docs/examples/from_cbor.output | 4 - .../from_json__default_constructible.cpp | 37 - .../from_json__default_constructible.output | 1 - .../from_json__non_default_constructible.cpp | 53 - ...rom_json__non_default_constructible.output | 1 - .../mkdocs/docs/examples/from_msgpack.cpp | 20 - .../mkdocs/docs/examples/from_msgpack.output | 4 - .../docs/mkdocs/docs/examples/from_ubjson.cpp | 20 - .../mkdocs/docs/examples/from_ubjson.output | 4 - .../docs/mkdocs/docs/examples/front.cpp | 29 - .../docs/mkdocs/docs/examples/front.output | 6 - .../mkdocs/docs/examples/get__PointerType.cpp | 21 - .../docs/examples/get__PointerType.output | 2 - .../docs/examples/get__ValueType_const.cpp | 50 - .../docs/examples/get__ValueType_const.output | 11 - .../mkdocs/docs/examples/get_allocator.cpp | 18 - .../mkdocs/docs/examples/get_allocator.output | 1 - .../docs/mkdocs/docs/examples/get_binary.cpp | 16 - .../mkdocs/docs/examples/get_binary.output | 1 - .../docs/mkdocs/docs/examples/get_ptr.cpp | 21 - .../docs/mkdocs/docs/examples/get_ptr.output | 2 - .../docs/mkdocs/docs/examples/get_ref.cpp | 27 - .../docs/mkdocs/docs/examples/get_ref.output | 2 - .../docs/mkdocs/docs/examples/get_to.cpp | 59 - .../docs/mkdocs/docs/examples/get_to.output | 11 - .../docs/mkdocs/docs/examples/insert.cpp | 17 - .../docs/mkdocs/docs/examples/insert.output | 2 - .../mkdocs/docs/examples/insert__count.cpp | 17 - .../mkdocs/docs/examples/insert__count.output | 2 - .../mkdocs/docs/examples/insert__ilist.cpp | 17 - .../mkdocs/docs/examples/insert__ilist.output | 2 - .../mkdocs/docs/examples/insert__range.cpp | 20 - .../mkdocs/docs/examples/insert__range.output | 2 - .../docs/examples/insert__range_object.cpp | 21 - .../docs/examples/insert__range_object.output | 3 - .../mkdocs/docs/examples/invalid_iterator.cpp | 21 - .../docs/examples/invalid_iterator.output | 2 - .../docs/mkdocs/docs/examples/is_array.cpp | 30 - .../docs/mkdocs/docs/examples/is_array.output | 9 - .../docs/mkdocs/docs/examples/is_binary.cpp | 30 - .../mkdocs/docs/examples/is_binary.output | 9 - .../docs/mkdocs/docs/examples/is_boolean.cpp | 30 - .../mkdocs/docs/examples/is_boolean.output | 9 - .../mkdocs/docs/examples/is_discarded.cpp | 30 - .../mkdocs/docs/examples/is_discarded.output | 9 - .../docs/mkdocs/docs/examples/is_null.cpp | 30 - .../docs/mkdocs/docs/examples/is_null.output | 9 - .../docs/mkdocs/docs/examples/is_number.cpp | 30 - .../mkdocs/docs/examples/is_number.output | 9 - .../mkdocs/docs/examples/is_number_float.cpp | 30 - .../docs/examples/is_number_float.output | 9 - .../docs/examples/is_number_integer.cpp | 30 - .../docs/examples/is_number_integer.output | 9 - .../docs/examples/is_number_unsigned.cpp | 30 - .../docs/examples/is_number_unsigned.output | 9 - .../docs/mkdocs/docs/examples/is_object.cpp | 30 - .../mkdocs/docs/examples/is_object.output | 9 - .../mkdocs/docs/examples/is_primitive.cpp | 30 - .../mkdocs/docs/examples/is_primitive.output | 9 - .../docs/mkdocs/docs/examples/is_string.cpp | 30 - .../mkdocs/docs/examples/is_string.output | 9 - .../mkdocs/docs/examples/is_structured.cpp | 30 - .../mkdocs/docs/examples/is_structured.output | 9 - .../docs/mkdocs/docs/examples/items.cpp | 23 - .../docs/mkdocs/docs/examples/items.output | 7 - .../docs/examples/json_base_class_t.cpp | 88 - .../docs/examples/json_base_class_t.output | 4 - .../docs/mkdocs/docs/examples/json_lines.cpp | 22 - .../mkdocs/docs/examples/json_lines.output | 4 - .../mkdocs/docs/examples/json_pointer.cpp | 47 - .../mkdocs/docs/examples/json_pointer.output | 3 - .../docs/examples/json_pointer__back.cpp | 15 - .../docs/examples/json_pointer__back.output | 2 - .../docs/examples/json_pointer__empty.cpp | 20 - .../docs/examples/json_pointer__empty.output | 4 - .../json_pointer__operator__equal.cpp | 19 - .../json_pointer__operator__equal.output | 4 - ...on_pointer__operator__equal_stringtype.cpp | 33 - ...pointer__operator__equal_stringtype.output | 4 - .../json_pointer__operator__notequal.cpp | 19 - .../json_pointer__operator__notequal.output | 4 - ...pointer__operator__notequal_stringtype.cpp | 32 - ...nter__operator__notequal_stringtype.output | 4 - .../examples/json_pointer__operator_add.cpp | 23 - .../json_pointer__operator_add.output | 4 - .../json_pointer__operator_add_binary.cpp | 19 - .../json_pointer__operator_add_binary.output | 3 - .../json_pointer__operator_string_t.cpp | 19 - .../json_pointer__operator_string_t.output | 2 - .../examples/json_pointer__parent_pointer.cpp | 18 - .../json_pointer__parent_pointer.output | 3 - .../docs/examples/json_pointer__pop_back.cpp | 21 - .../examples/json_pointer__pop_back.output | 4 - .../docs/examples/json_pointer__push_back.cpp | 21 - .../examples/json_pointer__push_back.output | 4 - .../docs/examples/json_pointer__string_t.cpp | 13 - .../examples/json_pointer__string_t.output | 2 - .../docs/examples/json_pointer__to_string.cpp | 34 - .../examples/json_pointer__to_string.output | 12 - .../docs/mkdocs/docs/examples/max_size.cpp | 25 - .../docs/mkdocs/docs/examples/max_size.output | 7 - .../docs/mkdocs/docs/examples/merge_patch.cpp | 41 - .../mkdocs/docs/examples/merge_patch.output | 11 - .../docs/mkdocs/docs/examples/meta.cpp | 11 - .../docs/mkdocs/docs/examples/meta.output | 17 - ...nn_define_derived_type_intrusive_macro.cpp | 37 - ...define_derived_type_intrusive_macro.output | 6 - ...lohmann_define_type_intrusive_explicit.cpp | 62 - ...mann_define_type_intrusive_explicit.output | 2 - .../nlohmann_define_type_intrusive_macro.cpp | 48 - ...lohmann_define_type_intrusive_macro.output | 2 - ...type_intrusive_only_serialize_explicit.cpp | 39 - ...e_intrusive_only_serialize_explicit.output | 1 - ...ne_type_intrusive_only_serialize_macro.cpp | 33 - ...type_intrusive_only_serialize_macro.output | 1 - ...e_type_intrusive_with_default_explicit.cpp | 57 - ...ype_intrusive_with_default_explicit.output | 2 - ...fine_type_intrusive_with_default_macro.cpp | 42 - ...e_type_intrusive_with_default_macro.output | 2 - ...ann_define_type_non_intrusive_explicit.cpp | 55 - ..._define_type_non_intrusive_explicit.output | 2 - ...ohmann_define_type_non_intrusive_macro.cpp | 41 - ...ann_define_type_non_intrusive_macro.output | 2 - ..._non_intrusive_only_serialize_explicit.cpp | 32 - ...n_intrusive_only_serialize_explicit.output | 1 - ...ype_non_intrusive_only_serialize_macro.cpp | 26 - ..._non_intrusive_only_serialize_macro.output | 1 - ...pe_non_intrusive_with_default_explicit.cpp | 55 - ...non_intrusive_with_default_explicit.output | 2 - ..._type_non_intrusive_with_default_macro.cpp | 40 - ...pe_non_intrusive_with_default_macro.output | 2 - .../docs/examples/nlohmann_json_namespace.cpp | 14 - .../examples/nlohmann_json_namespace.output | 1 - .../nlohmann_json_namespace_begin.c++17.cpp | 33 - ...nlohmann_json_namespace_begin.c++17.output | 1 - .../nlohmann_json_namespace_no_version.cpp | 13 - .../nlohmann_json_namespace_no_version.output | 1 - .../examples/nlohmann_json_serialize_enum.cpp | 59 - .../nlohmann_json_serialize_enum.output | 3 - .../nlohmann_json_serialize_enum_2.cpp | 33 - .../nlohmann_json_serialize_enum_2.output | 3 - .../docs/examples/nlohmann_json_version.cpp | 12 - .../examples/nlohmann_json_version.output | 1 - .../mkdocs/docs/examples/number_float_t.cpp | 10 - .../docs/examples/number_float_t.output | 1 - .../mkdocs/docs/examples/number_integer_t.cpp | 10 - .../docs/examples/number_integer_t.output | 1 - .../docs/examples/number_unsigned_t.cpp | 10 - .../docs/examples/number_unsigned_t.output | 1 - .../docs/mkdocs/docs/examples/object.cpp | 28 - .../docs/mkdocs/docs/examples/object.output | 4 - .../docs/examples/object_comparator_t.cpp | 11 - .../docs/examples/object_comparator_t.output | 2 - .../docs/mkdocs/docs/examples/object_t.cpp | 10 - .../docs/mkdocs/docs/examples/object_t.output | 1 - .../docs/examples/operator__ValueType.cpp | 60 - .../docs/examples/operator__ValueType.output | 12 - .../mkdocs/docs/examples/operator__equal.cpp | 24 - .../docs/examples/operator__equal.output | 4 - .../examples/operator__equal__nullptr_t.cpp | 22 - .../operator__equal__nullptr_t.output | 5 - .../operator__equal__specializations.cpp | 16 - .../operator__equal__specializations.output | 2 - .../docs/examples/operator__greater.cpp | 24 - .../docs/examples/operator__greater.output | 4 - .../docs/examples/operator__greaterequal.cpp | 24 - .../examples/operator__greaterequal.output | 4 - .../mkdocs/docs/examples/operator__less.cpp | 24 - .../docs/examples/operator__less.output | 4 - .../docs/examples/operator__lessequal.cpp | 24 - .../docs/examples/operator__lessequal.output | 4 - .../docs/examples/operator__notequal.cpp | 24 - .../docs/examples/operator__notequal.output | 4 - .../operator__notequal__nullptr_t.cpp | 22 - .../operator__notequal__nullptr_t.output | 5 - .../docs/examples/operator__value_t.cpp | 38 - .../docs/examples/operator__value_t.output | 8 - .../examples/operator_array__json_pointer.cpp | 49 - .../operator_array__json_pointer.output | 8 - .../operator_array__json_pointer_const.cpp | 25 - .../operator_array__json_pointer_const.output | 4 - .../operator_array__keytype.c++17.cpp | 34 - .../operator_array__keytype.c++17.output | 19 - .../operator_array__keytype_const.c++17.cpp | 18 - ...operator_array__keytype_const.c++17.output | 1 - .../operator_array__object_t_key_type.cpp | 32 - .../operator_array__object_t_key_type.output | 19 - ...perator_array__object_t_key_type_const.cpp | 16 - ...ator_array__object_t_key_type_const.output | 1 - .../examples/operator_array__size_type.cpp | 25 - .../examples/operator_array__size_type.output | 3 - .../operator_array__size_type_const.cpp | 13 - .../operator_array__size_type_const.output | 1 - .../docs/examples/operator_deserialize.cpp | 26 - .../docs/examples/operator_deserialize.output | 13 - .../docs/examples/operator_literal_json.cpp | 13 - .../examples/operator_literal_json.output | 4 - .../operator_literal_json_pointer.cpp | 14 - .../operator_literal_json_pointer.output | 1 - .../examples/operator_ltlt__basic_json.cpp | 21 - .../examples/operator_ltlt__basic_json.output | 22 - .../examples/operator_ltlt__json_pointer.cpp | 13 - .../operator_ltlt__json_pointer.output | 1 - ...rator_spaceship__const_reference.c++20.cpp | 40 - ...or_spaceship__const_reference.c++20.output | 4 - .../operator_spaceship__scalartype.c++20.cpp | 40 - ...perator_spaceship__scalartype.c++20.output | 4 - .../mkdocs/docs/examples/ordered_json.cpp | 14 - .../mkdocs/docs/examples/ordered_json.output | 5 - .../docs/mkdocs/docs/examples/ordered_map.cpp | 43 - .../mkdocs/docs/examples/ordered_map.output | 4 - .../docs/mkdocs/docs/examples/other_error.cpp | 30 - .../mkdocs/docs/examples/other_error.output | 2 - .../mkdocs/docs/examples/out_of_range.cpp | 20 - .../mkdocs/docs/examples/out_of_range.output | 2 - .../docs/examples/parse__allow_exceptions.cpp | 36 - .../examples/parse__allow_exceptions.output | 2 - .../parse__array__parser_callback_t.cpp | 30 - .../parse__array__parser_callback_t.output | 20 - ...contiguouscontainer__parser_callback_t.cpp | 15 - ...tiguouscontainer__parser_callback_t.output | 6 - .../parse__istream__parser_callback_t.cpp | 57 - .../parse__istream__parser_callback_t.output | 34 - .../docs/examples/parse__iterator_pair.cpp | 15 - .../docs/examples/parse__iterator_pair.link | 1 - .../docs/examples/parse__iterator_pair.output | 6 - .../mkdocs/docs/examples/parse__pointers.cpp | 15 - .../mkdocs/docs/examples/parse__pointers.link | 1 - .../docs/examples/parse__pointers.output | 6 - .../parse__string__parser_callback_t.cpp | 48 - .../parse__string__parser_callback_t.output | 34 - .../docs/mkdocs/docs/examples/parse_error.cpp | 20 - .../mkdocs/docs/examples/parse_error.output | 3 - .../docs/mkdocs/docs/examples/patch.cpp | 33 - .../docs/mkdocs/docs/examples/patch.output | 11 - .../mkdocs/docs/examples/patch_inplace.cpp | 35 - .../mkdocs/docs/examples/patch_inplace.output | 13 - .../docs/mkdocs/docs/examples/push_back.cpp | 25 - .../mkdocs/docs/examples/push_back.output | 4 - .../examples/push_back__initializer_list.cpp | 27 - .../push_back__initializer_list.output | 4 - .../examples/push_back__object_t__value.cpp | 25 - .../push_back__object_t__value.output | 4 - .../docs/mkdocs/docs/examples/rbegin.cpp | 16 - .../docs/mkdocs/docs/examples/rbegin.output | 1 - .../docs/mkdocs/docs/examples/rend.cpp | 19 - .../docs/mkdocs/docs/examples/rend.output | 1 - .../docs/mkdocs/docs/examples/sax_parse.cpp | 131 - .../mkdocs/docs/examples/sax_parse.output | 37 - .../docs/examples/sax_parse__binary.cpp | 114 - .../docs/examples/sax_parse__binary.output | 3 - .../docs/mkdocs/docs/examples/size.cpp | 29 - .../docs/mkdocs/docs/examples/size.output | 9 - .../docs/mkdocs/docs/examples/std_hash.cpp | 19 - .../docs/mkdocs/docs/examples/std_hash.output | 8 - .../docs/mkdocs/docs/examples/std_swap.cpp | 19 - .../docs/mkdocs/docs/examples/std_swap.output | 2 - .../docs/mkdocs/docs/examples/string_t.cpp | 10 - .../docs/mkdocs/docs/examples/string_t.output | 1 - .../mkdocs/docs/examples/swap__array_t.cpp | 20 - .../mkdocs/docs/examples/swap__array_t.output | 2 - .../mkdocs/docs/examples/swap__binary_t.cpp | 20 - .../docs/examples/swap__binary_t.output | 2 - .../mkdocs/docs/examples/swap__object_t.cpp | 20 - .../docs/examples/swap__object_t.output | 2 - .../mkdocs/docs/examples/swap__reference.cpp | 18 - .../docs/examples/swap__reference.output | 2 - .../mkdocs/docs/examples/swap__string_t.cpp | 20 - .../docs/examples/swap__string_t.output | 2 - .../docs/mkdocs/docs/examples/to_bjdata.cpp | 64 - .../mkdocs/docs/examples/to_bjdata.output | 4 - .../docs/mkdocs/docs/examples/to_bson.cpp | 22 - .../docs/mkdocs/docs/examples/to_bson.output | 1 - .../docs/mkdocs/docs/examples/to_cbor.cpp | 22 - .../docs/mkdocs/docs/examples/to_cbor.output | 1 - .../docs/mkdocs/docs/examples/to_json.cpp | 32 - .../docs/mkdocs/docs/examples/to_json.output | 1 - .../docs/mkdocs/docs/examples/to_msgpack.cpp | 22 - .../mkdocs/docs/examples/to_msgpack.output | 1 - .../docs/mkdocs/docs/examples/to_string.cpp | 20 - .../mkdocs/docs/examples/to_string.output | 3 - .../docs/mkdocs/docs/examples/to_ubjson.cpp | 64 - .../mkdocs/docs/examples/to_ubjson.output | 4 - .../docs/mkdocs/docs/examples/type.cpp | 28 - .../docs/mkdocs/docs/examples/type.output | 8 - .../docs/mkdocs/docs/examples/type_error.cpp | 20 - .../mkdocs/docs/examples/type_error.output | 2 - .../docs/mkdocs/docs/examples/type_name.cpp | 27 - .../mkdocs/docs/examples/type_name.output | 8 - .../docs/mkdocs/docs/examples/unflatten.cpp | 26 - .../mkdocs/docs/examples/unflatten.output | 18 - .../docs/mkdocs/docs/examples/update.cpp | 24 - .../docs/mkdocs/docs/examples/update.output | 17 - .../mkdocs/docs/examples/update__range.cpp | 24 - .../mkdocs/docs/examples/update__range.output | 17 - .../mkdocs/docs/examples/value__json_ptr.cpp | 31 - .../docs/examples/value__json_ptr.output | 1 - .../docs/examples/value__keytype.c++17.cpp | 32 - .../docs/examples/value__keytype.c++17.output | 1 - .../examples/value__object_t_key_type.cpp | 30 - .../examples/value__object_t_key_type.output | 1 - .../docs/examples/value__return_type.cpp | 14 - .../docs/examples/value__return_type.output | 4 - .../mkdocs/docs/features/arbitrary_types.md | 294 - .../docs/mkdocs/docs/features/assertions.md | 144 - .../docs/features/binary_formats/bjdata.md | 206 - .../docs/features/binary_formats/bson.md | 97 - .../docs/features/binary_formats/cbor.md | 181 - .../docs/features/binary_formats/index.md | 52 - .../features/binary_formats/messagepack.md | 143 - .../docs/features/binary_formats/ubjson.md | 126 - .../mkdocs/docs/features/binary_values.md | 374 - .../docs/mkdocs/docs/features/comments.md | 83 - .../features/element_access/checked_access.md | 91 - .../features/element_access/default_value.md | 63 - .../docs/features/element_access/index.md | 9 - .../element_access/unchecked_access.md | 112 - .../mkdocs/docs/features/enum_conversion.md | 61 - .../docs/mkdocs/docs/features/iterators.md | 155 - .../docs/mkdocs/docs/features/json_patch.md | 47 - .../docs/mkdocs/docs/features/json_pointer.md | 126 - .../docs/mkdocs/docs/features/macros.md | 135 - .../docs/mkdocs/docs/features/merge_patch.md | 20 - .../docs/mkdocs/docs/features/namespace.md | 94 - .../docs/mkdocs/docs/features/object_order.md | 109 - .../mkdocs/docs/features/parsing/index.md | 13 - .../docs/features/parsing/json_lines.md | 49 - .../docs/features/parsing/parse_exceptions.md | 121 - .../docs/features/parsing/parser_callbacks.md | 83 - .../docs/features/parsing/sax_interface.md | 76 - .../docs/mkdocs/docs/features/types/index.md | 271 - .../docs/features/types/number_handling.md | 328 - .../docs/mkdocs/docs/home/architecture.md | 124 - .../docs/mkdocs/docs/home/customers.md | 163 - .../docs/mkdocs/docs/home/design_goals.md | 17 - .../docs/mkdocs/docs/home/exceptions.md | 902 - libs/json-3.12.0/docs/mkdocs/docs/home/faq.md | 180 - .../docs/mkdocs/docs/home/license.md | 21 - .../docs/mkdocs/docs/home/releases.md | 1225 - .../docs/mkdocs/docs/home/sponsors.md | 19 - .../mkdocs/docs/images/callback_events.png | Bin 46039 -> 0 bytes .../docs/mkdocs/docs/images/customers.png | Bin 1020636 -> 0 bytes .../docs/mkdocs/docs/images/json.gif | Bin 1652796 -> 0 bytes .../mkdocs/docs/images/json_syntax_number.png | Bin 37014 -> 0 bytes .../docs/images/package_managers/CPM.png | Bin 15910 -> 0 bytes .../docs/images/package_managers/bazel.svg | 11 - .../docs/images/package_managers/conan.svg | 16 - .../docs/images/package_managers/conda.svg | 1 - .../docs/images/package_managers/homebrew.svg | 22 - .../docs/images/package_managers/macports.svg | 81 - .../docs/images/package_managers/meson.svg | 2 - .../docs/images/package_managers/nuget.svg | 21 - .../docs/images/package_managers/spack.svg | 61 - .../docs/images/package_managers/swift.svg | 1 - .../docs/images/package_managers/vcpkg.png | Bin 11393 -> 0 bytes .../docs/images/package_managers/xmake.svg | 60 - .../mkdocs/docs/images/range-begin-end.svg | 435 - .../mkdocs/docs/images/range-rbegin-rend.svg | 1232 - libs/json-3.12.0/docs/mkdocs/docs/index.md | 3 - .../docs/mkdocs/docs/integration/bazel/BUILD | 5 - .../docs/integration/bazel/MODULE.bazel | 1 - .../mkdocs/docs/integration/bazel/example.cpp | 10 - .../docs/integration/cget/CMakeLists.txt | 7 - .../mkdocs/docs/integration/cget/example.cpp | 10 - .../docs/mkdocs/docs/integration/cmake.md | 178 - .../docs/integration/conan/CMakeLists.txt | 7 - .../docs/integration/conan/Conanfile.txt | 6 - .../mkdocs/docs/integration/conan/example.cpp | 10 - .../mkdocs/docs/integration/conda/example.cpp | 10 - .../docs/integration/cpm/CMakeLists.txt | 9 - .../mkdocs/docs/integration/cpm/example.cpp | 10 - .../docs/mkdocs/docs/integration/example.cpp | 10 - .../docs/integration/homebrew/CMakeLists.txt | 7 - .../docs/integration/homebrew/example.cpp | 10 - .../docs/integration/hunter/CMakeLists.txt | 15 - .../docs/integration/hunter/example.cpp | 10 - .../docs/mkdocs/docs/integration/index.md | 18 - .../docs/integration/macports/CMakeLists.txt | 7 - .../docs/integration/macports/example.cpp | 10 - .../mkdocs/docs/integration/meson/example.cpp | 10 - .../mkdocs/docs/integration/meson/meson.build | 12 - .../docs/integration/migration_guide.md | 264 - .../nuget/nuget-package-content.png | Bin 19422 -> 0 bytes .../nuget/nuget-project-changes.png | Bin 30826 -> 0 bytes .../nuget/nuget-project-makefile.png | Bin 55236 -> 0 bytes .../nuget/nuget-search-package.png | Bin 96734 -> 0 bytes .../nuget/nuget-select-package.png | Bin 157311 -> 0 bytes .../docs/integration/package_managers.md | 826 - .../mkdocs/docs/integration/pkg-config.md | 13 - .../docs/integration/spack/CMakeLists.txt | 7 - .../mkdocs/docs/integration/spack/example.cpp | 10 - .../docs/integration/vcpkg/CMakeLists.txt | 7 - .../mkdocs/docs/integration/vcpkg/example.cpp | 10 - .../mkdocs/docs/integration/xmake/example.cpp | 10 - .../mkdocs/docs/integration/xmake/xmake.lua | 8 - .../docs/mkdocs/includes/glossary.md | 36 - libs/json-3.12.0/docs/mkdocs/mkdocs.yml | 380 - libs/json-3.12.0/docs/mkdocs/requirements.txt | 11 - .../docs/mkdocs/scripts/check_structure.py | 222 - .../include/nlohmann/adl_serializer.hpp | 55 - .../nlohmann/byte_container_with_subtype.hpp | 103 - .../include/nlohmann/detail/abi_macros.hpp | 111 - .../nlohmann/detail/conversions/from_json.hpp | 577 - .../nlohmann/detail/conversions/to_chars.hpp | 1118 - .../nlohmann/detail/conversions/to_json.hpp | 479 - .../include/nlohmann/detail/exceptions.hpp | 291 - .../include/nlohmann/detail/hash.hpp | 129 - .../nlohmann/detail/input/binary_reader.hpp | 3068 -- .../nlohmann/detail/input/input_adapters.hpp | 549 - .../nlohmann/detail/input/json_sax.hpp | 986 - .../include/nlohmann/detail/input/lexer.hpp | 1643 - .../include/nlohmann/detail/input/parser.hpp | 519 - .../nlohmann/detail/input/position_t.hpp | 37 - .../detail/iterators/internal_iterator.hpp | 35 - .../nlohmann/detail/iterators/iter_impl.hpp | 760 - .../detail/iterators/iteration_proxy.hpp | 235 - .../detail/iterators/iterator_traits.hpp | 61 - .../iterators/json_reverse_iterator.hpp | 130 - .../detail/iterators/primitive_iterator.hpp | 132 - .../detail/json_custom_base_class.hpp | 39 - .../include/nlohmann/detail/json_pointer.hpp | 988 - .../include/nlohmann/detail/json_ref.hpp | 78 - .../include/nlohmann/detail/macro_scope.hpp | 595 - .../include/nlohmann/detail/macro_unscope.hpp | 46 - .../nlohmann/detail/meta/call_std/begin.hpp | 17 - .../nlohmann/detail/meta/call_std/end.hpp | 17 - .../nlohmann/detail/meta/cpp_future.hpp | 171 - .../include/nlohmann/detail/meta/detected.hpp | 70 - .../nlohmann/detail/meta/identity_tag.hpp | 21 - .../include/nlohmann/detail/meta/is_sax.hpp | 159 - .../include/nlohmann/detail/meta/std_fs.hpp | 29 - .../nlohmann/detail/meta/type_traits.hpp | 795 - .../include/nlohmann/detail/meta/void_t.hpp | 24 - .../nlohmann/detail/output/binary_writer.hpp | 1850 -- .../detail/output/output_adapters.hpp | 147 - .../nlohmann/detail/output/serializer.hpp | 988 - .../include/nlohmann/detail/string_concat.hpp | 146 - .../include/nlohmann/detail/string_escape.hpp | 72 - .../include/nlohmann/detail/string_utils.hpp | 37 - .../include/nlohmann/detail/value_t.hpp | 118 - libs/json-3.12.0/include/nlohmann/json.hpp | 5306 ---- .../json-3.12.0/include/nlohmann/json_fwd.hpp | 75 - .../include/nlohmann/ordered_map.hpp | 359 - .../nlohmann/thirdparty/hedley/hedley.hpp | 2045 -- .../thirdparty/hedley/hedley_undef.hpp | 158 - libs/json-3.12.0/meson.build | 24 - libs/json-3.12.0/nlohmann_json.natvis | 278 - libs/json-3.12.0/tests/CMakeLists.txt | 197 - libs/json-3.12.0/tests/Makefile | 32 - libs/json-3.12.0/tests/abi/CMakeLists.txt | 30 - .../tests/abi/config/CMakeLists.txt | 22 - libs/json-3.12.0/tests/abi/config/config.hpp | 35 - libs/json-3.12.0/tests/abi/config/custom.cpp | 33 - libs/json-3.12.0/tests/abi/config/default.cpp | 45 - .../tests/abi/config/noversion.cpp | 44 - .../json-3.12.0/tests/abi/diag/CMakeLists.txt | 19 - libs/json-3.12.0/tests/abi/diag/diag.cpp | 29 - libs/json-3.12.0/tests/abi/diag/diag.hpp | 20 - libs/json-3.12.0/tests/abi/diag/diag_off.cpp | 30 - libs/json-3.12.0/tests/abi/diag/diag_on.cpp | 30 - .../abi/include/nlohmann/json_v3_10_5.hpp | 22091 ------------- .../tests/abi/inline_ns/CMakeLists.txt | 12 - .../tests/abi/inline_ns/use_current.cpp | 36 - .../tests/abi/inline_ns/use_v3_10_5.cpp | 22 - libs/json-3.12.0/tests/abi/main.cpp | 10 - .../tests/benchmarks/CMakeLists.txt | 34 - .../tests/benchmarks/src/benchmarks.cpp | 217 - .../cmake_add_subdirectory/CMakeLists.txt | 18 - .../project/CMakeLists.txt | 20 - .../cmake_add_subdirectory/project/main.cpp | 16 - .../tests/cmake_fetch_content/CMakeLists.txt | 20 - .../project/CMakeLists.txt | 20 - .../cmake_fetch_content/project/main.cpp | 16 - .../tests/cmake_fetch_content2/CMakeLists.txt | 20 - .../project/CMakeLists.txt | 15 - .../cmake_fetch_content2/project/main.cpp | 16 - .../tests/cmake_import/CMakeLists.txt | 19 - .../tests/cmake_import/project/CMakeLists.txt | 12 - .../tests/cmake_import/project/main.cpp | 16 - .../tests/cmake_import_minver/CMakeLists.txt | 19 - .../project/CMakeLists.txt | 8 - .../cmake_import_minver/project/main.cpp | 16 - .../CMakeLists.txt | 18 - .../project/Bar.cpp | 11 - .../project/Bar.hpp | 12 - .../project/CMakeLists.txt | 21 - .../project/Foo.cpp | 11 - .../project/Foo.hpp | 12 - .../project/main.cpp | 16 - .../tests/cuda_example/CMakeLists.txt | 10 - .../tests/cuda_example/json_cuda.cu | 19 - libs/json-3.12.0/tests/fuzzing.md | 81 - .../reports/2016-08-29-fuzz/exec_speed.png | Bin 28144 -> 0 bytes .../tests/reports/2016-08-29-fuzz/fuzz.tiff | Bin 235588 -> 0 bytes .../reports/2016-08-29-fuzz/high_freq.png | Bin 26251 -> 0 bytes .../tests/reports/2016-08-29-fuzz/index.html | 10 - .../reports/2016-08-29-fuzz/low_freq.png | Bin 11752 -> 0 bytes .../2016-09-09-nativejson_benchmark/README.md | 31 - .../conformance_Nlohmann (C++11).md | 670 - .../conformance_overall_Result.png | Bin 169617 -> 0 bytes ..._mac64_clang7.0_1._Parse_Memory_(byte).png | Bin 196128 -> 0 bytes ...0GHz_mac64_clang7.0_1._Parse_Time_(ms).png | Bin 149308 -> 0 bytes ..._mac64_clang7.0_2._Stringify_Time_(ms).png | Bin 139615 -> 0 bytes ...z_mac64_clang7.0_3._Prettify_Time_(ms).png | Bin 100027 -> 0 bytes ..._clang7.0_7._Code_size_FileSize_(byte).png | Bin 186055 -> 0 bytes .../reports/2016-10-02-fuzz/exec_speed.png | Bin 31420 -> 0 bytes .../tests/reports/2016-10-02-fuzz/fuzz.tiff | Bin 264782 -> 0 bytes .../reports/2016-10-02-fuzz/high_freq.png | Bin 23019 -> 0 bytes .../tests/reports/2016-10-02-fuzz/index.html | 10 - .../reports/2016-10-02-fuzz/low_freq.png | Bin 14234 -> 0 bytes .../tests/src/fuzzer-driver_afl.cpp | 39 - .../tests/src/fuzzer-parse_bjdata.cpp | 85 - .../tests/src/fuzzer-parse_bson.cpp | 74 - .../tests/src/fuzzer-parse_cbor.cpp | 69 - .../tests/src/fuzzer-parse_json.cpp | 70 - .../tests/src/fuzzer-parse_msgpack.cpp | 69 - .../tests/src/fuzzer-parse_ubjson.cpp | 85 - .../tests/src/make_test_data_available.hpp | 31 - libs/json-3.12.0/tests/src/test_utils.hpp | 33 - libs/json-3.12.0/tests/src/unit-32bit.cpp | 134 - .../json-3.12.0/tests/src/unit-algorithms.cpp | 365 - libs/json-3.12.0/tests/src/unit-allocator.cpp | 263 - .../json-3.12.0/tests/src/unit-alt-string.cpp | 370 - .../tests/src/unit-assert_macro.cpp | 48 - .../tests/src/unit-binary_formats.cpp | 211 - libs/json-3.12.0/tests/src/unit-bjdata.cpp | 3713 --- libs/json-3.12.0/tests/src/unit-bson.cpp | 1296 - .../src/unit-byte_container_with_subtype.cpp | 76 - libs/json-3.12.0/tests/src/unit-capacity.cpp | 542 - libs/json-3.12.0/tests/src/unit-cbor.cpp | 2704 -- .../tests/src/unit-class_const_iterator.cpp | 393 - .../tests/src/unit-class_iterator.cpp | 468 - .../tests/src/unit-class_lexer.cpp | 226 - .../tests/src/unit-class_parser.cpp | 1691 - ...unit-class_parser_diagnostic_positions.cpp | 1957 -- .../json-3.12.0/tests/src/unit-comparison.cpp | 596 - libs/json-3.12.0/tests/src/unit-concepts.cpp | 149 - .../tests/src/unit-constructor1.cpp | 1581 - .../tests/src/unit-constructor2.cpp | 186 - .../tests/src/unit-convenience.cpp | 205 - .../tests/src/unit-conversions.cpp | 1753 -- .../tests/src/unit-custom-base-class.cpp | 335 - .../tests/src/unit-deserialization.cpp | 1191 - .../src/unit-diagnostic-positions-only.cpp | 44 - .../tests/src/unit-diagnostic-positions.cpp | 40 - .../tests/src/unit-diagnostics.cpp | 265 - .../tests/src/unit-disabled_exceptions.cpp | 51 - .../tests/src/unit-element_access1.cpp | 880 - .../tests/src/unit-element_access2.cpp | 1792 -- libs/json-3.12.0/tests/src/unit-hash.cpp | 113 - .../json-3.12.0/tests/src/unit-inspection.cpp | 459 - libs/json-3.12.0/tests/src/unit-items.cpp | 1433 - .../json-3.12.0/tests/src/unit-iterators1.cpp | 1630 - .../json-3.12.0/tests/src/unit-iterators2.cpp | 971 - .../json-3.12.0/tests/src/unit-iterators3.cpp | 35 - .../json-3.12.0/tests/src/unit-json_patch.cpp | 1336 - .../tests/src/unit-json_pointer.cpp | 791 - .../json-3.12.0/tests/src/unit-large_json.cpp | 29 - .../json-3.12.0/tests/src/unit-locale-cpp.cpp | 161 - .../tests/src/unit-merge_patch.cpp | 244 - libs/json-3.12.0/tests/src/unit-meta.cpp | 36 - libs/json-3.12.0/tests/src/unit-modifiers.cpp | 952 - libs/json-3.12.0/tests/src/unit-msgpack.cpp | 1882 -- .../src/unit-no-mem-leak-on-adl-serialize.cpp | 86 - libs/json-3.12.0/tests/src/unit-noexcept.cpp | 83 - .../tests/src/unit-ordered_json.cpp | 71 - .../tests/src/unit-ordered_map.cpp | 310 - .../tests/src/unit-pointer_access.cpp | 479 - libs/json-3.12.0/tests/src/unit-readme.cpp | 304 - .../tests/src/unit-reference_access.cpp | 247 - .../tests/src/unit-regression1.cpp | 1530 - .../tests/src/unit-regression2.cpp | 1042 - .../tests/src/unit-serialization.cpp | 297 - .../json-3.12.0/tests/src/unit-testsuites.cpp | 1392 - libs/json-3.12.0/tests/src/unit-to_chars.cpp | 516 - .../tests/src/unit-type_traits.cpp | 56 - libs/json-3.12.0/tests/src/unit-ubjson.cpp | 2547 -- libs/json-3.12.0/tests/src/unit-udl.cpp | 57 - libs/json-3.12.0/tests/src/unit-udt.cpp | 904 - libs/json-3.12.0/tests/src/unit-udt_macro.cpp | 709 - libs/json-3.12.0/tests/src/unit-unicode1.cpp | 620 - libs/json-3.12.0/tests/src/unit-unicode2.cpp | 610 - libs/json-3.12.0/tests/src/unit-unicode3.cpp | 324 - libs/json-3.12.0/tests/src/unit-unicode4.cpp | 324 - libs/json-3.12.0/tests/src/unit-unicode5.cpp | 324 - .../tests/src/unit-user_defined_input.cpp | 130 - libs/json-3.12.0/tests/src/unit-windows_h.cpp | 23 - libs/json-3.12.0/tests/src/unit-wstring.cpp | 99 - libs/json-3.12.0/tests/src/unit.cpp | 10 - .../tests/thirdparty/Fuzzer/CMakeLists.txt | 45 - .../tests/thirdparty/Fuzzer/FuzzerCorpus.h | 217 - .../thirdparty/Fuzzer/FuzzerCrossOver.cpp | 52 - .../tests/thirdparty/Fuzzer/FuzzerDefs.h | 89 - .../thirdparty/Fuzzer/FuzzerDictionary.h | 124 - .../tests/thirdparty/Fuzzer/FuzzerDriver.cpp | 545 - .../thirdparty/Fuzzer/FuzzerExtFunctions.def | 50 - .../thirdparty/Fuzzer/FuzzerExtFunctions.h | 35 - .../Fuzzer/FuzzerExtFunctionsDlsym.cpp | 52 - .../Fuzzer/FuzzerExtFunctionsWeak.cpp | 53 - .../Fuzzer/FuzzerExtFunctionsWeakAlias.cpp | 56 - .../tests/thirdparty/Fuzzer/FuzzerFlags.def | 115 - .../tests/thirdparty/Fuzzer/FuzzerIO.cpp | 117 - .../tests/thirdparty/Fuzzer/FuzzerIO.h | 64 - .../tests/thirdparty/Fuzzer/FuzzerIOPosix.cpp | 88 - .../thirdparty/Fuzzer/FuzzerIOWindows.cpp | 282 - .../tests/thirdparty/Fuzzer/FuzzerInterface.h | 67 - .../tests/thirdparty/Fuzzer/FuzzerInternal.h | 182 - .../tests/thirdparty/Fuzzer/FuzzerLoop.cpp | 792 - .../tests/thirdparty/Fuzzer/FuzzerMain.cpp | 21 - .../tests/thirdparty/Fuzzer/FuzzerMerge.cpp | 261 - .../tests/thirdparty/Fuzzer/FuzzerMerge.h | 70 - .../tests/thirdparty/Fuzzer/FuzzerMutate.cpp | 527 - .../tests/thirdparty/Fuzzer/FuzzerMutate.h | 145 - .../tests/thirdparty/Fuzzer/FuzzerOptions.h | 68 - .../tests/thirdparty/Fuzzer/FuzzerRandom.h | 36 - .../tests/thirdparty/Fuzzer/FuzzerSHA1.cpp | 222 - .../tests/thirdparty/Fuzzer/FuzzerSHA1.h | 33 - .../tests/thirdparty/Fuzzer/FuzzerTracePC.cpp | 339 - .../tests/thirdparty/Fuzzer/FuzzerTracePC.h | 158 - .../thirdparty/Fuzzer/FuzzerTraceState.cpp | 325 - .../tests/thirdparty/Fuzzer/FuzzerUtil.cpp | 218 - .../tests/thirdparty/Fuzzer/FuzzerUtil.h | 72 - .../thirdparty/Fuzzer/FuzzerUtilDarwin.cpp | 152 - .../thirdparty/Fuzzer/FuzzerUtilLinux.cpp | 24 - .../thirdparty/Fuzzer/FuzzerUtilPosix.cpp | 117 - .../thirdparty/Fuzzer/FuzzerUtilWindows.cpp | 182 - .../thirdparty/Fuzzer/FuzzerValueBitMap.h | 87 - .../tests/thirdparty/Fuzzer/README.txt | 2 - .../thirdparty/Fuzzer/afl/afl_driver.cpp | 295 - .../tests/thirdparty/Fuzzer/build.sh | 10 - .../tests/thirdparty/Fuzzer/cxx.dict | 122 - .../standalone/StandaloneFuzzTargetMain.c | 41 - .../thirdparty/Fuzzer/test/AFLDriverTest.cpp | 22 - .../Fuzzer/test/AbsNegAndConstant64Test.cpp | 23 - .../Fuzzer/test/AbsNegAndConstantTest.cpp | 23 - .../Fuzzer/test/AccumulateAllocationsTest.cpp | 17 - .../Fuzzer/test/BufferOverflowOnInput.cpp | 23 - .../thirdparty/Fuzzer/test/CMakeLists.txt | 217 - .../Fuzzer/test/CallerCalleeTest.cpp | 59 - .../thirdparty/Fuzzer/test/CounterTest.cpp | 18 - .../Fuzzer/test/CustomCrossOverTest.cpp | 63 - .../Fuzzer/test/CustomMutatorTest.cpp | 38 - .../tests/thirdparty/Fuzzer/test/DSO1.cpp | 12 - .../tests/thirdparty/Fuzzer/test/DSO2.cpp | 12 - .../thirdparty/Fuzzer/test/DSOTestExtra.cpp | 11 - .../thirdparty/Fuzzer/test/DSOTestMain.cpp | 31 - .../tests/thirdparty/Fuzzer/test/DivTest.cpp | 20 - .../thirdparty/Fuzzer/test/EmptyTest.cpp | 11 - .../test/FourIndependentBranchesTest.cpp | 22 - .../Fuzzer/test/FullCoverageSetTest.cpp | 24 - .../thirdparty/Fuzzer/test/FuzzerUnittest.cpp | 738 - .../thirdparty/Fuzzer/test/InitializeTest.cpp | 28 - .../tests/thirdparty/Fuzzer/test/LeakTest.cpp | 17 - .../Fuzzer/test/LeakTimeoutTest.cpp | 17 - .../tests/thirdparty/Fuzzer/test/LoadTest.cpp | 22 - .../thirdparty/Fuzzer/test/MemcmpTest.cpp | 31 - .../Fuzzer/test/NthRunCrashTest.cpp | 18 - .../Fuzzer/test/NullDerefOnEmptyTest.cpp | 19 - .../thirdparty/Fuzzer/test/NullDerefTest.cpp | 26 - .../Fuzzer/test/OneHugeAllocTest.cpp | 28 - .../test/OutOfMemorySingleLargeMallocTest.cpp | 27 - .../Fuzzer/test/OutOfMemoryTest.cpp | 31 - .../Fuzzer/test/RepeatedBytesTest.cpp | 29 - .../thirdparty/Fuzzer/test/RepeatedMemcmp.cpp | 22 - .../Fuzzer/test/ShrinkControlFlowTest.cpp | 28 - .../Fuzzer/test/ShrinkValueProfileTest.cpp | 22 - .../Fuzzer/test/SignedIntOverflowTest.cpp | 28 - .../thirdparty/Fuzzer/test/SimpleCmpTest.cpp | 46 - .../Fuzzer/test/SimpleDictionaryTest.cpp | 29 - .../thirdparty/Fuzzer/test/SimpleHashTest.cpp | 40 - .../thirdparty/Fuzzer/test/SimpleTest.cpp | 27 - .../Fuzzer/test/SimpleThreadedTest.cpp | 25 - .../Fuzzer/test/SingleMemcmpTest.cpp | 17 - .../Fuzzer/test/SingleStrcmpTest.cpp | 17 - .../Fuzzer/test/SingleStrncmpTest.cpp | 17 - .../thirdparty/Fuzzer/test/SpamyTest.cpp | 21 - .../thirdparty/Fuzzer/test/StrcmpTest.cpp | 32 - .../thirdparty/Fuzzer/test/StrncmpOOBTest.cpp | 21 - .../thirdparty/Fuzzer/test/StrncmpTest.cpp | 28 - .../thirdparty/Fuzzer/test/StrstrTest.cpp | 28 - .../thirdparty/Fuzzer/test/SwapCmpTest.cpp | 34 - .../thirdparty/Fuzzer/test/Switch2Test.cpp | 35 - .../thirdparty/Fuzzer/test/SwitchTest.cpp | 58 - .../Fuzzer/test/ThreadedLeakTest.cpp | 18 - .../thirdparty/Fuzzer/test/ThreadedTest.cpp | 26 - .../Fuzzer/test/TimeoutEmptyTest.cpp | 14 - .../thirdparty/Fuzzer/test/TimeoutTest.cpp | 26 - .../Fuzzer/test/TraceMallocTest.cpp | 27 - .../Fuzzer/test/UninstrumentedTest.cpp | 11 - .../Fuzzer/test/afl-driver-extra-stats.test | 28 - .../Fuzzer/test/afl-driver-stderr.test | 10 - .../thirdparty/Fuzzer/test/caller-callee.test | 2 - .../thirdparty/Fuzzer/test/coverage.test | 19 - .../tests/thirdparty/Fuzzer/test/dict1.txt | 4 - .../thirdparty/Fuzzer/test/dump_coverage.test | 16 - .../Fuzzer/test/fuzzer-customcrossover.test | 10 - .../Fuzzer/test/fuzzer-custommutator.test | 4 - .../thirdparty/Fuzzer/test/fuzzer-dict.test | 6 - .../thirdparty/Fuzzer/test/fuzzer-dirs.test | 15 - .../thirdparty/Fuzzer/test/fuzzer-fdmask.test | 30 - .../Fuzzer/test/fuzzer-finalstats.test | 11 - .../thirdparty/Fuzzer/test/fuzzer-flags.test | 10 - .../thirdparty/Fuzzer/test/fuzzer-jobs.test | 29 - .../thirdparty/Fuzzer/test/fuzzer-leak.test | 35 - .../Fuzzer/test/fuzzer-oom-with-profile.test | 6 - .../thirdparty/Fuzzer/test/fuzzer-oom.test | 11 - .../Fuzzer/test/fuzzer-printcovpcs.test | 8 - .../thirdparty/Fuzzer/test/fuzzer-runs.test | 8 - .../thirdparty/Fuzzer/test/fuzzer-seed.test | 3 - .../thirdparty/Fuzzer/test/fuzzer-segv.test | 5 - .../Fuzzer/test/fuzzer-singleinputs.test | 16 - .../Fuzzer/test/fuzzer-threaded.test | 7 - .../Fuzzer/test/fuzzer-timeout.test | 19 - .../Fuzzer/test/fuzzer-traces-hooks.test | 25 - .../thirdparty/Fuzzer/test/fuzzer-ubsan.test | 4 - .../tests/thirdparty/Fuzzer/test/fuzzer.test | 57 - .../tests/thirdparty/Fuzzer/test/hi.txt | 1 - .../tests/thirdparty/Fuzzer/test/lit.cfg | 29 - .../thirdparty/Fuzzer/test/lit.site.cfg.in | 4 - .../tests/thirdparty/Fuzzer/test/merge.test | 46 - .../Fuzzer/test/minimize_crash.test | 6 - .../Fuzzer/test/no-coverage/CMakeLists.txt | 29 - .../Fuzzer/test/repeated-bytes.test | 2 - .../tests/thirdparty/Fuzzer/test/shrink.test | 7 - .../thirdparty/Fuzzer/test/simple-cmp.test | 2 - .../thirdparty/Fuzzer/test/standalone.test | 4 - .../thirdparty/Fuzzer/test/swap-cmp.test | 2 - .../thirdparty/Fuzzer/test/trace-malloc.test | 10 - .../Fuzzer/test/ubsan/CMakeLists.txt | 15 - .../tests/thirdparty/Fuzzer/test/ulimit.test | 2 - .../Fuzzer/test/uninstrumented/CMakeLists.txt | 16 - .../tests/thirdparty/Fuzzer/test/unit/lit.cfg | 7 - .../Fuzzer/test/unit/lit.site.cfg.in | 2 - .../Fuzzer/test/value-profile-cmp.test | 2 - .../Fuzzer/test/value-profile-cmp2.test | 2 - .../Fuzzer/test/value-profile-cmp3.test | 2 - .../Fuzzer/test/value-profile-cmp4.test | 2 - .../Fuzzer/test/value-profile-div.test | 3 - .../Fuzzer/test/value-profile-load.test | 3 - .../Fuzzer/test/value-profile-mem.test | 2 - .../Fuzzer/test/value-profile-set.test | 3 - .../Fuzzer/test/value-profile-strcmp.test | 2 - .../Fuzzer/test/value-profile-strncmp.test | 2 - .../Fuzzer/test/value-profile-switch.test | 3 - .../tests/thirdparty/doctest/doctest.h | 7106 ----- .../doctest/doctest_compatibility.h | 37 - .../tests/thirdparty/fifo_map/fifo_map.hpp | 530 - .../tests/thirdparty/imapdl/filterbr.py | 111 - libs/json-3.12.0/tools/amalgamate/CHANGES.md | 10 - libs/json-3.12.0/tools/amalgamate/README.md | 65 - .../tools/amalgamate/amalgamate.py | 299 - .../tools/amalgamate/config_json.json | 8 - .../tools/amalgamate/config_json_fwd.json | 8 - libs/json-3.12.0/tools/astyle/.astylerc | 80 - .../json-3.12.0/tools/astyle/requirements.txt | 1 - .../tools/gdb_pretty_printer/README.md | 79 - .../tools/gdb_pretty_printer/nlohmann-json.py | 35 - .../tools/generate_natvis/README.md | 9 - .../tools/generate_natvis/generate_natvis.py | 41 - .../generate_natvis/nlohmann_json.natvis.j2 | 40 - .../tools/generate_natvis/requirements.txt | 1 - libs/json-3.12.0/tools/macro_builder/main.cpp | 43 - libs/json-3.12.0/tools/serve_header/README.md | 91 - libs/json-3.12.0/tools/serve_header/demo.png | Bin 557446 -> 0 bytes .../tools/serve_header/requirements.txt | 2 - .../tools/serve_header/serve_header.py | 410 - .../serve_header/serve_header.yml.example | 15 - .../libs}/cpp-httplib-0.57.1/LICENSE | 0 .../libs/cpp-httplib-0.57.1}/LICENSE.MIT | 0 .../libs}/cpp-httplib-0.57.1/httplib.h | 6 - .../libs/json-3.12.0}/nlohmann/json.hpp | 0 .../libs/json-3.12.0}/nlohmann/json_fwd.hpp | 0 xenith/ollama_api/handler.cpp | 5 + xenith/ollama_api/handler.h | 13 + xenith/ollama_api/server.h | 6 + {ollama_api => xenith/ollama_api}/test.cpp | 3 +- 1507 files changed, 29 insertions(+), 268878 deletions(-) delete mode 100644 KVCacheArch delete mode 100644 libs/cpp-httplib-0.57.1/.gitattributes delete mode 100644 libs/cpp-httplib-0.57.1/.github/workflows/abidiff.yaml delete mode 100644 libs/cpp-httplib-0.57.1/.github/workflows/benchmark_ab.yaml delete mode 100644 libs/cpp-httplib-0.57.1/.github/workflows/benchmark_run.yaml delete mode 100644 libs/cpp-httplib-0.57.1/.github/workflows/cifuzz.yaml delete mode 100644 libs/cpp-httplib-0.57.1/.github/workflows/docs.yml delete mode 100644 libs/cpp-httplib-0.57.1/.github/workflows/release-docker.yml delete mode 100644 libs/cpp-httplib-0.57.1/.github/workflows/test-32bit.yml delete mode 100644 libs/cpp-httplib-0.57.1/.github/workflows/test.yaml delete mode 100644 libs/cpp-httplib-0.57.1/.github/workflows/test_benchmark.yaml delete mode 100644 libs/cpp-httplib-0.57.1/.github/workflows/test_no_exceptions.yaml delete mode 100644 libs/cpp-httplib-0.57.1/.github/workflows/test_offline.yaml delete mode 100644 libs/cpp-httplib-0.57.1/.github/workflows/test_proxy.yaml delete mode 100644 libs/cpp-httplib-0.57.1/CMakeLists.txt delete mode 100644 libs/cpp-httplib-0.57.1/Dockerfile delete mode 100644 libs/cpp-httplib-0.57.1/README-sse.md delete mode 100644 libs/cpp-httplib-0.57.1/README-stream.md delete mode 100644 libs/cpp-httplib-0.57.1/README-websocket.md delete mode 100644 libs/cpp-httplib-0.57.1/README.md delete mode 100644 libs/cpp-httplib-0.57.1/benchmark/Makefile delete mode 100755 libs/cpp-httplib-0.57.1/benchmark/ab.sh delete mode 100644 libs/cpp-httplib-0.57.1/benchmark/cpp-httplib/main.cpp delete mode 100644 libs/cpp-httplib-0.57.1/benchmark/crow/crow_all.h delete mode 100644 libs/cpp-httplib-0.57.1/benchmark/crow/main.cpp delete mode 100644 libs/cpp-httplib-0.57.1/cmake/FindBrotli.cmake delete mode 100644 libs/cpp-httplib-0.57.1/cmake/httplibConfig.cmake.in delete mode 100644 libs/cpp-httplib-0.57.1/cmake/modules.cmake delete mode 100644 libs/cpp-httplib-0.57.1/docker-compose.yml delete mode 100644 libs/cpp-httplib-0.57.1/docker/html/index.html delete mode 100644 libs/cpp-httplib-0.57.1/docker/main.cc delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/config.toml delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c01-get-response-body.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c02-json.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c03-default-headers.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c04-follow-location.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c05-basic-auth.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c06-bearer-token.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c07-multipart-upload.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c08-post-file-body.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c09-chunked-upload.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c10-stream-response.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c11-progress-callback.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c12-timeouts.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c13-max-timeout.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c14-keep-alive.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c15-compression.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c16-proxy.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c17-error-codes.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c18-ssl-errors.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c19-client-logger.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/e01-sse-server.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/e02-sse-event-names.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/e03-sse-reconnect.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/e04-sse-client.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/index.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s01-handlers.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s02-json-api.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s03-path-params.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s04-static-files.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s05-stream-response.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s06-download-response.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s07-multipart-reader.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s08-compress-response.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s09-pre-routing.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s10-post-routing.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s11-pre-request.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s12-user-data.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s13-error-handler.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s14-exception-handler.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s15-server-logger.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s16-disconnect.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s17-bind-any-port.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s18-listen-after-bind.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s19-graceful-shutdown.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s20-keep-alive.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s21-thread-pool.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s22-unix-socket.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s23-custom-methods.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/t01-tls-backends.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/t02-cert-verification.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/t03-ssl-server.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/t04-mtls.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/t05-peer-cert.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/w01-websocket-echo.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/w02-websocket-ping.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/w03-websocket-close.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/w04-websocket-binary.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/w05-websocket-tls.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/w06-websocket-timeouts.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/index.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/app.png delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/ch01-setup.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/ch02-rest-api.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/ch03-sse-streaming.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/ch04-model-management.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/ch05-web-ui.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/ch06-desktop-app.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/ch07-code-reading.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/ch08-customization.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/index.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/kv-cache.svg delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/slots.svg delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/webui.png delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/tour/01-getting-started.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/tour/02-basic-client.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/tour/03-basic-server.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/tour/04-static-file-server.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/tour/05-tls-setup.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/tour/06-https-client.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/tour/07-https-server.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/tour/08-websocket.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/tour/09-whats-next.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/tour/index.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c01-get-response-body.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c02-json.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c03-default-headers.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c04-follow-location.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c05-basic-auth.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c06-bearer-token.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c07-multipart-upload.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c08-post-file-body.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c09-chunked-upload.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c10-stream-response.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c11-progress-callback.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c12-timeouts.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c13-max-timeout.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c14-keep-alive.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c15-compression.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c16-proxy.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c17-error-codes.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c18-ssl-errors.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c19-client-logger.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/e01-sse-server.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/e02-sse-event-names.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/e03-sse-reconnect.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/e04-sse-client.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/index.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s01-handlers.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s02-json-api.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s03-path-params.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s04-static-files.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s05-stream-response.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s06-download-response.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s07-multipart-reader.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s08-compress-response.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s09-pre-routing.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s10-post-routing.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s11-pre-request.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s12-user-data.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s13-error-handler.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s14-exception-handler.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s15-server-logger.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s16-disconnect.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s17-bind-any-port.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s18-listen-after-bind.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s19-graceful-shutdown.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s20-keep-alive.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s21-thread-pool.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s22-unix-socket.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s23-custom-methods.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/t01-tls-backends.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/t02-cert-verification.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/t03-ssl-server.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/t04-mtls.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/t05-peer-cert.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/w01-websocket-echo.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/w02-websocket-ping.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/w03-websocket-close.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/w04-websocket-binary.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/w05-websocket-tls.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/w06-websocket-timeouts.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/index.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/llm-app/ch01-setup.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/llm-app/ch02-rest-api.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/llm-app/ch03-sse-streaming.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/llm-app/ch04-model-management.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/llm-app/ch05-web-ui.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/llm-app/ch06-desktop-app.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/llm-app/ch07-code-reading.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/llm-app/ch08-customization.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/llm-app/index.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/llm-app/kv-cache.svg delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/llm-app/slots.svg delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/tour/01-getting-started.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/tour/02-basic-client.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/tour/03-basic-server.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/tour/04-static-file-server.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/tour/05-tls-setup.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/tour/06-https-client.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/tour/07-https-server.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/tour/08-websocket.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/tour/09-whats-next.md delete mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/tour/index.md delete mode 100755 libs/cpp-httplib-0.57.1/docs-util/llm-app/build_desktop_app.sh delete mode 100755 libs/cpp-httplib-0.57.1/docs-util/llm-app/build_web_app.sh delete mode 100644 libs/cpp-httplib-0.57.1/docs-util/llm-app/extract_code.sh delete mode 100755 libs/cpp-httplib-0.57.1/docs-util/llm-app/generate_desktop_app_project.sh delete mode 100644 libs/cpp-httplib-0.57.1/docs-util/llm-app/justfile delete mode 100755 libs/cpp-httplib-0.57.1/docs-util/llm-app/test_book.sh delete mode 100644 libs/cpp-httplib-0.57.1/docs-util/llm-app/test_webui.cpp delete mode 100644 libs/cpp-httplib-0.57.1/docs-util/llm-app/webdriver.h delete mode 100644 libs/cpp-httplib-0.57.1/example/Dockerfile.hello delete mode 100644 libs/cpp-httplib-0.57.1/example/Makefile delete mode 100644 libs/cpp-httplib-0.57.1/example/accept_header.cc delete mode 100644 libs/cpp-httplib-0.57.1/example/benchmark.cc delete mode 100644 libs/cpp-httplib-0.57.1/example/ca-bundle.crt delete mode 100644 libs/cpp-httplib-0.57.1/example/client.cc delete mode 100644 libs/cpp-httplib-0.57.1/example/client.vcxproj delete mode 100644 libs/cpp-httplib-0.57.1/example/example.sln delete mode 100644 libs/cpp-httplib-0.57.1/example/hello.cc delete mode 100644 libs/cpp-httplib-0.57.1/example/one_time_request.cc delete mode 100644 libs/cpp-httplib-0.57.1/example/redirect.cc delete mode 100644 libs/cpp-httplib-0.57.1/example/server.cc delete mode 100644 libs/cpp-httplib-0.57.1/example/server.vcxproj delete mode 100644 libs/cpp-httplib-0.57.1/example/server_and_client.cc delete mode 100644 libs/cpp-httplib-0.57.1/example/simplecli.cc delete mode 100644 libs/cpp-httplib-0.57.1/example/simplesvr.cc delete mode 100644 libs/cpp-httplib-0.57.1/example/ssecli-stream.cc delete mode 100644 libs/cpp-httplib-0.57.1/example/ssecli.cc delete mode 100644 libs/cpp-httplib-0.57.1/example/ssesvr.cc delete mode 100644 libs/cpp-httplib-0.57.1/example/upload.cc delete mode 100755 libs/cpp-httplib-0.57.1/example/uploader.sh delete mode 100644 libs/cpp-httplib-0.57.1/example/wsecho.cc delete mode 100644 libs/cpp-httplib-0.57.1/generate_module.py delete mode 100644 libs/cpp-httplib-0.57.1/justfile delete mode 100644 libs/cpp-httplib-0.57.1/meson.build delete mode 100644 libs/cpp-httplib-0.57.1/meson_options.txt delete mode 100755 libs/cpp-httplib-0.57.1/scripts/release.sh delete mode 100755 libs/cpp-httplib-0.57.1/split.py delete mode 100644 libs/cpp-httplib-0.57.1/test/CMakeLists.txt delete mode 100644 libs/cpp-httplib-0.57.1/test/Makefile delete mode 100644 libs/cpp-httplib-0.57.1/test/ca-bundle.crt delete mode 100755 libs/cpp-httplib-0.57.1/test/dns_test_fixture.py delete mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/CMakeLists.txt delete mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/Makefile delete mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/client_fuzzer.cc delete mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/1 delete mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/2 delete mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/3 delete mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/clusterfuzz-testcase-minimized-client_fuzzer-5188033728282624 delete mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/clusterfuzz-testcase-minimized-client_fuzzer-6561074643271680 delete mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/clusterfuzz-testcase-minimized-header_parser_fuzzer-4645558454386688 delete mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/clusterfuzz-testcase-minimized-server_fuzzer-5042094968537088 delete mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/clusterfuzz-testcase-minimized-server_fuzzer-5372331946541056 delete mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/clusterfuzz-testcase-minimized-server_fuzzer-5386708825800704 delete mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/clusterfuzz-testcase-minimized-server_fuzzer-5667822731132928 delete mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/clusterfuzz-testcase-minimized-server_fuzzer-5886572146327552 delete mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/clusterfuzz-testcase-minimized-server_fuzzer-5942767436562432 delete mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/clusterfuzz-testcase-minimized-server_fuzzer-6007379124158464 delete mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/clusterfuzz-testcase-minimized-server_fuzzer-6508706672541696 delete mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/issue1264 delete mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/header_parser_fuzzer.cc delete mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/multipart_parser_fuzzer.cc delete mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/server_fuzzer.cc delete mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/server_fuzzer.dict delete mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/standalone_fuzz_target_runner.cpp delete mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/url_parser_fuzzer.cc delete mode 100755 libs/cpp-httplib-0.57.1/test/gen-certs.sh delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/gtest-assertion-result.h delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/gtest-death-test.h delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/gtest-matchers.h delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/gtest-message.h delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/gtest-param-test.h delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/gtest-printers.h delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/gtest-spi.h delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/gtest-test-part.h delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/gtest-typed-test.h delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/gtest.h delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/gtest_pred_impl.h delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/gtest_prod.h delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/internal/custom/README.md delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/internal/custom/gtest-port.h delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/internal/custom/gtest-printers.h delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/internal/custom/gtest.h delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/internal/gtest-death-test-internal.h delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/internal/gtest-filepath.h delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/internal/gtest-internal.h delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/internal/gtest-param-util.h delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/internal/gtest-port-arch.h delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/internal/gtest-port.h delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/internal/gtest-string.h delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/internal/gtest-type-util.h delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/src/gtest-all.cc delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/src/gtest-assertion-result.cc delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/src/gtest-death-test.cc delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/src/gtest-filepath.cc delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/src/gtest-internal-inl.h delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/src/gtest-matchers.cc delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/src/gtest-port.cc delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/src/gtest-printers.cc delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/src/gtest-test-part.cc delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/src/gtest-typed-test.cc delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/src/gtest.cc delete mode 100644 libs/cpp-httplib-0.57.1/test/gtest/src/gtest_main.cc delete mode 100644 libs/cpp-httplib-0.57.1/test/image.jpg delete mode 100644 libs/cpp-httplib-0.57.1/test/include_httplib.cc delete mode 100644 libs/cpp-httplib-0.57.1/test/include_windows_h.cc delete mode 100644 libs/cpp-httplib-0.57.1/test/lsan_suppressions.txt delete mode 100755 libs/cpp-httplib-0.57.1/test/make-shared-library.sh delete mode 100644 libs/cpp-httplib-0.57.1/test/meson.build delete mode 100644 libs/cpp-httplib-0.57.1/test/proxy/Dockerfile delete mode 100644 libs/cpp-httplib-0.57.1/test/proxy/basic_passwd delete mode 100644 libs/cpp-httplib-0.57.1/test/proxy/basic_squid.conf delete mode 100644 libs/cpp-httplib-0.57.1/test/proxy/digest_passwd delete mode 100644 libs/cpp-httplib-0.57.1/test/proxy/digest_squid.conf delete mode 100644 libs/cpp-httplib-0.57.1/test/proxy/docker-compose.ci.yml delete mode 100644 libs/cpp-httplib-0.57.1/test/proxy/docker-compose.yml delete mode 100644 libs/cpp-httplib-0.57.1/test/proxy/httpbin_nginx.conf delete mode 100755 libs/cpp-httplib-0.57.1/test/run_issue_2431_repro.sh delete mode 100644 libs/cpp-httplib-0.57.1/test/test.cc delete mode 100644 libs/cpp-httplib-0.57.1/test/test.conf delete mode 100644 libs/cpp-httplib-0.57.1/test/test.rootCA.conf delete mode 100644 libs/cpp-httplib-0.57.1/test/test.sln delete mode 100644 libs/cpp-httplib-0.57.1/test/test.vcxproj delete mode 100644 libs/cpp-httplib-0.57.1/test/test_32bit_build.cpp delete mode 100644 libs/cpp-httplib-0.57.1/test/test_benchmark.cc delete mode 100644 libs/cpp-httplib-0.57.1/test/test_proxy.cc delete mode 100644 libs/cpp-httplib-0.57.1/test/test_thread_pool.cc delete mode 100644 libs/cpp-httplib-0.57.1/test/test_websocket_heartbeat.cc delete mode 100644 libs/cpp-httplib-0.57.1/test/test_websocket_thread_safety.cc delete mode 100644 libs/cpp-httplib-0.57.1/test/www/dir/1MB.txt delete mode 100644 libs/cpp-httplib-0.57.1/test/www/dir/index.html delete mode 100644 libs/cpp-httplib-0.57.1/test/www/dir/meson.build delete mode 100644 libs/cpp-httplib-0.57.1/test/www/dir/test.abcde delete mode 100644 libs/cpp-httplib-0.57.1/test/www/dir/test.html delete mode 100644 libs/cpp-httplib-0.57.1/test/www/empty_file delete mode 100644 libs/cpp-httplib-0.57.1/test/www/file delete mode 100644 libs/cpp-httplib-0.57.1/test/www/meson.build delete mode 100644 libs/cpp-httplib-0.57.1/test/www/日本語Dir/meson.build delete mode 100644 libs/cpp-httplib-0.57.1/test/www/日本語Dir/日本語File.txt delete mode 100644 libs/cpp-httplib-0.57.1/test/www2/dir/index.html delete mode 100644 libs/cpp-httplib-0.57.1/test/www2/dir/meson.build delete mode 100644 libs/cpp-httplib-0.57.1/test/www2/dir/test.html delete mode 100644 libs/cpp-httplib-0.57.1/test/www3/dir/index.html delete mode 100644 libs/cpp-httplib-0.57.1/test/www3/dir/meson.build delete mode 100644 libs/cpp-httplib-0.57.1/test/www3/dir/test.html delete mode 100644 libs/json-3.12.0/.cirrus.yml delete mode 100644 libs/json-3.12.0/.clang-tidy delete mode 100644 libs/json-3.12.0/.github/CODEOWNERS delete mode 100644 libs/json-3.12.0/.github/CODE_OF_CONDUCT.md delete mode 100644 libs/json-3.12.0/.github/CONTRIBUTING.md delete mode 100644 libs/json-3.12.0/.github/FUNDING.yml delete mode 100644 libs/json-3.12.0/.github/ISSUE_TEMPLATE/bug.yaml delete mode 100644 libs/json-3.12.0/.github/ISSUE_TEMPLATE/config.yml delete mode 100644 libs/json-3.12.0/.github/PULL_REQUEST_TEMPLATE.md delete mode 100644 libs/json-3.12.0/.github/SECURITY.md delete mode 100644 libs/json-3.12.0/.github/config.yml delete mode 100644 libs/json-3.12.0/.github/dependabot.yml delete mode 100644 libs/json-3.12.0/.github/external_ci/appveyor.yml delete mode 100644 libs/json-3.12.0/.github/labeler.yml delete mode 100644 libs/json-3.12.0/.github/workflows/check_amalgamation.yml delete mode 100644 libs/json-3.12.0/.github/workflows/cifuzz.yml delete mode 100644 libs/json-3.12.0/.github/workflows/codeql-analysis.yml delete mode 100644 libs/json-3.12.0/.github/workflows/comment_check_amalgamation.yml delete mode 100644 libs/json-3.12.0/.github/workflows/dependency-review.yml delete mode 100644 libs/json-3.12.0/.github/workflows/labeler.yml delete mode 100644 libs/json-3.12.0/.github/workflows/macos.yml delete mode 100644 libs/json-3.12.0/.github/workflows/publish_documentation.yml delete mode 100644 libs/json-3.12.0/.github/workflows/scorecards.yml delete mode 100644 libs/json-3.12.0/.github/workflows/stale.yml delete mode 100644 libs/json-3.12.0/.github/workflows/ubuntu.yml delete mode 100644 libs/json-3.12.0/.github/workflows/windows.yml delete mode 100644 libs/json-3.12.0/.gitignore delete mode 100644 libs/json-3.12.0/.reuse/dep5 delete mode 100644 libs/json-3.12.0/.reuse/templates/json.jinja2 delete mode 100644 libs/json-3.12.0/.reuse/templates/json_support.jinja2 delete mode 100644 libs/json-3.12.0/BUILD.bazel delete mode 100644 libs/json-3.12.0/CITATION.cff delete mode 100644 libs/json-3.12.0/CMakeLists.txt delete mode 100644 libs/json-3.12.0/ChangeLog.md delete mode 100644 libs/json-3.12.0/FILES.md delete mode 100644 libs/json-3.12.0/LICENSES/Apache-2.0.txt delete mode 100644 libs/json-3.12.0/LICENSES/BSD-3-Clause.txt delete mode 100644 libs/json-3.12.0/LICENSES/GPL-3.0-only.txt delete mode 100644 libs/json-3.12.0/LICENSES/MIT.txt delete mode 100644 libs/json-3.12.0/MODULE.bazel delete mode 100644 libs/json-3.12.0/Makefile delete mode 100644 libs/json-3.12.0/Package.swift delete mode 100644 libs/json-3.12.0/README.md delete mode 100644 libs/json-3.12.0/cmake/ci.cmake delete mode 100644 libs/json-3.12.0/cmake/clang_flags.cmake delete mode 100644 libs/json-3.12.0/cmake/config.cmake.in delete mode 100644 libs/json-3.12.0/cmake/download_test_data.cmake delete mode 100644 libs/json-3.12.0/cmake/gcc_flags.cmake delete mode 100644 libs/json-3.12.0/cmake/nlohmann_jsonConfigVersion.cmake.in delete mode 100644 libs/json-3.12.0/cmake/pkg-config.pc.in delete mode 100644 libs/json-3.12.0/cmake/requirements/requirements-cppcheck.txt delete mode 100644 libs/json-3.12.0/cmake/requirements/requirements-cpplint.txt delete mode 100644 libs/json-3.12.0/cmake/requirements/requirements-reuse.txt delete mode 100644 libs/json-3.12.0/cmake/scripts/gen_bazel_build_file.cmake delete mode 100644 libs/json-3.12.0/cmake/test.cmake delete mode 100644 libs/json-3.12.0/docs/Makefile delete mode 100644 libs/json-3.12.0/docs/README.md delete mode 100644 libs/json-3.12.0/docs/avatars.png delete mode 100644 libs/json-3.12.0/docs/docset/Info.plist delete mode 100644 libs/json-3.12.0/docs/docset/Makefile delete mode 100644 libs/json-3.12.0/docs/docset/README.md delete mode 100644 libs/json-3.12.0/docs/docset/docSet.sql delete mode 100644 libs/json-3.12.0/docs/docset/docset.json delete mode 100644 libs/json-3.12.0/docs/docset/icon.png delete mode 100644 libs/json-3.12.0/docs/docset/icon@2x.png delete mode 100644 libs/json-3.12.0/docs/json.gif delete mode 100644 libs/json-3.12.0/docs/mkdocs/Makefile delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/adl_serializer/from_json.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/adl_serializer/index.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/adl_serializer/to_json.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/accept.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/array.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/array_t.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/at.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/back.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/basic_json.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/begin.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/binary.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/binary_t.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/boolean_t.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/cbegin.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/cbor_tag_handler_t.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/cend.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/clear.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/contains.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/count.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/crbegin.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/crend.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/default_object_comparator_t.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/diff.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/dump.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/emplace.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/emplace_back.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/empty.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/end.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/end_pos.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/erase.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/error_handler_t.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/exception.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/find.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/flatten.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/from_bjdata.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/from_bson.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/from_cbor.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/from_msgpack.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/from_ubjson.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/front.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/get.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/get_allocator.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/get_binary.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/get_ptr.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/get_ref.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/get_to.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/index.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/input_format_t.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/insert.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/invalid_iterator.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_array.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_binary.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_boolean.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_discarded.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_null.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_number.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_number_float.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_number_integer.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_number_unsigned.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_object.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_primitive.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_string.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_structured.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/items.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/json_base_class_t.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/json_serializer.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/max_size.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/merge_patch.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/meta.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/number_float_t.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/number_integer_t.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/number_unsigned_t.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/object.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/object_comparator_t.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/object_t.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/operator+=.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/operator=.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/operator[].md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/operator_ValueType.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/operator_eq.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/operator_ge.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/operator_gt.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/operator_le.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/operator_lt.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/operator_ne.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/operator_spaceship.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/operator_value_t.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/other_error.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/out_of_range.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/parse.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/parse_error.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/parse_event_t.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/parser_callback_t.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/patch.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/patch_inplace.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/push_back.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/rbegin.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/rend.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/sax_parse.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/size.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/start_pos.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/std_hash.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/std_swap.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/string_t.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/swap.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/to_bjdata.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/to_bson.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/to_cbor.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/to_msgpack.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/to_string.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/to_ubjson.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/type.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/type_error.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/type_name.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/unflatten.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/update.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/value.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/value_t.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/~basic_json.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/byte_container_with_subtype/byte_container_with_subtype.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/byte_container_with_subtype/clear_subtype.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/byte_container_with_subtype/has_subtype.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/byte_container_with_subtype/index.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/byte_container_with_subtype/set_subtype.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/byte_container_with_subtype/subtype.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/back.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/empty.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/index.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/json_pointer.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/operator_eq.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/operator_ne.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/operator_slash.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/operator_slasheq.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/operator_string_t.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/parent_pointer.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/pop_back.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/push_back.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/string_t.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/to_string.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/binary.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/boolean.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/end_array.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/end_object.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/index.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/key.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/null.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/number_float.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/number_integer.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/number_unsigned.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/parse_error.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/start_array.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/start_object.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/string.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/index.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_assert.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_diagnostic_positions.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_diagnostics.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_disable_enum_serialization.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_has_cpp_11.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_has_filesystem.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_has_ranges.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_has_static_rtti.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_has_three_way_comparison.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_no_io.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_noexception.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_skip_library_version_check.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_skip_unsupported_compiler_check.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_throw_user.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_use_global_udls.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_use_implicit_conversions.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_use_legacy_discarded_value_comparison.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/nlohmann_define_derived_type.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/nlohmann_define_type_intrusive.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/nlohmann_define_type_non_intrusive.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/nlohmann_json_namespace.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/nlohmann_json_namespace_begin.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/nlohmann_json_namespace_no_version.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/nlohmann_json_serialize_enum.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/nlohmann_json_version_major.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/operator_gtgt.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/operator_literal_json.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/operator_literal_json_pointer.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/operator_ltlt.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/ordered_json.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/ordered_map.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/community/code_of_conduct.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/community/contribution_guidelines.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/community/governance.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/community/index.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/community/quality_assurance.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/community/security_policy.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/css/custom.css delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/README.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/README.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/accept__string.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/accept__string.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/array.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/array.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/array_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/array_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__json_pointer.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__json_pointer.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__json_pointer_const.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__json_pointer_const.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__keytype.c++17.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__keytype.c++17.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__keytype_const.c++17.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__keytype_const.c++17.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__object_t_key_type.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__object_t_key_type.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__object_t_key_type_const.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__object_t_key_type_const.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__size_type.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__size_type.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__size_type_const.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__size_type_const.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/back.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/back.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__CompatibleType.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__CompatibleType.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__InputIt_InputIt.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__InputIt_InputIt.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__basic_json.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__basic_json.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__copyassignment.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__copyassignment.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__list_init_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__list_init_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__moveconstructor.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__moveconstructor.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__nullptr_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__nullptr_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__size_type_basic_json.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__size_type_basic_json.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__value_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__value_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/begin.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/begin.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/binary.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/binary.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/binary_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/binary_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/boolean_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/boolean_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/byte_container_with_subtype__byte_container_with_subtype.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/byte_container_with_subtype__byte_container_with_subtype.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/byte_container_with_subtype__clear_subtype.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/byte_container_with_subtype__clear_subtype.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/byte_container_with_subtype__has_subtype.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/byte_container_with_subtype__has_subtype.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/byte_container_with_subtype__set_subtype.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/byte_container_with_subtype__set_subtype.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/byte_container_with_subtype__subtype.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/byte_container_with_subtype__subtype.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/cbegin.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/cbegin.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/cbor_tag_handler_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/cbor_tag_handler_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/cend.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/cend.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/clear.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/clear.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/contains__json_pointer.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/contains__json_pointer.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/contains__keytype.c++17.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/contains__keytype.c++17.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/contains__object_t_key_type.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/contains__object_t_key_type.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/count__keytype.c++17.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/count__keytype.c++17.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/count__object_t_key_type.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/count__object_t_key_type.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/crbegin.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/crbegin.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/crend.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/crend.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/default_object_comparator_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/default_object_comparator_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/diagnostic_positions.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/diagnostic_positions.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/diagnostic_positions_exception.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/diagnostic_positions_exception.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/diagnostics_extended.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/diagnostics_extended.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/diagnostics_extended_positions.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/diagnostics_extended_positions.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/diagnostics_standard.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/diagnostics_standard.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/diff.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/diff.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/dump.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/dump.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/emplace.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/emplace.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/emplace_back.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/emplace_back.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/empty.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/empty.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/end.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/end.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/erase__IteratorType.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/erase__IteratorType.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/erase__IteratorType_IteratorType.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/erase__IteratorType_IteratorType.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/erase__keytype.c++17.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/erase__keytype.c++17.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/erase__object_t_key_type.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/erase__object_t_key_type.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/erase__size_type.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/erase__size_type.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/error_handler_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/error_handler_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/exception.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/exception.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/find__keytype.c++17.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/find__keytype.c++17.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/find__object_t_key_type.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/find__object_t_key_type.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/flatten.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/flatten.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_bjdata.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_bjdata.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_bson.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_bson.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_cbor.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_cbor.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_json__default_constructible.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_json__default_constructible.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_json__non_default_constructible.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_json__non_default_constructible.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_msgpack.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_msgpack.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_ubjson.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_ubjson.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/front.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/front.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get__PointerType.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get__PointerType.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get__ValueType_const.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get__ValueType_const.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get_allocator.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get_allocator.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get_binary.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get_binary.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get_ptr.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get_ptr.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get_ref.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get_ref.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get_to.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get_to.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/insert.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/insert.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/insert__count.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/insert__count.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/insert__ilist.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/insert__ilist.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/insert__range.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/insert__range.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/insert__range_object.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/insert__range_object.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/invalid_iterator.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/invalid_iterator.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_array.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_array.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_binary.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_binary.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_boolean.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_boolean.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_discarded.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_discarded.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_null.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_null.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_number.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_number.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_number_float.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_number_float.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_number_integer.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_number_integer.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_number_unsigned.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_number_unsigned.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_object.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_object.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_primitive.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_primitive.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_string.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_string.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_structured.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_structured.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/items.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/items.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_base_class_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_base_class_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_lines.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_lines.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__back.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__back.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__empty.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__empty.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator__equal.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator__equal.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator__equal_stringtype.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator__equal_stringtype.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator__notequal.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator__notequal.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator__notequal_stringtype.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator__notequal_stringtype.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator_add.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator_add.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator_add_binary.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator_add_binary.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator_string_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator_string_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__parent_pointer.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__parent_pointer.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__pop_back.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__pop_back.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__push_back.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__push_back.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__string_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__string_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__to_string.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__to_string.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/max_size.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/max_size.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/merge_patch.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/merge_patch.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/meta.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/meta.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_derived_type_intrusive_macro.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_derived_type_intrusive_macro.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_intrusive_explicit.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_intrusive_explicit.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_intrusive_macro.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_intrusive_macro.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_intrusive_only_serialize_explicit.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_intrusive_only_serialize_explicit.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_intrusive_only_serialize_macro.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_intrusive_only_serialize_macro.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_intrusive_with_default_explicit.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_intrusive_with_default_explicit.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_intrusive_with_default_macro.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_intrusive_with_default_macro.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_non_intrusive_explicit.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_non_intrusive_explicit.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_non_intrusive_macro.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_non_intrusive_macro.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_non_intrusive_only_serialize_explicit.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_non_intrusive_only_serialize_explicit.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_non_intrusive_only_serialize_macro.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_non_intrusive_only_serialize_macro.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_non_intrusive_with_default_explicit.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_non_intrusive_with_default_explicit.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_non_intrusive_with_default_macro.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_non_intrusive_with_default_macro.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_json_namespace.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_json_namespace.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_json_namespace_begin.c++17.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_json_namespace_begin.c++17.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_json_namespace_no_version.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_json_namespace_no_version.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_json_serialize_enum.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_json_serialize_enum.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_json_serialize_enum_2.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_json_serialize_enum_2.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_json_version.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_json_version.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/number_float_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/number_float_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/number_integer_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/number_integer_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/number_unsigned_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/number_unsigned_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/object.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/object.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/object_comparator_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/object_comparator_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/object_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/object_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__ValueType.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__ValueType.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__equal.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__equal.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__equal__nullptr_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__equal__nullptr_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__equal__specializations.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__equal__specializations.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__greater.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__greater.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__greaterequal.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__greaterequal.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__less.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__less.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__lessequal.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__lessequal.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__notequal.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__notequal.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__notequal__nullptr_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__notequal__nullptr_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__value_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__value_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__json_pointer.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__json_pointer.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__json_pointer_const.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__json_pointer_const.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__keytype.c++17.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__keytype.c++17.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__keytype_const.c++17.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__keytype_const.c++17.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__object_t_key_type.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__object_t_key_type.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__object_t_key_type_const.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__object_t_key_type_const.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__size_type.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__size_type.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__size_type_const.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__size_type_const.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_deserialize.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_deserialize.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_literal_json.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_literal_json.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_literal_json_pointer.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_literal_json_pointer.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_ltlt__basic_json.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_ltlt__basic_json.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_ltlt__json_pointer.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_ltlt__json_pointer.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_spaceship__const_reference.c++20.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_spaceship__const_reference.c++20.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_spaceship__scalartype.c++20.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_spaceship__scalartype.c++20.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/ordered_json.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/ordered_json.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/ordered_map.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/ordered_map.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/other_error.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/other_error.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/out_of_range.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/out_of_range.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__allow_exceptions.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__allow_exceptions.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__array__parser_callback_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__array__parser_callback_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__contiguouscontainer__parser_callback_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__contiguouscontainer__parser_callback_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__istream__parser_callback_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__istream__parser_callback_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__iterator_pair.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__iterator_pair.link delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__iterator_pair.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__pointers.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__pointers.link delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__pointers.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__string__parser_callback_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__string__parser_callback_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse_error.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse_error.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/patch.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/patch.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/patch_inplace.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/patch_inplace.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/push_back.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/push_back.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/push_back__initializer_list.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/push_back__initializer_list.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/push_back__object_t__value.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/push_back__object_t__value.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/rbegin.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/rbegin.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/rend.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/rend.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/sax_parse.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/sax_parse.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/sax_parse__binary.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/sax_parse__binary.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/size.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/size.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/std_hash.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/std_hash.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/std_swap.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/std_swap.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/string_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/string_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/swap__array_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/swap__array_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/swap__binary_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/swap__binary_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/swap__object_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/swap__object_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/swap__reference.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/swap__reference.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/swap__string_t.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/swap__string_t.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_bjdata.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_bjdata.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_bson.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_bson.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_cbor.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_cbor.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_json.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_json.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_msgpack.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_msgpack.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_string.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_string.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_ubjson.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_ubjson.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/type.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/type.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/type_error.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/type_error.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/type_name.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/type_name.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/unflatten.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/unflatten.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/update.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/update.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/update__range.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/update__range.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/value__json_ptr.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/value__json_ptr.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/value__keytype.c++17.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/value__keytype.c++17.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/value__object_t_key_type.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/value__object_t_key_type.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/value__return_type.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/value__return_type.output delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/arbitrary_types.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/assertions.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/binary_formats/bjdata.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/binary_formats/bson.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/binary_formats/cbor.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/binary_formats/index.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/binary_formats/messagepack.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/binary_formats/ubjson.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/binary_values.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/comments.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/element_access/checked_access.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/element_access/default_value.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/element_access/index.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/element_access/unchecked_access.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/enum_conversion.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/iterators.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/json_patch.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/json_pointer.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/macros.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/merge_patch.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/namespace.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/object_order.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/parsing/index.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/parsing/json_lines.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/parsing/parse_exceptions.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/parsing/parser_callbacks.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/parsing/sax_interface.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/types/index.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/types/number_handling.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/home/architecture.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/home/customers.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/home/design_goals.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/home/exceptions.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/home/faq.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/home/license.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/home/releases.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/home/sponsors.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/callback_events.png delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/customers.png delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/json.gif delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/json_syntax_number.png delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/package_managers/CPM.png delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/package_managers/bazel.svg delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/package_managers/conan.svg delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/package_managers/conda.svg delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/package_managers/homebrew.svg delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/package_managers/macports.svg delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/package_managers/meson.svg delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/package_managers/nuget.svg delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/package_managers/spack.svg delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/package_managers/swift.svg delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/package_managers/vcpkg.png delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/package_managers/xmake.svg delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/range-begin-end.svg delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/range-rbegin-rend.svg delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/index.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/bazel/BUILD delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/bazel/MODULE.bazel delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/bazel/example.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/cget/CMakeLists.txt delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/cget/example.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/cmake.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/conan/CMakeLists.txt delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/conan/Conanfile.txt delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/conan/example.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/conda/example.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/cpm/CMakeLists.txt delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/cpm/example.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/example.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/homebrew/CMakeLists.txt delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/homebrew/example.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/hunter/CMakeLists.txt delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/hunter/example.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/index.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/macports/CMakeLists.txt delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/macports/example.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/meson/example.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/meson/meson.build delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/migration_guide.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/nuget/nuget-package-content.png delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/nuget/nuget-project-changes.png delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/nuget/nuget-project-makefile.png delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/nuget/nuget-search-package.png delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/nuget/nuget-select-package.png delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/package_managers.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/pkg-config.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/spack/CMakeLists.txt delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/spack/example.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/vcpkg/CMakeLists.txt delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/vcpkg/example.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/xmake/example.cpp delete mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/xmake/xmake.lua delete mode 100644 libs/json-3.12.0/docs/mkdocs/includes/glossary.md delete mode 100644 libs/json-3.12.0/docs/mkdocs/mkdocs.yml delete mode 100644 libs/json-3.12.0/docs/mkdocs/requirements.txt delete mode 100755 libs/json-3.12.0/docs/mkdocs/scripts/check_structure.py delete mode 100644 libs/json-3.12.0/include/nlohmann/adl_serializer.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/byte_container_with_subtype.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/abi_macros.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/conversions/from_json.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/conversions/to_chars.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/conversions/to_json.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/exceptions.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/hash.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/input/binary_reader.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/input/input_adapters.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/input/json_sax.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/input/lexer.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/input/parser.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/input/position_t.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/iterators/internal_iterator.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/iterators/iter_impl.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/iterators/iteration_proxy.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/iterators/iterator_traits.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/iterators/json_reverse_iterator.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/iterators/primitive_iterator.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/json_custom_base_class.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/json_pointer.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/json_ref.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/macro_scope.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/macro_unscope.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/meta/call_std/begin.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/meta/call_std/end.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/meta/cpp_future.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/meta/detected.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/meta/identity_tag.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/meta/is_sax.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/meta/std_fs.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/meta/type_traits.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/meta/void_t.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/output/binary_writer.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/output/output_adapters.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/output/serializer.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/string_concat.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/string_escape.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/string_utils.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/detail/value_t.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/json.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/json_fwd.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/ordered_map.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/thirdparty/hedley/hedley.hpp delete mode 100644 libs/json-3.12.0/include/nlohmann/thirdparty/hedley/hedley_undef.hpp delete mode 100644 libs/json-3.12.0/meson.build delete mode 100644 libs/json-3.12.0/nlohmann_json.natvis delete mode 100644 libs/json-3.12.0/tests/CMakeLists.txt delete mode 100644 libs/json-3.12.0/tests/Makefile delete mode 100644 libs/json-3.12.0/tests/abi/CMakeLists.txt delete mode 100644 libs/json-3.12.0/tests/abi/config/CMakeLists.txt delete mode 100644 libs/json-3.12.0/tests/abi/config/config.hpp delete mode 100644 libs/json-3.12.0/tests/abi/config/custom.cpp delete mode 100644 libs/json-3.12.0/tests/abi/config/default.cpp delete mode 100644 libs/json-3.12.0/tests/abi/config/noversion.cpp delete mode 100644 libs/json-3.12.0/tests/abi/diag/CMakeLists.txt delete mode 100644 libs/json-3.12.0/tests/abi/diag/diag.cpp delete mode 100644 libs/json-3.12.0/tests/abi/diag/diag.hpp delete mode 100644 libs/json-3.12.0/tests/abi/diag/diag_off.cpp delete mode 100644 libs/json-3.12.0/tests/abi/diag/diag_on.cpp delete mode 100644 libs/json-3.12.0/tests/abi/include/nlohmann/json_v3_10_5.hpp delete mode 100644 libs/json-3.12.0/tests/abi/inline_ns/CMakeLists.txt delete mode 100644 libs/json-3.12.0/tests/abi/inline_ns/use_current.cpp delete mode 100644 libs/json-3.12.0/tests/abi/inline_ns/use_v3_10_5.cpp delete mode 100644 libs/json-3.12.0/tests/abi/main.cpp delete mode 100644 libs/json-3.12.0/tests/benchmarks/CMakeLists.txt delete mode 100644 libs/json-3.12.0/tests/benchmarks/src/benchmarks.cpp delete mode 100644 libs/json-3.12.0/tests/cmake_add_subdirectory/CMakeLists.txt delete mode 100644 libs/json-3.12.0/tests/cmake_add_subdirectory/project/CMakeLists.txt delete mode 100644 libs/json-3.12.0/tests/cmake_add_subdirectory/project/main.cpp delete mode 100644 libs/json-3.12.0/tests/cmake_fetch_content/CMakeLists.txt delete mode 100644 libs/json-3.12.0/tests/cmake_fetch_content/project/CMakeLists.txt delete mode 100644 libs/json-3.12.0/tests/cmake_fetch_content/project/main.cpp delete mode 100644 libs/json-3.12.0/tests/cmake_fetch_content2/CMakeLists.txt delete mode 100644 libs/json-3.12.0/tests/cmake_fetch_content2/project/CMakeLists.txt delete mode 100644 libs/json-3.12.0/tests/cmake_fetch_content2/project/main.cpp delete mode 100644 libs/json-3.12.0/tests/cmake_import/CMakeLists.txt delete mode 100644 libs/json-3.12.0/tests/cmake_import/project/CMakeLists.txt delete mode 100644 libs/json-3.12.0/tests/cmake_import/project/main.cpp delete mode 100644 libs/json-3.12.0/tests/cmake_import_minver/CMakeLists.txt delete mode 100644 libs/json-3.12.0/tests/cmake_import_minver/project/CMakeLists.txt delete mode 100644 libs/json-3.12.0/tests/cmake_import_minver/project/main.cpp delete mode 100644 libs/json-3.12.0/tests/cmake_target_include_directories/CMakeLists.txt delete mode 100644 libs/json-3.12.0/tests/cmake_target_include_directories/project/Bar.cpp delete mode 100644 libs/json-3.12.0/tests/cmake_target_include_directories/project/Bar.hpp delete mode 100644 libs/json-3.12.0/tests/cmake_target_include_directories/project/CMakeLists.txt delete mode 100644 libs/json-3.12.0/tests/cmake_target_include_directories/project/Foo.cpp delete mode 100644 libs/json-3.12.0/tests/cmake_target_include_directories/project/Foo.hpp delete mode 100644 libs/json-3.12.0/tests/cmake_target_include_directories/project/main.cpp delete mode 100644 libs/json-3.12.0/tests/cuda_example/CMakeLists.txt delete mode 100644 libs/json-3.12.0/tests/cuda_example/json_cuda.cu delete mode 100644 libs/json-3.12.0/tests/fuzzing.md delete mode 100644 libs/json-3.12.0/tests/reports/2016-08-29-fuzz/exec_speed.png delete mode 100644 libs/json-3.12.0/tests/reports/2016-08-29-fuzz/fuzz.tiff delete mode 100644 libs/json-3.12.0/tests/reports/2016-08-29-fuzz/high_freq.png delete mode 100644 libs/json-3.12.0/tests/reports/2016-08-29-fuzz/index.html delete mode 100644 libs/json-3.12.0/tests/reports/2016-08-29-fuzz/low_freq.png delete mode 100644 libs/json-3.12.0/tests/reports/2016-09-09-nativejson_benchmark/README.md delete mode 100644 libs/json-3.12.0/tests/reports/2016-09-09-nativejson_benchmark/conformance_Nlohmann (C++11).md delete mode 100644 libs/json-3.12.0/tests/reports/2016-09-09-nativejson_benchmark/conformance_overall_Result.png delete mode 100644 libs/json-3.12.0/tests/reports/2016-09-09-nativejson_benchmark/performance_Corei7-4980HQ@2.80GHz_mac64_clang7.0_1._Parse_Memory_(byte).png delete mode 100644 libs/json-3.12.0/tests/reports/2016-09-09-nativejson_benchmark/performance_Corei7-4980HQ@2.80GHz_mac64_clang7.0_1._Parse_Time_(ms).png delete mode 100644 libs/json-3.12.0/tests/reports/2016-09-09-nativejson_benchmark/performance_Corei7-4980HQ@2.80GHz_mac64_clang7.0_2._Stringify_Time_(ms).png delete mode 100644 libs/json-3.12.0/tests/reports/2016-09-09-nativejson_benchmark/performance_Corei7-4980HQ@2.80GHz_mac64_clang7.0_3._Prettify_Time_(ms).png delete mode 100644 libs/json-3.12.0/tests/reports/2016-09-09-nativejson_benchmark/performance_Corei7-4980HQ@2.80GHz_mac64_clang7.0_7._Code_size_FileSize_(byte).png delete mode 100644 libs/json-3.12.0/tests/reports/2016-10-02-fuzz/exec_speed.png delete mode 100644 libs/json-3.12.0/tests/reports/2016-10-02-fuzz/fuzz.tiff delete mode 100644 libs/json-3.12.0/tests/reports/2016-10-02-fuzz/high_freq.png delete mode 100644 libs/json-3.12.0/tests/reports/2016-10-02-fuzz/index.html delete mode 100644 libs/json-3.12.0/tests/reports/2016-10-02-fuzz/low_freq.png delete mode 100644 libs/json-3.12.0/tests/src/fuzzer-driver_afl.cpp delete mode 100644 libs/json-3.12.0/tests/src/fuzzer-parse_bjdata.cpp delete mode 100644 libs/json-3.12.0/tests/src/fuzzer-parse_bson.cpp delete mode 100644 libs/json-3.12.0/tests/src/fuzzer-parse_cbor.cpp delete mode 100644 libs/json-3.12.0/tests/src/fuzzer-parse_json.cpp delete mode 100644 libs/json-3.12.0/tests/src/fuzzer-parse_msgpack.cpp delete mode 100644 libs/json-3.12.0/tests/src/fuzzer-parse_ubjson.cpp delete mode 100644 libs/json-3.12.0/tests/src/make_test_data_available.hpp delete mode 100644 libs/json-3.12.0/tests/src/test_utils.hpp delete mode 100644 libs/json-3.12.0/tests/src/unit-32bit.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-algorithms.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-allocator.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-alt-string.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-assert_macro.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-binary_formats.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-bjdata.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-bson.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-byte_container_with_subtype.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-capacity.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-cbor.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-class_const_iterator.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-class_iterator.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-class_lexer.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-class_parser.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-class_parser_diagnostic_positions.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-comparison.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-concepts.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-constructor1.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-constructor2.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-convenience.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-conversions.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-custom-base-class.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-deserialization.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-diagnostic-positions-only.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-diagnostic-positions.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-diagnostics.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-disabled_exceptions.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-element_access1.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-element_access2.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-hash.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-inspection.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-items.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-iterators1.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-iterators2.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-iterators3.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-json_patch.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-json_pointer.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-large_json.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-locale-cpp.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-merge_patch.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-meta.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-modifiers.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-msgpack.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-no-mem-leak-on-adl-serialize.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-noexcept.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-ordered_json.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-ordered_map.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-pointer_access.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-readme.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-reference_access.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-regression1.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-regression2.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-serialization.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-testsuites.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-to_chars.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-type_traits.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-ubjson.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-udl.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-udt.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-udt_macro.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-unicode1.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-unicode2.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-unicode3.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-unicode4.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-unicode5.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-user_defined_input.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-windows_h.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit-wstring.cpp delete mode 100644 libs/json-3.12.0/tests/src/unit.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/CMakeLists.txt delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerCorpus.h delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerCrossOver.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerDefs.h delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerDictionary.h delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerDriver.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerExtFunctions.def delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerExtFunctions.h delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerExtFunctionsDlsym.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerExtFunctionsWeak.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerExtFunctionsWeakAlias.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerFlags.def delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerIO.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerIO.h delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerIOPosix.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerIOWindows.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerInterface.h delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerInternal.h delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerLoop.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerMain.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerMerge.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerMerge.h delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerMutate.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerMutate.h delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerOptions.h delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerRandom.h delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerSHA1.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerSHA1.h delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerTracePC.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerTracePC.h delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerTraceState.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerUtil.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerUtil.h delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerUtilDarwin.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerUtilLinux.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerUtilPosix.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerUtilWindows.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerValueBitMap.h delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/README.txt delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/afl/afl_driver.cpp delete mode 100755 libs/json-3.12.0/tests/thirdparty/Fuzzer/build.sh delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/cxx.dict delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/standalone/StandaloneFuzzTargetMain.c delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/AFLDriverTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/AbsNegAndConstant64Test.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/AbsNegAndConstantTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/AccumulateAllocationsTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/BufferOverflowOnInput.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/CMakeLists.txt delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/CallerCalleeTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/CounterTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/CustomCrossOverTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/CustomMutatorTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/DSO1.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/DSO2.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/DSOTestExtra.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/DSOTestMain.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/DivTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/EmptyTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/FourIndependentBranchesTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/FullCoverageSetTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/FuzzerUnittest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/InitializeTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/LeakTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/LeakTimeoutTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/LoadTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/MemcmpTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/NthRunCrashTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/NullDerefOnEmptyTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/NullDerefTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/OneHugeAllocTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/OutOfMemorySingleLargeMallocTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/OutOfMemoryTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/RepeatedBytesTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/RepeatedMemcmp.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/ShrinkControlFlowTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/ShrinkValueProfileTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/SignedIntOverflowTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/SimpleCmpTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/SimpleDictionaryTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/SimpleHashTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/SimpleTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/SimpleThreadedTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/SingleMemcmpTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/SingleStrcmpTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/SingleStrncmpTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/SpamyTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/StrcmpTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/StrncmpOOBTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/StrncmpTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/StrstrTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/SwapCmpTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/Switch2Test.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/SwitchTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/ThreadedLeakTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/ThreadedTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/TimeoutEmptyTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/TimeoutTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/TraceMallocTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/UninstrumentedTest.cpp delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/afl-driver-extra-stats.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/afl-driver-stderr.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/caller-callee.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/coverage.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/dict1.txt delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/dump_coverage.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-customcrossover.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-custommutator.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-dict.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-dirs.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-fdmask.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-finalstats.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-flags.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-jobs.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-leak.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-oom-with-profile.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-oom.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-printcovpcs.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-runs.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-seed.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-segv.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-singleinputs.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-threaded.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-timeout.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-traces-hooks.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-ubsan.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/hi.txt delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/lit.cfg delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/lit.site.cfg.in delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/merge.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/minimize_crash.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/no-coverage/CMakeLists.txt delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/repeated-bytes.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/shrink.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/simple-cmp.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/standalone.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/swap-cmp.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/trace-malloc.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/ubsan/CMakeLists.txt delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/ulimit.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/uninstrumented/CMakeLists.txt delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/unit/lit.cfg delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/unit/lit.site.cfg.in delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/value-profile-cmp.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/value-profile-cmp2.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/value-profile-cmp3.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/value-profile-cmp4.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/value-profile-div.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/value-profile-load.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/value-profile-mem.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/value-profile-set.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/value-profile-strcmp.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/value-profile-strncmp.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/value-profile-switch.test delete mode 100644 libs/json-3.12.0/tests/thirdparty/doctest/doctest.h delete mode 100644 libs/json-3.12.0/tests/thirdparty/doctest/doctest_compatibility.h delete mode 100644 libs/json-3.12.0/tests/thirdparty/fifo_map/fifo_map.hpp delete mode 100755 libs/json-3.12.0/tests/thirdparty/imapdl/filterbr.py delete mode 100644 libs/json-3.12.0/tools/amalgamate/CHANGES.md delete mode 100644 libs/json-3.12.0/tools/amalgamate/README.md delete mode 100755 libs/json-3.12.0/tools/amalgamate/amalgamate.py delete mode 100644 libs/json-3.12.0/tools/amalgamate/config_json.json delete mode 100644 libs/json-3.12.0/tools/amalgamate/config_json_fwd.json delete mode 100644 libs/json-3.12.0/tools/astyle/.astylerc delete mode 100644 libs/json-3.12.0/tools/astyle/requirements.txt delete mode 100644 libs/json-3.12.0/tools/gdb_pretty_printer/README.md delete mode 100644 libs/json-3.12.0/tools/gdb_pretty_printer/nlohmann-json.py delete mode 100644 libs/json-3.12.0/tools/generate_natvis/README.md delete mode 100755 libs/json-3.12.0/tools/generate_natvis/generate_natvis.py delete mode 100644 libs/json-3.12.0/tools/generate_natvis/nlohmann_json.natvis.j2 delete mode 100644 libs/json-3.12.0/tools/generate_natvis/requirements.txt delete mode 100644 libs/json-3.12.0/tools/macro_builder/main.cpp delete mode 100644 libs/json-3.12.0/tools/serve_header/README.md delete mode 100644 libs/json-3.12.0/tools/serve_header/demo.png delete mode 100644 libs/json-3.12.0/tools/serve_header/requirements.txt delete mode 100755 libs/json-3.12.0/tools/serve_header/serve_header.py delete mode 100644 libs/json-3.12.0/tools/serve_header/serve_header.yml.example rename {libs => xenith/libs}/cpp-httplib-0.57.1/LICENSE (100%) rename {libs/json-3.12.0 => xenith/libs/cpp-httplib-0.57.1}/LICENSE.MIT (100%) rename {libs => xenith/libs}/cpp-httplib-0.57.1/httplib.h (99%) rename {libs/json-3.12.0/single_include => xenith/libs/json-3.12.0}/nlohmann/json.hpp (100%) rename {libs/json-3.12.0/single_include => xenith/libs/json-3.12.0}/nlohmann/json_fwd.hpp (100%) create mode 100644 xenith/ollama_api/handler.cpp create mode 100644 xenith/ollama_api/handler.h create mode 100644 xenith/ollama_api/server.h rename {ollama_api => xenith/ollama_api}/test.cpp (99%) diff --git a/CMakeLists.txt b/CMakeLists.txt index e772658..2e9a432 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,9 +23,12 @@ set(SOURCES xenith/core/gradcheck.cpp # Файлы, которые уже были в твоем старом CMakeLists.txt xenith/preprocessing/tokenizer.cpp - ollama_api/test.cpp + xenith/ollama_api/test.cpp xenith/converter.cpp help.h + xenith/ollama_api/handler.cpp + xenith/ollama_api/handler.h + xenith/ollama_api/server.h ) # Заголовочные файлы (для удобства в IDE) diff --git a/KVCacheArch b/KVCacheArch deleted file mode 100644 index 9ec93aa..0000000 --- a/KVCacheArch +++ /dev/null @@ -1,7 +0,0 @@ -// [token][layer][kv][head][dim] -struct TokenKV { - float k[num_heads][head_dim]; // Ключи всех голов этого слоя - float v[num_heads][head_dim]; // Значения всех голов этого слоя -}; - -TokenKV kv_cache[MAX_CTX][NUM_LAYERS]; \ No newline at end of file diff --git a/libs/cpp-httplib-0.57.1/.gitattributes b/libs/cpp-httplib-0.57.1/.gitattributes deleted file mode 100644 index f818483..0000000 --- a/libs/cpp-httplib-0.57.1/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -/test/www*/dir/*.html text eol=lf -/test/www*/dir/*.txt text eol=lf \ No newline at end of file diff --git a/libs/cpp-httplib-0.57.1/.github/workflows/abidiff.yaml b/libs/cpp-httplib-0.57.1/.github/workflows/abidiff.yaml deleted file mode 100644 index 84ead93..0000000 --- a/libs/cpp-httplib-0.57.1/.github/workflows/abidiff.yaml +++ /dev/null @@ -1,70 +0,0 @@ -# SPDX-FileCopyrightText: 2025 Andrea Pappacoda -# SPDX-License-Identifier: MIT - -name: abidiff - -on: [push, pull_request] - -concurrency: - group: ${{ github.workflow }}-${{ github.ref || github.run_id }} - cancel-in-progress: true - -defaults: - run: - shell: sh - -jobs: - abi: - runs-on: ubuntu-latest - if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name - container: - image: debian:testing - - steps: - - name: Install dependencies - run: apt -y --update install --no-install-recommends - abigail-tools - ca-certificates - g++ - git - libbrotli-dev - libssl-dev - libzstd-dev - meson - pkg-config - python3 - zlib1g-dev - - - uses: actions/checkout@v4 - with: - path: current - - - uses: actions/checkout@v4 - with: - path: previous - fetch-depth: 0 - - - name: Checkout previous - working-directory: previous - run: | - git switch master - git describe --tags --abbrev=0 master | xargs git checkout - - - name: Build current - working-directory: current - run: | - meson setup --buildtype=debug -Dcpp-httplib_compile=true build - ninja -C build - - - name: Build previous - working-directory: previous - run: | - meson setup --buildtype=debug -Dcpp-httplib_compile=true build - ninja -C build - - - name: Run abidiff - run: abidiff - --headers-dir1 previous/build - --headers-dir2 current/build - previous/build/libcpp-httplib.so - current/build/libcpp-httplib.so diff --git a/libs/cpp-httplib-0.57.1/.github/workflows/benchmark_ab.yaml b/libs/cpp-httplib-0.57.1/.github/workflows/benchmark_ab.yaml deleted file mode 100644 index c7f499f..0000000 --- a/libs/cpp-httplib-0.57.1/.github/workflows/benchmark_ab.yaml +++ /dev/null @@ -1,62 +0,0 @@ -name: benchmark-ab - -# Manual A/B throughput comparison between two refs. -# -# This is a measurement, not a test: it never fails the build on a slow result. -# Absolute req/s from a shared runner is meaningless on its own, so both refs -# are built and measured alternately in the same job and only the ratio of the -# medians is reported, with a permutation test to say whether the difference -# stands out from the run-to-run noise. -# -# Non-SSL and Linux only for now. - -on: - workflow_dispatch: - inputs: - base: - description: "Baseline ref" - required: false - default: "origin/master" - head: - description: "Ref to compare (defaults to the ref this run was started on)" - required: false - default: "" - rounds: - description: "Measurement rounds per ref (9+ recommended; below 4 the test can never reach significance)" - required: false - default: "9" - duration: - description: "Load duration per measurement" - required: false - default: "5s" - connections: - description: "Concurrent connections" - required: false - default: "10" - -permissions: - contents: read - -jobs: - ubuntu: - runs-on: ubuntu-latest - steps: - - name: checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: install bombardier - run: go install github.com/codesenberg/bombardier@latest - - - name: run A/B benchmark - run: | - export PATH="$(go env GOPATH)/bin:$PATH" - HEAD_REF="${{ inputs.head }}" - if [ -z "$HEAD_REF" ]; then HEAD_REF="${{ github.sha }}"; fi - ./benchmark/ab.sh \ - --base "${{ inputs.base }}" \ - --head "$HEAD_REF" \ - --rounds "${{ inputs.rounds }}" \ - --duration "${{ inputs.duration }}" \ - --connections "${{ inputs.connections }}" diff --git a/libs/cpp-httplib-0.57.1/.github/workflows/benchmark_run.yaml b/libs/cpp-httplib-0.57.1/.github/workflows/benchmark_run.yaml deleted file mode 100644 index 326f4ca..0000000 --- a/libs/cpp-httplib-0.57.1/.github/workflows/benchmark_run.yaml +++ /dev/null @@ -1,106 +0,0 @@ -name: benchmark-run - -# Runs the committed benchmark (`just bench`) and records the numbers. -# -# This is a measurement, not a test: nothing here fails the build. Unlike -# benchmark-ab, which compares two refs inside one job, this just reports the -# absolute throughput of the current ref alongside Crow for reference. -# -# Absolute req/s is only meaningful against other runs on the same runner type, -# so compare like with like when reading the history. -# -# Non-SSL only. Windows is excluded: benchmark/Makefile depends on `nc`, `&` -# and `kill`, so it would need a PowerShell rewrite first. - -on: - workflow_dispatch: - inputs: - duration: - description: "Load duration per server" - required: false - default: "5s" - connections: - description: "Concurrent connections" - required: false - default: "10" - crow: - description: "Also benchmark Crow v1.3.1 for reference" - type: boolean - required: false - default: true - -permissions: - contents: read - -jobs: - bench: - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest, macos-latest] - runs-on: ${{ matrix.os }} - steps: - - name: checkout - uses: actions/checkout@v4 - - # macos runners ship without Go. - - name: setup Go - uses: actions/setup-go@v5 - with: - go-version: stable - - - name: install bombardier - run: go install github.com/codesenberg/bombardier@latest - - # crow_all.h includes , which no runner has out of the box. - - name: install asio - if: ${{ inputs.crow }} - run: | - if [ "$RUNNER_OS" = "Linux" ]; then - sudo apt-get update && sudo apt-get install -y libasio-dev - else - brew install asio - fi - - - name: run benchmark - run: | - # Without pipefail the `tee` below swallows a build failure and the - # job reports success having measured nothing. - set -o pipefail - export PATH="$(go env GOPATH)/bin:$PATH" - CROW_FLAGS="-std=c++17" - if [ "$RUNNER_OS" = "macOS" ]; then - CROW_FLAGS="$CROW_FLAGS -I$(brew --prefix asio)/include" - fi - if [ "${{ inputs.crow }}" = "true" ]; then TARGET=bench-all; else TARGET=bench; fi - make -C benchmark "$TARGET" \ - CROW_CXXFLAGS="$CROW_FLAGS" \ - BENCH="bombardier -c ${{ inputs.connections }} -d ${{ inputs.duration }} localhost:8080" \ - 2>&1 | tee /tmp/bench.txt - - # pipefail only catches a failed build. Each Makefile recipe ends in - # `kill`, so a bombardier that never ran still leaves make happy — check - # that the measurements are actually there. - - name: check results were produced - run: | - expected=1 - if [ "${{ inputs.crow }}" = "true" ]; then expected=2; fi - got=$(grep -c "Reqs/sec" /tmp/bench.txt || true) - if [ "$got" -lt "$expected" ]; then - echo "::error::expected $expected benchmark result(s), found $got" - exit 1 - fi - - - name: record results - if: always() - run: | - { - echo "## Benchmark (${{ matrix.os }})" - echo "" - echo "- ref: \`${{ github.ref_name }}\` (${{ github.sha }})" - echo "- connections=${{ inputs.connections }} duration=${{ inputs.duration }}" - echo "" - echo '```' - cat /tmp/bench.txt - echo '```' - } >> "$GITHUB_STEP_SUMMARY" diff --git a/libs/cpp-httplib-0.57.1/.github/workflows/cifuzz.yaml b/libs/cpp-httplib-0.57.1/.github/workflows/cifuzz.yaml deleted file mode 100644 index 9915cb8..0000000 --- a/libs/cpp-httplib-0.57.1/.github/workflows/cifuzz.yaml +++ /dev/null @@ -1,42 +0,0 @@ -name: CIFuzz - -# The fuzzers only build httplib.h and the targets under test/fuzzing, so a -# pull request that touches neither has nothing for CIFuzz to exercise. Fuzzing -# is by far the longest job in CI (10 minutes of fuzzing on top of building the -# OSS-Fuzz image), and skipping it for documentation-only changes keeps the -# full 600 seconds for the pull requests that do reach the parsers. -on: - pull_request: - paths: - - 'httplib.h' - - 'test/fuzzing/**' - - '.github/workflows/cifuzz.yaml' - -concurrency: - group: ${{ github.workflow }}-${{ github.ref || github.run_id }} - cancel-in-progress: true - -jobs: - Fuzzing: - runs-on: ubuntu-latest - steps: - - name: Build Fuzzers - id: build - uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master - with: - oss-fuzz-project-name: 'cpp-httplib' - dry-run: false - language: c++ - - name: Run Fuzzers - uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master - with: - oss-fuzz-project-name: 'cpp-httplib' - fuzz-seconds: 600 - dry-run: false - language: c++ - - name: Upload Crash - uses: actions/upload-artifact@v4 - if: failure() && steps.build.outcome == 'success' - with: - name: artifacts - path: ./out/artifacts diff --git a/libs/cpp-httplib-0.57.1/.github/workflows/docs.yml b/libs/cpp-httplib-0.57.1/.github/workflows/docs.yml deleted file mode 100644 index d1090da..0000000 --- a/libs/cpp-httplib-0.57.1/.github/workflows/docs.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: docs -on: - push: - branches: [master] - paths: - - 'docs-src/**' - workflow_dispatch: -permissions: - contents: read - pages: write - id-token: write -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true -jobs: - deploy: - runs-on: ubuntu-latest - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - steps: - - uses: actions/checkout@v4 - with: - # Full history so sitemap reflects each page's real last commit date - fetch-depth: 0 - - uses: dtolnay/rust-toolchain@stable - - uses: Swatinem/rust-cache@v2 - - name: Install docs-gen - run: cargo install docs-gen - - name: Build - run: docs-gen build docs-src docs - - uses: actions/configure-pages@v5 - - uses: actions/upload-pages-artifact@v3 - with: - path: docs - - id: deployment - uses: actions/deploy-pages@v4 diff --git a/libs/cpp-httplib-0.57.1/.github/workflows/release-docker.yml b/libs/cpp-httplib-0.57.1/.github/workflows/release-docker.yml deleted file mode 100644 index 179ab82..0000000 --- a/libs/cpp-httplib-0.57.1/.github/workflows/release-docker.yml +++ /dev/null @@ -1,51 +0,0 @@ -name: Release Docker Image - -on: - release: - types: [published] - workflow_dispatch: - -jobs: - build-and-push: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - fetch-depth: 0 # Fetch all history and tags - - - name: Extract tag (manual) - if: github.event_name == 'workflow_dispatch' - id: set_tag_manual - run: | - # Checkout the latest tag and set output - git fetch --tags - LATEST_TAG=$(git describe --tags --abbrev=0) - git checkout $LATEST_TAG - echo "tag=${LATEST_TAG#v}" >> $GITHUB_OUTPUT - - - name: Extract tag (release) - if: github.event_name == 'release' - id: set_tag_release - run: echo "tag=${GITHUB_REF_NAME#v}" >> $GITHUB_OUTPUT - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Build and push Docker image - uses: docker/build-push-action@v5 - with: - context: . - file: ./Dockerfile - push: true - platforms: linux/amd64,linux/arm64 # Build for both amd64 and arm64 - # Use extracted tag without leading 'v' - tags: | - yhirose4dockerhub/cpp-httplib-server:latest - yhirose4dockerhub/cpp-httplib-server:${{ steps.set_tag_manual.outputs.tag || steps.set_tag_release.outputs.tag }} diff --git a/libs/cpp-httplib-0.57.1/.github/workflows/test-32bit.yml b/libs/cpp-httplib-0.57.1/.github/workflows/test-32bit.yml deleted file mode 100644 index 45d3393..0000000 --- a/libs/cpp-httplib-0.57.1/.github/workflows/test-32bit.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: 32-bit Build Test - -on: - push: - branches: [master] - pull_request: - branches: [master] - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.ref || github.run_id }} - cancel-in-progress: true - -jobs: - test-win32: - name: Windows 32-bit (MSVC x86) - runs-on: windows-latest - timeout-minutes: 10 - steps: - - uses: actions/checkout@v4 - - name: Build (Win32) - shell: cmd - run: | - for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -property installationPath`) do set VSDIR=%%i - call "%VSDIR%\VC\Auxiliary\Build\vcvarsall.bat" x86 || exit /b 1 - cl /std:c++14 /EHsc /W4 /WX /c /Fo:NUL test\test_32bit_build.cpp - - test-arm32: - name: ARM 32-bit (cross-compile) - runs-on: ubuntu-latest - timeout-minutes: 10 - steps: - - uses: actions/checkout@v4 - - name: Install cross compiler - run: sudo apt-get update && sudo apt-get install -y g++-arm-linux-gnueabihf - - name: Build (ARM 32-bit) - run: arm-linux-gnueabihf-g++ -std=c++11 -Wall -Wextra -Wno-psabi -Werror -c -o /dev/null test/test_32bit_build.cpp diff --git a/libs/cpp-httplib-0.57.1/.github/workflows/test.yaml b/libs/cpp-httplib-0.57.1/.github/workflows/test.yaml deleted file mode 100644 index ba7cc50..0000000 --- a/libs/cpp-httplib-0.57.1/.github/workflows/test.yaml +++ /dev/null @@ -1,629 +0,0 @@ -name: test - -on: - push: - pull_request: - workflow_dispatch: - inputs: - gtest_filter: - description: 'Google Test filter' - test_linux: - description: 'Test on Linux' - type: boolean - default: true - test_macos: - description: 'Test on MacOS' - type: boolean - default: true - test_windows: - description: 'Test on Windows' - type: boolean - default: true - -concurrency: - group: ${{ github.workflow }}-${{ github.ref || github.run_id }} - cancel-in-progress: true - -env: - # Exclude *_Online tests by default — they hit external services and flake on - # CI runners. Run with workflow_dispatch + a custom filter to include them. - GTEST_FILTER: ${{ github.event.inputs.gtest_filter || '-*_Online' }} - -jobs: - style-check: - # Uses the macOS runner's pre-installed Homebrew so clang-format tracks - # whatever version `brew install clang-format` currently resolves to on - # the maintainer's own Mac, instead of a version pinned in this file. - runs-on: macos-latest - if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name - continue-on-error: true - steps: - - name: checkout - uses: actions/checkout@v4 - - name: install clang-format - run: | - brew update - brew install clang-format coreutils - - name: run style check - run: | - clang-format --version - cd test && make style_check - - build-and-test-on-32bit: - runs-on: ubuntu-latest - if: > - (github.event_name == 'push') || - (github.event_name == 'pull_request' && - github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name) || - (github.event_name == 'workflow_dispatch' && github.event.inputs.test_linux == 'true') - strategy: - matrix: - config: - - arch_flags: -m32 - arch_suffix: :i386 - name: (32-bit) - steps: - - name: checkout - uses: actions/checkout@v4 - - name: install libraries - run: | - sudo dpkg --add-architecture i386 - sudo apt-get update - sudo apt-get install -y libc6-dev${{ matrix.config.arch_suffix }} libstdc++-13-dev${{ matrix.config.arch_suffix }} \ - libssl-dev${{ matrix.config.arch_suffix }} libcurl4-openssl-dev${{ matrix.config.arch_suffix }} \ - zlib1g-dev${{ matrix.config.arch_suffix }} libbrotli-dev${{ matrix.config.arch_suffix }} \ - libzstd-dev${{ matrix.config.arch_suffix }} - - name: build and run tests - run: cd test && make test EXTRA_CXXFLAGS="${{ matrix.config.arch_flags }}" - - ubuntu: - runs-on: ubuntu-latest - if: > - (github.event_name == 'push') || - (github.event_name == 'pull_request' && - github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name) || - (github.event_name == 'workflow_dispatch' && github.event.inputs.test_linux == 'true') - strategy: - fail-fast: false - matrix: - tls_backend: [openssl, mbedtls, wolfssl] - name: ubuntu (${{ matrix.tls_backend }}) - steps: - - name: checkout - uses: actions/checkout@v4 - - name: install common libraries - run: | - sudo apt-get update - sudo apt-get install -y libcurl4-openssl-dev zlib1g-dev libbrotli-dev libzstd-dev - - name: install OpenSSL - if: matrix.tls_backend == 'openssl' - run: sudo apt-get install -y libssl-dev - - name: install Mbed TLS - if: matrix.tls_backend == 'mbedtls' - run: sudo apt-get install -y libmbedtls-dev - - name: install wolfSSL - if: matrix.tls_backend == 'wolfssl' - run: sudo apt-get install -y libwolfssl-dev - - name: build and run tests (OpenSSL) - if: matrix.tls_backend == 'openssl' - run: cd test && make test_split && make test_openssl_parallel - env: - LSAN_OPTIONS: suppressions=lsan_suppressions.txt - - name: build and run tests (Mbed TLS) - if: matrix.tls_backend == 'mbedtls' - run: cd test && make test_split_mbedtls && make test_mbedtls_parallel - - name: build and run tests (wolfSSL) - if: matrix.tls_backend == 'wolfssl' - run: cd test && make test_split_wolfssl && make test_wolfssl_parallel - - name: run fuzz test target - if: matrix.tls_backend == 'openssl' - run: cd test && make fuzz_test - - name: build and run WebSocket heartbeat test - if: matrix.tls_backend == 'openssl' - run: cd test && make test_websocket_heartbeat && ./test_websocket_heartbeat - - name: build and run WebSocket TLS thread safety test - if: matrix.tls_backend == 'openssl' - run: cd test && make test_websocket_thread_safety && ./test_websocket_thread_safety - - name: build and run ThreadPool test - run: cd test && make test_thread_pool && ./test_thread_pool - - # Ubuntu 26.04's apt ships Mbed TLS 3.6, giving 3.x coverage that - # ubuntu-latest (24.04 = 2.28) and macOS (Homebrew = 4.x) no longer provide. - # Uses the 26.04 public-preview image; fold into the main ubuntu matrix once - # ubuntu-latest moves to 26.04. - ubuntu-2604-mbedtls: - runs-on: ubuntu-26.04 - if: > - (github.event_name == 'push') || - (github.event_name == 'pull_request' && - github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name) || - (github.event_name == 'workflow_dispatch' && github.event.inputs.test_linux == 'true') - name: ubuntu-26.04 (mbedtls 3.x) - steps: - - name: checkout - uses: actions/checkout@v4 - - name: install common libraries - run: | - sudo apt-get update - sudo apt-get install -y libcurl4-openssl-dev zlib1g-dev libbrotli-dev libzstd-dev - - name: install Mbed TLS - run: sudo apt-get install -y libmbedtls-dev - - name: build and run tests (Mbed TLS) - run: cd test && make test_split_mbedtls && make test_mbedtls_parallel - - # BoringSSL is Google's fork of OpenSSL. It has no API stability guarantee - # and is not packaged by distros, so we build it from source. cpp-httplib - # treats it as an OpenSSL backend variant via the OPENSSL_IS_BORINGSSL - # macro (see httplib.h). This job is best-effort: continue-on-error keeps - # upstream API drift from blocking PRs while still surfacing breakage. - ubuntu-boringssl: - runs-on: ubuntu-latest - if: > - (github.event_name == 'push') || - (github.event_name == 'pull_request' && - github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name) || - (github.event_name == 'workflow_dispatch' && github.event.inputs.test_linux == 'true') - continue-on-error: true - name: ubuntu (boringssl, best-effort) - env: - # Tracking HEAD keeps us honest about upstream churn. If breakage - # becomes routine, replace HEAD with a 40-char commit SHA; the - # resolve step uses the SHA directly when it matches that shape. - BORINGSSL_REF: HEAD - BORINGSSL_PREFIX: ${{ github.workspace }}/boringssl-install - steps: - - name: checkout - uses: actions/checkout@v4 - - name: install common libraries - run: | - sudo apt-get update - sudo apt-get install -y libcurl4-openssl-dev zlib1g-dev libbrotli-dev libzstd-dev - - name: resolve BoringSSL commit - id: boringssl-rev - # Accept either a ref name (resolved via git ls-remote) or a full - # 40-char SHA used directly. ls-remote does not list arbitrary - # commit SHAs, so pinning requires the second path. - run: | - if [[ "${BORINGSSL_REF}" =~ ^[0-9a-f]{40}$ ]]; then - sha="${BORINGSSL_REF}" - echo "Using pinned BoringSSL SHA: ${sha}" - else - sha=$(git ls-remote https://boringssl.googlesource.com/boringssl "${BORINGSSL_REF}" | awk '{print $1}') - if [ -z "$sha" ]; then - echo "Failed to resolve BoringSSL ref ${BORINGSSL_REF}" >&2 - exit 1 - fi - echo "Resolved ${BORINGSSL_REF} -> ${sha}" - fi - echo "sha=${sha}" >> "$GITHUB_OUTPUT" - - name: cache BoringSSL build - id: boringssl-cache - uses: actions/cache@v4 - with: - path: ${{ env.BORINGSSL_PREFIX }} - key: boringssl-${{ runner.os }}-${{ steps.boringssl-rev.outputs.sha }} - - name: build BoringSSL - if: steps.boringssl-cache.outputs.cache-hit != 'true' - run: | - set -e - git clone https://boringssl.googlesource.com/boringssl boringssl - cd boringssl - git checkout "${{ steps.boringssl-rev.outputs.sha }}" - cmake -S . -B build \ - -DCMAKE_BUILD_TYPE=Release \ - -DBUILD_SHARED_LIBS=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ - -DCMAKE_INSTALL_PREFIX="${BORINGSSL_PREFIX}" - cmake --build build -j"$(nproc)" --target install - - name: build and run tests (BoringSSL) - # Override OPENSSL_SUPPORT to point the existing OpenSSL Makefile path - # at BoringSSL's prefix. BoringSSL defines OPENSSL_IS_BORINGSSL in - # , which httplib.h and test.cc use to switch on API - # differences (e.g. SAN-only hostname verification, no CN fallback). - # - # BoringSSL's public headers () use std::enable_if_t, - # so consumers must compile with C++14 or later. cpp-httplib itself - # supports C++11, but anyone pairing it with BoringSSL inherits this - # constraint. EXTRA_CXXFLAGS appends after the Makefile's -std=c++11 - # and the later flag wins. - run: | - cd test - BORINGSSL_FLAGS="-DCPPHTTPLIB_OPENSSL_SUPPORT -I${BORINGSSL_PREFIX}/include -L${BORINGSSL_PREFIX}/lib -lssl -lcrypto -lpthread" - make test_split OPENSSL_SUPPORT="${BORINGSSL_FLAGS}" EXTRA_CXXFLAGS="-std=c++17" - make test_openssl_parallel OPENSSL_SUPPORT="${BORINGSSL_FLAGS}" EXTRA_CXXFLAGS="-std=c++17" - env: - LSAN_OPTIONS: suppressions=lsan_suppressions.txt - - # macOS counterpart of the BoringSSL job. Same best-effort posture; the - # extra framework links cover the macOS Keychain integration that - # httplib.h auto-enables for any TLS backend on macOS. - macos-boringssl: - runs-on: macos-latest - if: > - (github.event_name == 'push') || - (github.event_name == 'pull_request' && - github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name) || - (github.event_name == 'workflow_dispatch' && github.event.inputs.test_macos == 'true') - continue-on-error: true - name: macos (boringssl, best-effort) - env: - BORINGSSL_REF: HEAD - BORINGSSL_PREFIX: ${{ github.workspace }}/boringssl-install - steps: - - name: checkout - uses: actions/checkout@v4 - - name: resolve BoringSSL commit - id: boringssl-rev - # Accept either a ref name (resolved via git ls-remote) or a full - # 40-char SHA used directly. ls-remote does not list arbitrary - # commit SHAs, so pinning requires the second path. - run: | - if [[ "${BORINGSSL_REF}" =~ ^[0-9a-f]{40}$ ]]; then - sha="${BORINGSSL_REF}" - echo "Using pinned BoringSSL SHA: ${sha}" - else - sha=$(git ls-remote https://boringssl.googlesource.com/boringssl "${BORINGSSL_REF}" | awk '{print $1}') - if [ -z "$sha" ]; then - echo "Failed to resolve BoringSSL ref ${BORINGSSL_REF}" >&2 - exit 1 - fi - echo "Resolved ${BORINGSSL_REF} -> ${sha}" - fi - echo "sha=${sha}" >> "$GITHUB_OUTPUT" - - name: cache BoringSSL build - id: boringssl-cache - uses: actions/cache@v4 - with: - path: ${{ env.BORINGSSL_PREFIX }} - key: boringssl-${{ runner.os }}-${{ steps.boringssl-rev.outputs.sha }} - - name: build BoringSSL - if: steps.boringssl-cache.outputs.cache-hit != 'true' - run: | - set -e - git clone https://boringssl.googlesource.com/boringssl boringssl - cd boringssl - git checkout "${{ steps.boringssl-rev.outputs.sha }}" - cmake -S . -B build \ - -DCMAKE_BUILD_TYPE=Release \ - -DBUILD_SHARED_LIBS=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ - -DCMAKE_INSTALL_PREFIX="${BORINGSSL_PREFIX}" - cmake --build build -j"$(sysctl -n hw.ncpu)" --target install - - name: build and run tests (BoringSSL) - run: | - cd test - # CoreFoundation/Security frameworks satisfy the Keychain integration - # auto-enabled in httplib.h for macOS TLS builds. - BORINGSSL_FLAGS="-DCPPHTTPLIB_OPENSSL_SUPPORT -I${BORINGSSL_PREFIX}/include -L${BORINGSSL_PREFIX}/lib -lssl -lcrypto -framework CoreFoundation -framework Security" - make test_split OPENSSL_SUPPORT="${BORINGSSL_FLAGS}" EXTRA_CXXFLAGS="-std=c++17" - make test_openssl_parallel OPENSSL_SUPPORT="${BORINGSSL_FLAGS}" EXTRA_CXXFLAGS="-std=c++17" - env: - LSAN_OPTIONS: suppressions=lsan_suppressions.txt - - # Reproducer for https://github.com/yhirose/cpp-httplib/issues/2431. - # On Linux/glibc, getaddrinfo_with_timeout() schedules an asynchronous - # DNS lookup with getaddrinfo_a(GAI_NOWAIT) using a stack-local gaicb. - # When gai_suspend() hits the connection timeout, gai_cancel() is called - # but does not block; the resolver worker can later write back into the - # destroyed stack frame. To make the worker actually reach that write, - # the test job runs a loopback UDP responder (test/dns_test_fixture.py) - # that delays its reply past the test's 1s timeout, and uses an iptables - # NAT rule so glibc's lookups land on that fixture instead of a real - # nameserver. With ASAN's detect_stack_use_after_return enabled, the - # late write-back is reported as a stack-use-after-return. - issue-2431-repro: - runs-on: ubuntu-latest - if: > - (github.event_name == 'push') || - (github.event_name == 'pull_request' && - github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name) || - (github.event_name == 'workflow_dispatch' && github.event.inputs.test_linux == 'true') - name: issue-2431 repro (Linux + ASAN) - # Bound the whole job in case anything in the test harness hangs - # unexpectedly. With the fixture in place a normal run is well under - # a minute either way (ASAN abort on broken HEAD, clean pass on fix). - timeout-minutes: 5 - env: - DNS_FIXTURE_PORT: "15353" - DNS_FIXTURE_DELAY: "3" - steps: - - name: checkout - uses: actions/checkout@v4 - - name: install libraries - run: | - sudo apt-get update - sudo apt-get install -y libssl-dev zlib1g-dev libbrotli-dev \ - libzstd-dev libcurl4-openssl-dev iptables util-linux iproute2 - - name: start loopback DNS test fixture - run: | - # Force glibc through its DNS code path: Ubuntu's default - # nsswitch short-circuits to NOTFOUND through mdns4_minimal, - # which would skip the buggy code entirely. - sudo sed -i 's/^hosts:.*/hosts: dns/' /etc/nsswitch.conf - # Run the loopback fixture (delayed UDP responder). - python3 test/dns_test_fixture.py "$DNS_FIXTURE_PORT" "$DNS_FIXTURE_DELAY" \ - >/tmp/dns_fixture.log 2>&1 & - echo $! | sudo tee /tmp/dns_fixture.pid >/dev/null - # Wait for the fixture to start listening. - for _ in $(seq 1 50); do - if ss -lun "( sport = :$DNS_FIXTURE_PORT )" | grep -q ":$DNS_FIXTURE_PORT"; then - break - fi - sleep 0.1 - done - ss -lun "( sport = :$DNS_FIXTURE_PORT )" | grep -q ":$DNS_FIXTURE_PORT" \ - || { echo "fixture failed to start"; cat /tmp/dns_fixture.log; exit 1; } - # Send the test process's DNS lookups to the loopback fixture. - # NAT only the local OUTPUT chain; conntrack handles the reply path. - sudo iptables -t nat -I OUTPUT -p udp --dport 53 \ - -j REDIRECT --to-port "$DNS_FIXTURE_PORT" - # Sanity check: a query must take at least the fixture delay - # and resolve to NXDOMAIN (proving traffic reaches the fixture). - start=$(date +%s) - getent hosts unresolvable-host.invalid >/dev/null 2>&1 || true - elapsed=$(( $(date +%s) - start )) - if [ "$elapsed" -lt 2 ]; then - echo "ERROR: lookup returned in ${elapsed}s; fixture not in path" >&2 - exit 1 - fi - echo "[ok] DNS lookups are routed to the test fixture (took ${elapsed}s)" - - name: build test binary - run: cd test && make test - - name: run GetAddrInfoAsyncCancelTest - run: | - cd test - ARCH=$(uname -m) - CPPHTTPLIB_TEST_ISSUE_2431=1 \ - ASAN_OPTIONS=detect_stack_use_after_return=1 \ - LSAN_OPTIONS=suppressions=lsan_suppressions.txt \ - setarch "$ARCH" -R \ - ./test --gtest_filter='GetAddrInfoAsyncCancelTest.*' - - name: tear down test fixture - if: always() - run: | - sudo iptables -t nat -F OUTPUT || true - if [ -f /tmp/dns_fixture.pid ]; then - sudo kill "$(cat /tmp/dns_fixture.pid)" 2>/dev/null || true - fi - - macos: - runs-on: macos-latest - if: > - (github.event_name == 'push') || - (github.event_name == 'pull_request' && - github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name) || - (github.event_name == 'workflow_dispatch' && github.event.inputs.test_macos == 'true') - strategy: - fail-fast: false - matrix: - tls_backend: [openssl, mbedtls, wolfssl] - name: macos (${{ matrix.tls_backend }}) - steps: - - name: checkout - uses: actions/checkout@v4 - - name: install Mbed TLS - if: matrix.tls_backend == 'mbedtls' - run: brew install mbedtls - - name: install wolfSSL - if: matrix.tls_backend == 'wolfssl' - run: brew install wolfssl - - name: build and run tests (OpenSSL) - if: matrix.tls_backend == 'openssl' - run: cd test && make test_split && make test_openssl_parallel - env: - LSAN_OPTIONS: suppressions=lsan_suppressions.txt - - name: build and run tests (Mbed TLS) - if: matrix.tls_backend == 'mbedtls' - run: cd test && make test_split_mbedtls && make test_mbedtls_parallel - - name: build and run tests (wolfSSL) - if: matrix.tls_backend == 'wolfssl' - run: cd test && make test_split_wolfssl && make test_wolfssl_parallel - - name: run fuzz test target - if: matrix.tls_backend == 'openssl' - run: cd test && make fuzz_test - - name: build and run WebSocket heartbeat test - if: matrix.tls_backend == 'openssl' - run: cd test && make test_websocket_heartbeat && ./test_websocket_heartbeat - - name: build and run WebSocket TLS thread safety test - if: matrix.tls_backend == 'openssl' - run: cd test && make test_websocket_thread_safety && ./test_websocket_thread_safety - - name: build and run ThreadPool test - run: cd test && make test_thread_pool && ./test_thread_pool - - ios-parse-check: - runs-on: macos-latest - if: > - (github.event_name == 'push') || - (github.event_name == 'pull_request' && - github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name) || - (github.event_name == 'workflow_dispatch' && github.event.inputs.test_macos == 'true') - name: ios header parse check (not officially supported) - steps: - - name: checkout - uses: actions/checkout@v4 - - name: install OpenSSL headers - run: brew install openssl@3 - - name: verify header parses on iOS target - run: | - IOS_SDK=$(xcrun --sdk iphoneos --show-sdk-path) - OPENSSL_INC=$(brew --prefix openssl@3)/include - echo "Using iOS SDK: $IOS_SDK" - echo '#include "httplib.h"' | clang++ \ - -isysroot "$IOS_SDK" \ - -target arm64-apple-ios16.0 \ - -std=c++11 \ - -DCPPHTTPLIB_OPENSSL_SUPPORT \ - -I"$OPENSSL_INC" \ - -I. -Wall -Wextra \ - -fsyntax-only -x c++ - - - name: verify CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN is rejected on iOS - run: | - IOS_SDK=$(xcrun --sdk iphoneos --show-sdk-path) - OPENSSL_INC=$(brew --prefix openssl@3)/include - out=$(echo '#include "httplib.h"' | clang++ \ - -isysroot "$IOS_SDK" \ - -target arm64-apple-ios16.0 \ - -std=c++11 \ - -DCPPHTTPLIB_OPENSSL_SUPPORT \ - -DCPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN \ - -I"$OPENSSL_INC" \ - -I. \ - -fsyntax-only -x c++ - 2>&1 || true) - if echo "$out" | grep -q "only supported on macOS"; then - echo "OK: #error fired as expected" - else - echo "FAIL: expected #error did not fire" - echo "--- compiler output ---" - echo "$out" - exit 1 - fi - - windows: - runs-on: windows-latest - permissions: - contents: read - if: > - (github.event_name == 'push') || - (github.event_name == 'pull_request' && - github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name) || - (github.event_name == 'workflow_dispatch' && github.event.inputs.test_windows == 'true') - strategy: - fail-fast: false - matrix: - config: - - with_ssl: false - compiled: false - run_tests: true - name: without SSL - - with_ssl: true - compiled: false - run_tests: true - name: with SSL - - with_ssl: false - compiled: true - run_tests: false - name: compiled - name: windows ${{ matrix.config.name }} - steps: - - name: Prepare Git for Checkout on Windows - run: | - git config --global core.autocrlf false - git config --global core.eol lf - - name: Checkout - uses: actions/checkout@v4 - - name: Export GitHub Actions cache environment variables - uses: actions/github-script@v7 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - name: Setup msbuild on windows - uses: microsoft/setup-msbuild@v2 - - name: Cache vcpkg packages - id: vcpkg-cache - uses: actions/cache@v4 - with: - path: C:/vcpkg/installed - key: vcpkg-installed-windows-gtest-curl-zlib-brotli-zstd - - name: Install vcpkg dependencies - if: steps.vcpkg-cache.outputs.cache-hit != 'true' - run: vcpkg install gtest curl zlib brotli zstd - - name: Install OpenSSL - if: ${{ matrix.config.with_ssl }} - shell: pwsh - run: | - # Chocolatey's openssl package hardcodes a versioned slproweb URL, and - # slproweb keeps only the newest build of each branch. The package - # therefore 404s on every OpenSSL release until someone respins it. - # Read slproweb's own manifest instead: it is updated at the same time - # as the downloads it points at, so the URL is always live. - $ErrorActionPreference = 'Stop' - $ProgressPreference = 'SilentlyContinue' # Invoke-WebRequest is slow with it - - $manifest = 'https://raw.githubusercontent.com/slproweb/opensslhashes/master/win32_openssl_hashes.json' - $entry = (Invoke-RestMethod $manifest).files.PSObject.Properties.Value | - Where-Object { - $_.bits -eq 64 -and $_.arch -eq 'INTEL' -and - -not $_.light -and $_.installer -eq 'exe' -and $_.basever -like '4.*' - } | - Sort-Object { [version]$_.basever } | Select-Object -Last 1 - if (-not $entry) { throw 'No 64-bit OpenSSL 4.x installer found in the manifest' } - Write-Host "Installing OpenSSL $($entry.basever) from $($entry.url)" - - $installer = Join-Path $env:RUNNER_TEMP 'Win64OpenSSL.exe' - Invoke-WebRequest $entry.url -OutFile $installer - $actual = (Get-FileHash $installer -Algorithm SHA512).Hash.ToLower() - if ($actual -ne $entry.sha512.ToLower()) { - throw "SHA512 mismatch: expected $($entry.sha512), got $actual" - } - - # Same silent flags the Chocolatey package used. The installer is Inno - # Setup, so /DIR pins the location CMake already looks in. The inner - # quotes matter: ArgumentList joins on spaces, so an unquoted /DIR - # would install to C:\Program and only fail later, at load time. - $dir = 'C:\Program Files\OpenSSL' - $proc = Start-Process $installer -Wait -PassThru -ArgumentList ` - '/VERYSILENT', '/SUPPRESSMSGBOXES', '/NORESTART', '/SP-', "/DIR=`"$dir`"" - if ($proc.ExitCode -ne 0) { throw "Installer exited with $($proc.ExitCode)" } - - # Catch a misplaced install here rather than at link or load time. - if (-not (Test-Path "$dir\lib\VC\x64\MD\libcrypto.lib")) { - throw "OpenSSL import libraries missing under $dir" - } - if (-not (Get-ChildItem "$dir\bin\libcrypto-*.dll" -ErrorAction SilentlyContinue)) { - throw "OpenSSL runtime DLLs missing under $dir\bin" - } - - "$dir\bin" | Out-File $env:GITHUB_PATH -Append -Encoding utf8 - "OPENSSL_CONF=$dir\bin\openssl.cfg" | Out-File $env:GITHUB_ENV -Append -Encoding utf8 - - name: Configure CMake ${{ matrix.config.name }} - run: > - cmake -B build -S . - -DCMAKE_BUILD_TYPE=Release - -DCMAKE_TOOLCHAIN_FILE=${{ env.VCPKG_ROOT }}/scripts/buildsystems/vcpkg.cmake - -DHTTPLIB_TEST=ON - -DHTTPLIB_COMPILE=${{ matrix.config.compiled && 'ON' || 'OFF' }} - -DHTTPLIB_USE_OPENSSL_IF_AVAILABLE=${{ matrix.config.with_ssl && 'ON' || 'OFF' }} - -DHTTPLIB_REQUIRE_ZLIB=ON - -DHTTPLIB_REQUIRE_BROTLI=ON - -DHTTPLIB_REQUIRE_ZSTD=ON - -DHTTPLIB_REQUIRE_OPENSSL=${{ matrix.config.with_ssl && 'ON' || 'OFF' }} - - name: Build ${{ matrix.config.name }} - run: cmake --build build --config Release -- /v:m /clp:ShowCommandLine - - name: Run tests ${{ matrix.config.name }} - if: ${{ matrix.config.run_tests }} - shell: pwsh - working-directory: build/test - run: | - $shards = 4 - $procs = @() - for ($i = 0; $i -lt $shards; $i++) { - $log = "shard_${i}.log" - $procs += Start-Process -FilePath ./Release/httplib-test.exe ` - -ArgumentList "--gtest_color=yes","--gtest_filter=${{ github.event.inputs.gtest_filter || '-*_Online' }}" ` - -NoNewWindow -PassThru -RedirectStandardOutput $log -RedirectStandardError "${log}.err" ` - -Environment @{ GTEST_TOTAL_SHARDS="$shards"; GTEST_SHARD_INDEX="$i" } - } - $procs | Wait-Process - $failed = $false - for ($i = 0; $i -lt $shards; $i++) { - $log = "shard_${i}.log" - $proc = $procs[$i] - $hasPassed = Select-String -Path $log -Pattern "\[ PASSED \]" -Quiet - $hasFailed = Select-String -Path $log -Pattern "\[ FAILED \]" -Quiet - if ($hasPassed -and -not $hasFailed -and $proc.ExitCode -eq 0) { - $passed = (Select-String -Path $log -Pattern "\[ PASSED \]").Line - Write-Host "Shard ${i}: $passed" - } else { - Write-Host "=== Shard $i FAILED (exit=$($proc.ExitCode)) ===" - Get-Content $log - if (Test-Path "${log}.err") { Get-Content "${log}.err" } - $failed = $true - } - } - if ($failed) { exit 1 } - Write-Host "All shards passed." - - env: - VCPKG_ROOT: "C:/vcpkg" - VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" diff --git a/libs/cpp-httplib-0.57.1/.github/workflows/test_benchmark.yaml b/libs/cpp-httplib-0.57.1/.github/workflows/test_benchmark.yaml deleted file mode 100644 index e2c0b01..0000000 --- a/libs/cpp-httplib-0.57.1/.github/workflows/test_benchmark.yaml +++ /dev/null @@ -1,79 +0,0 @@ -name: benchmark - -on: - push: - pull_request: - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.ref || github.run_id }} - cancel-in-progress: true - -jobs: - ubuntu: - runs-on: ubuntu-latest - if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name - steps: - - name: checkout - uses: actions/checkout@v4 - - name: build and run - run: cd test && make test_benchmark && ./test_benchmark - - macos: - runs-on: macos-latest - if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name - steps: - - name: checkout - uses: actions/checkout@v4 - - name: build and run - run: cd test && make test_benchmark && ./test_benchmark - - windows: - runs-on: windows-latest - if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name - steps: - - name: Prepare Git for Checkout on Windows - run: | - git config --global core.autocrlf false - git config --global core.eol lf - - name: checkout - uses: actions/checkout@v4 - - name: Export GitHub Actions cache environment variables - uses: actions/github-script@v7 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - name: Cache vcpkg packages - id: vcpkg-cache - uses: actions/cache@v4 - with: - path: C:/vcpkg/installed - key: vcpkg-installed-windows-gtest - - name: Install vcpkg dependencies - if: steps.vcpkg-cache.outputs.cache-hit != 'true' - run: vcpkg install gtest - - name: Configure and build - shell: pwsh - run: | - $cmake_content = @" - cmake_minimum_required(VERSION 3.14) - project(httplib-benchmark CXX) - find_package(GTest REQUIRED) - add_executable(httplib-benchmark test/test_benchmark.cc) - target_include_directories(httplib-benchmark PRIVATE .) - target_link_libraries(httplib-benchmark PRIVATE GTest::gtest_main) - target_compile_options(httplib-benchmark PRIVATE "$<$:/utf-8>") - "@ - New-Item -ItemType Directory -Force -Path build_bench/test | Out-Null - Set-Content -Path build_bench/CMakeLists.txt -Value $cmake_content - Copy-Item -Path httplib.h -Destination build_bench/ - Copy-Item -Path test/test_benchmark.cc -Destination build_bench/test/ - cmake -B build_bench/build -S build_bench ` - -DCMAKE_TOOLCHAIN_FILE="$env:VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake" - cmake --build build_bench/build --config Release - - name: Run with retry - run: ctest --output-on-failure --test-dir build_bench/build -C Release --repeat until-pass:5 - env: - VCPKG_ROOT: "C:/vcpkg" - VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" diff --git a/libs/cpp-httplib-0.57.1/.github/workflows/test_no_exceptions.yaml b/libs/cpp-httplib-0.57.1/.github/workflows/test_no_exceptions.yaml deleted file mode 100644 index f525297..0000000 --- a/libs/cpp-httplib-0.57.1/.github/workflows/test_no_exceptions.yaml +++ /dev/null @@ -1,20 +0,0 @@ -name: No Exceptions Test - -on: [push, pull_request] - -jobs: - test-no-exceptions: - runs-on: ubuntu-latest - if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name - - steps: - - uses: actions/checkout@v3 - - - name: Install dependencies - run: | - sudo apt-get update - sudo apt-get install -y build-essential libssl-dev zlib1g-dev libcurl4-openssl-dev libbrotli-dev libzstd-dev - - - name: Run tests with CPPHTTPLIB_NO_EXCEPTIONS - run: | - cd test && make test_split EXTRA_CXXFLAGS="-fno-exceptions -DCPPHTTPLIB_NO_EXCEPTIONS" && make test_openssl_parallel EXTRA_CXXFLAGS="-fno-exceptions -DCPPHTTPLIB_NO_EXCEPTIONS" diff --git a/libs/cpp-httplib-0.57.1/.github/workflows/test_offline.yaml b/libs/cpp-httplib-0.57.1/.github/workflows/test_offline.yaml deleted file mode 100644 index 42c4495..0000000 --- a/libs/cpp-httplib-0.57.1/.github/workflows/test_offline.yaml +++ /dev/null @@ -1,62 +0,0 @@ -name: test_offline - -on: - push: - pull_request: - workflow_dispatch: - inputs: - test_linux: - description: 'Test on Linux' - type: boolean - default: true - -concurrency: - group: ${{ github.workflow }}-${{ github.ref || github.run_id }} - cancel-in-progress: true - -env: - GTEST_FILTER: "-*.*_Online" - -jobs: - ubuntu: - runs-on: ubuntu-latest - if: > - (github.event_name == 'push') || - (github.event_name == 'pull_request' && - github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name) || - (github.event_name == 'workflow_dispatch' && github.event.inputs.test_linux == 'true') - strategy: - matrix: - tls_backend: [openssl, no-tls] - name: ubuntu (${{ matrix.tls_backend }}) - steps: - - name: checkout - uses: actions/checkout@v4 - - name: install common libraries - run: | - sudo apt-get update - sudo apt-get install -y libcurl4-openssl-dev zlib1g-dev libbrotli-dev libzstd-dev - - name: install OpenSSL - if: matrix.tls_backend == 'openssl' - run: sudo apt-get install -y libssl-dev - - name: disable network - run: | - sudo iptables -A OUTPUT -o lo -j ACCEPT - sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT - sudo iptables -A OUTPUT -j REJECT - sudo ip6tables -A OUTPUT -o lo -j ACCEPT - sudo ip6tables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT - sudo ip6tables -A OUTPUT -j REJECT - - name: build and run tests (OpenSSL) - if: matrix.tls_backend == 'openssl' - run: cd test && make test_split && make test_openssl_parallel - env: - LSAN_OPTIONS: suppressions=lsan_suppressions.txt - - name: build and run tests (No TLS) - if: matrix.tls_backend == 'no-tls' - run: cd test && make test_no_tls_parallel - - name: restore network - if: always() - run: | - sudo iptables -F OUTPUT - sudo ip6tables -F OUTPUT diff --git a/libs/cpp-httplib-0.57.1/.github/workflows/test_proxy.yaml b/libs/cpp-httplib-0.57.1/.github/workflows/test_proxy.yaml deleted file mode 100644 index cf09432..0000000 --- a/libs/cpp-httplib-0.57.1/.github/workflows/test_proxy.yaml +++ /dev/null @@ -1,37 +0,0 @@ -name: Proxy Test - -on: [push, pull_request] - -jobs: - test-proxy: - runs-on: ubuntu-latest - if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name - strategy: - matrix: - tls_backend: [openssl, mbedtls] - name: proxy (${{ matrix.tls_backend }}) - - steps: - - uses: actions/checkout@v4 - - - name: Install common dependencies - run: | - sudo apt-get update - sudo apt-get install -y build-essential zlib1g-dev libcurl4-openssl-dev libbrotli-dev libzstd-dev netcat-openbsd - - name: Install OpenSSL - if: matrix.tls_backend == 'openssl' - run: sudo apt-get install -y libssl-dev - - name: Install Mbed TLS - if: matrix.tls_backend == 'mbedtls' - run: sudo apt-get install -y libmbedtls-dev - - - name: Run proxy tests (OpenSSL) - if: matrix.tls_backend == 'openssl' - run: cd test && make proxy - env: - COMPOSE_FILE: docker-compose.yml:docker-compose.ci.yml - - name: Run proxy tests (Mbed TLS) - if: matrix.tls_backend == 'mbedtls' - run: cd test && make proxy_mbedtls - env: - COMPOSE_FILE: docker-compose.yml:docker-compose.ci.yml \ No newline at end of file diff --git a/libs/cpp-httplib-0.57.1/CMakeLists.txt b/libs/cpp-httplib-0.57.1/CMakeLists.txt deleted file mode 100644 index d3d8c29..0000000 --- a/libs/cpp-httplib-0.57.1/CMakeLists.txt +++ /dev/null @@ -1,470 +0,0 @@ -#[[ - Build options: - * Standard BUILD_SHARED_LIBS is supported and sets HTTPLIB_SHARED default value. - * HTTPLIB_USE_OPENSSL_IF_AVAILABLE (default on) - * HTTPLIB_USE_WOLFSSL_IF_AVAILABLE (default off) - * HTTPLIB_USE_MBEDTLS_IF_AVAILABLE (default off) - * HTTPLIB_USE_ZLIB_IF_AVAILABLE (default on) - * HTTPLIB_USE_BROTLI_IF_AVAILABLE (default on) - * HTTPLIB_USE_ZSTD_IF_AVAILABLE (default on) - * HTTPLIB_BUILD_MODULES (default off) - * HTTPLIB_REQUIRE_OPENSSL (default off) - * HTTPLIB_REQUIRE_WOLFSSL (default off) - * HTTPLIB_REQUIRE_MBEDTLS (default off) - * HTTPLIB_REQUIRE_ZLIB (default off) - * HTTPLIB_REQUIRE_BROTLI (default off) - * HTTPLIB_REQUIRE_ZSTD (default off) - * HTTPLIB_DISABLE_MACOSX_AUTOMATIC_ROOT_CERTIFICATES (default off) - * HTTPLIB_USE_NON_BLOCKING_GETADDRINFO (default on) - * HTTPLIB_COMPILE (default off) - * HTTPLIB_INSTALL (default on) - * HTTPLIB_SHARED (default off) builds as a shared library (if HTTPLIB_COMPILE is ON) - * HTTPLIB_TEST (default off) - * BROTLI_USE_STATIC_LIBS - tells Cmake to use the static Brotli libs (only works if you have them installed). - * OPENSSL_USE_STATIC_LIBS - tells Cmake to use the static OpenSSL libs (only works if you have them installed). - - ------------------------------------------------------------------------------- - - After installation with Cmake, a find_package(httplib COMPONENTS OpenSSL wolfssl MbedTLS ZLIB Brotli zstd) is available. - This creates a httplib::httplib target (if found and if listed components are supported). - It can be linked like so: - - target_link_libraries(your_exe httplib::httplib) - - The following will build & install for later use. - - Linux/macOS: - - mkdir -p build - cd build - cmake -DCMAKE_BUILD_TYPE=Release .. - sudo cmake --build . --target install - - Windows: - - mkdir build - cd build - cmake .. - runas /user:Administrator "cmake --build . --config Release --target install" - - ------------------------------------------------------------------------------- - - These variables are available after you run find_package(httplib) - * HTTPLIB_HEADER_PATH - this is the full path to the installed header (e.g. /usr/include/httplib.h). - * HTTPLIB_IS_USING_OPENSSL - a bool for if OpenSSL support is enabled. - * HTTPLIB_IS_USING_WOLFSSL - a bool for if wolfSSL support is enabled. - * HTTPLIB_IS_USING_MBEDTLS - a bool for if MbedTLS support is enabled. - * HTTPLIB_IS_USING_ZLIB - a bool for if ZLIB support is enabled. - * HTTPLIB_IS_USING_BROTLI - a bool for if Brotli support is enabled. - * HTTPLIB_IS_USING_ZSTD - a bool for if ZSTD support is enabled. - * HTTPLIB_IS_USING_MACOSX_AUTOMATIC_ROOT_CERTIFICATES - a bool for if support of loading system certs from the Apple Keychain is enabled. - * HTTPLIB_IS_USING_NON_BLOCKING_GETADDRINFO - a bool for if nonblocking getaddrinfo is enabled. - * HTTPLIB_IS_COMPILED - a bool for if the library is compiled, or otherwise header-only. - * HTTPLIB_INCLUDE_DIR - the root path to httplib's header (e.g. /usr/include). - * HTTPLIB_LIBRARY - the full path to the library if compiled (e.g. /usr/lib/libhttplib.so). - * httplib_VERSION or HTTPLIB_VERSION - the project's version string. - * HTTPLIB_FOUND - a bool for if the target was found. - - Want to use precompiled headers (Cmake feature since v3.16)? - It's as simple as doing the following (before linking): - - target_precompile_headers(httplib::httplib INTERFACE "${HTTPLIB_HEADER_PATH}") - - ------------------------------------------------------------------------------- - - ARCH_INDEPENDENT option of write_basic_package_version_file() requires Cmake v3.14 -]] -cmake_minimum_required(VERSION 3.14.0 FATAL_ERROR) - -# Get the CPPHTTPLIB_VERSION value and use it as a version -# This gets the string with the CPPHTTPLIB_VERSION value from the header. -# This is so the maintainer doesn't actually need to update this manually. -file(STRINGS httplib.h _raw_version_string REGEX "CPPHTTPLIB_VERSION \"([0-9]+\\.[0-9]+\\.[0-9]+)\"") - -# Extracts just the version string itself from the whole string contained in _raw_version_string -# since _raw_version_string would contain the entire line of code where it found the version string -string(REGEX MATCH "([0-9]+\\.?)+" _httplib_version "${_raw_version_string}") - -project(httplib - VERSION ${_httplib_version} - LANGUAGES CXX - DESCRIPTION "A C++ header-only HTTP/HTTPS server and client library." - HOMEPAGE_URL "https://github.com/yhirose/cpp-httplib" -) - -# Change as needed to set an OpenSSL minimum version. -# This is used in the installed Cmake config file. -set(_HTTPLIB_OPENSSL_MIN_VER "3.0.0") - -# Lets you disable C++ exception during CMake configure time. -# The value is used in the install CMake config file. -option(HTTPLIB_NO_EXCEPTIONS "Disable the use of C++ exceptions" OFF) -# Allow for a build to require OpenSSL to pass, instead of just being optional -option(HTTPLIB_REQUIRE_OPENSSL "Requires OpenSSL to be found & linked, or fails build." OFF) -option(HTTPLIB_REQUIRE_WOLFSSL "Requires wolfSSL to be found & linked, or fails build." OFF) -option(HTTPLIB_REQUIRE_MBEDTLS "Requires MbedTLS to be found & linked, or fails build." OFF) -option(HTTPLIB_REQUIRE_ZLIB "Requires ZLIB to be found & linked, or fails build." OFF) -# Allow for a build to casually enable OpenSSL/ZLIB support, but silently continue if not found. -# Make these options so their automatic use can be specifically disabled (as needed) -option(HTTPLIB_USE_OPENSSL_IF_AVAILABLE "Uses OpenSSL (if available) to enable HTTPS support." ON) -option(HTTPLIB_USE_WOLFSSL_IF_AVAILABLE "Uses wolfSSL (if available) to enable HTTPS support." OFF) -option(HTTPLIB_USE_MBEDTLS_IF_AVAILABLE "Uses MbedTLS (if available) to enable HTTPS support." OFF) -option(HTTPLIB_USE_ZLIB_IF_AVAILABLE "Uses ZLIB (if available) to enable Zlib compression support." ON) -# Lets you compile the program as a regular library instead of header-only -option(HTTPLIB_COMPILE "If ON, uses a Python script to split the header into a compilable header & source file (requires Python v3)." OFF) -# Lets you disable the installation (useful when fetched from another CMake project) -option(HTTPLIB_INSTALL "Enables the installation target" ON) -option(HTTPLIB_TEST "Enables testing and builds tests" OFF) -option(HTTPLIB_REQUIRE_BROTLI "Requires Brotli to be found & linked, or fails build." OFF) -option(HTTPLIB_USE_BROTLI_IF_AVAILABLE "Uses Brotli (if available) to enable Brotli decompression support." ON) -option(HTTPLIB_DISABLE_MACOSX_AUTOMATIC_ROOT_CERTIFICATES "Disable loading system certs from the Apple Keychain on macOS." OFF) -option(HTTPLIB_USE_NON_BLOCKING_GETADDRINFO "Enables the non-blocking alternatives for getaddrinfo." ON) -option(HTTPLIB_REQUIRE_ZSTD "Requires ZSTD to be found & linked, or fails build." OFF) -option(HTTPLIB_USE_ZSTD_IF_AVAILABLE "Uses ZSTD (if available) to enable zstd support." ON) -# C++20 modules support requires CMake 3.28 or later -if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.28") - option(HTTPLIB_BUILD_MODULES "Build httplib modules (requires HTTPLIB_COMPILE to be ON)." OFF) -else() - set(HTTPLIB_BUILD_MODULES OFF CACHE INTERNAL "Build httplib modules disabled (requires CMake 3.28+)" FORCE) - if(DEFINED CACHE{HTTPLIB_BUILD_MODULES} AND HTTPLIB_BUILD_MODULES) - message(WARNING "HTTPLIB_BUILD_MODULES requires CMake 3.28 or later. Current version is ${CMAKE_VERSION}. Modules support has been disabled.") - endif() -endif() - -# Incompatibility between TLS libraries -set(TLS_LIBRARIES_USED_TMP 0) - -foreach(tls_library OPENSSL WOLFSSL MBEDTLS) - set(TLS_REQUIRED ${HTTPLIB_REQUIRE_${tls_library}}) - set(TLS_IF_AVAILABLE ${HTTPLIB_USE_${tls_library}_IF_AVAILABLE}) - - if(TLS_REQUIRED OR TLS_IF_AVAILABLE) - math(EXPR TLS_LIBRARIES_USED_TMP "${TLS_LIBRARIES_USED_TMP} + 1") - endif() -endforeach() - -if(TLS_LIBRARIES_USED_TMP GREATER 1) - message(FATAL_ERROR "TLS libraries are mutually exclusive.") -endif() - -# Defaults to static library but respects standard BUILD_SHARED_LIBS if set -include(CMakeDependentOption) -cmake_dependent_option(HTTPLIB_SHARED "Build the library as a shared library instead of static. Has no effect if using header-only." - "${BUILD_SHARED_LIBS}" HTTPLIB_COMPILE OFF -) -if(HTTPLIB_SHARED) - set(HTTPLIB_LIB_TYPE SHARED) - if(WIN32) - # Necessary for Windows if building shared libs - # See https://stackoverflow.com/a/40743080 - set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) - endif() -else() - set(HTTPLIB_LIB_TYPE STATIC) -endif() - -if(CMAKE_SYSTEM_NAME MATCHES "Windows") - if(CMAKE_SYSTEM_VERSION) - if(${CMAKE_SYSTEM_VERSION} VERSION_LESS "10.0.0") - message(WARNING "Windows ${CMAKE_SYSTEM_VERSION} or lower is not supported. Please use Windows 10 or later.") - endif() - else() - set(CMAKE_SYSTEM_VERSION "10.0.19041.0") - message(WARNING "The target is Windows but CMAKE_SYSTEM_VERSION is not set, the default system version is set to Windows 10.") - endif() -endif() - -# Set some variables that are used in-tree and while building based on our options -set(HTTPLIB_IS_COMPILED ${HTTPLIB_COMPILE}) -set(HTTPLIB_IS_USING_MACOSX_AUTOMATIC_ROOT_CERTIFICATES TRUE) -if(HTTPLIB_DISABLE_MACOSX_AUTOMATIC_ROOT_CERTIFICATES) - set(HTTPLIB_IS_USING_MACOSX_AUTOMATIC_ROOT_CERTIFICATES FALSE) -endif() -set(HTTPLIB_IS_USING_NON_BLOCKING_GETADDRINFO ${HTTPLIB_USE_NON_BLOCKING_GETADDRINFO}) - -# Threads needed for on some systems, and for on Linux -set(THREADS_PREFER_PTHREAD_FLAG TRUE) -find_package(Threads REQUIRED) -# Since Cmake v3.11, Crypto & SSL became optional when not specified as COMPONENTS. -if(HTTPLIB_REQUIRE_OPENSSL) - find_package(OpenSSL ${_HTTPLIB_OPENSSL_MIN_VER} COMPONENTS Crypto SSL REQUIRED) - set(HTTPLIB_IS_USING_OPENSSL TRUE) -elseif(HTTPLIB_USE_OPENSSL_IF_AVAILABLE) - find_package(OpenSSL ${_HTTPLIB_OPENSSL_MIN_VER} COMPONENTS Crypto SSL QUIET) - # Avoid a rare circumstance of not finding all components but the end-user did their - # own call for OpenSSL, which might trick us into thinking we'd otherwise have what we wanted - if (TARGET OpenSSL::SSL AND TARGET OpenSSL::Crypto) - set(HTTPLIB_IS_USING_OPENSSL ${OPENSSL_FOUND}) - else() - set(HTTPLIB_IS_USING_OPENSSL FALSE) - endif() -endif() - -if(HTTPLIB_REQUIRE_WOLFSSL) - find_package(wolfssl REQUIRED) - set(HTTPLIB_IS_USING_WOLFSSL TRUE) -elseif(HTTPLIB_USE_WOLFSSL_IF_AVAILABLE) - find_package(wolfssl QUIET) - set(HTTPLIB_IS_USING_WOLFSSL ${wolfssl_FOUND}) -endif() - -if(HTTPLIB_REQUIRE_MBEDTLS) - find_package(MbedTLS REQUIRED) - set(HTTPLIB_IS_USING_MBEDTLS TRUE) -elseif(HTTPLIB_USE_MBEDTLS_IF_AVAILABLE) - find_package(MbedTLS QUIET) - set(HTTPLIB_IS_USING_MBEDTLS ${MbedTLS_FOUND}) -endif() - -if(HTTPLIB_REQUIRE_ZLIB) - find_package(ZLIB REQUIRED) - set(HTTPLIB_IS_USING_ZLIB TRUE) -elseif(HTTPLIB_USE_ZLIB_IF_AVAILABLE) - find_package(ZLIB QUIET) - # FindZLIB doesn't have a ZLIB_FOUND variable, so check the target. - if(TARGET ZLIB::ZLIB) - set(HTTPLIB_IS_USING_ZLIB TRUE) - endif() -endif() - -# Adds our cmake folder to the search path for find_package -# This is so we can use our custom FindBrotli.cmake -list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") -if(HTTPLIB_REQUIRE_BROTLI) - find_package(Brotli COMPONENTS encoder decoder common REQUIRED) - set(HTTPLIB_IS_USING_BROTLI TRUE) -elseif(HTTPLIB_USE_BROTLI_IF_AVAILABLE) - find_package(Brotli COMPONENTS encoder decoder common QUIET) - set(HTTPLIB_IS_USING_BROTLI ${Brotli_FOUND}) -endif() - -# NOTE: -# zstd < 1.5.6 does not provide the CMake imported target `zstd::libzstd`. -# Older versions must be consumed via their pkg-config file. -if(HTTPLIB_REQUIRE_ZSTD) - if (NOT TARGET zstd::libzstd) - find_package(zstd 1.5.6 CONFIG) - if(NOT zstd_FOUND) - find_package(PkgConfig REQUIRED) - pkg_check_modules(zstd REQUIRED IMPORTED_TARGET libzstd) - add_library(zstd::libzstd ALIAS PkgConfig::zstd) - endif() - endif() - set(HTTPLIB_IS_USING_ZSTD TRUE) -elseif(HTTPLIB_USE_ZSTD_IF_AVAILABLE) - if (TARGET zstd::libzstd) - set(HTTPLIB_IS_USING_ZSTD TRUE) - else() - find_package(zstd 1.5.6 CONFIG QUIET) - if(NOT zstd_FOUND) - find_package(PkgConfig QUIET) - if(PKG_CONFIG_FOUND) - pkg_check_modules(zstd QUIET IMPORTED_TARGET libzstd) - - if(TARGET PkgConfig::zstd) - add_library(zstd::libzstd ALIAS PkgConfig::zstd) - endif() - endif() - endif() - # Both find_package and PkgConf set a XXX_FOUND var - set(HTTPLIB_IS_USING_ZSTD ${zstd_FOUND}) - endif() -endif() - -# Used for default, common dirs that the end-user can change (if needed) -# like CMAKE_INSTALL_INCLUDEDIR or CMAKE_INSTALL_DATADIR -include(GNUInstallDirs) - -if(HTTPLIB_COMPILE) - # Put the split script into the build dir - configure_file(split.py "${CMAKE_CURRENT_BINARY_DIR}/split.py" - COPYONLY - ) - # Needs to be in the same dir as the python script - configure_file(httplib.h "${CMAKE_CURRENT_BINARY_DIR}/httplib.h" - COPYONLY - ) - - # Used outside of this if-else - set(_INTERFACE_OR_PUBLIC PUBLIC) - # Brings in the Python3_EXECUTABLE path we can use. - find_package(Python3 REQUIRED) - # Actually split the file - # Keeps the output in the build dir to not pollute the main dir - execute_process(COMMAND ${Python3_EXECUTABLE} "${CMAKE_CURRENT_BINARY_DIR}/split.py" - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - ERROR_VARIABLE _httplib_split_error - ) - if(_httplib_split_error) - message(FATAL_ERROR "Failed when trying to split cpp-httplib with the Python script.\n${_httplib_split_error}") - endif() - - # If building modules, also generate the module file - if(HTTPLIB_BUILD_MODULES) - # Put the generate_module script into the build dir - configure_file(generate_module.py "${CMAKE_CURRENT_BINARY_DIR}/generate_module.py" - COPYONLY - ) - # Generate the module file - execute_process(COMMAND ${Python3_EXECUTABLE} "${CMAKE_CURRENT_BINARY_DIR}/generate_module.py" - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - ERROR_VARIABLE _httplib_module_error - ) - if(_httplib_module_error) - message(FATAL_ERROR "Failed when trying to generate cpp-httplib module with the Python script.\n${_httplib_module_error}") - endif() - endif() - - # split.py puts output in "out" - set(_httplib_build_includedir "${CMAKE_CURRENT_BINARY_DIR}/out") - add_library(${PROJECT_NAME} ${HTTPLIB_LIB_TYPE} "${_httplib_build_includedir}/httplib.cc") - target_sources(${PROJECT_NAME} - PUBLIC - $ - $ - ) - - # Add C++20 module support if requested - # Include from separate file to prevent parse errors on older CMake versions - if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.28") - include(cmake/modules.cmake) - endif() - - set_target_properties(${PROJECT_NAME} - PROPERTIES - VERSION ${${PROJECT_NAME}_VERSION} - SOVERSION "${${PROJECT_NAME}_VERSION_MAJOR}.${${PROJECT_NAME}_VERSION_MINOR}" - OUTPUT_NAME cpp-httplib - ) -else() - # This is for header-only. - set(_INTERFACE_OR_PUBLIC INTERFACE) - add_library(${PROJECT_NAME} INTERFACE) - set(_httplib_build_includedir "${CMAKE_CURRENT_SOURCE_DIR}") -endif() -# Lets you address the target with httplib::httplib -# Only useful if building in-tree, versus using it from an installation. -add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME}) - -# Require C++11, or C++20 if modules are enabled -if(HTTPLIB_BUILD_MODULES) - target_compile_features(${PROJECT_NAME} ${_INTERFACE_OR_PUBLIC} cxx_std_20) -else() - target_compile_features(${PROJECT_NAME} ${_INTERFACE_OR_PUBLIC} cxx_std_11) -endif() - -target_include_directories(${PROJECT_NAME} SYSTEM ${_INTERFACE_OR_PUBLIC} - $ - $ -) - -target_link_libraries(${PROJECT_NAME} ${_INTERFACE_OR_PUBLIC} - # Always require threads - Threads::Threads - # Needed for Windows libs on Mingw, as the pragma comment(lib, "xyz") aren't triggered. - $<$:ws2_32> - $<$:crypt32> - # Needed for API from MacOS Security framework - "$<$,$,$>:-framework CFNetwork -framework CoreFoundation -framework Security>" - # Needed for non-blocking getaddrinfo on MacOS - "$<$,$>:-framework CFNetwork -framework CoreFoundation>" - # Can't put multiple targets in a single generator expression or it bugs out. - $<$:Brotli::common> - $<$:Brotli::encoder> - $<$:Brotli::decoder> - $<$:ZLIB::ZLIB> - $<$:zstd::libzstd> - $<$:OpenSSL::SSL> - $<$:OpenSSL::Crypto> - $<$:wolfssl::wolfssl> - $<$:MbedTLS::mbedtls> -) - -# Set the definitions to enable optional features -target_compile_definitions(${PROJECT_NAME} ${_INTERFACE_OR_PUBLIC} - $<$:CPPHTTPLIB_NO_EXCEPTIONS> - $<$:CPPHTTPLIB_BROTLI_SUPPORT> - $<$:CPPHTTPLIB_ZLIB_SUPPORT> - $<$:CPPHTTPLIB_ZSTD_SUPPORT> - $<$:CPPHTTPLIB_OPENSSL_SUPPORT> - $<$:CPPHTTPLIB_WOLFSSL_SUPPORT> - $<$:CPPHTTPLIB_MBEDTLS_SUPPORT> - $<$,$>:CPPHTTPLIB_DISABLE_MACOSX_AUTOMATIC_ROOT_CERTIFICATES> - $<$:CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO> -) - -# CMake configuration files installation directory -set(_TARGET_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") - -include(CMakePackageConfigHelpers) - -# Configures the meta-file httplibConfig.cmake.in to replace variables with paths/values/etc. -configure_package_config_file("cmake/${PROJECT_NAME}Config.cmake.in" - "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" - INSTALL_DESTINATION "${_TARGET_INSTALL_CMAKEDIR}" - # Passes the includedir install path - PATH_VARS CMAKE_INSTALL_FULL_INCLUDEDIR -) - -if(HTTPLIB_COMPILE) - write_basic_package_version_file("${PROJECT_NAME}ConfigVersion.cmake" - # Example: if you find_package(httplib 0.5.4) - # then anything >= 0.5.4 and < 0.6 is accepted - COMPATIBILITY SameMinorVersion - ) -else() - write_basic_package_version_file("${PROJECT_NAME}ConfigVersion.cmake" - # Example: if you find_package(httplib 0.5.4) - # then anything >= 0.5.4 and < 0.6 is accepted - COMPATIBILITY SameMinorVersion - # Tells Cmake that it's a header-only lib - # Mildly useful for end-users :) - ARCH_INDEPENDENT - ) -endif() - -if(HTTPLIB_INSTALL) - # Creates the export httplibTargets.cmake - # This is strictly what holds compilation requirements - # and linkage information (doesn't find deps though). - if(HTTPLIB_BUILD_MODULES) - install(TARGETS ${PROJECT_NAME} EXPORT httplibTargets FILE_SET CXX_MODULES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/httplib/modules CXX_MODULES_BMI DESTINATION ${CMAKE_INSTALL_LIBDIR}/httplib/modules) - else() - install(TARGETS ${PROJECT_NAME} EXPORT httplibTargets) - endif() - - install(FILES "${_httplib_build_includedir}/httplib.h" TYPE INCLUDE) - - install(FILES - "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" - "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" - # Install it so it can be used later by the httplibConfig.cmake file. - # Put it in the same dir as our config file instead of a global path so we don't potentially stomp on other packages. - "${CMAKE_CURRENT_SOURCE_DIR}/cmake/FindBrotli.cmake" - DESTINATION ${_TARGET_INSTALL_CMAKEDIR} - ) - - # NOTE: This path changes depending on if it's on Windows or Linux - install(EXPORT httplibTargets - # Puts the targets into the httplib namespace - # So this makes httplib::httplib linkable after doing find_package(httplib) - NAMESPACE ${PROJECT_NAME}:: - DESTINATION ${_TARGET_INSTALL_CMAKEDIR} - ) - - # Install documentation & license - # ex: /usr/share/doc/httplib/README.md and /usr/share/licenses/httplib/LICENSE - install(FILES "README.md" DESTINATION "${CMAKE_INSTALL_DOCDIR}") - install(FILES "LICENSE" DESTINATION "${CMAKE_INSTALL_DATADIR}/licenses/${PROJECT_NAME}") - - include(CPack) -endif() - -if(HTTPLIB_BUILD_MODULES AND NOT HTTPLIB_COMPILE) - message(FATAL_ERROR "HTTPLIB_BUILD_MODULES requires HTTPLIB_COMPILE to be ON.") -endif() - -if(HTTPLIB_TEST) - include(CTest) - add_subdirectory(test) -endif() diff --git a/libs/cpp-httplib-0.57.1/Dockerfile b/libs/cpp-httplib-0.57.1/Dockerfile deleted file mode 100644 index 3495b42..0000000 --- a/libs/cpp-httplib-0.57.1/Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM yhirose4dockerhub/ubuntu-builder AS builder -WORKDIR /build -COPY httplib.h . -COPY docker/main.cc . -RUN g++ -std=c++23 -static -o server -O2 -I. main.cc && strip server - -FROM scratch -COPY --from=builder /build/server /server -COPY docker/html/index.html /html/index.html -EXPOSE 80 - -ENTRYPOINT ["/server"] -CMD ["--host", "0.0.0.0", "--port", "80", "--mount", "/:./html"] diff --git a/libs/cpp-httplib-0.57.1/README-sse.md b/libs/cpp-httplib-0.57.1/README-sse.md deleted file mode 100644 index 223dcc3..0000000 --- a/libs/cpp-httplib-0.57.1/README-sse.md +++ /dev/null @@ -1,204 +0,0 @@ -# SSEClient - Server-Sent Events Client - -A simple, EventSource-like SSE client for C++11. - -## Features - -- **Auto-reconnect**: Automatically reconnects on connection loss -- **Last-Event-ID**: Sends last received ID on reconnect for resumption -- **retry field**: Respects server's reconnect interval -- **Event types**: Supports custom event types via `on_event()` -- **Async support**: Run in background thread with `start_async()` -- **C++11 compatible**: No C++14/17/20 features required - -## Quick Start - -```cpp -httplib::Client cli("http://localhost:8080"); -httplib::sse::SSEClient sse(cli, "/events"); - -sse.on_message([](const httplib::sse::SSEMessage &msg) { - std::cout << "Event: " << msg.event << std::endl; - std::cout << "Data: " << msg.data << std::endl; -}); - -sse.start(); // Blocking, with auto-reconnect -``` - -## API Reference - -### SSEMessage - -```cpp -struct SSEMessage { - std::string event; // Event type (default: "message") - std::string data; // Event payload - std::string id; // Event ID -}; -``` - -### SSEClient - -#### Constructor - -```cpp -// Basic -SSEClient(Client &client, const std::string &path); - -// With custom headers -SSEClient(Client &client, const std::string &path, const Headers &headers); -``` - -#### Event Handlers - -```cpp -// Called for all events (or events without a specific handler) -sse.on_message([](const SSEMessage &msg) { }); - -// Called for specific event types -sse.on_event("update", [](const SSEMessage &msg) { }); -sse.on_event("delete", [](const SSEMessage &msg) { }); - -// Called when connection is established -sse.on_open([]() { }); - -// Called on connection errors -sse.on_error([](httplib::Error err) { }); -``` - -#### Configuration - -```cpp -// Set reconnect interval (default: 3000ms) -sse.set_reconnect_interval(5000); - -// Set max reconnect attempts (default: 0 = unlimited) -sse.set_max_reconnect_attempts(10); - -// Update headers at any time (thread-safe) -sse.set_headers({{"Authorization", "Bearer new_token"}}); -``` - -#### Control - -```cpp -// Blocking start with auto-reconnect -sse.start(); - -// Non-blocking start (runs in background thread) -sse.start_async(); - -// Stop the client (thread-safe) -sse.stop(); -``` - -#### State - -```cpp -bool connected = sse.is_connected(); -const std::string &id = sse.last_event_id(); -``` - -## Examples - -### Basic Usage - -```cpp -httplib::Client cli("http://localhost:8080"); -httplib::sse::SSEClient sse(cli, "/events"); - -sse.on_message([](const httplib::sse::SSEMessage &msg) { - std::cout << msg.data << std::endl; -}); - -sse.start(); -``` - -### With Custom Event Types - -```cpp -httplib::sse::SSEClient sse(cli, "/events"); - -sse.on_event("notification", [](const httplib::sse::SSEMessage &msg) { - std::cout << "Notification: " << msg.data << std::endl; -}); - -sse.on_event("update", [](const httplib::sse::SSEMessage &msg) { - std::cout << "Update: " << msg.data << std::endl; -}); - -sse.start(); -``` - -### Async with Stop - -```cpp -httplib::sse::SSEClient sse(cli, "/events"); - -sse.on_message([](const httplib::sse::SSEMessage &msg) { - std::cout << msg.data << std::endl; -}); - -sse.start_async(); // Returns immediately - -// ... do other work ... - -sse.stop(); // Stop when done -``` - -### With Custom Headers (e.g., Authentication) - -```cpp -httplib::Headers headers = { - {"Authorization", "Bearer token123"} -}; - -httplib::sse::SSEClient sse(cli, "/events", headers); -sse.start(); -``` - -### Refreshing Auth Token on Reconnect - -```cpp -httplib::sse::SSEClient sse(cli, "/events", - {{"Authorization", "Bearer " + get_token()}}); - -// Preemptively refresh token on each successful connection -sse.on_open([&sse]() { - sse.set_headers({{"Authorization", "Bearer " + get_token()}}); -}); - -// Or reactively refresh on auth failure (401 triggers reconnect) -sse.on_error([&sse](httplib::Error) { - sse.set_headers({{"Authorization", "Bearer " + refresh_token()}}); -}); - -sse.start(); -``` - -### Error Handling - -```cpp -sse.on_error([](httplib::Error err) { - std::cerr << "Error: " << httplib::to_string(err) << std::endl; -}); - -sse.set_reconnect_interval(1000); -sse.set_max_reconnect_attempts(5); - -sse.start(); -``` - -## SSE Protocol - -The client parses SSE format according to the [W3C specification](https://html.spec.whatwg.org/multipage/server-sent-events.html): - -``` -event: custom-type -id: 123 -data: {"message": "hello"} - -data: simple message - -: this is a comment (ignored) -``` diff --git a/libs/cpp-httplib-0.57.1/README-stream.md b/libs/cpp-httplib-0.57.1/README-stream.md deleted file mode 100644 index b7f4162..0000000 --- a/libs/cpp-httplib-0.57.1/README-stream.md +++ /dev/null @@ -1,317 +0,0 @@ -# cpp-httplib Streaming API - -This document describes the streaming extensions for cpp-httplib, providing an iterator-style API for handling HTTP responses incrementally with **true socket-level streaming**. - -> **Important Notes**: -> -> - **No Keep-Alive**: Each `stream::Get()` call uses a dedicated connection that is closed after the response is fully read. For connection reuse, use `Client::Get()`. -> - **Single iteration only**: The `next()` method can only iterate through the body once. -> - **Result is not thread-safe**: While `stream::Get()` can be called from multiple threads simultaneously, the returned `stream::Result` must be used from a single thread only. - -## Overview - -The streaming API allows you to process HTTP response bodies chunk by chunk using an iterator-style pattern. Data is read directly from the network socket, enabling low-memory processing of large responses. This is particularly useful for: - -- **LLM/AI streaming responses** (e.g., ChatGPT, Claude, Ollama) -- **Server-Sent Events (SSE)** -- **Large file downloads** with progress tracking -- **Reverse proxy implementations** - -## Quick Start - -```cpp -#include "httplib.h" - -int main() { - httplib::Client cli("http://localhost:8080"); - - // Get streaming response - auto result = httplib::stream::Get(cli, "/stream"); - - if (result) { - // Process response body in chunks - while (result.next()) { - std::cout.write(result.data(), result.size()); - } - } - - return 0; -} -``` - -## API Layers - -cpp-httplib provides multiple API layers for different use cases: - -```text -┌─────────────────────────────────────────────┐ -│ SSEClient │ ← SSE-specific, parsed events -│ - on_message(), on_event() │ -│ - Auto-reconnect, Last-Event-ID │ -├─────────────────────────────────────────────┤ -│ stream::Get() / stream::Result │ ← Iterator-based streaming -│ - while (result.next()) { ... } │ -├─────────────────────────────────────────────┤ -│ open_stream() / StreamHandle │ ← General-purpose streaming -│ - handle.read(buf, len) │ -├─────────────────────────────────────────────┤ -│ Client::Get() │ ← Traditional, full buffering -└─────────────────────────────────────────────┘ -``` - -| Use Case | Recommended API | -|----------|----------------| -| SSE with auto-reconnect | `SSEClient` (see [README-sse.md](README-sse.md)) | -| LLM streaming (JSON Lines) | `stream::Get()` | -| Large file download | `stream::Get()` or `open_stream()` | -| Reverse proxy | `open_stream()` | -| Small responses with Keep-Alive | `Client::Get()` | - -## API Reference - -### Low-Level API: `StreamHandle` - -The `StreamHandle` struct provides direct control over streaming responses. It takes ownership of the socket connection and reads data directly from the network. - -> **Note:** When using `open_stream()`, the connection is dedicated to streaming and **Keep-Alive is not supported**. For Keep-Alive connections, use `client.Get()` instead. - -```cpp -// Open a stream (takes ownership of socket) -httplib::Client cli("http://localhost:8080"); -auto handle = cli.open_stream("GET", "/path"); - -// Check validity -if (handle.is_valid()) { - // Access response headers immediately - int status = handle.response->status; - auto content_type = handle.response->get_header_value("Content-Type"); - - // Read body incrementally - char buf[4096]; - ssize_t n; - while ((n = handle.read(buf, sizeof(buf))) > 0) { - process(buf, n); - } -} -``` - -#### StreamHandle Members - -| Member | Type | Description | -|--------|------|-------------| -| `response` | `std::unique_ptr` | HTTP response with headers | -| `error` | `Error` | Error code if request failed | -| `is_valid()` | `bool` | Returns true if response is valid | -| `read(buf, len)` | `ssize_t` | Read up to `len` bytes directly from socket | -| `get_read_error()` | `Error` | Get the last read error | -| `has_read_error()` | `bool` | Check if a read error occurred | - -### High-Level API: `stream::Get()` and `stream::Result` - -The `httplib.h` header provides a more ergonomic iterator-style API. - -```cpp -#include "httplib.h" - -httplib::Client cli("http://localhost:8080"); -cli.set_follow_location(true); -... - -// Simple GET -auto result = httplib::stream::Get(cli, "/path"); - -// GET with custom headers -httplib::Headers headers = {{"Authorization", "Bearer token"}}; -auto result = httplib::stream::Get(cli, "/path", headers); - -// Process the response -if (result) { - while (result.next()) { - process(result.data(), result.size()); - } -} - -// Or read entire body at once -auto result2 = httplib::stream::Get(cli, "/path"); -if (result2) { - std::string body = result2.read_all(); -} -``` - -#### stream::Result Members - -| Member | Type | Description | -|--------|------|-------------| -| `operator bool()` | `bool` | Returns true if response is valid | -| `is_valid()` | `bool` | Same as `operator bool()` | -| `status()` | `int` | HTTP status code | -| `headers()` | `const Headers&` | Response headers | -| `get_header_value(key, def)` | `std::string` | Get header value (with optional default) | -| `has_header(key)` | `bool` | Check if header exists | -| `next()` | `bool` | Read next chunk, returns false when done | -| `data()` | `const char*` | Pointer to current chunk data | -| `size()` | `size_t` | Size of current chunk | -| `read_all()` | `std::string` | Read entire remaining body into string | -| `error()` | `Error` | Get the connection/request error | -| `read_error()` | `Error` | Get the last read error | -| `has_read_error()` | `bool` | Check if a read error occurred | - -## Usage Examples - -### Example 1: SSE (Server-Sent Events) Client - -```cpp -#include "httplib.h" -#include - -int main() { - httplib::Client cli("http://localhost:1234"); - - auto result = httplib::stream::Get(cli, "/events"); - if (!result) { return 1; } - - while (result.next()) { - std::cout.write(result.data(), result.size()); - std::cout.flush(); - } - - return 0; -} -``` - -For a complete SSE client with auto-reconnection and event parsing, see `example/ssecli-stream.cc`. - -### Example 2: LLM Streaming Response - -```cpp -#include "httplib.h" -#include - -int main() { - httplib::Client cli("http://localhost:11434"); // Ollama - - auto result = httplib::stream::Get(cli, "/api/generate"); - - if (result && result.status() == 200) { - while (result.next()) { - std::cout.write(result.data(), result.size()); - std::cout.flush(); - } - } - - // Check for connection errors - if (result.read_error() != httplib::Error::Success) { - std::cerr << "Connection lost\n"; - } - - return 0; -} -``` - -### Example 3: Large File Download with Progress - -```cpp -#include "httplib.h" -#include -#include - -int main() { - httplib::Client cli("http://example.com"); - auto result = httplib::stream::Get(cli, "/large-file.zip"); - - if (!result || result.status() != 200) { - std::cerr << "Download failed\n"; - return 1; - } - - std::ofstream file("download.zip", std::ios::binary); - size_t total = 0; - - while (result.next()) { - file.write(result.data(), result.size()); - total += result.size(); - std::cout << "\rDownloaded: " << (total / 1024) << " KB" << std::flush; - } - - std::cout << "\nComplete!\n"; - return 0; -} -``` - -### Example 4: Reverse Proxy Streaming - -```cpp -#include "httplib.h" - -httplib::Server svr; - -svr.Get("/proxy/(.*)", [](const httplib::Request& req, httplib::Response& res) { - httplib::Client upstream("http://backend:8080"); - auto handle = upstream.open_stream("/" + req.matches[1].str()); - - if (!handle.is_valid()) { - res.status = 502; - return; - } - - res.status = handle.response->status; - res.set_chunked_content_provider( - handle.response->get_header_value("Content-Type"), - [handle = std::move(handle)](size_t, httplib::DataSink& sink) mutable { - char buf[8192]; - auto n = handle.read(buf, sizeof(buf)); - if (n > 0) { - sink.write(buf, static_cast(n)); - return true; - } - sink.done(); - return true; - } - ); -}); - -svr.listen("0.0.0.0", 3000); -``` - -## Comparison with Existing APIs - -| Feature | `Client::Get()` | `open_stream()` | `stream::Get()` | -|---------|----------------|-----------------|----------------| -| Headers available | After complete | Immediately | Immediately | -| Body reading | All at once | Direct from socket | Iterator-based | -| Memory usage | Full body in RAM | Minimal (controlled) | Minimal (controlled) | -| Keep-Alive support | ✅ Yes | ❌ No | ❌ No | -| Compression | Auto-handled | Auto-handled | Auto-handled | -| Best for | Small responses, Keep-Alive | Low-level streaming | Easy streaming | - -## Features - -- **True socket-level streaming**: Data is read directly from the network socket -- **Low memory footprint**: Only the current chunk is held in memory -- **Compression support**: Automatic decompression for gzip, brotli, and zstd -- **Chunked transfer**: Full support for chunked transfer encoding -- **SSL/TLS support**: Works with HTTPS connections - -## Important Notes - -### Keep-Alive Behavior - -The streaming API (`stream::Get()` / `open_stream()`) takes ownership of the socket connection for the duration of the stream. This means: - -- **Keep-Alive is not supported** for streaming connections -- The socket is closed when `StreamHandle` is destroyed -- For Keep-Alive scenarios, use the standard `client.Get()` API instead - -```cpp -// Use for streaming (no Keep-Alive) -auto result = httplib::stream::Get(cli, "/large-stream"); -while (result.next()) { /* ... */ } - -// Use for Keep-Alive connections -auto res = cli.Get("/api/data"); // Connection can be reused -``` - -## Related - -- [Issue #2269](https://github.com/yhirose/cpp-httplib/issues/2269) - Original feature request -- [example/ssecli-stream.cc](./example/ssecli-stream.cc) - SSE client with auto-reconnection diff --git a/libs/cpp-httplib-0.57.1/README-websocket.md b/libs/cpp-httplib-0.57.1/README-websocket.md deleted file mode 100644 index 3629a59..0000000 --- a/libs/cpp-httplib-0.57.1/README-websocket.md +++ /dev/null @@ -1,523 +0,0 @@ -# WebSocket - RFC 6455 WebSocket Support - -A simple, blocking WebSocket implementation for C++11. - -> [!IMPORTANT] -> This is a blocking I/O WebSocket implementation using a thread-per-connection model (plus one heartbeat thread per connection). It is intended for small- to mid-scale workloads; handling large numbers of simultaneous WebSocket connections is outside the design target of this library. If you need high-concurrency WebSocket support with non-blocking/async I/O (e.g., thousands of simultaneous connections), this is not the one that you want. - -> [!NOTE] -> WebSocket extensions (`permessage-deflate` and others defined by RFC 6455) are **not supported**. If a client proposes an extension via `Sec-WebSocket-Extensions`, the server silently declines it — the negotiated connection always runs without extensions. - -## Features - -- **RFC 6455 compliant**: Full WebSocket protocol support (extensions are not implemented) -- **Server and Client**: Both sides included -- **SSL/TLS support**: `wss://` scheme for secure connections -- **Text and Binary**: Both message types supported -- **Automatic heartbeat**: Periodic Ping/Pong keeps connections alive -- **Unresponsive-peer detection**: Opt-in liveness check via `set_websocket_max_missed_pongs()` -- **Subprotocol negotiation**: `Sec-WebSocket-Protocol` support for GraphQL, MQTT, etc. - -## Quick Start - -### Server - -```cpp -httplib::Server svr; - -svr.WebSocket("/ws", [](const httplib::Request &req, httplib::ws::WebSocket &ws) { - std::string msg; - while (ws.read(msg)) { - ws.send("echo: " + msg); - } -}); - -svr.listen("localhost", 8080); -``` - -### Client - -```cpp -httplib::ws::WebSocketClient ws("ws://localhost:8080/ws"); - -if (ws.connect()) { - ws.send("hello"); - - std::string msg; - if (ws.read(msg)) { - std::cout << msg << std::endl; // "echo: hello" - } - ws.close(); -} -``` - -## API Reference - -### ReadResult - -```cpp -enum ReadResult : int { - Fail = 0, // Connection closed or error - Text = 1, // UTF-8 text message - Binary = 2, // Binary message - Timeout = 3, // Read timeout elapsed; connection still open -}; -``` - -Returned by `read()`. Since `Fail` is `0`, the result works naturally in boolean contexts — `while (ws.read(msg))` continues until the connection closes. When you need to distinguish text from binary, check the return value directly. - -`Timeout` is only returned for a read timeout you set yourself with `set_read_timeout()`. It means the timeout elapsed on a message boundary: nothing was consumed and the connection is still open, so you can send on it and read again. The compile-time defaults (`CPPHTTPLIB_WEBSOCKET_SERVER_READ_TIMEOUT_SECOND`, 300 seconds on the server; a client waits forever) are a backstop against a peer that has gone quiet, not a request for control: when one of them elapses, `read()` returns `Fail` and closes the connection, so code that never calls `set_read_timeout()` can keep using `while (ws.read(msg))`. - -**`msg` is left untouched on `Timeout`.** Because `Timeout` is non-zero, `while (ws.read(msg))` keeps looping — with the *previous* message still in `msg`. Once you set a read timeout, test the result instead: - -```cpp -ws.set_read_timeout(std::chrono::milliseconds(100)); -std::string msg; -while (ws.is_open()) { - auto r = ws.read(msg); - if (r == httplib::ws::Timeout) { continue; } // nothing yet; send if you like - if (r == httplib::ws::Fail) { break; } - handle(msg); -} -``` - -### CloseStatus - -```cpp -enum class CloseStatus : uint16_t { - Normal = 1000, - GoingAway = 1001, - ProtocolError = 1002, - UnsupportedData = 1003, - NoStatus = 1005, - Abnormal = 1006, - InvalidPayload = 1007, - PolicyViolation = 1008, - MessageTooBig = 1009, - MandatoryExtension = 1010, - InternalError = 1011, -}; -``` - -### Server Registration - -```cpp -// Basic handler -Server &WebSocket(const std::string &pattern, WebSocketHandler handler); - -// With subprotocol negotiation -Server &WebSocket(const std::string &pattern, WebSocketHandler handler, - SubProtocolSelector sub_protocol_selector); -``` - -**Type aliases:** - -```cpp -using WebSocketHandler = - std::function; -using SubProtocolSelector = - std::function &protocols)>; -``` - -The `SubProtocolSelector` receives the list of subprotocols proposed by the client (from the `Sec-WebSocket-Protocol` header) and returns the selected one. Return an empty string to decline all proposed subprotocols. - -### WebSocket (Server-side) - -Passed to the handler registered with `Server::WebSocket()`. The handler runs in a dedicated thread per connection. - -```cpp -// Read next message (blocks until received, returns Fail/Text/Binary) -ReadResult read(std::string &msg); - -// Send messages -bool send(const std::string &data); // Text -bool send(const char *data, size_t len); // Binary - -// Close the connection -void close(CloseStatus status = CloseStatus::Normal, - const std::string &reason = ""); - -// Access the original HTTP upgrade request -const Request &request() const; - -// Check if the connection is still open -bool is_open() const; -``` - -### WebSocketClient - -```cpp -// Constructor - accepts ws:// or wss:// URL -explicit WebSocketClient(const std::string &scheme_host_port_path, - const Headers &headers = {}); - -// Constructor with a client certificate for mutual TLS (wss:// only, -// requires CPPHTTPLIB_OPENSSL_SUPPORT). The certificate is ignored for -// ws:// URLs. -struct PemMemory { - const char *cert_pem; - size_t cert_pem_len; - const char *key_pem; - size_t key_pem_len; - const char *private_key_password; -}; -explicit WebSocketClient(const std::string &scheme_host_port_path, - const PemMemory &pem, const Headers &headers = {}); - -// Check if the URL was parsed successfully -bool is_valid() const; - -// Connect (performs HTTP upgrade handshake). The returned Result is truthy -// only when the handshake fully succeeded; on failure it describes what went -// wrong: -// res.error() httplib::Error identifying the failing layer -// res.status() HTTP status of the upgrade response (-1 if none) -// res.headers() headers of the upgrade response -// res.ssl_error() TLS error detail (wss://, SSL builds only) -// res.ssl_backend_error() backend-specific TLS error code (SSL builds only) -Result connect(); - -// Get the subprotocol selected by the server (empty if none) -const std::string &subprotocol() const; - -// Read/Send/Close (same as server-side WebSocket) -ReadResult read(std::string &msg); -bool send(const std::string &data); -bool send(const char *data, size_t len); -void close(CloseStatus status = CloseStatus::Normal, - const std::string &reason = ""); -bool is_open() const; - -// Timeouts -void set_read_timeout(time_t sec, time_t usec = 0); -void set_write_timeout(time_t sec, time_t usec = 0); -void set_connection_timeout(time_t sec, time_t usec = 0); -template -void set_read_timeout(const std::chrono::duration &duration); -template -void set_write_timeout(const std::chrono::duration &duration); -template -void set_connection_timeout(const std::chrono::duration &duration); - -// SSL configuration (wss:// only, requires CPPHTTPLIB_OPENSSL_SUPPORT) -void set_ca_cert_path(const std::string &ca_cert_file_path, - const std::string &ca_cert_dir_path = std::string()); -void set_ca_cert_store(tls::ca_store_t store); -void enable_server_certificate_verification(bool enabled); -void enable_server_hostname_verification(bool enabled); -``` - -## Examples - -### Echo Server with Connection Logging - -```cpp -httplib::Server svr; - -svr.WebSocket("/ws", [](const httplib::Request &req, httplib::ws::WebSocket &ws) { - std::cout << "Connected from " << req.remote_addr << std::endl; - - std::string msg; - while (ws.read(msg)) { - ws.send("echo: " + msg); - } - - std::cout << "Disconnected" << std::endl; -}); - -svr.listen("localhost", 8080); -``` - -### Client: Continuous Read Loop - -```cpp -httplib::ws::WebSocketClient ws("ws://localhost:8080/ws"); - -if (ws.connect()) { - ws.send("hello"); - ws.send("world"); - - std::string msg; - while (ws.read(msg)) { // blocks until a message arrives - std::cout << msg << std::endl; // "echo: hello", "echo: world" - } - // read() returns false when the server closes the connection -} -``` - -### Inspecting Connection Failures - -`connect()` returns a `Result` that tells you why a connection attempt failed. -`error()` distinguishes network problems (`Connection`, `ConnectionTimeout`), -TLS problems (`SSLConnection`, `SSLServerVerification`, -`SSLServerHostnameVerification`), and upgrade rejections -(`WebSocketHandshake`). When the server answered with something other than -`101 Switching Protocols`, `status()` and `headers()` carry that response: - -```cpp -auto res = ws.connect(); -if (!res) { - std::cerr << "connect failed: " << httplib::to_string(res.error()) << std::endl; - if (res.status() != -1) { - // The server responded but refused the upgrade (e.g. 401, 404) - std::cerr << "HTTP status: " << res.status() << std::endl; - } -} -``` - -### Text and Binary Messages - -Check the `ReadResult` return value to distinguish between text and binary: - -```cpp -// Server -svr.WebSocket("/ws", [](const httplib::Request &req, httplib::ws::WebSocket &ws) { - std::string msg; - httplib::ws::ReadResult ret; - while ((ret = ws.read(msg))) { - if (ret == httplib::ws::Text) { - ws.send("echo: " + msg); - } else { - ws.send(msg.data(), msg.size()); // Binary echo - } - } -}); - -// Client -httplib::ws::WebSocketClient ws("ws://localhost:8080/ws"); -if (ws.connect()) { - // Send binary data - const char binary[] = {0x00, 0x01, 0x02, 0x03}; - ws.send(binary, sizeof(binary)); - - // Receive and check the type - std::string msg; - if (ws.read(msg) == httplib::ws::Binary) { - // Process binary data in msg - } - ws.close(); -} -``` - -### SSL Client - -```cpp -httplib::ws::WebSocketClient ws("wss://echo.example.com/ws"); - -if (ws.connect()) { - ws.send("hello over TLS"); - - std::string msg; - if (ws.read(msg)) { - std::cout << msg << std::endl; - } - ws.close(); -} -``` - -### Close with Status - -```cpp -// Client-side: close with a specific status code and reason -ws.close(httplib::ws::CloseStatus::GoingAway, "shutting down"); - -// Server-side: close with a policy violation status -ws.close(httplib::ws::CloseStatus::PolicyViolation, "forbidden"); -``` - -### Accessing the Upgrade Request - -```cpp -svr.WebSocket("/ws", [](const httplib::Request &req, httplib::ws::WebSocket &ws) { - // Access headers from the original HTTP upgrade request - auto auth = req.get_header_value("Authorization"); - if (auth.empty()) { - ws.close(httplib::ws::CloseStatus::PolicyViolation, "unauthorized"); - return; - } - - std::string msg; - while (ws.read(msg)) { - ws.send("echo: " + msg); - } -}); -``` - -The check above runs after the handshake, so the client sees a successful upgrade followed by a close frame. To refuse the upgrade itself with an HTTP status, use a pre-routing or pre-request handler. Both run before the `101 Switching Protocols` response, and `req.matched_route` is available in the pre-request handler: - -```cpp -svr.set_pre_request_handler([](const httplib::Request &req, httplib::Response &res) { - if (req.matched_route == "/ws" && req.get_header_value("Authorization").empty()) { - res.status = httplib::StatusCode::Unauthorized_401; - return httplib::Server::HandlerResponse::Handled; // not upgraded - } - return httplib::Server::HandlerResponse::Unhandled; -}); -``` - -### Custom Headers and Timeouts - -```cpp -httplib::Headers headers = { - {"Authorization", "Bearer token123"} -}; - -httplib::ws::WebSocketClient ws("ws://localhost:8080/ws", headers); -ws.set_connection_timeout(5, 0); // 5 seconds -ws.set_read_timeout(30, 0); // 30 seconds -ws.set_write_timeout(10, 0); // 10 seconds - -// std::chrono is also supported -ws.set_connection_timeout(std::chrono::seconds(5)); -ws.set_read_timeout(std::chrono::seconds(30)); -ws.set_write_timeout(std::chrono::seconds(10)); - -if (ws.connect()) { - std::string msg; - while (ws.read(msg)) { - std::cout << msg << std::endl; - } -} -``` - -### Subprotocol Negotiation - -The server can negotiate a subprotocol with the client using `Sec-WebSocket-Protocol`. This is required for protocols like GraphQL over WebSocket (`graphql-ws`) and MQTT. - -```cpp -// Server: register a handler with a subprotocol selector -svr.WebSocket( - "/ws", - [](const httplib::Request &req, httplib::ws::WebSocket &ws) { - std::string msg; - while (ws.read(msg)) { - ws.send("echo: " + msg); - } - }, - [](const std::vector &protocols) -> std::string { - // The client proposed a list of subprotocols; pick one - for (const auto &p : protocols) { - if (p == "graphql-ws" || p == "graphql-transport-ws") { - return p; - } - } - return ""; // Decline all - }); - -// Client: propose subprotocols via Sec-WebSocket-Protocol header -httplib::Headers headers = { - {"Sec-WebSocket-Protocol", "graphql-ws, graphql-transport-ws"} -}; -httplib::ws::WebSocketClient ws("ws://localhost:8080/ws", headers); - -if (ws.connect()) { - // Check which subprotocol the server selected - std::cout << "Subprotocol: " << ws.subprotocol() << std::endl; - // => "graphql-ws" - ws.close(); -} -``` - -### SSL Client with Certificate Configuration - -```cpp -httplib::ws::WebSocketClient ws("wss://example.com/ws"); -ws.set_ca_cert_path("/path/to/ca-bundle.crt"); -ws.enable_server_certificate_verification(true); -ws.enable_server_hostname_verification(true); // default; false skips the identity check - -if (ws.connect()) { - ws.send("secure message"); - ws.close(); -} -``` - -## Configuration - -| Macro | Default | Description | -|---------------------------------------------|-------------------|----------------------------------------------------------| -| `CPPHTTPLIB_WEBSOCKET_MAX_PAYLOAD_LENGTH` | `16777216` (16MB) | Maximum payload size per message | -| `CPPHTTPLIB_WEBSOCKET_CLIENT_READ_TIMEOUT_SECOND` | `0` | Client read timeout (seconds); `0` waits forever | -| `CPPHTTPLIB_WEBSOCKET_SERVER_READ_TIMEOUT_SECOND` | `300` | Server read timeout (seconds) | -| `CPPHTTPLIB_WEBSOCKET_CLOSE_TIMEOUT_SECOND` | `5` | Timeout for waiting peer's Close response (seconds) | -| `CPPHTTPLIB_WEBSOCKET_PING_INTERVAL_SECOND` | `30` | Automatic Ping interval for heartbeat (seconds) | -| `CPPHTTPLIB_WEBSOCKET_MAX_MISSED_PONGS` | `0` (disabled) | Close the connection after N consecutive unacked pings | - -### Runtime Ping Interval - -You can override the ping interval at runtime instead of changing the compile-time macro. Set it to `0` to disable automatic pings entirely. - -```cpp -// Server side -httplib::Server svr; -svr.set_websocket_ping_interval(10); // 10 seconds - -// Or using std::chrono -svr.set_websocket_ping_interval(std::chrono::seconds(10)); - -// Client side -httplib::ws::WebSocketClient ws("ws://localhost:8080/ws"); -ws.set_websocket_ping_interval(10); // 10 seconds - -// Disable automatic pings -ws.set_websocket_ping_interval(0); -``` - -### Unresponsive-Peer Detection (Pong Timeout) - -By default the heartbeat only sends pings — it does not enforce that pongs come back. To detect a silently dropped connection faster, enable the max-missed-pongs check. Once `max_missed_pongs` consecutive pings go unanswered, the heartbeat thread closes the connection with `CloseStatus::GoingAway` and the reason `"pong timeout"`. - -```cpp -ws.set_websocket_max_missed_pongs(2); // close after 2 consecutive unacked pings -``` - -The server side has the same `set_websocket_max_missed_pongs()`. - -With the default ping interval of 30 seconds, `max_missed_pongs = 2` detects a dead peer within ~60 seconds. The counter is reset every time a Pong frame is received, so the mechanism only works when your code is actively calling `read()` — exactly the pattern a normal WebSocket client already uses. - -**The default is `0`**, which means "never close the connection because of missing pongs." Pings are still sent on the heartbeat interval, but their responses are not checked. On the server side a dead connection still does not linger: while a handler is inside `read()`, `CPPHTTPLIB_WEBSOCKET_SERVER_READ_TIMEOUT_SECOND` (default **300 seconds = 5 minutes**) acts as a backstop. A client has no such backstop — it waits forever unless you set a read timeout — so there `max_missed_pongs` is what notices an unresponsive peer at all. On either side it is also the knob for noticing one *faster* than the 5-minute fallback. - -## Threading Model - -WebSocket connections share the same thread pool as HTTP requests. Each WebSocket connection occupies one thread for its entire lifetime. - -The default thread pool uses dynamic scaling: it maintains a base thread count of `CPPHTTPLIB_THREAD_POOL_COUNT` (8 or `std::thread::hardware_concurrency() - 1`, whichever is greater) and can scale up to 4x that count under load (`CPPHTTPLIB_THREAD_POOL_MAX_COUNT`). When all base threads are busy, temporary threads are spawned automatically up to the maximum. These dynamic threads exit after an idle timeout (`CPPHTTPLIB_THREAD_POOL_IDLE_TIMEOUT`, default 3 seconds). - -This dynamic scaling helps accommodate WebSocket connections alongside HTTP requests. However, if you expect many simultaneous WebSocket connections, you should configure the thread pool accordingly: - -```cpp -httplib::Server svr; - -svr.new_task_queue = [] { - return new httplib::ThreadPool(/*base_threads=*/8, /*max_threads=*/128); -}; -``` - -Choose sizes that account for both your expected HTTP load and the maximum number of simultaneous WebSocket connections. - -### Calling from Multiple Threads - -A single `WebSocket` (server-side) or `WebSocketClient` handle is shared by three potential callers: the thread running your handler (or holding the client), the heartbeat thread, and, if your code does its own thing, a separate thread calling `send()`/`close()` while another thread is blocked in `read()`. - -**Supported**: calling `read()` from one thread while calling `send()`/`close()` from another. This is the common pattern for a client that reads incoming messages in a loop on one thread and sends from elsewhere (e.g. a UI thread). A message that is in flight when `close()` is called still arrives intact; `close()` sends the Close frame and returns, leaving the connection's read side to the thread that owns it, so it does not block waiting for the peer's Close reply in that case. The heartbeat thread's automatic pings use the same `send()` path internally, so they are safe to run concurrently with your `read()` loop too — for `wss://` this requires every TLS call on a connection to be serialized internally, which cpp-httplib does for you. - -**Not supported**: calling `read()` from two threads at the same time on the same handle. The calls are serialized rather than left to corrupt each other, but which thread receives which message is unspecified, so there is nothing useful to build on it. - -## Protocol - -The implementation follows [RFC 6455](https://tools.ietf.org/html/rfc6455): - -- Handshake via HTTP Upgrade with `Sec-WebSocket-Key` / `Sec-WebSocket-Accept` -- Subprotocol negotiation via `Sec-WebSocket-Protocol` -- Frame masking (client-to-server) -- Control frames: Close, Ping, Pong -- Message fragmentation and reassembly -- Close handshake with status codes - -## Browser Test - -Run the echo server example and open `http://localhost:8080` in a browser: - -```bash -cd example && make wsecho && ./wsecho -``` diff --git a/libs/cpp-httplib-0.57.1/README.md b/libs/cpp-httplib-0.57.1/README.md deleted file mode 100644 index 10f85c2..0000000 --- a/libs/cpp-httplib-0.57.1/README.md +++ /dev/null @@ -1,1829 +0,0 @@ -# cpp-httplib - -[![](https://github.com/yhirose/cpp-httplib/workflows/test/badge.svg)](https://github.com/yhirose/cpp-httplib/actions) - -A C++11 single-file header-only cross platform HTTP/HTTPS library.
-It's extremely easy to set up. Just include the **[httplib.h](https://raw.githubusercontent.com/yhirose/cpp-httplib/refs/heads/master/httplib.h)** file in your code! - -Learn more in the [official documentation](https://yhirose.github.io/cpp-httplib/) (built with [docs-gen](https://github.com/yhirose/docs-gen)). - -> [!IMPORTANT] -> This library uses 'blocking' socket I/O. If you are looking for a library with 'non-blocking' socket I/O, this is not the one that you want. Only **HTTP/1.1** is supported — HTTP/2 and HTTP/3 are not implemented. - -> [!WARNING] -> 32-bit platforms are **NOT supported**. Use at your own risk. The library may compile on 32-bit targets, but no security review has been conducted for 32-bit environments. Integer truncation and other 32-bit-specific issues may exist. **Security reports that only affect 32-bit platforms will be closed without action.** The maintainer does not have access to 32-bit environments for testing or fixing issues. CI includes basic compile checks only, not functional or security testing. - -## Main Features - -- HTTP Server/Client -- SSL/TLS support (OpenSSL, MbedTLS, wolfSSL) -- [Stream API](README-stream.md) -- [Server-Sent Events](README-sse.md) -- [WebSocket](README-websocket.md) - -## Simple examples - -### Server - -```c++ -#define CPPHTTPLIB_OPENSSL_SUPPORT -#include "path/to/httplib.h" - -// HTTP -httplib::Server svr; - -// HTTPS -httplib::SSLServer svr; - -svr.Get("/hi", [](const httplib::Request &, httplib::Response &res) { - res.set_content("Hello World!", "text/plain"); -}); - -svr.listen("0.0.0.0", 8080); -``` - -### Client - -```c++ -#define CPPHTTPLIB_OPENSSL_SUPPORT -#include "path/to/httplib.h" - -// HTTP -httplib::Client cli("http://yhirose.github.io"); - -// HTTPS -httplib::Client cli("https://yhirose.github.io"); - -if (auto res = cli.Get("/hi")) { - res->status; - res->body; -} -``` - -## SSL/TLS Support - -cpp-httplib supports multiple TLS backends through an abstraction layer: - -| Backend | Define | Libraries | Notes | -| :------ | :----- | :-------- | :---- | -| OpenSSL | `CPPHTTPLIB_OPENSSL_SUPPORT` | `libssl`, `libcrypto` | [3.0 or later](https://www.openssl.org/policies/releasestrat.html) required | -| Mbed TLS | `CPPHTTPLIB_MBEDTLS_SUPPORT` | `libmbedtls`, `libmbedx509`, `libmbedcrypto` | 2.x, 3.x, and 4.x supported (auto-detected); 4.x renames `libmbedcrypto` to `libtfpsacrypto` | -| wolfSSL | `CPPHTTPLIB_WOLFSSL_SUPPORT` | `libwolfssl` | 5.x supported; must build with `--enable-opensslall` | - -> [!NOTE] -> **Mbed TLS / wolfSSL limitation:** `get_ca_certs()` and `get_ca_names()` only reflect CA certificates loaded via `load_ca_cert_store()`. Certificates loaded through `set_ca_cert_path()` or system certificates (`load_system_certs`) are not enumerable. - -> [!NOTE] -> **BoringSSL (best-effort):** BoringSSL builds under `CPPHTTPLIB_OPENSSL_SUPPORT` and is exercised by CI against current upstream. Because BoringSSL does not guarantee API stability, support is best-effort — breakage may occasionally land. Two known behavioral differences vs OpenSSL: (1) BoringSSL's public headers require C++14 or later, so consumers must compile accordingly; (2) hostname verification is SAN-only per RFC 6125 §6.4.4 (no CN fallback). - -```c++ -// Use either OpenSSL, Mbed TLS, or wolfSSL -#define CPPHTTPLIB_OPENSSL_SUPPORT // or CPPHTTPLIB_MBEDTLS_SUPPORT or CPPHTTPLIB_WOLFSSL_SUPPORT -#include "path/to/httplib.h" - -// Server -httplib::SSLServer svr("./cert.pem", "./key.pem"); - -// Client -httplib::Client cli("https://localhost:1234"); // scheme + host -httplib::SSLClient cli("localhost:1234"); // host -httplib::SSLClient cli("localhost", 1234); // host, port - -// Use your CA bundle -cli.set_ca_cert_path("./ca-bundle.crt"); - -// Disable cert verification -cli.enable_server_certificate_verification(false); - -// Disable host verification -cli.enable_server_hostname_verification(false); -``` - -### SSL Error Handling - -When SSL operations fail, cpp-httplib provides detailed error information through `ssl_error()` and `ssl_backend_error()`: - -- `ssl_error()` - Returns the TLS-level error code (e.g., `SSL_ERROR_SSL` for OpenSSL) -- `ssl_backend_error()` - Returns the backend-specific error code (e.g., `ERR_get_error()` for OpenSSL/wolfSSL, return value for Mbed TLS) - -```c++ -#define CPPHTTPLIB_OPENSSL_SUPPORT // or CPPHTTPLIB_MBEDTLS_SUPPORT or CPPHTTPLIB_WOLFSSL_SUPPORT -#include "path/to/httplib.h" - -httplib::Client cli("https://example.com"); - -auto res = cli.Get("/"); -if (!res) { - // Check the error type - const auto err = res.error(); - - switch (err) { - case httplib::Error::SSLConnection: - std::cout << "SSL connection failed, SSL error: " - << res.ssl_error() << std::endl; - break; - - case httplib::Error::SSLLoadingCerts: - std::cout << "SSL cert loading failed, backend error: " - << std::hex << res.ssl_backend_error() << std::endl; - break; - - case httplib::Error::SSLServerVerification: - std::cout << "SSL verification failed, verify error: " - << res.ssl_backend_error() << std::endl; - break; - - case httplib::Error::SSLServerHostnameVerification: - std::cout << "SSL hostname verification failed, verify error: " - << res.ssl_backend_error() << std::endl; - break; - - default: - std::cout << "HTTP error: " << httplib::to_string(err) << std::endl; - } -} -``` - -### Custom Certificate Verification - -You can set a custom verification callback using `tls::VerifyCallback`: - -```c++ -httplib::Client cli("https://example.com"); - -cli.set_server_certificate_verifier( - [](const httplib::tls::VerifyContext &ctx) -> bool { - std::cout << "Subject CN: " << ctx.subject_cn() << std::endl; - std::cout << "Issuer: " << ctx.issuer_name() << std::endl; - std::cout << "Depth: " << ctx.depth << std::endl; - std::cout << "Pre-verified: " << ctx.preverify_ok << std::endl; - - // Inspect SANs (Subject Alternative Names) - for (const auto &san : ctx.sans()) { - std::cout << "SAN: " << san.value << std::endl; - } - - // Return true to accept, false to reject - return ctx.preverify_ok; - }); -``` - -### Mutual TLS (mTLS) - -Regular TLS only verifies the server certificate. With mTLS, the client also presents a certificate that the server verifies. - -```c++ -// Server: pass a CA to verify client certificates against -httplib::SSLServer svr("./cert.pem", "./key.pem", "./client-ca-cert.pem"); - -// Client: present a certificate -httplib::SSLClient cli("api.example.com", 443, - "./client-cert.pem", "./client-key.pem"); -``` - -Both `SSLServer` and `SSLClient` also accept an in-memory `PemMemory` struct instead of file paths — handy when certs come from an environment variable or a secrets manager: - -```c++ -httplib::SSLServer::PemMemory server_pem{}; -server_pem.cert_pem = server_cert.data(); -server_pem.cert_pem_len = server_cert.size(); -server_pem.key_pem = server_key.data(); -server_pem.key_pem_len = server_key.size(); -server_pem.client_ca_pem = client_ca.data(); -server_pem.client_ca_pem_len = client_ca.size(); -httplib::SSLServer svr(server_pem); - -httplib::SSLClient::PemMemory client_pem{}; -client_pem.cert_pem = client_cert.data(); -client_pem.cert_pem_len = client_cert.size(); -client_pem.key_pem = client_key.data(); -client_pem.key_pem_len = client_key.size(); -httplib::SSLClient cli("api.example.com", 443, client_pem); -``` - -`httplib::ws::WebSocketClient` has the same `PemMemory` constructor for `wss://` connections. See [README-websocket.md](README-websocket.md) for details. - -### Peer Certificate Inspection - -On the server side, you can inspect the client's peer certificate from a request handler: - -```c++ -httplib::SSLServer svr("./cert.pem", "./key.pem", - "./client-ca-cert.pem"); - -svr.Get("/", [](const httplib::Request &req, httplib::Response &res) { - auto cert = req.peer_cert(); - if (cert) { - std::cout << "Client CN: " << cert.subject_cn() << std::endl; - std::cout << "Serial: " << cert.serial() << std::endl; - } - - auto sni = req.sni(); - std::cout << "SNI: " << sni << std::endl; -}); -``` - -### Platform-specific Certificate Handling - -cpp-httplib automatically integrates with the OS certificate store on macOS and Windows. This works with all TLS backends. - -| Platform | Behavior | Disable (compile time) | -| :------- | :------- | :--------------------- | -| macOS | Loads system certs from Keychain (link `CoreFoundation` and `Security` with `-framework`). Requires Apple Clang; GCC is not supported for this feature. | `CPPHTTPLIB_DISABLE_MACOSX_AUTOMATIC_ROOT_CERTIFICATES` | -| Windows | Verifies certs via CryptoAPI (`CertGetCertificateChain` / `CertVerifyCertificateChainPolicy`) with revocation checking | `CPPHTTPLIB_DISABLE_WINDOWS_AUTOMATIC_ROOT_CERTIFICATES_UPDATE` | - -On Windows, verification can also be disabled at runtime: - -```c++ -cli.enable_windows_certificate_verification(false); -``` - -> [!NOTE] -> When using SSL, it seems impossible to avoid SIGPIPE in all cases, since on some operating systems, SIGPIPE can only be suppressed on a per-message basis, but there is no way to make the OpenSSL library do so for its internal communications. If your program needs to avoid being terminated on SIGPIPE, the only fully general way might be to set up a signal handler for SIGPIPE to handle or ignore it yourself. - -## Server - -```c++ -#include - -int main(void) -{ - using namespace httplib; - - Server svr; - - svr.Get("/hi", [](const Request& req, Response& res) { - res.set_content("Hello World!", "text/plain"); - }); - - // Match the request path against a regular expression - // and extract its captures - svr.Get(R"(/numbers/(\d+))", [&](const Request& req, Response& res) { - auto numbers = req.matches[1]; - res.set_content(numbers, "text/plain"); - }); - - // Capture the second segment of the request path as "id" path param - svr.Get("/users/:id", [&](const Request& req, Response& res) { - auto user_id = req.path_params.at("id"); - res.set_content(user_id, "text/plain"); - }); - - // Extract values from HTTP headers and URL query params - svr.Get("/body-header-param", [](const Request& req, Response& res) { - if (req.has_header("Content-Length")) { - auto val = req.get_header_value("Content-Length"); - } - if (req.has_param("key")) { - auto val = req.get_param_value("key"); - } - // Get all values for a given key (e.g., ?tag=a&tag=b) - auto values = req.get_param_values("tag"); - res.set_content(req.body, "text/plain"); - }); - - // If the handler takes time to finish, you can also poll the connection state - svr.Get("/task", [&](const Request& req, Response& res) { - const char * result = nullptr; - process.run(); // for example, starting an external process - while (result == nullptr) { - sleep(1); - if (req.is_connection_closed()) { - process.kill(); // kill the process - return; - } - result = process.stdout(); // != nullptr if the process finishes - } - res.set_content(result, "text/plain"); - }); - - svr.Get("/stop", [&](const Request& req, Response& res) { - svr.stop(); - }); - - svr.listen("localhost", 1234); -} -``` - -`Post`, `Put`, `Patch`, `Delete` and `Options` methods are also supported. - -### Custom HTTP methods - -Methods outside the built-in set are rejected with `400 Bad Request` unless a handler is registered for them with `CustomRoute`. This covers the WebDAV methods of RFC 4918, `SUBSCRIBE` and friends from UPnP, and any other extension method. - -```c++ -svr.CustomRoute("PROPFIND", "/dav/:id", [](const Request& req, Response& res) { - // The request body is available as usual - auto id = req.path_params.at("id"); - res.status = StatusCode::MultiStatus_207; - res.set_content(build_multistatus(req.body), "application/xml"); -}); - -// A content reader overload is available too -svr.CustomRoute("REPORT", "/dav/.*", - [](const Request& req, Response& res, - const ContentReader& content_reader) { - content_reader([&](const char* data, size_t data_length) { - // ... - return true; - }); - }); -``` - -Patterns work exactly as they do for `Get` and the other methods, so regular expressions and path parameters are both available. - -Note the following: - -* The method name must be a valid HTTP method token (RFC 9110) and must be registered before `listen()` is called. -* `GET`, `HEAD`, `POST`, `PUT`, `DELETE`, `CONNECT`, `OPTIONS`, `TRACE`, `PATCH` and `PRI` cannot be registered this way. Use the dedicated methods above instead. -* A rejected registration makes `is_valid()` return `false`, and `listen()` then fails rather than starting a server with a route that would never fire. -* Static file serving and WebSocket upgrades remain `GET`/`HEAD` only. -* `Allow` and the WebDAV `DAV:` header are not generated automatically. Register an `Options` handler if clients need them. - -### Bind a socket to multiple interfaces and any available port - -```cpp -int port = svr.bind_to_any_port("0.0.0.0"); -svr.listen_after_bind(); -``` - -### Port sharing and exclusive binding - -By default, the server socket enables address/port reuse: `SO_REUSEPORT` where it is available (Linux, macOS), and `SO_REUSEADDR` otherwise (Windows). A restarted server can bind again immediately, but binding to a port that another server is already listening on also succeeds, and connections are distributed between them. - -If you want `listen()` to fail when the port is already in use, replace the default socket options with `set_socket_options`: - -```cpp -svr.set_socket_options([](socket_t sock) { -#ifdef _WIN32 - httplib::set_socket_opt(sock, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, 1); -#else - httplib::set_socket_opt(sock, SOL_SOCKET, SO_REUSEADDR, 1); -#endif -}); -``` - -> [!NOTE] -> Setting only `SO_REUSEADDR` is not enough on Windows. There, `SO_REUSEADDR` allows two sockets that both set it to bind to the same port, so use `SO_EXCLUSIVEADDRUSE` instead. - -### Static File Server - -```cpp -// Mount / to ./www directory -auto ret = svr.set_mount_point("/", "./www"); -if (!ret) { - // The specified base directory doesn't exist... -} - -// Mount /public to ./www directory -ret = svr.set_mount_point("/public", "./www"); - -// Mount /public to ./www1 and ./www2 directories -ret = svr.set_mount_point("/public", "./www1"); // 1st order to search -ret = svr.set_mount_point("/public", "./www2"); // 2nd order to search - -// Remove mount / -ret = svr.remove_mount_point("/"); - -// Remove mount /public -ret = svr.remove_mount_point("/public"); -``` - -```cpp -// User defined file extension and MIME type mappings -svr.set_file_extension_and_mimetype_mapping("cc", "text/x-c"); -svr.set_file_extension_and_mimetype_mapping("cpp", "text/x-c"); -svr.set_file_extension_and_mimetype_mapping("hh", "text/x-h"); -``` - -The following are built-in mappings: - -| Extension | MIME Type | Extension | MIME Type | -| :--------- | :-------------------------- | :--------- | :-------------------------- | -| css | text/css | mpga | audio/mpeg | -| csv | text/csv | weba | audio/webm | -| txt | text/plain | wav | audio/wave | -| vtt | text/vtt | otf | font/otf | -| html, htm | text/html | ttf | font/ttf | -| apng | image/apng | woff | font/woff | -| avif | image/avif | woff2 | font/woff2 | -| bmp | image/bmp | 7z | application/x-7z-compressed | -| gif | image/gif | atom | application/atom+xml | -| png | image/png | pdf | application/pdf | -| svg | image/svg+xml | mjs, js | text/javascript | -| webp | image/webp | json | application/json | -| ico | image/x-icon | rss | application/rss+xml | -| tif | image/tiff | tar | application/x-tar | -| tiff | image/tiff | xhtml, xht | application/xhtml+xml | -| jpeg, jpg | image/jpeg | xslt | application/xslt+xml | -| mp4 | video/mp4 | xml | application/xml | -| mpeg | video/mpeg | gz | application/gzip | -| webm | video/webm | zip | application/zip | -| mp3 | audio/mp3 | wasm | application/wasm | - -> [!WARNING] -> These static file server methods are not thread-safe. - - - -> [!NOTE] -> On POSIX systems, the static file server rejects requests that resolve (via symlinks) to a path outside the mounted base directory. Ensure that the served directory has appropriate permissions, as managing access to the served directory is the application developer's responsibility. - -### File request handler - -```cpp -// The handler is called right before the response is sent to a client -svr.set_file_request_handler([](const Request &req, Response &res) { - ... -}); -``` - -### Logging - -cpp-httplib provides separate logging capabilities for access logs and error logs, similar to web servers like Nginx and Apache. - -#### Access Logging - -Access loggers capture successful HTTP requests and responses: - -```cpp -svr.set_logger([](const httplib::Request& req, const httplib::Response& res) { - std::cout << req.method << " " << req.path << " -> " << res.status << std::endl; -}); -``` - -#### Pre-compression Logging - -You can also set a pre-compression logger to capture request/response data before compression is applied: - -```cpp -svr.set_pre_compression_logger([](const httplib::Request& req, const httplib::Response& res) { - // Log before compression - res.body contains uncompressed content - // Content-Encoding header is not yet set - your_pre_compression_logger(req, res); -}); -``` - -The pre-compression logger is only called when compression would be applied. For responses without compression, only the access logger is called. - -For a static file response (see [Static file compression](#static-file-compression)), `res.body` is empty when the logger runs. The bytes are still on disk at that point, not in memory. - -#### Error Logging - -Error loggers capture failed requests and connection issues. Unlike access loggers, error loggers only receive the Error and Request information, as errors typically occur before a meaningful Response can be generated. - -```cpp -svr.set_error_logger([](const httplib::Error& err, const httplib::Request* req) { - std::cerr << httplib::to_string(err) << " while processing request"; - if (req) { - std::cerr << ", client: " << req->get_header_value("X-Forwarded-For") - << ", request: '" << req->method << " " << req->path << " " << req->version << "'" - << ", host: " << req->get_header_value("Host"); - } - std::cerr << std::endl; -}); -``` - -### Error handler - -```cpp -svr.set_error_handler([](const auto& req, auto& res) { - auto fmt = "

Error Status: %d

"; - char buf[BUFSIZ]; - snprintf(buf, sizeof(buf), fmt, res.status); - res.set_content(buf, "text/html"); -}); -``` - -### Exception handler -The exception handler gets called if a user routing handler throws an error. - -```cpp -svr.set_exception_handler([](const auto& req, auto& res, std::exception_ptr ep) { - auto fmt = "

Error 500

%s

"; - char buf[BUFSIZ]; - try { - std::rethrow_exception(ep); - } catch (std::exception &e) { - snprintf(buf, sizeof(buf), fmt, e.what()); - } catch (...) { // See the following NOTE - snprintf(buf, sizeof(buf), fmt, "Unknown Exception"); - } - res.set_content(buf, "text/html"); - res.status = StatusCode::InternalServerError_500; -}); -``` - -> [!CAUTION] -> if you don't provide the `catch (...)` block for a rethrown exception pointer, an uncaught exception will end up causing the server crash. Be careful! - -### Pre routing handler - -```cpp -svr.set_pre_routing_handler([](const auto& req, auto& res) { - if (req.path == "/hello") { - res.set_content("world", "text/html"); - return Server::HandlerResponse::Handled; - } - return Server::HandlerResponse::Unhandled; -}); -``` - -### Post routing handler - -```cpp -svr.set_post_routing_handler([](const auto& req, auto& res) { - res.set_header("ADDITIONAL_HEADER", "value"); -}); -``` - -### Pre request handler - -The pre-request handler runs after the route has been matched (so `req.matched_route` and `req.path_params` are available) but **before the request body is read**. This means you can reject a request — for example on a failed authentication or authorization check — without forcing the server to buffer a potentially large body. - -```cpp -svr.set_pre_request_handler([](const auto& req, auto& res) { - if (req.matched_route == "/user/:user") { - auto user = req.path_params.at("user"); - if (user != "john") { - res.status = StatusCode::Forbidden_403; - res.set_content("error", "text/html"); - return Server::HandlerResponse::Handled; - } - } - return Server::HandlerResponse::Unhandled; -}); -``` - -> [!NOTE] -> Because the body has not been read yet, `req.body` and form fields parsed from the body are not available in the pre-request handler. Inspect headers, the path, query parameters, or `req.matched_route` instead. - -### Handler execution order - -`set_start_handler` runs once when the server starts. For each request, handlers run in the following order: - -``` -Request received - │ - ├─ expect_100_continue_handler (when the request has "Expect: 100-continue") - │ └─ returns a status other than 100 → stop here - │ - ├─ pre_routing_handler route not matched yet, body not read - │ └─ returns Handled → stop here - │ - ├─ file_request_handler (GET/HEAD, static file serving) - │ - ├─ route matching → req.matched_route is set - │ - ├─ pre_request_handler route matched, body NOT read yet - │ └─ returns Handled → stop here (route handler is skipped) - │ - ├─ route handler Get/Post/...; the request body is read first - │ - └─ post_routing_handler after routing completes - - On a thrown exception → exception_handler - On an error status (4xx/5xx) → error_handler -``` - -Use `pre_routing_handler` to reject a request as early as possible, before the route is known. Use `pre_request_handler` for route-specific checks, since `req.matched_route` is available and the body has not been read yet. - -For a request with `Expect: 100-continue`, the `100 Continue` response is not sent until the body is about to be read. A request rejected before that point (by `pre_routing_handler`, `pre_request_handler`, or because no route matched) gets its final response without `100 Continue`, so the client never sends the body. - -A WebSocket upgrade request that matches a route registered with `svr.WebSocket()` takes a shorter path: `pre_routing_handler`, then route matching (`req.matched_route` is set), then `pre_request_handler`, then the WebSocket handler. If either hook returns `Handled`, its response is sent as a regular HTTP response and the connection is not upgraded. Once the connection is upgraded, `post_routing_handler` does not run. - -### Response user data - -`res.user_data` is a type-safe key-value store that lets pre-routing or pre-request handlers pass arbitrary data to route handlers. - -```cpp -struct AuthContext { - std::string user_id; - std::string role; -}; - -svr.set_pre_routing_handler([](const auto& req, auto& res) { - auto token = req.get_header_value("Authorization"); - res.user_data.set("auth", AuthContext{decode_token(token)}); - return Server::HandlerResponse::Unhandled; -}); - -svr.Get("/me", [](const auto& /*req*/, auto& res) { - auto* ctx = res.user_data.get("auth"); - if (!ctx) { - res.status = StatusCode::Unauthorized_401; - return; - } - res.set_content("Hello " + ctx->user_id, "text/plain"); -}); -``` - -### Form data handling - -#### URL-encoded form data ('application/x-www-form-urlencoded') - -```cpp -svr.Post("/form", [&](const auto& req, auto& res) { - // URL query parameters and form-encoded data are accessible via req.params - std::string username = req.get_param_value("username"); - std::string password = req.get_param_value("password"); - - // Handle multiple values with same name - auto interests = req.get_param_values("interests"); - - // Check existence - if (req.has_param("newsletter")) { - // Handle newsletter subscription - } -}); -``` - -#### 'multipart/form-data' POST data - -```cpp -svr.Post("/multipart", [&](const Request& req, Response& res) { - // Access text fields (from form inputs without files) - std::string username = req.form.get_field("username"); - std::string bio = req.form.get_field("bio"); - - // Access uploaded files - if (req.form.has_file("avatar")) { - const auto& file = req.form.get_file("avatar"); - std::cout << "Uploaded file: " << file.filename - << " (" << file.content_type << ") - " - << file.content.size() << " bytes" << std::endl; - - // Access additional headers if needed - for (const auto& header : file.headers) { - std::cout << "Header: " << header.first << " = " << header.second << std::endl; - } - - // IMPORTANT: file.filename is an untrusted value from the client. - // Always sanitize to prevent path traversal attacks. - auto safe_name = httplib::sanitize_filename(file.filename); - if (safe_name.empty()) { - res.status = StatusCode::BadRequest_400; - res.set_content("Invalid filename", "text/plain"); - return; - } - - // Save to disk - std::ofstream ofs(upload_dir + "/" + safe_name, std::ios::binary); - ofs << file.content; - } - - // Handle multiple values with same name - auto tags = req.form.get_fields("tags"); // e.g., multiple checkboxes - for (const auto& tag : tags) { - std::cout << "Tag: " << tag << std::endl; - } - - auto documents = req.form.get_files("documents"); // multiple file upload - for (const auto& doc : documents) { - std::cout << "Document: " << doc.filename - << " (" << doc.content.size() << " bytes)" << std::endl; - } - - // Check existence before accessing - if (req.form.has_field("newsletter")) { - std::cout << "Newsletter subscription: " << req.form.get_field("newsletter") << std::endl; - } - - // Get counts for validation - if (req.form.get_field_count("tags") > 5) { - res.status = StatusCode::BadRequest_400; - res.set_content("Too many tags", "text/plain"); - return; - } - - // Summary - std::cout << "Received " << req.form.fields.size() << " text fields and " - << req.form.files.size() << " files" << std::endl; - - res.set_content("Upload successful", "text/plain"); -}); -``` - -#### Filename Sanitization - -`file.filename` in multipart uploads is an untrusted value from the client. Always sanitize before using it in file paths: - -```cpp -auto safe = httplib::sanitize_filename(file.filename); -``` - -This function strips path separators (`/`, `\`), null bytes, leading/trailing whitespace, and rejects `.` and `..`. Returns an empty string if the filename is unsafe. - -### Receive content with a content receiver - -```cpp -svr.Post("/content_receiver", - [&](const Request &req, Response &res, const ContentReader &content_reader) { - if (req.is_multipart_form_data()) { - // NOTE: `content_reader` is blocking until every form data field is read - // This approach allows streaming processing of large files - std::vector items; - content_reader( - [&](const FormData &item) { - items.push_back(item); - return true; - }, - [&](const char *data, size_t data_length) { - items.back().content.append(data, data_length); - return true; - }); - - // Process the received items - for (const auto& item : items) { - if (item.filename.empty()) { - // Text field - std::cout << "Field: " << item.name << " = " << item.content << std::endl; - } else { - // File - std::cout << "File: " << item.name << " (" << item.filename << ") - " - << item.content.size() << " bytes" << std::endl; - } - } - } else { - std::string body; - content_reader([&](const char *data, size_t data_length) { - body.append(data, data_length); - return true; - }); - } - }); -``` - -`CPPHTTPLIB_MULTIPART_FORM_DATA_FILE_MAX_COUNT` (default 1024) caps the number of -form-data parts only on the buffered path, where every part is accumulated into -`req.form`. The content receiver keeps nothing, so the cap does not apply here. -If your handler needs an upper bound on the number of parts, count them yourself -and return `false` from the callback to stop the parser. - -### Send content with the content provider - -```cpp -const size_t DATA_CHUNK_SIZE = 4; - -svr.Get("/stream", [&](const Request &req, Response &res) { - auto data = new std::string("abcdefg"); - - res.set_content_provider( - data->size(), // Content length - "text/plain", // Content type - [&, data](size_t offset, size_t length, DataSink &sink) { - const auto &d = *data; - sink.write(&d[offset], std::min(length, DATA_CHUNK_SIZE)); - return true; // return 'false' if you want to cancel the process. - }, - [data](bool success) { delete data; }); -}); -``` - -Without content length: - -```cpp -svr.Get("/stream", [&](const Request &req, Response &res) { - res.set_content_provider( - "text/plain", // Content type - [&](size_t offset, DataSink &sink) { - if (/* there is still data */) { - std::vector data; - // prepare data... - sink.write(data.data(), data.size()); - } else { - sink.done(); // No more data - } - return true; // return 'false' if you want to cancel the process. - }); -}); -``` - -### Chunked transfer encoding - -```cpp -svr.Get("/chunked", [&](const Request& req, Response& res) { - res.set_chunked_content_provider( - "text/plain", - [](size_t offset, DataSink &sink) { - sink.write("123", 3); - sink.write("345", 3); - sink.write("789", 3); - sink.done(); // No more data - return true; // return 'false' if you want to cancel the process. - } - ); -}); -``` - -With trailer: - -```cpp -svr.Get("/chunked", [&](const Request& req, Response& res) { - res.set_header("Trailer", "Dummy1, Dummy2"); - res.set_chunked_content_provider( - "text/plain", - [](size_t offset, DataSink &sink) { - sink.write("123", 3); - sink.write("345", 3); - sink.write("789", 3); - sink.done_with_trailer({ - {"Dummy1", "DummyVal1"}, - {"Dummy2", "DummyVal2"} - }); - return true; - } - ); -}); -``` - -### Send file content - -```cpp -svr.Get("/content", [&](const Request &req, Response &res) { - res.set_file_content("./path/to/content.html"); -}); - -svr.Get("/content", [&](const Request &req, Response &res) { - res.set_file_content("./path/to/content", "text/html"); -}); -``` - -### 'Expect: 100-continue' handler - -By default, the server accepts an `Expect: 100-continue` header and sends a `100 Continue` response when it starts reading the request body. If the request is answered without reading the body, `100 Continue` is not sent and the connection is closed after the response. - -The handler runs before `pre_routing_handler`. Returning `100` lets the request proceed; returning any other status sends that status as the final response and closes the connection. - -```cpp -// Send a '417 Expectation Failed' response. -svr.set_expect_100_continue_handler([](const Request &req, Response &res) { - return StatusCode::ExpectationFailed_417; -}); -``` - -```cpp -// Send a final status without reading the message body. -svr.set_expect_100_continue_handler([](const Request &req, Response &res) { - return res.status = StatusCode::Unauthorized_401; -}); -``` - -### Keep-Alive connection - -```cpp -svr.set_keep_alive_max_count(2); // Default is 100 -svr.set_keep_alive_timeout(10); // Default is 5 -``` - -### Timeout - -```c++ -svr.set_read_timeout(5, 0); // 5 seconds -svr.set_write_timeout(5, 0); // 5 seconds -svr.set_idle_interval(0, 100000); // 100 milliseconds - -// std::chrono is also supported -svr.set_read_timeout(std::chrono::seconds(5)); -svr.set_keep_alive_timeout(std::chrono::seconds(10)); -``` - -### Set maximum payload length for reading a request body - -```c++ -svr.set_payload_max_length(1024 * 1024 * 512); // 512MB -``` - -> [!NOTE] -> When the request body content type is 'www-form-urlencoded', the actual payload length shouldn't exceed `CPPHTTPLIB_FORM_URL_ENCODED_PAYLOAD_MAX_LENGTH`. - -### Server-Sent Events - -Please see [Server example](https://github.com/yhirose/cpp-httplib/blob/master/example/ssesvr.cc) and [Client example](https://github.com/yhirose/cpp-httplib/blob/master/example/ssecli.cc). - -### Default thread pool support - -`ThreadPool` is used as the **default** task queue, with dynamic scaling support. By default, it maintains a base thread count of 8 or `std::thread::hardware_concurrency() - 1` (whichever is greater), and can scale up to 4x that count under load. You can change these with `CPPHTTPLIB_THREAD_POOL_COUNT` and `CPPHTTPLIB_THREAD_POOL_MAX_COUNT`. - -When all threads are busy and a new task arrives, a temporary thread is spawned (up to the maximum). When a dynamic thread finishes its task and the queue is empty, or after an idle timeout, it exits automatically. The idle timeout defaults to 3 seconds, configurable via `CPPHTTPLIB_THREAD_POOL_IDLE_TIMEOUT`. - -If you want to set the thread counts at runtime: - -```cpp -svr.new_task_queue = [] { return new ThreadPool(/*base_threads=*/8, /*max_threads=*/64); }; -``` - -#### Max queued requests - -You can also provide an optional parameter to limit the maximum number -of pending requests, i.e. requests `accept()`ed by the listener but -still waiting to be serviced by worker threads. - -```cpp -svr.new_task_queue = [] { return new ThreadPool(/*base_threads=*/12, /*max_threads=*/0, /*max_queued_requests=*/18); }; -``` - -Default limit is 0 (unlimited). Once the limit is reached, the listener -will shutdown the client connection. - -#### Idle timeout for dynamic threads - -The idle timeout for dynamic threads can also be set at runtime via the -fourth parameter (in seconds): - -```cpp -svr.new_task_queue = [] { return new ThreadPool(/*base_threads=*/8, /*max_threads=*/64, /*max_queued_requests=*/0, /*idle_timeout_sec=*/10); }; -``` - -### Override the default thread pool with yours - -You can supply your own thread pool implementation according to your need. - -```cpp -class YourThreadPoolTaskQueue : public TaskQueue { -public: - YourThreadPoolTaskQueue(size_t n) { - pool_.start_with_thread_count(n); - } - - virtual bool enqueue(std::function fn) override { - /* Return true if the task was actually enqueued, or false - * if the caller must drop the corresponding connection. */ - return pool_.enqueue(fn); - } - - virtual void shutdown() override { - pool_.shutdown_gracefully(); - } - -private: - YourThreadPool pool_; -}; - -svr.new_task_queue = [] { - return new YourThreadPoolTaskQueue(12); -}; -``` - -## Client - -```c++ -#include -#include - -int main(void) -{ - httplib::Client cli("localhost", 1234); - - if (auto res = cli.Get("/hi")) { - if (res->status == StatusCode::OK_200) { - std::cout << res->body << std::endl; - } - } else { - auto err = res.error(); - std::cout << "HTTP error: " << httplib::to_string(err) << std::endl; - } -} -``` - -> [!TIP] -> Constructor with scheme-host-port string is now supported! - -```c++ -httplib::Client cli("localhost"); -httplib::Client cli("localhost:8080"); -httplib::Client cli("http://localhost"); -httplib::Client cli("http://localhost:8080"); -httplib::Client cli("https://localhost"); -httplib::SSLClient cli("localhost"); -``` - -### Error code - -Here is the list of errors from `Result::error()`. - -```c++ -enum class Error { - Success = 0, - Unknown, - Connection, - BindIPAddress, - Read, - Write, - ExceedRedirectCount, - Canceled, - SSLConnection, - SSLLoadingCerts, - SSLServerVerification, - SSLServerHostnameVerification, - UnsupportedMultipartBoundaryChars, - Compression, - ConnectionTimeout, - ProxyConnection, - ConnectionClosed, - Timeout, - ResourceExhaustion, - TooManyFormDataFiles, - ExceedMaxPayloadSize, - ExceedUriMaxLength, - ExceedMaxSocketDescriptorCount, - InvalidRequestLine, - InvalidHTTPMethod, - InvalidHTTPVersion, - InvalidHeaders, - MultipartParsing, - OpenFile, - Listen, - GetSockName, - UnsupportedAddressFamily, - HTTPParsing, - InvalidRangeHeader, - UnsupportedContentEncoding, -}; -``` - -### Client Logging - -#### Access Logging - -```cpp -cli.set_logger([](const httplib::Request& req, const httplib::Response& res) { - auto duration = std::chrono::duration_cast( - std::chrono::steady_clock::now() - start_time).count(); - std::cout << "✓ " << req.method << " " << req.path - << " -> " << res.status << " (" << res.body.size() << " bytes, " - << duration << "ms)" << std::endl; -}); -``` - -#### Error Logging - -```cpp -cli.set_error_logger([](const httplib::Error& err, const httplib::Request* req) { - std::cerr << "✗ "; - if (req) { - std::cerr << req->method << " " << req->path << " "; - } - std::cerr << "failed: " << httplib::to_string(err); - - // Add specific guidance based on error type - switch (err) { - case httplib::Error::Connection: - std::cerr << " (verify server is running and reachable)"; - break; - case httplib::Error::SSLConnection: - std::cerr << " (check SSL certificate and TLS configuration)"; - break; - case httplib::Error::ConnectionTimeout: - std::cerr << " (increase timeout or check network latency)"; - break; - case httplib::Error::Read: - std::cerr << " (server may have closed connection prematurely)"; - break; - default: - break; - } - std::cerr << std::endl; -}); -``` - -### GET with HTTP headers - -```c++ -httplib::Headers headers = { - { "Hello", "World!" } -}; -auto res = cli.Get("/hi", headers); -``` - -or - -```c++ -auto res = cli.Get("/hi", httplib::Headers{{"Hello", "World!"}}); -``` - -or - -```c++ -cli.set_default_headers({ - { "Hello", "World!" } -}); -auto res = cli.Get("/hi"); -``` - -### POST - -```c++ -res = cli.Post("/post", "text", "text/plain"); -res = cli.Post("/person", "name=john1¬e=coder", "application/x-www-form-urlencoded"); -``` - -### POST with parameters - -```c++ -httplib::Params params; -params.emplace("name", "john"); -params.emplace("note", "coder"); - -auto res = cli.Post("/post", params); -``` - or - -```c++ -httplib::Params params{ - { "name", "john" }, - { "note", "coder" } -}; - -auto res = cli.Post("/post", params); -``` - -### POST with Multipart Form Data - -```c++ -httplib::UploadFormDataItems items = { - { "text1", "text default", "", "" }, - { "text2", "aωb", "", "" }, - { "file1", "h\ne\n\nl\nl\no\n", "hello.txt", "text/plain" }, - { "file2", "{\n \"world\", true\n}\n", "world.json", "application/json" }, - { "file3", "", "", "application/octet-stream" }, -}; - -auto res = cli.Post("/multipart", items); -``` - -To upload files from disk without loading them entirely into memory, use `make_file_provider`. The file is sent with chunked transfer encoding. - -```cpp -httplib::FormDataProviderItems providers = { - httplib::make_file_provider("file1", "/path/to/large.bin", "large.bin", "application/octet-stream"), - httplib::make_file_provider("avatar", "/path/to/photo.jpg", "photo.jpg", "image/jpeg"), -}; - -auto res = cli.Post("/upload", {}, {}, providers); -``` - -### POST with a file body - -To POST a file as a raw binary body with `Content-Length`, use `make_file_body`. - -```cpp -auto [size, provider] = httplib::make_file_body("/path/to/data.bin"); -auto res = cli.Post("/upload", size, provider, "application/octet-stream"); -``` - -### PUT - -```c++ -res = cli.Put("/resource/foo", "text", "text/plain"); -``` - -### PATCH - -```c++ -res = cli.Patch("/resource/foo", "text", "text/plain"); -``` - -### DELETE - -```c++ -res = cli.Delete("/resource/foo"); -``` - -### OPTIONS - -```c++ -res = cli.Options("*"); -res = cli.Options("/resource/foo"); -``` - -### Timeout - -```c++ -cli.set_connection_timeout(0, 300000); // 300 milliseconds -cli.set_read_timeout(5, 0); // 5 seconds -cli.set_write_timeout(5, 0); // 5 seconds - -// This method works the same as curl's `--max-time` option -cli.set_max_timeout(5000); // 5 seconds - -// std::chrono is also supported -cli.set_connection_timeout(std::chrono::milliseconds(300)); -cli.set_read_timeout(std::chrono::seconds(5)); -cli.set_write_timeout(std::chrono::seconds(5)); -cli.set_max_timeout(std::chrono::seconds(5)); -``` - -### Set maximum payload length for reading a response body - -```c++ -cli.set_payload_max_length(1024 * 1024 * 512); // 512MB -``` - -### Receive content with a content receiver - -```c++ -std::string body; - -auto res = cli.Get("/large-data", - [&](const char *data, size_t data_length) { - body.append(data, data_length); - return true; - }); -``` - -```cpp -std::string body; - -auto res = cli.Get( - "/stream", Headers(), - [&](const Response &response) { - EXPECT_EQ(StatusCode::OK_200, response.status); - return true; // return 'false' if you want to cancel the request. - }, - [&](const char *data, size_t data_length) { - body.append(data, data_length); - return true; // return 'false' if you want to cancel the request. - }); -``` - -### Send content with a content provider - -```cpp -std::string body = ...; - -auto res = cli.Post( - "/stream", body.size(), - [](size_t offset, size_t length, DataSink &sink) { - sink.write(body.data() + offset, length); - return true; // return 'false' if you want to cancel the request. - }, - "text/plain"); -``` - -### Chunked transfer encoding - -```cpp -auto res = cli.Post( - "/stream", - [](size_t offset, DataSink &sink) { - sink.os << "chunked data 1"; - sink.os << "chunked data 2"; - sink.os << "chunked data 3"; - sink.done(); - return true; // return 'false' if you want to cancel the request. - }, - "text/plain"); -``` - -### With Progress Callback - -```cpp -httplib::Client cli(url, port); - -// prints: 0 / 000 bytes => 50% complete -auto res = cli.Get("/", [](size_t len, size_t total) { - printf("%lld / %lld bytes => %d%% complete\n", - len, total, - (int)(len*100/total)); - return true; // return 'false' if you want to cancel the request. -} -); -``` - -![progress](https://user-images.githubusercontent.com/236374/33138910-495c4ecc-cf86-11e7-8693-2fc6d09615c4.gif) - -### Authentication - -```cpp -// Basic Authentication -cli.set_basic_auth("user", "pass"); - -// Digest Authentication -cli.set_digest_auth("user", "pass"); - -// Bearer Token Authentication -cli.set_bearer_token_auth("token"); -``` - -> [!NOTE] -> OpenSSL is required for Digest Authentication. - -### Proxy server support - -```cpp -cli.set_proxy("host", port); - -// Basic Authentication -cli.set_proxy_basic_auth("user", "pass"); - -// Digest Authentication -cli.set_proxy_digest_auth("user", "pass"); - -// Bearer Token Authentication -cli.set_proxy_bearer_token_auth("pass"); -``` - -> [!NOTE] -> OpenSSL is required for Digest Authentication. - -#### Bypass the proxy for specific hosts (`NO_PROXY`) - -```cpp -cli.set_no_proxy({"internal.corp", "10.0.0.0/8", "*.dev.local"}); -``` - -Each pattern is `*`, a hostname suffix, an IP literal, or a CIDR block. -Hostname matching is case-insensitive with a dot-boundary rule. See the -[NO_PROXY cookbook](https://yhirose.github.io/cpp-httplib/en/cookbook/c16-proxy) -for details and for reading the variable from the environment. - -### Range - -```cpp -httplib::Client cli("httpcan.org"); - -auto res = cli.Get("/range/32", httplib::Headers{ - httplib::make_range_header({{1, 10}}) // 'Range: bytes=1-10' -}); -// res->status should be 206. -// res->body should be "bcdefghijk". -``` - -```cpp -httplib::make_range_header({{1, 10}, {20, -1}}) // 'Range: bytes=1-10, 20-' -httplib::make_range_header({{100, 199}, {500, 599}}) // 'Range: bytes=100-199, 500-599' -httplib::make_range_header({{0, 0}, {-1, 1}}) // 'Range: bytes=0-0, -1' -``` - -### Keep-Alive connection - -```cpp -httplib::Client cli("localhost", 1234); - -cli.Get("/hello"); // with "Connection: close" - -cli.set_keep_alive(true); -cli.Get("/world"); - -cli.set_keep_alive(false); -cli.Get("/last-request"); // with "Connection: close" -``` - -### Redirect - -```cpp -httplib::Client cli("yahoo.com"); - -auto res = cli.Get("/"); -res->status; // 301 - -cli.set_follow_location(true); -res = cli.Get("/"); -res->status; // 200 -``` - -### Use a specific network interface - -> [!NOTE] -> This feature is not available on Windows, yet. - -```cpp -cli.set_interface("eth0"); // Interface name, IP address or host name -``` - -The same method is available on `httplib::ws::WebSocketClient`. - -### Override the connection target for a hostname - -`set_hostname_addr_map` redirects where the socket connects, without changing -the identity of the request. The hostname the client was constructed with keeps -supplying the `Host` header, the SNI, and the name that the server certificate -is verified against, so this is a connection-level override only, not a way to -talk to a different origin. - -```cpp -httplib::Client cli("https://example.com"); - -// Connect to this IP address instead of resolving "example.com" -cli.set_hostname_addr_map({{"example.com", "192.168.1.10"}}); -``` - -A mapped value may be an IP literal or another hostname. An IP literal is used -as-is; anything else is resolved as a name, so a host that is only reachable -under a different name works too: - -```cpp -cli.set_hostname_addr_map({{"example.com", "internal.example.lan"}}); -``` - -An empty value is ignored, leaving the original hostname as the connection -target. - -The same method is available on `httplib::ws::WebSocketClient`. - -### Automatic Path Encoding - -The client automatically encodes special characters in URL paths by default: - -```cpp -httplib::Client cli("https://example.com"); - -// Automatic path encoding (default behavior) -cli.set_path_encode(true); -auto res = cli.Get("/path with spaces/file.txt"); // Automatically encodes spaces - -// Disable automatic path encoding -cli.set_path_encode(false); -auto res = cli.Get("/already%20encoded/path"); // Use pre-encoded paths -``` - -- `set_path_encode(bool on)` - Controls automatic encoding of special characters in URL paths - - `true` (default): Automatically encodes spaces, plus signs, newlines, and other special characters - - `false`: Sends paths as-is without encoding (useful for pre-encoded URLs) - -### Performance Note for Local Connections - -> [!WARNING] -> On Windows systems with improperly configured IPv6 settings, using "localhost" as the hostname may cause significant connection delays (up to 2 seconds per request) due to DNS resolution issues. This affects both client and server operations. For better performance when connecting to local services, use "127.0.0.1" instead of "localhost". -> -> See: https://github.com/yhirose/cpp-httplib/issues/366#issuecomment-593004264 - -```cpp -// May be slower on Windows due to DNS resolution delays -httplib::Client cli("localhost", 8080); -httplib::Server svr; -svr.listen("localhost", 8080); - -// Faster alternative for local connections -httplib::Client cli("127.0.0.1", 8080); -httplib::Server svr; -svr.listen("127.0.0.1", 8080); -``` - -## Ordered Headers, Query Parameters, and Form Data - -`Headers`, `Params`, `FormFields`, and `FormFiles` preserve the order entries were received (for a parsed request) or inserted (for one you build yourself). Earlier versions stored these in `std::multimap` or `std::unordered_multimap`, which either sorted entries by key or gave no ordering guarantee at all for repeated keys. RFC 9110 §5.3 and RFC 7578 §5.2 both require the original order to be preserved, so this is now guaranteed rather than incidental. - -```c++ -// A request with two Accept-Encoding lines... -// Accept-Encoding: gzip -// Accept-Encoding: br -// ...visits "gzip" before "br", not the other way around. -for (auto it = req.headers.equal_range("Accept-Encoding").first; - it != req.headers.end(); ++it) { - std::cout << it->second << std::endl; -} - -// get_header_value(key, id) reaches a specific one directly. -auto second = req.get_header_value("Accept-Encoding", 1); // "br" -``` - -`Headers` matches field names case-insensitively, as before. `Params`, `FormFields`, and `FormFiles` are case-sensitive. - -> [!NOTE] -> Iterators on these containers follow `std::vector` rules: inserting a new entry invalidates existing iterators. Code that keeps an iterator across a call to `insert()`/`emplace()` needs to re-fetch it afterward. - -## Payload Limit - -The maximum payload body size is limited to 100MB by default for both server and client. You can change it with `set_payload_max_length()` or by defining `CPPHTTPLIB_PAYLOAD_MAX_LENGTH` at compile time. Setting it to `0` disables the limit entirely. - -## Compression - -The server can apply compression to the following MIME type contents: - -- all text types except text/event-stream -- image/svg+xml -- application/javascript -- application/json -- application/xml -- application/protobuf -- application/xhtml+xml - -A response that already carries `Content-Encoding` is sent as it is. A handler serving content it encoded itself, an asset compressed at build time for instance, keeps its own coding and its own bytes: - -```c++ -svr.Get("/app.js", [](const Request & /*req*/, Response &res) { - res.set_header("Content-Encoding", "gzip"); - res.set_content(gzipped_asset, "application/javascript"); -}); -``` - -This holds for every kind of response, including the file-backed ones below. - -`Vary: Accept-Encoding` is added only to responses the server encoded itself. A handler that chooses between an encoded and an identity representation by reading `Accept-Encoding` should set the field itself, so that shared caches keep the two apart. - -### Static file compression - -Responses served from a file, whether through `set_mount_point()` or `Response::set_file_content()`, are sent as is by default. Turn compression on for them with: - -```c++ -svr.set_static_file_compression(true); -``` - -Only files within a size range are compressed, and both ends of it can be moved: - -```c++ -svr.set_static_file_compression_min_length(512); -svr.set_static_file_compression_max_length(1024 * 1024); -``` - -The lower bound defaults to 1400 bytes. A response that already fits in a single 1500-byte MTU is not delivered any faster for being smaller, and a file of a few bytes comes back larger than it went in, since gzip's header and trailer outweigh what deflate saves. `0` compresses everything down to a single byte, and `CPPHTTPLIB_STATIC_FILE_COMPRESSION_MIN_LENGTH` sets the default at compile time. An empty file is never compressed regardless. - -The upper bound defaults to 4MB, and exists for a different reason: the file is compressed per request, and the compressed bytes are held in memory until the response has been written, so the peak cost scales with the number of requests in flight. It is a bound on what one request can cost, not a statement about how well large files compress, which is why raising it is reasonable when the files are known and the traffic is not. `0` removes the limit, and `CPPHTTPLIB_STATIC_FILE_COMPRESSION_MAX_LENGTH` sets the default at compile time. - -A compressed response keeps its `Content-Length`, so `HEAD` still reports the size a `GET` would return. Two details are worth knowing: - -- Range requests are answered from the uncompressed representation, so `Content-Range` keeps naming the file's own bytes. -- The `ETag` carries the coding it belongs to (`W/"...-gzip"`), so a client that cached the compressed form revalidates against the right validator. - -Content providers registered with `set_content_provider()` are not covered. Feeding one through a compressor would hold each write back until the compressor's window filled, which breaks providers that produce their body incrementally. Use `set_chunked_content_provider()` to compress a generated body. - -### Zlib Support - -'gzip' compression is available with `CPPHTTPLIB_ZLIB_SUPPORT`. `libz` should be linked. - -### Brotli Support - -Brotli compression is available with `CPPHTTPLIB_BROTLI_SUPPORT`. Necessary libraries should be linked. -Please see https://github.com/google/brotli for more detail. - -### Zstd Support - -Zstd compression is available with `CPPHTTPLIB_ZSTD_SUPPORT`. Necessary libraries should be linked. -Please see https://github.com/facebook/zstd for more detail. - -### Default `Accept-Encoding` value - -The default `Accept-Encoding` value contains all possible compression types. So, the following two examples are same. - -```c++ -res = cli.Get("/resource/foo"); -res = cli.Get("/resource/foo", httplib::Headers{{"Accept-Encoding", "br, gzip, deflate, zstd"}}); -``` - -If we don't want a response without compression, we have to set `Accept-Encoding` to an empty string. This behavior is similar to curl. - -```c++ -res = cli.Get("/resource/foo", httplib::Headers{{"Accept-Encoding", ""}}); -``` - -### Compress request body on client - -```c++ -cli.set_compress(true); -res = cli.Post("/resource/foo", "...", "text/plain"); -``` - -### Compress response body on client - -```c++ -cli.set_decompress(false); -res = cli.Get("/resource/foo"); -res->body; // Compressed data - -``` - -Unix Domain Socket Support --------------------------- - - -```c++ -// Server -httplib::Server svr; -svr.set_address_family(AF_UNIX).listen("./my-socket.sock", 80); - -// Client -httplib::Client cli("./my-socket.sock"); -cli.set_address_family(AF_UNIX); -``` - -"my-socket.sock" can be a relative path or an absolute path. Your application must have the appropriate permissions for the path. You can also use an abstract socket address on Linux. To use an abstract socket address, prepend a null byte ('\x00') to the path. - -This library automatically sets the Host header to "localhost" for Unix socket connections, similar to curl's behavior: - - -URI Encoding/Decoding Utilities -------------------------------- - -cpp-httplib provides utility functions for URI encoding and decoding: - -```cpp -#include - -std::string url = "https://example.com/search?q=hello world"; -std::string encoded = httplib::encode_uri(url); -std::string decoded = httplib::decode_uri(encoded); - -std::string param = "hello world"; -std::string encoded_component = httplib::encode_uri_component(param); -std::string decoded_component = httplib::decode_uri_component(encoded_component); -``` - -### Functions - -- `encode_uri(const std::string &value)` - Encodes a full URI, preserving reserved characters like `://`, `?`, `&`, `=` -- `decode_uri(const std::string &value)` - Decodes a URI-encoded string -- `encode_uri_component(const std::string &value)` - Encodes a URI component (query parameter, path segment), encoding all reserved characters -- `decode_uri_component(const std::string &value)` - Decodes a URI component - -Use `encode_uri()` for full URLs and `encode_uri_component()` for individual query parameters or path segments. - -## Stream API - -Process large responses without loading everything into memory. - -```c++ -httplib::Client cli("localhost", 8080); -cli.set_follow_location(true); -... - -auto result = httplib::stream::Get(cli, "/large-file"); -if (result) { - while (result.next()) { - process(result.data(), result.size()); // Process each chunk as it arrives - } -} - -// Or read the entire body at once -auto result2 = httplib::stream::Get(cli, "/file"); -if (result2) { - std::string body = result2.read_all(); -} -``` - -All HTTP methods are supported: `stream::Get`, `Post`, `Put`, `Patch`, `Delete`, `Head`, `Options`. - -See [README-stream.md](README-stream.md) for more details. - -## SSE Client - -```cpp -#include - -int main() { - httplib::Client cli("http://localhost:8080"); - httplib::sse::SSEClient sse(cli, "/events"); - - sse.on_message([](const httplib::sse::SSEMessage &msg) { - std::cout << "Event: " << msg.event << std::endl; - std::cout << "Data: " << msg.data << std::endl; - }); - - sse.start(); // Blocking, with auto-reconnect - return 0; -} -``` - -See [README-sse.md](README-sse.md) for more details. - -## WebSocket - -```cpp -// Server -httplib::Server svr; - -svr.WebSocket("/ws", [](const httplib::Request &req, httplib::ws::WebSocket &ws) { - std::string msg; - while (ws.read(msg)) { - ws.send("Echo: " + msg); - } -}); - -svr.listen("localhost", 8080); -``` - -```cpp -// Client -httplib::ws::WebSocketClient ws("ws://localhost:8080/ws"); - -if (ws.connect()) { - ws.send("Hello, WebSocket!"); - - std::string msg; - if (ws.read(msg)) { - std::cout << "Received: " << msg << std::endl; - } - - ws.close(); -} -``` - -SSL is also supported via `wss://` scheme (e.g. `WebSocketClient("wss://example.com/ws")`). Subprotocol negotiation (`Sec-WebSocket-Protocol`) is supported via `SubProtocolSelector` callback. - -> **Note:** WebSocket connections occupy a thread for their entire lifetime (plus an additional thread per connection for heartbeat pings). This thread-per-connection model is intended for small- to mid-scale workloads; large numbers of simultaneous WebSocket connections are outside the design target of this library. If you expect many concurrent WebSocket clients, configure a dynamic thread pool (`svr.new_task_queue = [] { return new ThreadPool(8, 64); };`) and measure carefully. - -> **WebSocket extensions are not supported.** `permessage-deflate` and other RFC 6455 extensions are not implemented. If a client proposes them via `Sec-WebSocket-Extensions`, the server silently declines them in its handshake response. - -> **Unresponsive-peer detection.** Heartbeat pings also serve as a liveness probe when `set_websocket_max_missed_pongs(n)` is set: if the client sends `n` consecutive pings without receiving a pong, it will close the connection. Disabled by default (`0`). - -See [README-websocket.md](README-websocket.md) for more details. - -## Socket Option Utility - -`set_socket_opt` is a convenience wrapper around `setsockopt` for setting integer socket options: - -```cpp -auto sock = svr.socket(); -httplib::set_socket_opt(sock, IPPROTO_TCP, TCP_NODELAY, 1); -``` - -> [!TIP] -> For most use cases, prefer `set_tcp_nodelay(true)` or `set_socket_options(callback)` on the Server/Client instead of calling `set_socket_opt` directly. - -## Split httplib.h into .h and .cc - -```console -$ ./split.py -h -usage: split.py [-h] [-e EXTENSION] [-o OUT] - -This script splits httplib.h into .h and .cc parts. - -optional arguments: - -h, --help show this help message and exit - -e EXTENSION, --extension EXTENSION - extension of the implementation file (default: cc) - -o OUT, --out OUT where to write the files (default: out) - -$ ./split.py -Wrote out/httplib.h and out/httplib.cc -``` - -## Dockerfile for Static HTTP Server - -Dockerfile for static HTTP server is available. Port number of this HTTP server is 80, and it serves static files from `/html` directory in the container. - -```bash -> docker build -t cpp-httplib-server . -... - -> docker run --rm -it -p 8080:80 -v ./docker/html:/html cpp-httplib-server -Serving HTTP on 0.0.0.0 port 80 ... -192.168.65.1 - - [31/Aug/2024:21:33:56 +0000] "GET / HTTP/1.1" 200 599 "-" "curl/8.7.1" -192.168.65.1 - - [31/Aug/2024:21:34:26 +0000] "GET / HTTP/1.1" 200 599 "-" "Mozilla/5.0 ..." -192.168.65.1 - - [31/Aug/2024:21:34:26 +0000] "GET /favicon.ico HTTP/1.1" 404 152 "-" "Mozilla/5.0 ..." -``` - -From Docker Hub - -```bash -> docker run --rm -it -p 8080:80 -v ./docker/html:/html yhirose4dockerhub/cpp-httplib-server -Serving HTTP on 0.0.0.0 port 80 ... -192.168.65.1 - - [31/Aug/2024:21:33:56 +0000] "GET / HTTP/1.1" 200 599 "-" "curl/8.7.1" -192.168.65.1 - - [31/Aug/2024:21:34:26 +0000] "GET / HTTP/1.1" 200 599 "-" "Mozilla/5.0 ..." -192.168.65.1 - - [31/Aug/2024:21:34:26 +0000] "GET /favicon.ico HTTP/1.1" 404 152 "-" "Mozilla/5.0 ..." -``` - -NOTE ----- - -### Regular Expression Stack Overflow - -> [!CAUTION] -> When using complex regex patterns in route handlers, be aware that certain patterns may cause stack overflow during pattern matching. This is a known issue with `std::regex` implementations and affects the `dispatch_request()` method. -> -> ```cpp -> // This pattern can cause stack overflow with large input -> svr.Get(".*", handler); -> ``` -> -> Consider using simpler patterns or path parameters to avoid this issue: -> -> ```cpp -> // Safer alternatives -> svr.Get("/users/:id", handler); // Path parameters -> svr.Get(R"(/api/v\d+/.*)", handler); // More specific patterns -> ``` - -### g++ - -g++ 4.8 and below cannot build this library since `` in the versions are [broken](https://stackoverflow.com/questions/12530406/is-gcc-4-8-or-earlier-buggy-about-regular-expressions). - -### Windows - -Include `httplib.h` before `Windows.h` or include `Windows.h` by defining `WIN32_LEAN_AND_MEAN` beforehand. - -```cpp -#include -#include -``` - -```cpp -#define WIN32_LEAN_AND_MEAN -#include -#include -``` - -> [!NOTE] -> cpp-httplib officially supports only the latest Visual Studio. It might work with former versions of Visual Studio, but I can no longer verify it. Pull requests are always welcome for the older versions of Visual Studio unless they break the C++11 conformance. - -> [!NOTE] -> Windows 8 or lower, Visual Studio 2015 or lower, and Cygwin and MSYS2 including MinGW are neither supported nor tested. - -## License - -MIT license (© 2026 Yuji Hirose) - -## Special Thanks To - -[These folks](https://github.com/yhirose/cpp-httplib/graphs/contributors) made great contributions to polish this library to totally another level from a simple toy! diff --git a/libs/cpp-httplib-0.57.1/benchmark/Makefile b/libs/cpp-httplib-0.57.1/benchmark/Makefile deleted file mode 100644 index 8f6d9ce..0000000 --- a/libs/cpp-httplib-0.57.1/benchmark/Makefile +++ /dev/null @@ -1,51 +0,0 @@ -CXXFLAGS = -O2 -I.. - -CPPHTTPLIB_CXXFLAGS = -std=c++11 -CROW_CXXFLAGS = -std=c++17 - -CPPHTTPLIB_FLAGS = -DCPPHTTPLIB_THREAD_POOL_COUNT=16 - -BENCH = bombardier -c 10 -d 5s localhost:8080 -MONITOR = ali http://localhost:8080 -WAIT = while ! nc -z localhost 8080 >/dev/null 2>&1; do sleep 0.05; done - -# cpp-httplib -bench: server - @echo "--------------------\n cpp-httplib latest\n--------------------\n" - @./server & export PID=$$!; $(WAIT); $(BENCH); kill $${PID} - @echo "" - -monitor: server - @./server & export PID=$$!; $(MONITOR); kill $${PID} - -run : server - @./server - -server : cpp-httplib/main.cpp ../httplib.h - @g++ -o $@ $(CXXFLAGS) $(CPPHTTPLIB_CXXFLAGS) $(CPPHTTPLIB_FLAGS) cpp-httplib/main.cpp - -# crow -bench-crow: server-crow - @echo "-------------\n Crow v1.3.1\n-------------\n" - @./server-crow & export PID=$$!; $(WAIT); $(BENCH); kill $${PID} - @echo "" - -monitor-crow: server-crow - @./server-crow & export PID=$$!; $(MONITOR); kill $${PID} - -run-crow : server-crow - @./server-crow - -server-crow : crow/main.cpp crow/crow_all.h - @g++ -o $@ $(CXXFLAGS) $(CROW_CXXFLAGS) crow/main.cpp - -# misc -build: server server-crow - -bench-all: bench-crow bench - -issue: - bombardier -c 10 -d 30s localhost:8080 - -clean: - rm -rf server* diff --git a/libs/cpp-httplib-0.57.1/benchmark/ab.sh b/libs/cpp-httplib-0.57.1/benchmark/ab.sh deleted file mode 100755 index 6014b7b..0000000 --- a/libs/cpp-httplib-0.57.1/benchmark/ab.sh +++ /dev/null @@ -1,286 +0,0 @@ -#!/usr/bin/env bash -# -# A/B throughput comparison between two git refs. -# -# Usage: ./ab.sh [--base REF] [--head REF] [--rounds N] [--duration S] -# [--connections N] [--threads N] [--path PATH] [--tls] -# [--large-mib N] [--timeout S] -# -# --path selects the workload. The harness serves: -# / small body via set_content(); the response line, the -# headers and the body already share a single write(), so -# this is the least sensitive case -# /large large body via set_content() -# /static/small.js 1 KiB file from a mount point, where the headers and the -# body are two separate writes -# /static/large.bin same, with the body large enough to dominate -# -# --large-mib sizes the two large workloads (default 1). -# -# --tls runs the same workload over HTTPS, which writes through -# SSLSocketStream instead of SocketStream. -# -# --timeout is bombardier's per-request timeout. Its 2s default aborts large -# TLS responses, and the run then fails on the non-2xx check. -# -# Absolute numbers from a single run are meaningless: on a quiet 8-core laptop -# the same binary varies by +/-20% run to run, and shared CI runners are worse. -# So both refs are built and then measured alternately in the same session, and -# only the ratio of the medians is reported. -# -# Requires: bombardier, python3, g++ (or $CXX), git. - -set -euo pipefail - -BASE_REF="master" -HEAD_REF="HEAD" -ROUNDS=5 -DURATION="5s" -CONNECTIONS=10 -THREADS="" -PORT=8080 -REQ_PATH="/" -TLS=0 -LARGE_MIB=1 -TIMEOUT="30s" - -while [ $# -gt 0 ]; do - case "$1" in - --base) BASE_REF="$2"; shift 2 ;; - --head) HEAD_REF="$2"; shift 2 ;; - --rounds) ROUNDS="$2"; shift 2 ;; - --duration) DURATION="$2"; shift 2 ;; - --connections) CONNECTIONS="$2"; shift 2 ;; - --threads) THREADS="$2"; shift 2 ;; - --path) REQ_PATH="$2"; shift 2 ;; - --large-mib) LARGE_MIB="$2"; shift 2 ;; - --timeout) TIMEOUT="$2"; shift 2 ;; - --tls) TLS=1; shift ;; - *) echo "Unknown option: $1" >&2; exit 1 ;; - esac -done - -command -v bombardier >/dev/null || { echo "Error: bombardier not found" >&2; exit 1; } -command -v python3 >/dev/null || { echo "Error: python3 not found" >&2; exit 1; } - -REPO_ROOT=$(git rev-parse --show-toplevel) -CXX=${CXX:-g++} - -# Default the thread pool to the core count. The committed benchmark Makefile -# hardcodes 16, which heavily oversubscribes a 2-4 vCPU CI runner and inflates -# the variance we are trying to see through. -if [ -z "$THREADS" ]; then - THREADS=$(python3 -c 'import os; print(os.cpu_count() or 4)') -fi - -WORKDIR=$(mktemp -d) -cleanup() { - pkill -f "$WORKDIR/.*/server-ab" 2>/dev/null || true - git -C "$REPO_ROOT" worktree remove --force "$WORKDIR/base" 2>/dev/null || true - git -C "$REPO_ROOT" worktree remove --force "$WORKDIR/head" 2>/dev/null || true - rm -rf "$WORKDIR" -} -trap cleanup EXIT - -BASE_SHA=$(git -C "$REPO_ROOT" rev-parse --short "$BASE_REF") -HEAD_SHA=$(git -C "$REPO_ROOT" rev-parse --short "$HEAD_REF") - -echo "==> base: $BASE_REF ($BASE_SHA)" -echo "==> head: $HEAD_REF ($HEAD_SHA)" -echo "==> rounds=$ROUNDS duration=$DURATION connections=$CONNECTIONS threads=$THREADS" -echo "==> path=$REQ_PATH tls=$TLS large=${LARGE_MIB}MiB" -echo "" - -if [ "$BASE_SHA" = "$HEAD_SHA" ]; then - echo "Note: base and head are the same commit; this measures harness noise." - echo "" -fi - -# --- Toolchain bits that depend on --tls --- -SCHEME="http" -INSECURE="" -TLS_CXXFLAGS="" -TLS_LDFLAGS="" -TLS_ARGS="" -if [ "$TLS" = "1" ]; then - SCHEME="https" - INSECURE="-k" - TLS_CXXFLAGS="-DCPPHTTPLIB_OPENSSL_SUPPORT" - TLS_LDFLAGS="-lssl -lcrypto" - if command -v pkg-config >/dev/null 2>&1 && pkg-config --exists openssl; then - TLS_CXXFLAGS="$TLS_CXXFLAGS $(pkg-config --cflags openssl)" - TLS_LDFLAGS="$(pkg-config --libs openssl)" - elif command -v brew >/dev/null 2>&1 && brew --prefix openssl >/dev/null 2>&1; then - OPENSSL_PREFIX=$(brew --prefix openssl) - TLS_CXXFLAGS="$TLS_CXXFLAGS -I$OPENSSL_PREFIX/include" - TLS_LDFLAGS="-L$OPENSSL_PREFIX/lib -lssl -lcrypto" - fi - if [ "$(uname -s)" = "Darwin" ]; then - TLS_LDFLAGS="$TLS_LDFLAGS -framework CoreFoundation -framework Security" - fi - TLS_ARGS="--cert $REPO_ROOT/test/cert.pem --key $REPO_ROOT/test/key.pem" - for f in "$REPO_ROOT/test/cert.pem" "$REPO_ROOT/test/key.pem"; do - [ -f "$f" ] || { echo "Error: $f not found" >&2; exit 1; } - done -fi - -# --- Build both refs --- -# The harness source always comes from the invoking worktree, so both refs run -# an identical workload and a ref that predates a harness change stays -# measurable. Only httplib.h varies, through -I. -HARNESS="$REPO_ROOT/benchmark/cpp-httplib/main.cpp" -[ -f "$HARNESS" ] || { echo "Error: $HARNESS not found" >&2; exit 1; } - -build() { - local name=$1 ref=$2 - git -C "$REPO_ROOT" worktree add --detach --quiet "$WORKDIR/$name" "$ref" - "$CXX" -o "$WORKDIR/$name/server-ab" -O2 -std=c++11 \ - -I"$WORKDIR/$name" \ - -DCPPHTTPLIB_THREAD_POOL_COUNT="$THREADS" \ - $TLS_CXXFLAGS \ - "$HARNESS" -lpthread $TLS_LDFLAGS -} - -echo "==> Building..." -build base "$BASE_REF" -build head "$HEAD_REF" - -# --- Measure one ref once, echo rps --- -measure() { - local name=$1 - local json rc - - "$WORKDIR/$name/server-ab" --port "$PORT" --dir "$WORKDIR/$name-www" \ - --large-mib "$LARGE_MIB" $TLS_ARGS >/dev/null 2>&1 & - local pid=$! - - # Wait for the listener (no dependency on nc) - local i - for i in $(seq 1 200); do - if (exec 3<>/dev/tcp/127.0.0.1/$PORT) 2>/dev/null; then exec 3>&- 3<&-; break; fi - sleep 0.05 - done - - set +e - json=$(bombardier -c "$CONNECTIONS" -d "$DURATION" -t "$TIMEOUT" -o json -p r $INSECURE \ - "$SCHEME://127.0.0.1:$PORT$REQ_PATH" 2>/dev/null) - rc=$? - set -e - - kill "$pid" 2>/dev/null || true - wait "$pid" 2>/dev/null || true - - # Wait for the port to be released before the next run - for i in $(seq 1 200); do - if ! (exec 3<>/dev/tcp/127.0.0.1/$PORT) 2>/dev/null; then break; fi - exec 3>&- 3<&- - sleep 0.05 - done - - if [ $rc -ne 0 ] || [ -z "$json" ]; then - echo "Error: bombardier failed for $name" >&2 - exit 1 - fi - - python3 -c ' -import json, sys -r = json.load(sys.stdin)["result"] -total = sum(r[k] for k in ("req1xx","req2xx","req3xx","req4xx","req5xx","others")) -bad = total - r["req2xx"] -if bad: - sys.stderr.write("Error: %d non-2xx/error responses\n" % bad) - sys.exit(1) -print("%.1f" % (total / r["timeTakenSeconds"])) -' <<<"$json" -} - -# --- Alternate, flipping the order each round to cancel ordering bias --- -BASE_RESULTS=() -HEAD_RESULTS=() - -echo "" -echo "==> Measuring..." -for ((r = 1; r <= ROUNDS; r++)); do - if (( r % 2 == 1 )); then order=("base" "head"); else order=("head" "base"); fi - line=" round $r:" - for name in "${order[@]}"; do - rps=$(measure "$name") - if [ "$name" = "base" ]; then BASE_RESULTS+=("$rps"); else HEAD_RESULTS+=("$rps"); fi - line="$line $name=$rps" - done - echo "$line" -done - -# --- Report --- -SUMMARY=$(python3 -c ' -import statistics, sys -from itertools import combinations - -base = [float(x) for x in sys.argv[1].split()] -head = [float(x) for x in sys.argv[2].split()] -bm, hm = statistics.median(base), statistics.median(head) - -def spread(v): - return (max(v) - min(v)) / statistics.median(v) * 100 - -def u_stat(a, b): - """Mann-Whitney U: number of (a, b) pairs where a > b, ties count a half.""" - return sum((x > y) + 0.5 * (x == y) for x in a for y in b) - -def exact_p(a, b): - """Two-sided permutation p-value. A single slow round cannot swing this - the way a min/max spread check can.""" - n1, n2 = len(a), len(b) - pooled = a + b - observed = abs(u_stat(a, b) - n1 * n2 / 2) - total = extreme = 0 - for idx in combinations(range(n1 + n2), n1): - s = set(idx) - ga = [pooled[i] for i in idx] - gb = [pooled[i] for i in range(n1 + n2) if i not in s] - total += 1 - if abs(u_stat(ga, gb) - n1 * n2 / 2) >= observed: - extreme += 1 - return extreme / total - -print("| | median req/s | min | max | spread |") -print("|---|---|---|---|---|") -print("| base | %.0f | %.0f | %.0f | %.1f%% |" % (bm, min(base), max(base), spread(base))) -print("| head | %.0f | %.0f | %.0f | %.1f%% |" % (hm, min(head), max(head), spread(head))) -print("") -print("**ratio: %.3fx** (%+.1f%%)" % (hm / bm, (hm / bm - 1) * 100)) -print("") - -if len(base) + len(head) > 20: - print("> %d rounds: skipping the permutation test (too many combinations)." - % len(base)) -else: - p = exact_p(base, head) - if p <= 0.05: - print("> Separation is consistent across rounds (permutation p = %.3f)." % p) - else: - print("> Not separated from noise (permutation p = %.3f). Inconclusive;" % p) - print("> raise --rounds or --duration, or run on a quieter machine.") - min_p = exact_p(list(range(len(base))), - list(range(len(base), len(base) + len(head)))) - if min_p > 0.05: - print(">") - print("> With %d rounds even perfect separation only reaches p = %.3f," - % (len(base), min_p)) - print("> so this test can never call a win. Use --rounds 4 or more.") -' "${BASE_RESULTS[*]}" "${HEAD_RESULTS[*]}") - -echo "" -echo "$SUMMARY" - -if [ -n "${GITHUB_STEP_SUMMARY:-}" ]; then - { - echo "## Benchmark A/B" - echo "" - echo "- base: \`$BASE_REF\` ($BASE_SHA)" - echo "- head: \`$HEAD_REF\` ($HEAD_SHA)" - echo "- rounds=$ROUNDS duration=$DURATION connections=$CONNECTIONS threads=$THREADS" - echo "" - echo "$SUMMARY" - } >> "$GITHUB_STEP_SUMMARY" -fi diff --git a/libs/cpp-httplib-0.57.1/benchmark/cpp-httplib/main.cpp b/libs/cpp-httplib-0.57.1/benchmark/cpp-httplib/main.cpp deleted file mode 100644 index 56987e6..0000000 --- a/libs/cpp-httplib-0.57.1/benchmark/cpp-httplib/main.cpp +++ /dev/null @@ -1,139 +0,0 @@ -#include "httplib.h" - -#include -#include -#include -#include - -#ifndef _WIN32 -#include -#include -#endif - -using namespace httplib; - -namespace { - -// The workloads differ in which part of the write path they exercise: -// -// / small body set through set_content(); the response line, -// the headers and the body already share a single write() -// /large large body set through set_content(); the body is copied -// into the header buffer before that single write(). -// --large-mib sets its size (and large.bin's). -// /static/small.js small file served from a mount point, where the headers -// and the body are two separate writes -// /static/large.bin same, with the body large enough to dominate -// -// Bodies are generated at startup so the repository carries no fixtures. - -const size_t SMALL_SIZE = 1024; -const size_t LARGE_SIZE_DEFAULT_MIB = 1; - -std::string filler(size_t n) { - std::string s; - s.reserve(n); - while (s.size() < n) { - s += "0123456789abcdef"; - } - s.resize(n); - return s; -} - -bool write_file(const std::string &path, const std::string &content) { - std::ofstream f(path.c_str(), std::ios::binary); - f.write(content.data(), static_cast(content.size())); - return f.good(); -} - -std::string default_dir() { - const char *tmp = std::getenv("TMPDIR"); - std::string base = tmp && *tmp ? tmp : "/tmp"; - if (!base.empty() && base[base.size() - 1] == '/') { - base.erase(base.size() - 1); - } - return base + "/cpp-httplib-bench"; -} - -bool make_dir(const std::string &path) { -#ifdef _WIN32 - return _mkdir(path.c_str()) == 0 || errno == EEXIST; -#else - return ::mkdir(path.c_str(), 0755) == 0 || errno == EEXIST; -#endif -} - -void setup(Server &svr, const std::string &large, const std::string &dir) { - svr.Get("/", [](const Request &, Response &res) { - res.set_content("Hello World!", "text/plain"); - }); - - svr.Get("/large", [&large](const Request &, Response &res) { - res.set_content(large, "application/octet-stream"); - }); - - svr.set_mount_point("/static", dir); -} - -} // namespace - -int main(int argc, char *argv[]) { - int port = 8080; - std::string dir = default_dir(); - std::string cert; - std::string key; - size_t large_mib = LARGE_SIZE_DEFAULT_MIB; - - for (int i = 1; i < argc; i++) { - auto last = i + 1 < argc; - if (!std::strcmp(argv[i], "--port") && last) { - port = std::atoi(argv[++i]); - } else if (!std::strcmp(argv[i], "--large-mib") && last) { - large_mib = static_cast(std::atoi(argv[++i])); - } else if (!std::strcmp(argv[i], "--dir") && last) { - dir = argv[++i]; - } else if (!std::strcmp(argv[i], "--cert") && last) { - cert = argv[++i]; - } else if (!std::strcmp(argv[i], "--key") && last) { - key = argv[++i]; - } else { - std::fprintf(stderr, - "usage: %s [--port N] [--dir PATH] [--large-mib N]" - " [--cert PATH --key PATH]\n", - argv[0]); - return 2; - } - } - - if (!make_dir(dir)) { - std::fprintf(stderr, "cannot create %s\n", dir.c_str()); - return 1; - } - - auto large = filler(large_mib * 1024 * 1024); - if (!write_file(dir + "/small.js", filler(SMALL_SIZE)) || - !write_file(dir + "/large.bin", large)) { - std::fprintf(stderr, "cannot write fixtures under %s\n", dir.c_str()); - return 1; - } - - if (!cert.empty()) { -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - SSLServer svr(cert.c_str(), key.c_str()); - if (!svr.is_valid()) { - std::fprintf(stderr, "cannot load %s / %s\n", cert.c_str(), key.c_str()); - return 1; - } - setup(svr, large, dir); - svr.listen("0.0.0.0", port); - return 0; -#else - std::fprintf(stderr, "built without CPPHTTPLIB_OPENSSL_SUPPORT\n"); - return 1; -#endif - } - - Server svr; - setup(svr, large, dir); - svr.listen("0.0.0.0", port); -} diff --git a/libs/cpp-httplib-0.57.1/benchmark/crow/crow_all.h b/libs/cpp-httplib-0.57.1/benchmark/crow/crow_all.h deleted file mode 100644 index 6de0dac..0000000 --- a/libs/cpp-httplib-0.57.1/benchmark/crow/crow_all.h +++ /dev/null @@ -1,13796 +0,0 @@ -// SPDX-License-Identifier: BSD-3-Clause AND ISC AND MIT -/*BSD 3-Clause License - -Copyright (c) 2014-2017, ipkn - 2020-2026, CrowCpp -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -The Crow logo and other graphic material (excluding third party logos) used are -under exclusive Copyright (c) 2021-2022, Farook Al-Sammarraie (The-EDev), All -rights reserved. -*/ -#pragma once -#ifdef CROW_ENABLE_COMPRESSION - -#include -#include - -// http://zlib.net/manual.html -namespace crow // NOTE: Already documented in "crow/app.h" -{ -namespace compression { -// Values used in the 'windowBits' parameter for deflateInit2. -enum algorithm { - // 15 is the default value for deflate - DEFLATE = 15, - // windowBits can also be greater than 15 for optional gzip encoding. - // Add 16 to windowBits to write a simple gzip header and trailer around the - // compressed data instead of a zlib wrapper. - GZIP = 15 | 16, -}; - -inline std::string compress_string(std::string const &str, algorithm algo) { - std::string compressed_str; - z_stream stream{}; - // Initialize with the default values - if (::deflateInit2(&stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, algo, 8, - Z_DEFAULT_STRATEGY) == Z_OK) { - char buffer[8192]; - - stream.avail_in = str.size(); - // zlib does not take a const pointer. The data is not altered. - stream.next_in = - const_cast(reinterpret_cast(str.c_str())); - - int code = Z_OK; - do { - stream.avail_out = sizeof(buffer); - stream.next_out = reinterpret_cast(&buffer[0]); - - code = ::deflate(&stream, Z_FINISH); - // Successful and non-fatal error code returned by deflate when used with - // Z_FINISH flush - if (code == Z_OK || code == Z_STREAM_END) { - std::copy(&buffer[0], &buffer[sizeof(buffer) - stream.avail_out], - std::back_inserter(compressed_str)); - } - - } while (code == Z_OK); - - if (code != Z_STREAM_END) compressed_str.clear(); - - ::deflateEnd(&stream); - } - - return compressed_str; -} - -inline std::string decompress_string(std::string const &deflated_string) { - std::string inflated_string; - Bytef tmp[8192]; - - z_stream zstream{}; - zstream.avail_in = deflated_string.size(); - // Nasty const_cast but zlib won't alter its contents - zstream.next_in = const_cast( - reinterpret_cast(deflated_string.c_str())); - // Initialize with automatic header detection, for gzip support - if (::inflateInit2(&zstream, MAX_WBITS | 32) == Z_OK) { - do { - zstream.avail_out = sizeof(tmp); - zstream.next_out = &tmp[0]; - - auto ret = ::inflate(&zstream, Z_NO_FLUSH); - if (ret == Z_OK || ret == Z_STREAM_END) { - std::copy(&tmp[0], &tmp[sizeof(tmp) - zstream.avail_out], - std::back_inserter(inflated_string)); - } else { - // Something went wrong with inflate; make sure we return an empty - // string - inflated_string.clear(); - break; - } - - } while (zstream.avail_out == 0); - - // Free zlib's internal memory - ::inflateEnd(&zstream); - } - - return inflated_string; -} -} // namespace compression -} // namespace crow - -#endif - -namespace crow { -constexpr const char VERSION[] = "master"; -} - -/* - * SHA1 Wikipedia Page: http://en.wikipedia.org/wiki/SHA-1 - * - * Copyright (c) 2012-22 SAURAV MOHAPATRA - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/** - * \file TinySHA1.hpp - * \author SAURAV MOHAPATRA - * \date 2012-22 - * \brief TinySHA1 - a header only implementation of the SHA1 algorithm in C++. - * Based on the implementation in boost::uuid::details. - * - * In this file are defined: - * - sha1::SHA1 - */ -#ifndef _TINY_SHA1_HPP_ -#define _TINY_SHA1_HPP_ -#include -#include -#include -#include - -/** - * \namespace sha1 - * \brief Here is defined the SHA1 class - */ -namespace sha1 { -/** - * \class SHA1 - * \brief A tiny SHA1 algorithm implementation used internally in the - * Crow server (specifically in crow/websocket.h). - */ -class SHA1 { -public: - typedef uint32_t digest32_t[5]; - typedef uint8_t digest8_t[20]; - inline static uint32_t LeftRotate(uint32_t value, size_t count) { - return (value << count) ^ (value >> (32 - count)); - } - SHA1() { reset(); } - virtual ~SHA1() {} - SHA1(const SHA1 &s) { *this = s; } - const SHA1 &operator=(const SHA1 &s) { - memcpy(m_digest, s.m_digest, 5 * sizeof(uint32_t)); - memcpy(m_block, s.m_block, 64); - m_blockByteIndex = s.m_blockByteIndex; - m_byteCount = s.m_byteCount; - return *this; - } - SHA1 &reset() { - m_digest[0] = 0x67452301; - m_digest[1] = 0xEFCDAB89; - m_digest[2] = 0x98BADCFE; - m_digest[3] = 0x10325476; - m_digest[4] = 0xC3D2E1F0; - m_blockByteIndex = 0; - m_byteCount = 0; - return *this; - } - SHA1 &processByte(uint8_t octet) { - this->m_block[this->m_blockByteIndex++] = octet; - ++this->m_byteCount; - if (m_blockByteIndex == 64) { - this->m_blockByteIndex = 0; - processBlock(); - } - return *this; - } - SHA1 &processBlock(const void *const start, const void *const end) { - const uint8_t *begin = static_cast(start); - const uint8_t *finish = static_cast(end); - while (begin != finish) { - processByte(*begin); - begin++; - } - return *this; - } - SHA1 &processBytes(const void *const data, size_t len) { - const uint8_t *block = static_cast(data); - processBlock(block, block + len); - return *this; - } - const uint32_t *getDigest(digest32_t digest) { - size_t bitCount = this->m_byteCount * 8; - processByte(0x80); - if (this->m_blockByteIndex > 56) { - while (m_blockByteIndex != 0) { - processByte(0); - } - while (m_blockByteIndex < 56) { - processByte(0); - } - } else { - while (m_blockByteIndex < 56) { - processByte(0); - } - } - processByte(0); - processByte(0); - processByte(0); - processByte(0); - processByte(static_cast((bitCount >> 24) & 0xFF)); - processByte(static_cast((bitCount >> 16) & 0xFF)); - processByte(static_cast((bitCount >> 8) & 0xFF)); - processByte(static_cast((bitCount) & 0xFF)); - - memcpy(digest, m_digest, 5 * sizeof(uint32_t)); - return digest; - } - const uint8_t *getDigestBytes(digest8_t digest) { - digest32_t d32; - getDigest(d32); - size_t di = 0; - digest[di++] = ((d32[0] >> 24) & 0xFF); - digest[di++] = ((d32[0] >> 16) & 0xFF); - digest[di++] = ((d32[0] >> 8) & 0xFF); - digest[di++] = ((d32[0]) & 0xFF); - - digest[di++] = ((d32[1] >> 24) & 0xFF); - digest[di++] = ((d32[1] >> 16) & 0xFF); - digest[di++] = ((d32[1] >> 8) & 0xFF); - digest[di++] = ((d32[1]) & 0xFF); - - digest[di++] = ((d32[2] >> 24) & 0xFF); - digest[di++] = ((d32[2] >> 16) & 0xFF); - digest[di++] = ((d32[2] >> 8) & 0xFF); - digest[di++] = ((d32[2]) & 0xFF); - - digest[di++] = ((d32[3] >> 24) & 0xFF); - digest[di++] = ((d32[3] >> 16) & 0xFF); - digest[di++] = ((d32[3] >> 8) & 0xFF); - digest[di++] = ((d32[3]) & 0xFF); - - digest[di++] = ((d32[4] >> 24) & 0xFF); - digest[di++] = ((d32[4] >> 16) & 0xFF); - digest[di++] = ((d32[4] >> 8) & 0xFF); - digest[di++] = ((d32[4]) & 0xFF); - return digest; - } - -protected: - void processBlock() { - uint32_t w[80]; - for (size_t i = 0; i < 16; i++) { - w[i] = (m_block[i * 4 + 0] << 24); - w[i] |= (m_block[i * 4 + 1] << 16); - w[i] |= (m_block[i * 4 + 2] << 8); - w[i] |= (m_block[i * 4 + 3]); - } - for (size_t i = 16; i < 80; i++) { - w[i] = LeftRotate((w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]), 1); - } - - uint32_t a = m_digest[0]; - uint32_t b = m_digest[1]; - uint32_t c = m_digest[2]; - uint32_t d = m_digest[3]; - uint32_t e = m_digest[4]; - - for (std::size_t i = 0; i < 80; ++i) { - uint32_t f = 0; - uint32_t k = 0; - - if (i < 20) { - f = (b & c) | (~b & d); - k = 0x5A827999; - } else if (i < 40) { - f = b ^ c ^ d; - k = 0x6ED9EBA1; - } else if (i < 60) { - f = (b & c) | (b & d) | (c & d); - k = 0x8F1BBCDC; - } else { - f = b ^ c ^ d; - k = 0xCA62C1D6; - } - uint32_t temp = LeftRotate(a, 5) + f + e + k + w[i]; - e = d; - d = c; - c = LeftRotate(b, 30); - b = a; - a = temp; - } - - m_digest[0] += a; - m_digest[1] += b; - m_digest[2] += c; - m_digest[3] += d; - m_digest[4] += e; - } - -private: - digest32_t m_digest; - uint8_t m_block[64]; - size_t m_blockByteIndex; - size_t m_byteCount; -}; -} // namespace sha1 -#endif - -#include -#include -#include -#include -#include -#include -#include - -namespace crow { - -// ---------------------------------------------------------------------------- -// qs_parse (modified) -// https://github.com/bartgrantham/qs_parse -// ---------------------------------------------------------------------------- -/* Similar to strncmp, but handles URL-encoding for either string */ -int qs_strncmp(const char *s, const char *qs, size_t n); - -/* Finds the beginning of each key/value pair and stores a pointer in qs_kv. - * Also decodes the value portion of the k/v pair *in-place*. In a future - * enhancement it will also have a compile-time option of sorting qs_kv - * alphabetically by key. */ -size_t qs_parse(char *qs, char *qs_kv[], size_t qs_kv_size, bool parse_url); - -/* Used by qs_parse to decode the value portion of a k/v pair */ -int qs_decode(char *qs); - -/* Looks up the value according to the key on a pre-processed query string - * A future enhancement will be a compile-time option to look up the key - * in a pre-sorted qs_kv array via a binary search. */ -// char * qs_k2v(const char * key, char * qs_kv[], int qs_kv_size); -char *qs_k2v(const char *key, char *const *qs_kv, size_t qs_kv_size, int nth); - -/* Non-destructive lookup of value, based on key. User provides the - * destinaton string and length. */ -char *qs_scanvalue(const char *key, const char *qs, char *val, size_t val_len); - -// TODO: implement sorting of the qs_kv array; for now ensure it's not compiled -#undef _qsSORTING - -// isxdigit _is_ available in , but let's avoid another header instead -#define CROW_QS_ISHEX(x) \ - ((((x) >= '0' && (x) <= '9') || ((x) >= 'A' && (x) <= 'F') || \ - ((x) >= 'a' && (x) <= 'f')) \ - ? 1 \ - : 0) -#define CROW_QS_HEX2DEC(x) \ - (((x) >= '0' && (x) <= '9') ? (x) - 48 \ - : ((x) >= 'A' && (x) <= 'F') ? (x) - 55 \ - : ((x) >= 'a' && (x) <= 'f') ? (x) - 87 \ - : 0) -#define CROW_QS_ISQSCHR(x) \ - ((((x) == '=') || ((x) == '#') || ((x) == '&') || ((x) == '\0')) ? 0 : 1) - -inline int qs_strncmp(const char *s, const char *qs, size_t n) { - unsigned char u1, u2, unyb, lnyb; - - while (n-- > 0) { - u1 = static_cast(*s++); - u2 = static_cast(*qs++); - - if (!CROW_QS_ISQSCHR(u1)) { u1 = '\0'; } - if (!CROW_QS_ISQSCHR(u2)) { u2 = '\0'; } - - if (u1 == '+') { u1 = ' '; } - if (u1 == '%') // easier/safer than scanf - { - unyb = static_cast(*s++); - lnyb = static_cast(*s++); - if (CROW_QS_ISHEX(unyb) && CROW_QS_ISHEX(lnyb)) - u1 = (CROW_QS_HEX2DEC(unyb) * 16) + CROW_QS_HEX2DEC(lnyb); - else - u1 = '\0'; - } - - if (u2 == '+') { u2 = ' '; } - if (u2 == '%') // easier/safer than scanf - { - unyb = static_cast(*qs++); - lnyb = static_cast(*qs++); - if (CROW_QS_ISHEX(unyb) && CROW_QS_ISHEX(lnyb)) - u2 = (CROW_QS_HEX2DEC(unyb) * 16) + CROW_QS_HEX2DEC(lnyb); - else - u2 = '\0'; - } - - if (u1 != u2) return u1 - u2; - if (u1 == '\0') return 0; - } - if (CROW_QS_ISQSCHR(*qs)) - return -1; - else - return 0; -} - -inline size_t qs_parse(char *qs, char *qs_kv[], size_t qs_kv_size, - bool parse_url = true) { - size_t i, j; - char *substr_ptr; - - for (i = 0; i < qs_kv_size; i++) - qs_kv[i] = NULL; - - // find the beginning of the k/v substrings or the fragment - substr_ptr = parse_url ? qs + strcspn(qs, "?#") : qs; - if (parse_url) { - if (substr_ptr[0] != '\0') - substr_ptr++; - else - return 0; // no query or fragment - } - - i = 0; - while (i < qs_kv_size) { - qs_kv[i] = substr_ptr; - j = strcspn(substr_ptr, "&"); - if (substr_ptr[j] == '\0') { - i++; - break; - } // x &'s -> means x iterations of this loop -> means *x+1* k/v pairs - substr_ptr += j + 1; - i++; - } - - // we only decode the values in place, the keys could have '='s in them - // which will hose our ability to distinguish keys from values later - for (j = 0; j < i; j++) { - substr_ptr = qs_kv[j] + strcspn(qs_kv[j], "=&#"); - if (substr_ptr[0] == '&' || - substr_ptr[0] == '\0') // blank value: skip decoding - substr_ptr[0] = '\0'; - else - qs_decode(++substr_ptr); - } - -#ifdef _qsSORTING -// TODO: qsort qs_kv, using qs_strncmp() for the comparison -#endif - - return i; -} - -inline int qs_decode(char *qs) { - int i = 0, j = 0; - - while (CROW_QS_ISQSCHR(qs[j])) { - if (qs[j] == '+') { - qs[i] = ' '; - } else if (qs[j] == '%') // easier/safer than scanf - { - if (!CROW_QS_ISHEX(qs[j + 1]) || !CROW_QS_ISHEX(qs[j + 2])) { - qs[i] = '\0'; - return i; - } - qs[i] = (CROW_QS_HEX2DEC(qs[j + 1]) * 16) + CROW_QS_HEX2DEC(qs[j + 2]); - j += 2; - } else { - qs[i] = qs[j]; - } - i++; - j++; - } - qs[i] = '\0'; - - return i; -} - -inline char *qs_k2v(const char *key, char *const *qs_kv, size_t qs_kv_size, - int nth = 0) { - size_t i; - size_t key_len, skip; - - key_len = strlen(key); - -#ifdef _qsSORTING -// TODO: binary search for key in the sorted qs_kv -#else // _qsSORTING - for (i = 0; i < qs_kv_size; i++) { - // we rely on the unambiguous '=' to find the value in our k/v pair - if (qs_strncmp(key, qs_kv[i], key_len) == 0) { - skip = strcspn(qs_kv[i], "="); - if (qs_kv[i][skip] == '=') skip++; - // return (zero-char value) ? ptr to trailing '\0' : ptr to value - if (nth == 0) - return qs_kv[i] + skip; - else - --nth; - } - } -#endif // _qsSORTING - - return nullptr; -} - -inline std::unique_ptr> -qs_dict_name2kv(const char *dict_name, char *const *qs_kv, size_t qs_kv_size, - int nth = 0) { - size_t i; - size_t name_len, skip_to_eq, skip_to_brace_open, skip_to_brace_close; - - name_len = strlen(dict_name); - -#ifdef _qsSORTING -// TODO: binary search for key in the sorted qs_kv -#else // _qsSORTING - for (i = 0; i < qs_kv_size; i++) { - if (strncmp(dict_name, qs_kv[i], name_len) == 0) { - skip_to_eq = strcspn(qs_kv[i], "="); - if (qs_kv[i][skip_to_eq] == '=') skip_to_eq++; - skip_to_brace_open = strcspn(qs_kv[i], "["); - if (qs_kv[i][skip_to_brace_open] == '[') skip_to_brace_open++; - skip_to_brace_close = strcspn(qs_kv[i], "]"); - - if (skip_to_brace_open <= skip_to_brace_close && skip_to_brace_open > 0 && - skip_to_brace_close > 0 && nth == 0) { - auto key = std::string(qs_kv[i] + skip_to_brace_open, - skip_to_brace_close - skip_to_brace_open); - auto value = std::string(qs_kv[i] + skip_to_eq); - return std::unique_ptr>( - new std::pair(key, value)); - } else { - --nth; - } - } - } -#endif // _qsSORTING - - return nullptr; -} - -inline char *qs_scanvalue(const char *key, const char *qs, char *val, - size_t val_len) { - const char *tmp = strchr(qs, '?'); - - // find the beginning of the k/v substrings - if (tmp != nullptr) qs = tmp + 1; - - const size_t key_len = strlen(key); - while (*qs != '#' && *qs != '\0') { - if (qs_strncmp(key, qs, key_len) == 0) break; - qs += strcspn(qs, "&"); - if (*qs == '&') qs++; - } - - if (qs[0] == '\0') return nullptr; - - qs += strcspn(qs, "=&#"); - if (qs[0] == '=') { - qs++; - size_t i = strcspn(qs, "&=#"); -#ifdef _MSC_VER - strncpy_s(val, val_len, qs, - (val_len - 1) < (i + 1) ? (val_len - 1) : (i + 1)); -#else - strncpy(val, qs, (val_len - 1) < (i + 1) ? (val_len - 1) : (i + 1)); -#endif - qs_decode(val); - } else { - if (val_len > 0) val[0] = '\0'; - } - - return val; -} -} // namespace crow -// ---------------------------------------------------------------------------- - -namespace crow { -struct request; -/// A class to represent any data coming after the `?` in the request URL into -/// key-value pairs. -class query_string { -public: - static const int MAX_KEY_VALUE_PAIRS_COUNT = 256; - - query_string() = default; - - query_string(const query_string &qs) : url_(qs.url_) { - for (auto p : qs.key_value_pairs_) { - key_value_pairs_.push_back((char *)(p - qs.url_.c_str() + url_.c_str())); - } - } - - query_string &operator=(const query_string &qs) { - url_ = qs.url_; - key_value_pairs_.clear(); - for (auto p : qs.key_value_pairs_) { - key_value_pairs_.push_back((char *)(p - qs.url_.c_str() + url_.c_str())); - } - return *this; - } - - query_string &operator=(query_string &&qs) noexcept { - key_value_pairs_ = std::move(qs.key_value_pairs_); - char *old_data = (char *)qs.url_.c_str(); - url_ = std::move(qs.url_); - for (auto &p : key_value_pairs_) { - p += (char *)url_.c_str() - old_data; - } - return *this; - } - - query_string(std::string params, bool url = true) : url_(std::move(params)) { - if (url_.empty()) return; - - key_value_pairs_.resize(MAX_KEY_VALUE_PAIRS_COUNT); - size_t count = qs_parse(&url_[0], &key_value_pairs_[0], - MAX_KEY_VALUE_PAIRS_COUNT, url); - - key_value_pairs_.resize(count); - key_value_pairs_.shrink_to_fit(); - } - - void clear() { - key_value_pairs_.clear(); - url_.clear(); - } - - friend std::ostream &operator<<(std::ostream &os, const query_string &qs) { - os << "[ "; - for (size_t i = 0; i < qs.key_value_pairs_.size(); ++i) { - if (i) os << ", "; - os << qs.key_value_pairs_[i]; - } - os << " ]"; - return os; - } - - /// Get a value from a name, used for `?name=value`. - - /// - /// Note: this method returns the value of the first occurrence of the key - /// only, to return all occurrences, see \ref get_list(). - char *get(const std::string &name) const { - char *ret = - qs_k2v(name.c_str(), key_value_pairs_.data(), key_value_pairs_.size()); - return ret; - } - - /// Works similar to \ref get() except it removes the item from the query - /// string. - char *pop(const std::string &name) { - char *ret = get(name); - if (ret != nullptr) { - const std::string key_name = name + '='; - for (unsigned int i = 0; i < key_value_pairs_.size(); i++) { - std::string str_item(key_value_pairs_[i]); - if (str_item.find(key_name) == 0) { - key_value_pairs_.erase(key_value_pairs_.begin() + i); - break; - } - } - } - return ret; - } - - /// Returns a list of values, passed as - /// `?name[]=value1&name[]=value2&...name[]=valuen` with n being the size of - /// the list. - - /// - /// Note: Square brackets in the above example are controlled by - /// `use_brackets` boolean (true by default). If set to false, the example - /// becomes `?name=value1,name=value2...name=valuen` - std::vector get_list(const std::string &name, - bool use_brackets = true) const { - std::vector ret; - std::string plus = name + (use_brackets ? "[]" : ""); - char *element = nullptr; - - int count = 0; - while (1) { - element = qs_k2v(plus.c_str(), key_value_pairs_.data(), - key_value_pairs_.size(), count++); - if (!element) break; - ret.push_back(element); - } - return ret; - } - - /// Similar to \ref get_list() but it removes the - std::vector pop_list(const std::string &name, - bool use_brackets = true) { - std::vector ret = get_list(name, use_brackets); - const size_t name_len = name.length(); - if (!ret.empty()) { - for (unsigned int i = 0; i < key_value_pairs_.size(); i++) { - std::string str_item(key_value_pairs_[i]); - if (str_item.find(name) == 0) { - if (use_brackets && str_item.find("[]=", name_len) == name_len) { - key_value_pairs_.erase(key_value_pairs_.begin() + i--); - } else if (!use_brackets && - str_item.find('=', name_len) == name_len) { - key_value_pairs_.erase(key_value_pairs_.begin() + i--); - } - } - } - } - return ret; - } - - /// Works similar to \ref get_list() except the brackets are mandatory must - /// not be empty. - - /// - /// For example calling `get_dict(yourname)` on - /// `?yourname[sub1]=42&yourname[sub2]=84` would give a map containing `{sub1 - /// : 42, sub2 : 84}`. - /// - /// if your query string has both empty brackets and ones with a key inside, - /// use pop_list() to get all the values without a key before running this - /// method. - std::unordered_map - get_dict(const std::string &name) const { - std::unordered_map ret; - - int count = 0; - while (1) { - if (auto element = qs_dict_name2kv(name.c_str(), key_value_pairs_.data(), - key_value_pairs_.size(), count++)) - ret.insert(*element); - else - break; - } - return ret; - } - - /// Works the same as \ref get_dict() but removes the values from the query - /// string. - std::unordered_map - pop_dict(const std::string &name) { - const std::string name_value = name + '['; - std::unordered_map ret = get_dict(name); - if (!ret.empty()) { - for (unsigned int i = 0; i < key_value_pairs_.size(); i++) { - std::string str_item(key_value_pairs_[i]); - if (str_item.find(name_value) == 0) { - key_value_pairs_.erase(key_value_pairs_.begin() + i--); - } - } - } - return ret; - } - - std::vector keys() const { - std::vector keys; - keys.reserve(key_value_pairs_.size()); - - for (const char *const element : key_value_pairs_) { - const char *delimiter = strchr(element, '='); - if (delimiter) - keys.emplace_back(element, delimiter); - else - keys.emplace_back(element); - } - - return keys; - } - -private: - std::string url_; - std::vector key_value_pairs_; -}; - -} // namespace crow - -// This file is generated from nginx/conf/mime.types using nginx_mime2cpp.py on -// 2021-12-03. -#include -#include - -namespace crow { -const std::unordered_map mime_types{ - {"gz", "application/gzip"}, - {"shtml", "text/html"}, - {"htm", "text/html"}, - {"html", "text/html"}, - {"css", "text/css"}, - {"xml", "text/xml"}, - {"gif", "image/gif"}, - {"jpg", "image/jpeg"}, - {"jpeg", "image/jpeg"}, - {"js", "application/javascript"}, - {"atom", "application/atom+xml"}, - {"rss", "application/rss+xml"}, - {"mml", "text/mathml"}, - {"txt", "text/plain"}, - {"jad", "text/vnd.sun.j2me.app-descriptor"}, - {"wml", "text/vnd.wap.wml"}, - {"htc", "text/x-component"}, - {"avif", "image/avif"}, - {"png", "image/png"}, - {"svgz", "image/svg+xml"}, - {"svg", "image/svg+xml"}, - {"tiff", "image/tiff"}, - {"tif", "image/tiff"}, - {"wbmp", "image/vnd.wap.wbmp"}, - {"webp", "image/webp"}, - {"ico", "image/x-icon"}, - {"jng", "image/x-jng"}, - {"bmp", "image/x-ms-bmp"}, - {"woff", "font/woff"}, - {"woff2", "font/woff2"}, - {"ear", "application/java-archive"}, - {"war", "application/java-archive"}, - {"jar", "application/java-archive"}, - {"json", "application/json"}, - {"hqx", "application/mac-binhex40"}, - {"doc", "application/msword"}, - {"pdf", "application/pdf"}, - {"ai", "application/postscript"}, - {"eps", "application/postscript"}, - {"ps", "application/postscript"}, - {"rtf", "application/rtf"}, - {"m3u8", "application/vnd.apple.mpegurl"}, - {"kml", "application/vnd.google-earth.kml+xml"}, - {"kmz", "application/vnd.google-earth.kmz"}, - {"xls", "application/vnd.ms-excel"}, - {"eot", "application/vnd.ms-fontobject"}, - {"ppt", "application/vnd.ms-powerpoint"}, - {"odg", "application/vnd.oasis.opendocument.graphics"}, - {"odp", "application/vnd.oasis.opendocument.presentation"}, - {"ods", "application/vnd.oasis.opendocument.spreadsheet"}, - {"odt", "application/vnd.oasis.opendocument.text"}, - {"pptx", "application/" - "vnd.openxmlformats-officedocument.presentationml.presentation"}, - {"xlsx", - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}, - {"docx", - "application/vnd.openxmlformats-officedocument.wordprocessingml.document"}, - {"wmlc", "application/vnd.wap.wmlc"}, - {"wasm", "application/wasm"}, - {"7z", "application/x-7z-compressed"}, - {"cco", "application/x-cocoa"}, - {"jardiff", "application/x-java-archive-diff"}, - {"jnlp", "application/x-java-jnlp-file"}, - {"run", "application/x-makeself"}, - {"pm", "application/x-perl"}, - {"pl", "application/x-perl"}, - {"pdb", "application/x-pilot"}, - {"prc", "application/x-pilot"}, - {"rar", "application/x-rar-compressed"}, - {"rpm", "application/x-redhat-package-manager"}, - {"sea", "application/x-sea"}, - {"swf", "application/x-shockwave-flash"}, - {"sit", "application/x-stuffit"}, - {"tk", "application/x-tcl"}, - {"tcl", "application/x-tcl"}, - {"crt", "application/x-x509-ca-cert"}, - {"pem", "application/x-x509-ca-cert"}, - {"der", "application/x-x509-ca-cert"}, - {"xpi", "application/x-xpinstall"}, - {"xhtml", "application/xhtml+xml"}, - {"xspf", "application/xspf+xml"}, - {"zip", "application/zip"}, - {"dll", "application/octet-stream"}, - {"exe", "application/octet-stream"}, - {"bin", "application/octet-stream"}, - {"deb", "application/octet-stream"}, - {"dmg", "application/octet-stream"}, - {"img", "application/octet-stream"}, - {"iso", "application/octet-stream"}, - {"msm", "application/octet-stream"}, - {"msp", "application/octet-stream"}, - {"msi", "application/octet-stream"}, - {"kar", "audio/midi"}, - {"midi", "audio/midi"}, - {"mid", "audio/midi"}, - {"mp3", "audio/mpeg"}, - {"ogg", "audio/ogg"}, - {"m4a", "audio/x-m4a"}, - {"ra", "audio/x-realaudio"}, - {"3gp", "video/3gpp"}, - {"3gpp", "video/3gpp"}, - {"ts", "video/mp2t"}, - {"mp4", "video/mp4"}, - {"mpg", "video/mpeg"}, - {"mpeg", "video/mpeg"}, - {"mov", "video/quicktime"}, - {"webm", "video/webm"}, - {"flv", "video/x-flv"}, - {"m4v", "video/x-m4v"}, - {"mng", "video/x-mng"}, - {"asf", "video/x-ms-asf"}, - {"asx", "video/x-ms-asf"}, - {"wmv", "video/x-ms-wmv"}, - {"avi", "video/x-msvideo"}}; -} - -// settings for crow -// TODO(ipkn) replace with runtime config. libucl? - -/* #ifdef - enables debug mode */ -// #define CROW_ENABLE_DEBUG - -/* #ifdef - enables logging */ -#define CROW_ENABLE_LOGGING - -/* #ifdef - enforces section 5.2 and 6.1 of RFC6455 (only accepting masked - * messages from clients) */ -// #define CROW_ENFORCE_WS_SPEC - -/* #define - specifies log level */ -/* - Debug = 0 - Info = 1 - Warning = 2 - Error = 3 - Critical = 4 - - default to INFO -*/ -#ifndef CROW_LOG_LEVEL -#define CROW_LOG_LEVEL 1 -#endif - -#ifndef CROW_STATIC_DIRECTORY -#define CROW_STATIC_DIRECTORY "static/" -#endif -#ifndef CROW_STATIC_ENDPOINT -#define CROW_STATIC_ENDPOINT "/static/" -#endif - -// compiler flags - -#if defined(_MSC_VER) -#if _MSC_VER < 1900 -#define CROW_MSVC_WORKAROUND -#define constexpr const -#define noexcept throw() -#endif -#endif - -#ifdef CROW_USE_BOOST -#include -#include -#ifdef CROW_ENABLE_SSL -#include -#endif -#else -#ifndef ASIO_STANDALONE -#define ASIO_STANDALONE -#endif -#include -#include -#ifdef CROW_ENABLE_SSL -#include -#endif -#endif - -#if (defined(CROW_USE_BOOST) && BOOST_VERSION >= 107000) || \ - (ASIO_VERSION >= 101008) -#define GET_IO_CONTEXT(s) ((asio::io_context &)(s).get_executor().context()) -#else -#define GET_IO_CONTEXT(s) ((s).get_io_service()) -#endif - -namespace crow { -#ifdef CROW_USE_BOOST -namespace asio = boost::asio; -using error_code = boost::system::error_code; -#else -using error_code = asio::error_code; -#endif -using tcp = asio::ip::tcp; -using stream_protocol = asio::local::stream_protocol; - -/// A wrapper for the asio::ip::tcp::socket and asio::ssl::stream -struct SocketAdaptor { - using context = void; - SocketAdaptor(asio::io_context &io_context, context *) - : socket_(io_context) {} - - asio::io_context &get_io_context() { return GET_IO_CONTEXT(socket_); } - - /// Get the TCP socket handling data transfers, regardless of what layer is - /// handling transfers on top of the socket. - tcp::socket &raw_socket() { return socket_; } - - /// Get the object handling data transfers, this can be either a TCP socket or - /// an SSL stream (if SSL is enabled). - tcp::socket &socket() { return socket_; } - - tcp::endpoint remote_endpoint() const { return socket_.remote_endpoint(); } - - std::string address() const { - return socket_.remote_endpoint().address().to_string(); - } - - bool is_open() const { return socket_.is_open(); } - - void close() { - error_code ec; - socket_.close(ec); - } - - void shutdown_readwrite() { - error_code ec; - socket_.shutdown(asio::socket_base::shutdown_type::shutdown_both, ec); - } - - void shutdown_write() { - error_code ec; - socket_.shutdown(asio::socket_base::shutdown_type::shutdown_send, ec); - } - - void shutdown_read() { - error_code ec; - socket_.shutdown(asio::socket_base::shutdown_type::shutdown_receive, ec); - } - - template void start(F f) { f(error_code()); } - - tcp::socket socket_; -}; - -struct UnixSocketAdaptor { - using context = void; - UnixSocketAdaptor(asio::io_context &io_context, context *) - : socket_(io_context) {} - - asio::io_context &get_io_context() { return GET_IO_CONTEXT(socket_); } - - stream_protocol::socket &raw_socket() { return socket_; } - - stream_protocol::socket &socket() { return socket_; } - - stream_protocol::endpoint remote_endpoint() { - return socket_.local_endpoint(); - } - - std::string address() const { return ""; } - - bool is_open() { return socket_.is_open(); } - - void close() { - error_code ec; - socket_.close(ec); - } - - void shutdown_readwrite() { - error_code ec; - socket_.shutdown(asio::socket_base::shutdown_type::shutdown_both, ec); - } - - void shutdown_write() { - error_code ec; - socket_.shutdown(asio::socket_base::shutdown_type::shutdown_send, ec); - } - - void shutdown_read() { - error_code ec; - socket_.shutdown(asio::socket_base::shutdown_type::shutdown_receive, ec); - } - - template void start(F f) { f(error_code()); } - - stream_protocol::socket socket_; -}; - -#ifdef CROW_ENABLE_SSL -struct SSLAdaptor { - using context = asio::ssl::context; - using ssl_socket_t = asio::ssl::stream; - SSLAdaptor(asio::io_context &io_context, context *ctx) - : ssl_socket_(new ssl_socket_t(io_context, *ctx)) {} - - asio::ssl::stream &socket() { return *ssl_socket_; } - - tcp::socket::lowest_layer_type &raw_socket() { - return ssl_socket_->lowest_layer(); - } - - tcp::endpoint remote_endpoint() { return raw_socket().remote_endpoint(); } - - std::string address() const { - return ssl_socket_->lowest_layer().remote_endpoint().address().to_string(); - } - - bool is_open() { return ssl_socket_ ? raw_socket().is_open() : false; } - - void close() { - if (is_open()) { - error_code ec; - raw_socket().close(ec); - } - } - - void shutdown_readwrite() { - if (is_open()) { - error_code ec; - raw_socket().shutdown(asio::socket_base::shutdown_type::shutdown_both, - ec); - } - } - - void shutdown_write() { - if (is_open()) { - error_code ec; - raw_socket().shutdown(asio::socket_base::shutdown_type::shutdown_send, - ec); - } - } - - void shutdown_read() { - if (is_open()) { - error_code ec; - raw_socket().shutdown(asio::socket_base::shutdown_type::shutdown_receive, - ec); - } - } - - asio::io_context &get_io_context() { return GET_IO_CONTEXT(raw_socket()); } - - template void start(F f) { - ssl_socket_->async_handshake(asio::ssl::stream_base::server, - [f](const error_code &ec) { f(ec); }); - } - - std::unique_ptr> ssl_socket_; -}; -#endif -} // namespace crow - -#include -#include -#include -#include -#include -#include - -namespace crow { -enum class LogLevel { -#ifndef ERROR -#ifndef DEBUG - DEBUG = 0, - INFO, - WARNING, - ERROR, - CRITICAL, -#endif -#endif - - Debug = 0, - Info, - Warning, - Error, - Critical, -}; - -class ILogHandler { -public: - virtual ~ILogHandler() = default; - - virtual void log(const std::string &message, LogLevel level) = 0; -}; - -class CerrLogHandler : public ILogHandler { -public: - void log(const std::string &message, LogLevel level) override { - std::string log_msg; - log_msg.reserve(message.length() + 1 + 32 + 3 + 8 + 2); - log_msg.append("(").append(timestamp()).append(") ["); - - switch (level) { - case LogLevel::Debug: log_msg.append("DEBUG "); break; - case LogLevel::Info: log_msg.append("INFO "); break; - case LogLevel::Warning: log_msg.append("WARNING "); break; - case LogLevel::Error: log_msg.append("ERROR "); break; - case LogLevel::Critical: log_msg.append("CRITICAL"); break; - } - - log_msg.append("] ").append(message); - - std::cerr << log_msg << std::endl; - } - -private: - static std::string timestamp() { - char date[32]; - time_t t = time(0); - - tm my_tm; - -#if defined(_MSC_VER) || defined(__MINGW32__) -#ifdef CROW_USE_LOCALTIMEZONE - localtime_s(&my_tm, &t); -#else - gmtime_s(&my_tm, &t); -#endif -#else -#ifdef CROW_USE_LOCALTIMEZONE - localtime_r(&t, &my_tm); -#else - gmtime_r(&t, &my_tm); -#endif -#endif - - size_t sz = strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S", &my_tm); - return std::string(date, date + sz); - } -}; - -class logger { -public: - logger(LogLevel level) : level_(level) {} - ~logger() { -#ifdef CROW_ENABLE_LOGGING - if (level_ >= get_current_log_level()) { - get_handler_ref()->log(stringstream_.str(), level_); - } -#endif - } - - // - template logger &operator<<(T const &value) { -#ifdef CROW_ENABLE_LOGGING - if (level_ >= get_current_log_level()) { stringstream_ << value; } -#endif - return *this; - } - - // - static void setLogLevel(LogLevel level) { get_log_level_ref() = level; } - - static void setHandler(ILogHandler *handler) { get_handler_ref() = handler; } - - static LogLevel get_current_log_level() { return get_log_level_ref(); } - -private: - // - static LogLevel &get_log_level_ref() { - static LogLevel current_level = static_cast(CROW_LOG_LEVEL); - return current_level; - } - static ILogHandler *&get_handler_ref() { - static CerrLogHandler default_handler; - static ILogHandler *current_handler = &default_handler; - return current_handler; - } - - // - std::ostringstream stringstream_; - LogLevel level_; -}; -} // namespace crow - -#define CROW_LOG_CRITICAL \ - if (crow::logger::get_current_log_level() <= crow::LogLevel::Critical) \ - crow::logger(crow::LogLevel::Critical) -#define CROW_LOG_ERROR \ - if (crow::logger::get_current_log_level() <= crow::LogLevel::Error) \ - crow::logger(crow::LogLevel::Error) -#define CROW_LOG_WARNING \ - if (crow::logger::get_current_log_level() <= crow::LogLevel::Warning) \ - crow::logger(crow::LogLevel::Warning) -#define CROW_LOG_INFO \ - if (crow::logger::get_current_log_level() <= crow::LogLevel::Info) \ - crow::logger(crow::LogLevel::Info) -#define CROW_LOG_DEBUG \ - if (crow::logger::get_current_log_level() <= crow::LogLevel::Debug) \ - crow::logger(crow::LogLevel::Debug) - -#include - -namespace crow { -/// An abstract class that allows any other class to be returned by a handler. -struct returnable { - std::string content_type; - virtual std::string dump() const = 0; - - returnable(std::string ctype) : content_type{ctype} {} - - virtual ~returnable() {} -}; -} // namespace crow - -#ifdef CROW_USE_BOOST -#include -#ifdef CROW_ENABLE_SSL -#include -#endif -#else -#ifndef ASIO_STANDALONE -#define ASIO_STANDALONE -#endif -#include -#ifdef CROW_ENABLE_SSL -#include -#endif -#endif - -namespace crow { -#ifdef CROW_USE_BOOST -namespace asio = boost::asio; -using error_code = boost::system::error_code; -#else -using error_code = asio::error_code; -#endif -using tcp = asio::ip::tcp; -using stream_protocol = asio::local::stream_protocol; - -struct TCPAcceptor { - using endpoint = tcp::endpoint; - tcp::acceptor acceptor_; - TCPAcceptor(asio::io_context &io_context) : acceptor_(io_context) {} - - int16_t port() const { return acceptor_.local_endpoint().port(); } - std::string address() const { - return acceptor_.local_endpoint().address().to_string(); - } - std::string url_display(bool ssl_used) const { - auto address = acceptor_.local_endpoint().address(); - return (ssl_used ? "https://" : "http://") + - (address.is_v4() ? address.to_string() - : "[" + address.to_string() + "]") + - ":" + std::to_string(acceptor_.local_endpoint().port()); - } - tcp::acceptor &raw_acceptor() { return acceptor_; } - endpoint local_endpoint() const { return acceptor_.local_endpoint(); } - inline static tcp::acceptor::reuse_address reuse_address_option() { - return tcp::acceptor::reuse_address(true); - } -}; - -struct UnixSocketAcceptor { - using endpoint = stream_protocol::endpoint; - stream_protocol::acceptor acceptor_; - UnixSocketAcceptor(asio::io_context &io_context) : acceptor_(io_context) {} - - int16_t port() const { return 0; } - std::string address() const { return acceptor_.local_endpoint().path(); } - std::string url_display(bool) const { - return acceptor_.local_endpoint().path(); - } - stream_protocol::acceptor &raw_acceptor() { return acceptor_; } - endpoint local_endpoint() const { return acceptor_.local_endpoint(); } - inline static stream_protocol::acceptor::reuse_address - reuse_address_option() { - // reuse addr must be false - // (https://github.com/chriskohlhoff/asio/issues/622) - return stream_protocol::acceptor::reuse_address(false); - } -}; -} // namespace crow - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -// TODO(EDev): Adding C++20's [[likely]] and [[unlikely]] attributes might be -// useful -#if defined(__GNUG__) || defined(__clang__) -#define CROW_LIKELY(X) __builtin_expect(!!(X), 1) -#define CROW_UNLIKELY(X) __builtin_expect(!!(X), 0) -#else -#define CROW_LIKELY(X) (X) -#define CROW_UNLIKELY(X) (X) -#endif - -namespace crow { -/// @cond SKIP -namespace black_magic { -#ifndef CROW_MSVC_WORKAROUND -/// Out of Range Exception for const_str -struct OutOfRange { - OutOfRange(unsigned /*pos*/, unsigned /*length*/) {} -}; -/// Helper function to throw an exception if i is larger than len -constexpr unsigned requires_in_range(unsigned i, unsigned len) { - return i >= len ? throw OutOfRange(i, len) : i; -} - -/// A constant string implementation. -class const_str { - const char *const begin_; - unsigned size_; - -public: - template - constexpr const_str(const char (&arr)[N]) : begin_(arr), size_(N - 1) { - static_assert(N >= 1, "not a string literal"); - } - constexpr char operator[](unsigned i) const { - return requires_in_range(i, size_), begin_[i]; - } - - constexpr operator const char *() const { return begin_; } - - constexpr const char *begin() const { return begin_; } - constexpr const char *end() const { return begin_ + size_; } - - constexpr unsigned size() const { return size_; } -}; - -constexpr unsigned find_closing_tag(const_str s, unsigned p) { - return s[p] == '>' ? p : find_closing_tag(s, p + 1); -} - -/// Check that the CROW_ROUTE string is valid -constexpr bool is_valid(const_str s, unsigned i = 0, int f = 0) { - return i == s.size() ? f == 0 - : f < 0 || f >= 2 ? false - : s[i] == '<' ? is_valid(s, i + 1, f + 1) - : s[i] == '>' ? is_valid(s, i + 1, f - 1) - : is_valid(s, i + 1, f); -} - -constexpr bool is_equ_p(const char *a, const char *b, unsigned n) { - return *a == 0 && *b == 0 && n == 0 ? true - : (*a == 0 || *b == 0) ? false - : n == 0 ? true - : *a != *b ? false - : is_equ_p(a + 1, b + 1, n - 1); -} - -constexpr bool is_equ_n(const_str a, unsigned ai, const_str b, unsigned bi, - unsigned n) { - return ai + n > a.size() || bi + n > b.size() ? false - : n == 0 ? true - : a[ai] != b[bi] ? false - : is_equ_n(a, ai + 1, b, bi + 1, n - 1); -} - -constexpr bool is_int(const_str s, unsigned i) { - return is_equ_n(s, i, "", 0, 5); -} - -constexpr bool is_uint(const_str s, unsigned i) { - return is_equ_n(s, i, "", 0, 6); -} - -constexpr bool is_float(const_str s, unsigned i) { - return is_equ_n(s, i, "", 0, 7) || is_equ_n(s, i, "", 0, 8); -} - -constexpr bool is_str(const_str s, unsigned i) { - return is_equ_n(s, i, "", 0, 5) || is_equ_n(s, i, "", 0, 8); -} - -constexpr bool is_path(const_str s, unsigned i) { - return is_equ_n(s, i, "", 0, 6); -} -#endif -template struct parameter_tag { - static const int value = 0; -}; -#define CROW_INTERNAL_PARAMETER_TAG(t, i) \ - template <> struct parameter_tag { \ - static const int value = i; \ - } -CROW_INTERNAL_PARAMETER_TAG(int, 1); -CROW_INTERNAL_PARAMETER_TAG(char, 1); -CROW_INTERNAL_PARAMETER_TAG(short, 1); -CROW_INTERNAL_PARAMETER_TAG(long, 1); -CROW_INTERNAL_PARAMETER_TAG(long long, 1); -CROW_INTERNAL_PARAMETER_TAG(unsigned int, 2); -CROW_INTERNAL_PARAMETER_TAG(unsigned char, 2); -CROW_INTERNAL_PARAMETER_TAG(unsigned short, 2); -CROW_INTERNAL_PARAMETER_TAG(unsigned long, 2); -CROW_INTERNAL_PARAMETER_TAG(unsigned long long, 2); -CROW_INTERNAL_PARAMETER_TAG(double, 3); -CROW_INTERNAL_PARAMETER_TAG(std::string, 4); -#undef CROW_INTERNAL_PARAMETER_TAG -template struct compute_parameter_tag_from_args_list; - -template <> struct compute_parameter_tag_from_args_list<> { - static const int value = 0; -}; - -template -struct compute_parameter_tag_from_args_list { - static const int sub_value = - compute_parameter_tag_from_args_list::value; - static const int value = - parameter_tag::type>::value - ? sub_value * 6 + parameter_tag::type>::value - : sub_value; -}; - -static inline bool is_parameter_tag_compatible(uint64_t a, uint64_t b) { - if (a == 0) return b == 0; - if (b == 0) return a == 0; - int sa = a % 6; - int sb = a % 6; - if (sa == 5) sa = 4; - if (sb == 5) sb = 4; - if (sa != sb) return false; - return is_parameter_tag_compatible(a / 6, b / 6); -} - -static inline unsigned find_closing_tag_runtime(const char *s, unsigned p) { - return s[p] == 0 ? throw std::runtime_error("unmatched tag <") - : s[p] == '>' ? p - : find_closing_tag_runtime(s, p + 1); -} - -static inline uint64_t get_parameter_tag_runtime(const char *s, - unsigned p = 0) { - return s[p] == 0 ? 0 - : s[p] == '<' - ? (std::strncmp(s + p, "", 5) == 0 - ? get_parameter_tag_runtime( - s, find_closing_tag_runtime(s, p)) * - 6 + - 1 - : std::strncmp(s + p, "", 6) == 0 - ? get_parameter_tag_runtime( - s, find_closing_tag_runtime(s, p)) * - 6 + - 2 - : (std::strncmp(s + p, "", 7) == 0 || - std::strncmp(s + p, "", 8) == 0) - ? get_parameter_tag_runtime( - s, find_closing_tag_runtime(s, p)) * - 6 + - 3 - : (std::strncmp(s + p, "", 5) == 0 || - std::strncmp(s + p, "", 8) == 0) - ? get_parameter_tag_runtime( - s, find_closing_tag_runtime(s, p)) * - 6 + - 4 - : std::strncmp(s + p, "", 6) == 0 - ? get_parameter_tag_runtime( - s, find_closing_tag_runtime(s, p)) * - 6 + - 5 - : throw std::runtime_error("invalid parameter type")) - : get_parameter_tag_runtime(s, p + 1); -} -#ifndef CROW_MSVC_WORKAROUND -constexpr uint64_t get_parameter_tag(const_str s, unsigned p = 0) { - return p == s.size() ? 0 - : s[p] == '<' - ? (is_int(s, p) - ? get_parameter_tag(s, find_closing_tag(s, p)) * 6 + 1 - : is_uint(s, p) - ? get_parameter_tag(s, find_closing_tag(s, p)) * 6 + 2 - : is_float(s, p) - ? get_parameter_tag(s, find_closing_tag(s, p)) * 6 + 3 - : is_str(s, p) - ? get_parameter_tag(s, find_closing_tag(s, p)) * 6 + 4 - : is_path(s, p) - ? get_parameter_tag(s, find_closing_tag(s, p)) * 6 + 5 - : throw std::runtime_error("invalid parameter type")) - : get_parameter_tag(s, p + 1); -} -#endif - -template struct S { - template using push = S; - template using push_back = S; - template