@point3/node-rdkafka 3.6.0-1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +20 -0
- package/README.md +636 -0
- package/binding.gyp +154 -0
- package/deps/librdkafka/.clang-format +136 -0
- package/deps/librdkafka/.clang-format-cpp +103 -0
- package/deps/librdkafka/.dir-locals.el +10 -0
- package/deps/librdkafka/.formatignore +33 -0
- package/deps/librdkafka/.gdbmacros +19 -0
- package/deps/librdkafka/.github/CODEOWNERS +1 -0
- package/deps/librdkafka/.github/ISSUE_TEMPLATE +34 -0
- package/deps/librdkafka/.semaphore/run-all-tests.yml +77 -0
- package/deps/librdkafka/.semaphore/semaphore-integration.yml +250 -0
- package/deps/librdkafka/.semaphore/semaphore.yml +378 -0
- package/deps/librdkafka/.semaphore/verify-linux-packages.yml +41 -0
- package/deps/librdkafka/CHANGELOG.md +2208 -0
- package/deps/librdkafka/CMakeLists.txt +291 -0
- package/deps/librdkafka/CODE_OF_CONDUCT.md +46 -0
- package/deps/librdkafka/CONFIGURATION.md +209 -0
- package/deps/librdkafka/CONTRIBUTING.md +431 -0
- package/deps/librdkafka/Doxyfile +2375 -0
- package/deps/librdkafka/INTRODUCTION.md +2481 -0
- package/deps/librdkafka/LICENSE +26 -0
- package/deps/librdkafka/LICENSE.cjson +22 -0
- package/deps/librdkafka/LICENSE.crc32c +28 -0
- package/deps/librdkafka/LICENSE.fnv1a +18 -0
- package/deps/librdkafka/LICENSE.hdrhistogram +27 -0
- package/deps/librdkafka/LICENSE.lz4 +26 -0
- package/deps/librdkafka/LICENSE.murmur2 +25 -0
- package/deps/librdkafka/LICENSE.nanopb +22 -0
- package/deps/librdkafka/LICENSE.opentelemetry +203 -0
- package/deps/librdkafka/LICENSE.pycrc +23 -0
- package/deps/librdkafka/LICENSE.queue +31 -0
- package/deps/librdkafka/LICENSE.regexp +5 -0
- package/deps/librdkafka/LICENSE.snappy +36 -0
- package/deps/librdkafka/LICENSE.tinycthread +26 -0
- package/deps/librdkafka/LICENSE.wingetopt +49 -0
- package/deps/librdkafka/LICENSES.txt +625 -0
- package/deps/librdkafka/Makefile +125 -0
- package/deps/librdkafka/README.md +199 -0
- package/deps/librdkafka/README.win32 +26 -0
- package/deps/librdkafka/STATISTICS.md +624 -0
- package/deps/librdkafka/configure +214 -0
- package/deps/librdkafka/configure.self +331 -0
- package/deps/librdkafka/debian/changelog +111 -0
- package/deps/librdkafka/debian/compat +1 -0
- package/deps/librdkafka/debian/control +71 -0
- package/deps/librdkafka/debian/copyright +99 -0
- package/deps/librdkafka/debian/gbp.conf +9 -0
- package/deps/librdkafka/debian/librdkafka++1.install +1 -0
- package/deps/librdkafka/debian/librdkafka-dev.examples +2 -0
- package/deps/librdkafka/debian/librdkafka-dev.install +9 -0
- package/deps/librdkafka/debian/librdkafka1.docs +5 -0
- package/deps/librdkafka/debian/librdkafka1.install +1 -0
- package/deps/librdkafka/debian/librdkafka1.symbols +135 -0
- package/deps/librdkafka/debian/rules +19 -0
- package/deps/librdkafka/debian/source/format +1 -0
- package/deps/librdkafka/debian/watch +2 -0
- package/deps/librdkafka/dev-conf.sh +123 -0
- package/deps/librdkafka/examples/CMakeLists.txt +79 -0
- package/deps/librdkafka/examples/Makefile +167 -0
- package/deps/librdkafka/examples/README.md +42 -0
- package/deps/librdkafka/examples/alter_consumer_group_offsets.c +338 -0
- package/deps/librdkafka/examples/consumer.c +271 -0
- package/deps/librdkafka/examples/delete_records.c +233 -0
- package/deps/librdkafka/examples/describe_cluster.c +322 -0
- package/deps/librdkafka/examples/describe_consumer_groups.c +455 -0
- package/deps/librdkafka/examples/describe_topics.c +427 -0
- package/deps/librdkafka/examples/elect_leaders.c +317 -0
- package/deps/librdkafka/examples/globals.json +11 -0
- package/deps/librdkafka/examples/idempotent_producer.c +344 -0
- package/deps/librdkafka/examples/incremental_alter_configs.c +347 -0
- package/deps/librdkafka/examples/kafkatest_verifiable_client.cpp +945 -0
- package/deps/librdkafka/examples/list_consumer_group_offsets.c +359 -0
- package/deps/librdkafka/examples/list_consumer_groups.c +365 -0
- package/deps/librdkafka/examples/list_offsets.c +327 -0
- package/deps/librdkafka/examples/misc.c +287 -0
- package/deps/librdkafka/examples/openssl_engine_example.cpp +248 -0
- package/deps/librdkafka/examples/producer.c +251 -0
- package/deps/librdkafka/examples/producer.cpp +228 -0
- package/deps/librdkafka/examples/rdkafka_complex_consumer_example.c +617 -0
- package/deps/librdkafka/examples/rdkafka_complex_consumer_example.cpp +467 -0
- package/deps/librdkafka/examples/rdkafka_consume_batch.cpp +264 -0
- package/deps/librdkafka/examples/rdkafka_example.c +853 -0
- package/deps/librdkafka/examples/rdkafka_example.cpp +679 -0
- package/deps/librdkafka/examples/rdkafka_performance.c +1781 -0
- package/deps/librdkafka/examples/transactions-older-broker.c +668 -0
- package/deps/librdkafka/examples/transactions.c +665 -0
- package/deps/librdkafka/examples/user_scram.c +491 -0
- package/deps/librdkafka/examples/win_ssl_cert_store.cpp +396 -0
- package/deps/librdkafka/lds-gen.py +73 -0
- package/deps/librdkafka/mainpage.doxy +40 -0
- package/deps/librdkafka/mklove/Makefile.base +329 -0
- package/deps/librdkafka/mklove/modules/configure.atomics +144 -0
- package/deps/librdkafka/mklove/modules/configure.base +2484 -0
- package/deps/librdkafka/mklove/modules/configure.builtin +70 -0
- package/deps/librdkafka/mklove/modules/configure.cc +186 -0
- package/deps/librdkafka/mklove/modules/configure.cxx +8 -0
- package/deps/librdkafka/mklove/modules/configure.fileversion +65 -0
- package/deps/librdkafka/mklove/modules/configure.gitversion +29 -0
- package/deps/librdkafka/mklove/modules/configure.good_cflags +18 -0
- package/deps/librdkafka/mklove/modules/configure.host +132 -0
- package/deps/librdkafka/mklove/modules/configure.lib +49 -0
- package/deps/librdkafka/mklove/modules/configure.libcurl +99 -0
- package/deps/librdkafka/mklove/modules/configure.libsasl2 +36 -0
- package/deps/librdkafka/mklove/modules/configure.libssl +147 -0
- package/deps/librdkafka/mklove/modules/configure.libzstd +58 -0
- package/deps/librdkafka/mklove/modules/configure.parseversion +95 -0
- package/deps/librdkafka/mklove/modules/configure.pic +16 -0
- package/deps/librdkafka/mklove/modules/configure.socket +20 -0
- package/deps/librdkafka/mklove/modules/configure.zlib +61 -0
- package/deps/librdkafka/mklove/modules/patches/README.md +8 -0
- package/deps/librdkafka/mklove/modules/patches/libcurl.0000-no-runtime-linking-check.patch +11 -0
- package/deps/librdkafka/mklove/modules/patches/libssl.0000-osx-rand-include-fix-OpenSSL-PR16409.patch +56 -0
- package/deps/librdkafka/packaging/RELEASE.md +319 -0
- package/deps/librdkafka/packaging/alpine/build-alpine.sh +38 -0
- package/deps/librdkafka/packaging/archlinux/PKGBUILD +30 -0
- package/deps/librdkafka/packaging/cmake/Config.cmake.in +37 -0
- package/deps/librdkafka/packaging/cmake/Modules/FindLZ4.cmake +38 -0
- package/deps/librdkafka/packaging/cmake/Modules/FindZSTD.cmake +27 -0
- package/deps/librdkafka/packaging/cmake/Modules/LICENSE.FindZstd +178 -0
- package/deps/librdkafka/packaging/cmake/README.md +38 -0
- package/deps/librdkafka/packaging/cmake/config.h.in +52 -0
- package/deps/librdkafka/packaging/cmake/parseversion.cmake +60 -0
- package/deps/librdkafka/packaging/cmake/rdkafka.pc.in +12 -0
- package/deps/librdkafka/packaging/cmake/try_compile/atomic_32_test.c +8 -0
- package/deps/librdkafka/packaging/cmake/try_compile/atomic_64_test.c +8 -0
- package/deps/librdkafka/packaging/cmake/try_compile/c11threads_test.c +14 -0
- package/deps/librdkafka/packaging/cmake/try_compile/crc32c_hw_test.c +27 -0
- package/deps/librdkafka/packaging/cmake/try_compile/dlopen_test.c +11 -0
- package/deps/librdkafka/packaging/cmake/try_compile/libsasl2_test.c +7 -0
- package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_darwin_test.c +6 -0
- package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_freebsd_test.c +7 -0
- package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_gnu_test.c +5 -0
- package/deps/librdkafka/packaging/cmake/try_compile/rand_r_test.c +7 -0
- package/deps/librdkafka/packaging/cmake/try_compile/rdkafka_setup.cmake +122 -0
- package/deps/librdkafka/packaging/cmake/try_compile/regex_test.c +10 -0
- package/deps/librdkafka/packaging/cmake/try_compile/strndup_test.c +5 -0
- package/deps/librdkafka/packaging/cmake/try_compile/sync_32_test.c +8 -0
- package/deps/librdkafka/packaging/cmake/try_compile/sync_64_test.c +8 -0
- package/deps/librdkafka/packaging/cp/README.md +16 -0
- package/deps/librdkafka/packaging/cp/check_features.c +72 -0
- package/deps/librdkafka/packaging/cp/verify-deb.sh +33 -0
- package/deps/librdkafka/packaging/cp/verify-packages.sh +69 -0
- package/deps/librdkafka/packaging/cp/verify-rpm.sh +32 -0
- package/deps/librdkafka/packaging/debian/changelog +66 -0
- package/deps/librdkafka/packaging/debian/compat +1 -0
- package/deps/librdkafka/packaging/debian/control +49 -0
- package/deps/librdkafka/packaging/debian/copyright +84 -0
- package/deps/librdkafka/packaging/debian/docs +5 -0
- package/deps/librdkafka/packaging/debian/gbp.conf +9 -0
- package/deps/librdkafka/packaging/debian/librdkafka-dev.dirs +2 -0
- package/deps/librdkafka/packaging/debian/librdkafka-dev.examples +2 -0
- package/deps/librdkafka/packaging/debian/librdkafka-dev.install +6 -0
- package/deps/librdkafka/packaging/debian/librdkafka-dev.substvars +1 -0
- package/deps/librdkafka/packaging/debian/librdkafka.dsc +16 -0
- package/deps/librdkafka/packaging/debian/librdkafka1-dbg.substvars +1 -0
- package/deps/librdkafka/packaging/debian/librdkafka1.dirs +1 -0
- package/deps/librdkafka/packaging/debian/librdkafka1.install +2 -0
- package/deps/librdkafka/packaging/debian/librdkafka1.postinst.debhelper +5 -0
- package/deps/librdkafka/packaging/debian/librdkafka1.postrm.debhelper +5 -0
- package/deps/librdkafka/packaging/debian/librdkafka1.symbols +64 -0
- package/deps/librdkafka/packaging/debian/rules +19 -0
- package/deps/librdkafka/packaging/debian/source/format +1 -0
- package/deps/librdkafka/packaging/debian/watch +2 -0
- package/deps/librdkafka/packaging/get_version.py +21 -0
- package/deps/librdkafka/packaging/homebrew/README.md +15 -0
- package/deps/librdkafka/packaging/homebrew/brew-update-pr.sh +31 -0
- package/deps/librdkafka/packaging/mingw-w64/configure-build-msys2-mingw-static.sh +52 -0
- package/deps/librdkafka/packaging/mingw-w64/configure-build-msys2-mingw.sh +21 -0
- package/deps/librdkafka/packaging/mingw-w64/export-variables.sh +13 -0
- package/deps/librdkafka/packaging/mingw-w64/run-tests.sh +6 -0
- package/deps/librdkafka/packaging/mingw-w64/semaphoreci-build.sh +38 -0
- package/deps/librdkafka/packaging/nuget/README.md +84 -0
- package/deps/librdkafka/packaging/nuget/artifact.py +177 -0
- package/deps/librdkafka/packaging/nuget/cleanup-s3.py +143 -0
- package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-win32__bldtype-Release/msvcr120.zip +0 -0
- package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-win32__bldtype-Release/msvcr140.zip +0 -0
- package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-x64__bldtype-Release/msvcr120.zip +0 -0
- package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-x64__bldtype-Release/msvcr140.zip +0 -0
- package/deps/librdkafka/packaging/nuget/nuget.sh +21 -0
- package/deps/librdkafka/packaging/nuget/nugetpackage.py +278 -0
- package/deps/librdkafka/packaging/nuget/packaging.py +448 -0
- package/deps/librdkafka/packaging/nuget/push-to-nuget.sh +21 -0
- package/deps/librdkafka/packaging/nuget/release.py +167 -0
- package/deps/librdkafka/packaging/nuget/requirements.txt +3 -0
- package/deps/librdkafka/packaging/nuget/staticpackage.py +178 -0
- package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.nuspec +21 -0
- package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.props +18 -0
- package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.targets +19 -0
- package/deps/librdkafka/packaging/nuget/zfile/__init__.py +0 -0
- package/deps/librdkafka/packaging/nuget/zfile/zfile.py +98 -0
- package/deps/librdkafka/packaging/rpm/Makefile +92 -0
- package/deps/librdkafka/packaging/rpm/README.md +23 -0
- package/deps/librdkafka/packaging/rpm/el7-x86_64.cfg +40 -0
- package/deps/librdkafka/packaging/rpm/librdkafka.spec +118 -0
- package/deps/librdkafka/packaging/rpm/mock-on-docker.sh +96 -0
- package/deps/librdkafka/packaging/rpm/tests/Makefile +25 -0
- package/deps/librdkafka/packaging/rpm/tests/README.md +8 -0
- package/deps/librdkafka/packaging/rpm/tests/run-test.sh +42 -0
- package/deps/librdkafka/packaging/rpm/tests/test-on-docker.sh +56 -0
- package/deps/librdkafka/packaging/rpm/tests/test.c +77 -0
- package/deps/librdkafka/packaging/rpm/tests/test.cpp +34 -0
- package/deps/librdkafka/packaging/tools/Dockerfile +31 -0
- package/deps/librdkafka/packaging/tools/build-configurations-checks.sh +12 -0
- package/deps/librdkafka/packaging/tools/build-deb-package.sh +64 -0
- package/deps/librdkafka/packaging/tools/build-debian.sh +65 -0
- package/deps/librdkafka/packaging/tools/build-manylinux.sh +68 -0
- package/deps/librdkafka/packaging/tools/build-release-artifacts.sh +139 -0
- package/deps/librdkafka/packaging/tools/distro-build.sh +38 -0
- package/deps/librdkafka/packaging/tools/gh-release-checksums.py +39 -0
- package/deps/librdkafka/packaging/tools/rdutcoverage.sh +25 -0
- package/deps/librdkafka/packaging/tools/requirements.txt +2 -0
- package/deps/librdkafka/packaging/tools/run-in-docker.sh +28 -0
- package/deps/librdkafka/packaging/tools/run-integration-tests.sh +31 -0
- package/deps/librdkafka/packaging/tools/run-style-check.sh +4 -0
- package/deps/librdkafka/packaging/tools/style-format.sh +149 -0
- package/deps/librdkafka/packaging/tools/update_rpcs_max_versions.py +100 -0
- package/deps/librdkafka/service.yml +172 -0
- package/deps/librdkafka/src/CMakeLists.txt +374 -0
- package/deps/librdkafka/src/Makefile +103 -0
- package/deps/librdkafka/src/README.lz4.md +30 -0
- package/deps/librdkafka/src/cJSON.c +2834 -0
- package/deps/librdkafka/src/cJSON.h +398 -0
- package/deps/librdkafka/src/crc32c.c +430 -0
- package/deps/librdkafka/src/crc32c.h +38 -0
- package/deps/librdkafka/src/generate_proto.sh +66 -0
- package/deps/librdkafka/src/librdkafka_cgrp_synch.png +0 -0
- package/deps/librdkafka/src/lz4.c +2727 -0
- package/deps/librdkafka/src/lz4.h +842 -0
- package/deps/librdkafka/src/lz4frame.c +2078 -0
- package/deps/librdkafka/src/lz4frame.h +692 -0
- package/deps/librdkafka/src/lz4frame_static.h +47 -0
- package/deps/librdkafka/src/lz4hc.c +1631 -0
- package/deps/librdkafka/src/lz4hc.h +413 -0
- package/deps/librdkafka/src/nanopb/pb.h +917 -0
- package/deps/librdkafka/src/nanopb/pb_common.c +388 -0
- package/deps/librdkafka/src/nanopb/pb_common.h +49 -0
- package/deps/librdkafka/src/nanopb/pb_decode.c +1727 -0
- package/deps/librdkafka/src/nanopb/pb_decode.h +193 -0
- package/deps/librdkafka/src/nanopb/pb_encode.c +1000 -0
- package/deps/librdkafka/src/nanopb/pb_encode.h +185 -0
- package/deps/librdkafka/src/opentelemetry/common.pb.c +32 -0
- package/deps/librdkafka/src/opentelemetry/common.pb.h +170 -0
- package/deps/librdkafka/src/opentelemetry/metrics.options +2 -0
- package/deps/librdkafka/src/opentelemetry/metrics.pb.c +67 -0
- package/deps/librdkafka/src/opentelemetry/metrics.pb.h +966 -0
- package/deps/librdkafka/src/opentelemetry/resource.pb.c +12 -0
- package/deps/librdkafka/src/opentelemetry/resource.pb.h +58 -0
- package/deps/librdkafka/src/queue.h +850 -0
- package/deps/librdkafka/src/rd.h +584 -0
- package/deps/librdkafka/src/rdaddr.c +255 -0
- package/deps/librdkafka/src/rdaddr.h +202 -0
- package/deps/librdkafka/src/rdatomic.h +230 -0
- package/deps/librdkafka/src/rdavg.h +260 -0
- package/deps/librdkafka/src/rdavl.c +210 -0
- package/deps/librdkafka/src/rdavl.h +250 -0
- package/deps/librdkafka/src/rdbase64.c +200 -0
- package/deps/librdkafka/src/rdbase64.h +43 -0
- package/deps/librdkafka/src/rdbuf.c +1884 -0
- package/deps/librdkafka/src/rdbuf.h +375 -0
- package/deps/librdkafka/src/rdcrc32.c +114 -0
- package/deps/librdkafka/src/rdcrc32.h +170 -0
- package/deps/librdkafka/src/rddl.c +179 -0
- package/deps/librdkafka/src/rddl.h +43 -0
- package/deps/librdkafka/src/rdendian.h +175 -0
- package/deps/librdkafka/src/rdfloat.h +67 -0
- package/deps/librdkafka/src/rdfnv1a.c +113 -0
- package/deps/librdkafka/src/rdfnv1a.h +35 -0
- package/deps/librdkafka/src/rdgz.c +120 -0
- package/deps/librdkafka/src/rdgz.h +46 -0
- package/deps/librdkafka/src/rdhdrhistogram.c +721 -0
- package/deps/librdkafka/src/rdhdrhistogram.h +87 -0
- package/deps/librdkafka/src/rdhttp.c +830 -0
- package/deps/librdkafka/src/rdhttp.h +101 -0
- package/deps/librdkafka/src/rdinterval.h +177 -0
- package/deps/librdkafka/src/rdkafka.c +5505 -0
- package/deps/librdkafka/src/rdkafka.h +10686 -0
- package/deps/librdkafka/src/rdkafka_admin.c +9794 -0
- package/deps/librdkafka/src/rdkafka_admin.h +661 -0
- package/deps/librdkafka/src/rdkafka_assignment.c +1010 -0
- package/deps/librdkafka/src/rdkafka_assignment.h +73 -0
- package/deps/librdkafka/src/rdkafka_assignor.c +1786 -0
- package/deps/librdkafka/src/rdkafka_assignor.h +402 -0
- package/deps/librdkafka/src/rdkafka_aux.c +409 -0
- package/deps/librdkafka/src/rdkafka_aux.h +174 -0
- package/deps/librdkafka/src/rdkafka_background.c +221 -0
- package/deps/librdkafka/src/rdkafka_broker.c +6337 -0
- package/deps/librdkafka/src/rdkafka_broker.h +744 -0
- package/deps/librdkafka/src/rdkafka_buf.c +543 -0
- package/deps/librdkafka/src/rdkafka_buf.h +1525 -0
- package/deps/librdkafka/src/rdkafka_cert.c +576 -0
- package/deps/librdkafka/src/rdkafka_cert.h +62 -0
- package/deps/librdkafka/src/rdkafka_cgrp.c +7587 -0
- package/deps/librdkafka/src/rdkafka_cgrp.h +477 -0
- package/deps/librdkafka/src/rdkafka_conf.c +4880 -0
- package/deps/librdkafka/src/rdkafka_conf.h +732 -0
- package/deps/librdkafka/src/rdkafka_confval.h +97 -0
- package/deps/librdkafka/src/rdkafka_coord.c +623 -0
- package/deps/librdkafka/src/rdkafka_coord.h +132 -0
- package/deps/librdkafka/src/rdkafka_error.c +228 -0
- package/deps/librdkafka/src/rdkafka_error.h +80 -0
- package/deps/librdkafka/src/rdkafka_event.c +502 -0
- package/deps/librdkafka/src/rdkafka_event.h +126 -0
- package/deps/librdkafka/src/rdkafka_feature.c +898 -0
- package/deps/librdkafka/src/rdkafka_feature.h +104 -0
- package/deps/librdkafka/src/rdkafka_fetcher.c +1422 -0
- package/deps/librdkafka/src/rdkafka_fetcher.h +44 -0
- package/deps/librdkafka/src/rdkafka_header.c +220 -0
- package/deps/librdkafka/src/rdkafka_header.h +76 -0
- package/deps/librdkafka/src/rdkafka_idempotence.c +807 -0
- package/deps/librdkafka/src/rdkafka_idempotence.h +144 -0
- package/deps/librdkafka/src/rdkafka_int.h +1260 -0
- package/deps/librdkafka/src/rdkafka_interceptor.c +819 -0
- package/deps/librdkafka/src/rdkafka_interceptor.h +104 -0
- package/deps/librdkafka/src/rdkafka_lz4.c +450 -0
- package/deps/librdkafka/src/rdkafka_lz4.h +49 -0
- package/deps/librdkafka/src/rdkafka_metadata.c +2209 -0
- package/deps/librdkafka/src/rdkafka_metadata.h +345 -0
- package/deps/librdkafka/src/rdkafka_metadata_cache.c +1183 -0
- package/deps/librdkafka/src/rdkafka_mock.c +3661 -0
- package/deps/librdkafka/src/rdkafka_mock.h +610 -0
- package/deps/librdkafka/src/rdkafka_mock_cgrp.c +1876 -0
- package/deps/librdkafka/src/rdkafka_mock_handlers.c +3113 -0
- package/deps/librdkafka/src/rdkafka_mock_int.h +710 -0
- package/deps/librdkafka/src/rdkafka_msg.c +2589 -0
- package/deps/librdkafka/src/rdkafka_msg.h +614 -0
- package/deps/librdkafka/src/rdkafka_msgbatch.h +62 -0
- package/deps/librdkafka/src/rdkafka_msgset.h +98 -0
- package/deps/librdkafka/src/rdkafka_msgset_reader.c +1806 -0
- package/deps/librdkafka/src/rdkafka_msgset_writer.c +1474 -0
- package/deps/librdkafka/src/rdkafka_offset.c +1565 -0
- package/deps/librdkafka/src/rdkafka_offset.h +150 -0
- package/deps/librdkafka/src/rdkafka_op.c +997 -0
- package/deps/librdkafka/src/rdkafka_op.h +858 -0
- package/deps/librdkafka/src/rdkafka_partition.c +4896 -0
- package/deps/librdkafka/src/rdkafka_partition.h +1182 -0
- package/deps/librdkafka/src/rdkafka_pattern.c +228 -0
- package/deps/librdkafka/src/rdkafka_pattern.h +70 -0
- package/deps/librdkafka/src/rdkafka_plugin.c +213 -0
- package/deps/librdkafka/src/rdkafka_plugin.h +41 -0
- package/deps/librdkafka/src/rdkafka_proto.h +736 -0
- package/deps/librdkafka/src/rdkafka_protocol.h +128 -0
- package/deps/librdkafka/src/rdkafka_queue.c +1230 -0
- package/deps/librdkafka/src/rdkafka_queue.h +1220 -0
- package/deps/librdkafka/src/rdkafka_range_assignor.c +1748 -0
- package/deps/librdkafka/src/rdkafka_request.c +7089 -0
- package/deps/librdkafka/src/rdkafka_request.h +732 -0
- package/deps/librdkafka/src/rdkafka_roundrobin_assignor.c +123 -0
- package/deps/librdkafka/src/rdkafka_sasl.c +530 -0
- package/deps/librdkafka/src/rdkafka_sasl.h +63 -0
- package/deps/librdkafka/src/rdkafka_sasl_cyrus.c +722 -0
- package/deps/librdkafka/src/rdkafka_sasl_int.h +89 -0
- package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.c +1833 -0
- package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.h +52 -0
- package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.c +1666 -0
- package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.h +47 -0
- package/deps/librdkafka/src/rdkafka_sasl_plain.c +142 -0
- package/deps/librdkafka/src/rdkafka_sasl_scram.c +858 -0
- package/deps/librdkafka/src/rdkafka_sasl_win32.c +550 -0
- package/deps/librdkafka/src/rdkafka_ssl.c +2129 -0
- package/deps/librdkafka/src/rdkafka_ssl.h +86 -0
- package/deps/librdkafka/src/rdkafka_sticky_assignor.c +4785 -0
- package/deps/librdkafka/src/rdkafka_subscription.c +278 -0
- package/deps/librdkafka/src/rdkafka_telemetry.c +760 -0
- package/deps/librdkafka/src/rdkafka_telemetry.h +52 -0
- package/deps/librdkafka/src/rdkafka_telemetry_decode.c +1053 -0
- package/deps/librdkafka/src/rdkafka_telemetry_decode.h +59 -0
- package/deps/librdkafka/src/rdkafka_telemetry_encode.c +997 -0
- package/deps/librdkafka/src/rdkafka_telemetry_encode.h +301 -0
- package/deps/librdkafka/src/rdkafka_timer.c +402 -0
- package/deps/librdkafka/src/rdkafka_timer.h +117 -0
- package/deps/librdkafka/src/rdkafka_topic.c +2161 -0
- package/deps/librdkafka/src/rdkafka_topic.h +334 -0
- package/deps/librdkafka/src/rdkafka_transport.c +1309 -0
- package/deps/librdkafka/src/rdkafka_transport.h +99 -0
- package/deps/librdkafka/src/rdkafka_transport_int.h +100 -0
- package/deps/librdkafka/src/rdkafka_txnmgr.c +3256 -0
- package/deps/librdkafka/src/rdkafka_txnmgr.h +171 -0
- package/deps/librdkafka/src/rdkafka_zstd.c +226 -0
- package/deps/librdkafka/src/rdkafka_zstd.h +57 -0
- package/deps/librdkafka/src/rdlist.c +576 -0
- package/deps/librdkafka/src/rdlist.h +434 -0
- package/deps/librdkafka/src/rdlog.c +89 -0
- package/deps/librdkafka/src/rdlog.h +41 -0
- package/deps/librdkafka/src/rdmap.c +508 -0
- package/deps/librdkafka/src/rdmap.h +492 -0
- package/deps/librdkafka/src/rdmurmur2.c +167 -0
- package/deps/librdkafka/src/rdmurmur2.h +35 -0
- package/deps/librdkafka/src/rdports.c +61 -0
- package/deps/librdkafka/src/rdports.h +38 -0
- package/deps/librdkafka/src/rdposix.h +250 -0
- package/deps/librdkafka/src/rdrand.c +80 -0
- package/deps/librdkafka/src/rdrand.h +43 -0
- package/deps/librdkafka/src/rdregex.c +156 -0
- package/deps/librdkafka/src/rdregex.h +43 -0
- package/deps/librdkafka/src/rdsignal.h +57 -0
- package/deps/librdkafka/src/rdstring.c +645 -0
- package/deps/librdkafka/src/rdstring.h +98 -0
- package/deps/librdkafka/src/rdsysqueue.h +404 -0
- package/deps/librdkafka/src/rdtime.h +356 -0
- package/deps/librdkafka/src/rdtypes.h +86 -0
- package/deps/librdkafka/src/rdunittest.c +549 -0
- package/deps/librdkafka/src/rdunittest.h +232 -0
- package/deps/librdkafka/src/rdvarint.c +134 -0
- package/deps/librdkafka/src/rdvarint.h +165 -0
- package/deps/librdkafka/src/rdwin32.h +382 -0
- package/deps/librdkafka/src/rdxxhash.c +1030 -0
- package/deps/librdkafka/src/rdxxhash.h +328 -0
- package/deps/librdkafka/src/regexp.c +1352 -0
- package/deps/librdkafka/src/regexp.h +41 -0
- package/deps/librdkafka/src/snappy.c +1866 -0
- package/deps/librdkafka/src/snappy.h +62 -0
- package/deps/librdkafka/src/snappy_compat.h +138 -0
- package/deps/librdkafka/src/statistics_schema.json +444 -0
- package/deps/librdkafka/src/tinycthread.c +932 -0
- package/deps/librdkafka/src/tinycthread.h +503 -0
- package/deps/librdkafka/src/tinycthread_extra.c +199 -0
- package/deps/librdkafka/src/tinycthread_extra.h +212 -0
- package/deps/librdkafka/src/win32_config.h +58 -0
- package/deps/librdkafka/src-cpp/CMakeLists.txt +90 -0
- package/deps/librdkafka/src-cpp/ConfImpl.cpp +84 -0
- package/deps/librdkafka/src-cpp/ConsumerImpl.cpp +244 -0
- package/deps/librdkafka/src-cpp/HandleImpl.cpp +436 -0
- package/deps/librdkafka/src-cpp/HeadersImpl.cpp +48 -0
- package/deps/librdkafka/src-cpp/KafkaConsumerImpl.cpp +296 -0
- package/deps/librdkafka/src-cpp/Makefile +55 -0
- package/deps/librdkafka/src-cpp/MessageImpl.cpp +38 -0
- package/deps/librdkafka/src-cpp/MetadataImpl.cpp +170 -0
- package/deps/librdkafka/src-cpp/ProducerImpl.cpp +197 -0
- package/deps/librdkafka/src-cpp/QueueImpl.cpp +70 -0
- package/deps/librdkafka/src-cpp/README.md +16 -0
- package/deps/librdkafka/src-cpp/RdKafka.cpp +59 -0
- package/deps/librdkafka/src-cpp/TopicImpl.cpp +124 -0
- package/deps/librdkafka/src-cpp/TopicPartitionImpl.cpp +57 -0
- package/deps/librdkafka/src-cpp/rdkafkacpp.h +3797 -0
- package/deps/librdkafka/src-cpp/rdkafkacpp_int.h +1641 -0
- package/deps/librdkafka/tests/0000-unittests.c +72 -0
- package/deps/librdkafka/tests/0001-multiobj.c +102 -0
- package/deps/librdkafka/tests/0002-unkpart.c +244 -0
- package/deps/librdkafka/tests/0003-msgmaxsize.c +173 -0
- package/deps/librdkafka/tests/0004-conf.c +934 -0
- package/deps/librdkafka/tests/0005-order.c +133 -0
- package/deps/librdkafka/tests/0006-symbols.c +163 -0
- package/deps/librdkafka/tests/0007-autotopic.c +136 -0
- package/deps/librdkafka/tests/0008-reqacks.c +179 -0
- package/deps/librdkafka/tests/0009-mock_cluster.c +97 -0
- package/deps/librdkafka/tests/0011-produce_batch.c +753 -0
- package/deps/librdkafka/tests/0012-produce_consume.c +537 -0
- package/deps/librdkafka/tests/0013-null-msgs.c +473 -0
- package/deps/librdkafka/tests/0014-reconsume-191.c +512 -0
- package/deps/librdkafka/tests/0015-offset_seeks.c +172 -0
- package/deps/librdkafka/tests/0016-client_swname.c +181 -0
- package/deps/librdkafka/tests/0017-compression.c +140 -0
- package/deps/librdkafka/tests/0018-cgrp_term.c +338 -0
- package/deps/librdkafka/tests/0019-list_groups.c +289 -0
- package/deps/librdkafka/tests/0020-destroy_hang.c +162 -0
- package/deps/librdkafka/tests/0021-rkt_destroy.c +72 -0
- package/deps/librdkafka/tests/0022-consume_batch.c +279 -0
- package/deps/librdkafka/tests/0025-timers.c +147 -0
- package/deps/librdkafka/tests/0026-consume_pause.c +547 -0
- package/deps/librdkafka/tests/0028-long_topicnames.c +79 -0
- package/deps/librdkafka/tests/0029-assign_offset.c +202 -0
- package/deps/librdkafka/tests/0030-offset_commit.c +589 -0
- package/deps/librdkafka/tests/0031-get_offsets.c +235 -0
- package/deps/librdkafka/tests/0033-regex_subscribe.c +536 -0
- package/deps/librdkafka/tests/0034-offset_reset.c +398 -0
- package/deps/librdkafka/tests/0035-api_version.c +73 -0
- package/deps/librdkafka/tests/0036-partial_fetch.c +87 -0
- package/deps/librdkafka/tests/0037-destroy_hang_local.c +85 -0
- package/deps/librdkafka/tests/0038-performance.c +121 -0
- package/deps/librdkafka/tests/0039-event.c +284 -0
- package/deps/librdkafka/tests/0040-io_event.c +257 -0
- package/deps/librdkafka/tests/0041-fetch_max_bytes.c +97 -0
- package/deps/librdkafka/tests/0042-many_topics.c +252 -0
- package/deps/librdkafka/tests/0043-no_connection.c +77 -0
- package/deps/librdkafka/tests/0044-partition_cnt.c +94 -0
- package/deps/librdkafka/tests/0045-subscribe_update.c +1010 -0
- package/deps/librdkafka/tests/0046-rkt_cache.c +65 -0
- package/deps/librdkafka/tests/0047-partial_buf_tmout.c +98 -0
- package/deps/librdkafka/tests/0048-partitioner.c +283 -0
- package/deps/librdkafka/tests/0049-consume_conn_close.c +162 -0
- package/deps/librdkafka/tests/0050-subscribe_adds.c +145 -0
- package/deps/librdkafka/tests/0051-assign_adds.c +126 -0
- package/deps/librdkafka/tests/0052-msg_timestamps.c +238 -0
- package/deps/librdkafka/tests/0053-stats_cb.cpp +527 -0
- package/deps/librdkafka/tests/0054-offset_time.cpp +236 -0
- package/deps/librdkafka/tests/0055-producer_latency.c +539 -0
- package/deps/librdkafka/tests/0056-balanced_group_mt.c +315 -0
- package/deps/librdkafka/tests/0057-invalid_topic.cpp +112 -0
- package/deps/librdkafka/tests/0058-log.cpp +123 -0
- package/deps/librdkafka/tests/0059-bsearch.cpp +241 -0
- package/deps/librdkafka/tests/0060-op_prio.cpp +163 -0
- package/deps/librdkafka/tests/0061-consumer_lag.cpp +295 -0
- package/deps/librdkafka/tests/0062-stats_event.c +126 -0
- package/deps/librdkafka/tests/0063-clusterid.cpp +180 -0
- package/deps/librdkafka/tests/0064-interceptors.c +481 -0
- package/deps/librdkafka/tests/0065-yield.cpp +140 -0
- package/deps/librdkafka/tests/0066-plugins.cpp +129 -0
- package/deps/librdkafka/tests/0067-empty_topic.cpp +151 -0
- package/deps/librdkafka/tests/0068-produce_timeout.c +136 -0
- package/deps/librdkafka/tests/0069-consumer_add_parts.c +119 -0
- package/deps/librdkafka/tests/0070-null_empty.cpp +197 -0
- package/deps/librdkafka/tests/0072-headers_ut.c +448 -0
- package/deps/librdkafka/tests/0073-headers.c +381 -0
- package/deps/librdkafka/tests/0074-producev.c +87 -0
- package/deps/librdkafka/tests/0075-retry.c +290 -0
- package/deps/librdkafka/tests/0076-produce_retry.c +452 -0
- package/deps/librdkafka/tests/0077-compaction.c +363 -0
- package/deps/librdkafka/tests/0078-c_from_cpp.cpp +96 -0
- package/deps/librdkafka/tests/0079-fork.c +93 -0
- package/deps/librdkafka/tests/0080-admin_ut.c +3095 -0
- package/deps/librdkafka/tests/0081-admin.c +5633 -0
- package/deps/librdkafka/tests/0082-fetch_max_bytes.cpp +137 -0
- package/deps/librdkafka/tests/0083-cb_event.c +233 -0
- package/deps/librdkafka/tests/0084-destroy_flags.c +208 -0
- package/deps/librdkafka/tests/0085-headers.cpp +392 -0
- package/deps/librdkafka/tests/0086-purge.c +368 -0
- package/deps/librdkafka/tests/0088-produce_metadata_timeout.c +162 -0
- package/deps/librdkafka/tests/0089-max_poll_interval.c +511 -0
- package/deps/librdkafka/tests/0090-idempotence.c +171 -0
- package/deps/librdkafka/tests/0091-max_poll_interval_timeout.c +295 -0
- package/deps/librdkafka/tests/0092-mixed_msgver.c +103 -0
- package/deps/librdkafka/tests/0093-holb.c +200 -0
- package/deps/librdkafka/tests/0094-idempotence_msg_timeout.c +231 -0
- package/deps/librdkafka/tests/0095-all_brokers_down.cpp +122 -0
- package/deps/librdkafka/tests/0097-ssl_verify.cpp +658 -0
- package/deps/librdkafka/tests/0098-consumer-txn.cpp +1218 -0
- package/deps/librdkafka/tests/0099-commit_metadata.c +194 -0
- package/deps/librdkafka/tests/0100-thread_interceptors.cpp +195 -0
- package/deps/librdkafka/tests/0101-fetch-from-follower.cpp +446 -0
- package/deps/librdkafka/tests/0102-static_group_rebalance.c +836 -0
- package/deps/librdkafka/tests/0103-transactions.c +1383 -0
- package/deps/librdkafka/tests/0104-fetch_from_follower_mock.c +625 -0
- package/deps/librdkafka/tests/0105-transactions_mock.c +3930 -0
- package/deps/librdkafka/tests/0106-cgrp_sess_timeout.c +318 -0
- package/deps/librdkafka/tests/0107-topic_recreate.c +259 -0
- package/deps/librdkafka/tests/0109-auto_create_topics.cpp +278 -0
- package/deps/librdkafka/tests/0110-batch_size.cpp +182 -0
- package/deps/librdkafka/tests/0111-delay_create_topics.cpp +127 -0
- package/deps/librdkafka/tests/0112-assign_unknown_part.c +87 -0
- package/deps/librdkafka/tests/0113-cooperative_rebalance.cpp +3473 -0
- package/deps/librdkafka/tests/0114-sticky_partitioning.cpp +176 -0
- package/deps/librdkafka/tests/0115-producer_auth.cpp +182 -0
- package/deps/librdkafka/tests/0116-kafkaconsumer_close.cpp +216 -0
- package/deps/librdkafka/tests/0117-mock_errors.c +331 -0
- package/deps/librdkafka/tests/0118-commit_rebalance.c +154 -0
- package/deps/librdkafka/tests/0119-consumer_auth.cpp +167 -0
- package/deps/librdkafka/tests/0120-asymmetric_subscription.c +185 -0
- package/deps/librdkafka/tests/0121-clusterid.c +115 -0
- package/deps/librdkafka/tests/0122-buffer_cleaning_after_rebalance.c +227 -0
- package/deps/librdkafka/tests/0123-connections_max_idle.c +98 -0
- package/deps/librdkafka/tests/0124-openssl_invalid_engine.c +69 -0
- package/deps/librdkafka/tests/0125-immediate_flush.c +144 -0
- package/deps/librdkafka/tests/0126-oauthbearer_oidc.c +528 -0
- package/deps/librdkafka/tests/0127-fetch_queue_backoff.cpp +165 -0
- package/deps/librdkafka/tests/0128-sasl_callback_queue.cpp +125 -0
- package/deps/librdkafka/tests/0129-fetch_aborted_msgs.c +79 -0
- package/deps/librdkafka/tests/0130-store_offsets.c +178 -0
- package/deps/librdkafka/tests/0131-connect_timeout.c +81 -0
- package/deps/librdkafka/tests/0132-strategy_ordering.c +179 -0
- package/deps/librdkafka/tests/0133-ssl_keys.c +150 -0
- package/deps/librdkafka/tests/0134-ssl_provider.c +92 -0
- package/deps/librdkafka/tests/0135-sasl_credentials.cpp +143 -0
- package/deps/librdkafka/tests/0136-resolve_cb.c +181 -0
- package/deps/librdkafka/tests/0137-barrier_batch_consume.c +619 -0
- package/deps/librdkafka/tests/0138-admin_mock.c +281 -0
- package/deps/librdkafka/tests/0139-offset_validation_mock.c +950 -0
- package/deps/librdkafka/tests/0140-commit_metadata.cpp +108 -0
- package/deps/librdkafka/tests/0142-reauthentication.c +515 -0
- package/deps/librdkafka/tests/0143-exponential_backoff_mock.c +552 -0
- package/deps/librdkafka/tests/0144-idempotence_mock.c +373 -0
- package/deps/librdkafka/tests/0145-pause_resume_mock.c +119 -0
- package/deps/librdkafka/tests/0146-metadata_mock.c +505 -0
- package/deps/librdkafka/tests/0147-consumer_group_consumer_mock.c +952 -0
- package/deps/librdkafka/tests/0148-offset_fetch_commit_error_mock.c +563 -0
- package/deps/librdkafka/tests/0149-broker-same-host-port.c +140 -0
- package/deps/librdkafka/tests/0150-telemetry_mock.c +651 -0
- package/deps/librdkafka/tests/0151-purge-brokers.c +566 -0
- package/deps/librdkafka/tests/0152-rebootstrap.c +59 -0
- package/deps/librdkafka/tests/0153-memberid.c +128 -0
- package/deps/librdkafka/tests/1000-unktopic.c +164 -0
- package/deps/librdkafka/tests/8000-idle.cpp +60 -0
- package/deps/librdkafka/tests/8001-fetch_from_follower_mock_manual.c +113 -0
- package/deps/librdkafka/tests/CMakeLists.txt +170 -0
- package/deps/librdkafka/tests/LibrdkafkaTestApp.py +291 -0
- package/deps/librdkafka/tests/Makefile +182 -0
- package/deps/librdkafka/tests/README.md +509 -0
- package/deps/librdkafka/tests/autotest.sh +33 -0
- package/deps/librdkafka/tests/backtrace.gdb +30 -0
- package/deps/librdkafka/tests/broker_version_tests.py +315 -0
- package/deps/librdkafka/tests/buildbox.sh +17 -0
- package/deps/librdkafka/tests/cleanup-checker-tests.sh +20 -0
- package/deps/librdkafka/tests/cluster_testing.py +191 -0
- package/deps/librdkafka/tests/delete-test-topics.sh +56 -0
- package/deps/librdkafka/tests/fixtures/oauthbearer/jwt_assertion_template.json +10 -0
- package/deps/librdkafka/tests/fixtures/ssl/Makefile +8 -0
- package/deps/librdkafka/tests/fixtures/ssl/README.md +13 -0
- package/deps/librdkafka/tests/fixtures/ssl/client.keystore.intermediate.p12 +0 -0
- package/deps/librdkafka/tests/fixtures/ssl/client.keystore.p12 +0 -0
- package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.intermediate.pem +72 -0
- package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.pem +50 -0
- package/deps/librdkafka/tests/fixtures/ssl/client2.intermediate.key +46 -0
- package/deps/librdkafka/tests/fixtures/ssl/client2.key +46 -0
- package/deps/librdkafka/tests/fixtures/ssl/create_keys.sh +168 -0
- package/deps/librdkafka/tests/fuzzers/Makefile +12 -0
- package/deps/librdkafka/tests/fuzzers/README.md +31 -0
- package/deps/librdkafka/tests/fuzzers/fuzz_regex.c +74 -0
- package/deps/librdkafka/tests/fuzzers/helpers.h +90 -0
- package/deps/librdkafka/tests/gen-ssl-certs.sh +165 -0
- package/deps/librdkafka/tests/interactive_broker_version.py +170 -0
- package/deps/librdkafka/tests/interceptor_test/CMakeLists.txt +16 -0
- package/deps/librdkafka/tests/interceptor_test/Makefile +22 -0
- package/deps/librdkafka/tests/interceptor_test/interceptor_test.c +314 -0
- package/deps/librdkafka/tests/interceptor_test/interceptor_test.h +54 -0
- package/deps/librdkafka/tests/java/IncrementalRebalanceCli.java +97 -0
- package/deps/librdkafka/tests/java/Makefile +13 -0
- package/deps/librdkafka/tests/java/Murmur2Cli.java +46 -0
- package/deps/librdkafka/tests/java/README.md +14 -0
- package/deps/librdkafka/tests/java/TransactionProducerCli.java +162 -0
- package/deps/librdkafka/tests/java/run-class.sh +11 -0
- package/deps/librdkafka/tests/librdkafka.suppressions +483 -0
- package/deps/librdkafka/tests/lz4_manual_test.sh +59 -0
- package/deps/librdkafka/tests/multi-broker-version-test.sh +50 -0
- package/deps/librdkafka/tests/parse-refcnt.sh +43 -0
- package/deps/librdkafka/tests/performance_plot.py +115 -0
- package/deps/librdkafka/tests/plugin_test/Makefile +19 -0
- package/deps/librdkafka/tests/plugin_test/plugin_test.c +58 -0
- package/deps/librdkafka/tests/requirements.txt +2 -0
- package/deps/librdkafka/tests/run-all-tests.sh +79 -0
- package/deps/librdkafka/tests/run-consumer-tests.sh +16 -0
- package/deps/librdkafka/tests/run-producer-tests.sh +16 -0
- package/deps/librdkafka/tests/run-test-batches.py +157 -0
- package/deps/librdkafka/tests/run-test.sh +140 -0
- package/deps/librdkafka/tests/rusage.c +249 -0
- package/deps/librdkafka/tests/sasl_test.py +289 -0
- package/deps/librdkafka/tests/scenarios/README.md +6 -0
- package/deps/librdkafka/tests/scenarios/ak23.json +6 -0
- package/deps/librdkafka/tests/scenarios/default.json +5 -0
- package/deps/librdkafka/tests/scenarios/noautocreate.json +5 -0
- package/deps/librdkafka/tests/sockem.c +801 -0
- package/deps/librdkafka/tests/sockem.h +85 -0
- package/deps/librdkafka/tests/sockem_ctrl.c +145 -0
- package/deps/librdkafka/tests/sockem_ctrl.h +61 -0
- package/deps/librdkafka/tests/test.c +7778 -0
- package/deps/librdkafka/tests/test.conf.example +27 -0
- package/deps/librdkafka/tests/test.h +1028 -0
- package/deps/librdkafka/tests/testcpp.cpp +131 -0
- package/deps/librdkafka/tests/testcpp.h +388 -0
- package/deps/librdkafka/tests/testshared.h +416 -0
- package/deps/librdkafka/tests/tools/README.md +4 -0
- package/deps/librdkafka/tests/tools/stats/README.md +21 -0
- package/deps/librdkafka/tests/tools/stats/filter.jq +42 -0
- package/deps/librdkafka/tests/tools/stats/graph.py +150 -0
- package/deps/librdkafka/tests/tools/stats/requirements.txt +3 -0
- package/deps/librdkafka/tests/tools/stats/to_csv.py +124 -0
- package/deps/librdkafka/tests/trivup/trivup-0.14.0.tar.gz +0 -0
- package/deps/librdkafka/tests/until-fail.sh +87 -0
- package/deps/librdkafka/tests/xxxx-assign_partition.c +122 -0
- package/deps/librdkafka/tests/xxxx-metadata.cpp +159 -0
- package/deps/librdkafka/vcpkg.json +23 -0
- package/deps/librdkafka/win32/README.md +5 -0
- package/deps/librdkafka/win32/build-package.bat +3 -0
- package/deps/librdkafka/win32/build.bat +19 -0
- package/deps/librdkafka/win32/common.vcxproj +84 -0
- package/deps/librdkafka/win32/interceptor_test/interceptor_test.vcxproj +87 -0
- package/deps/librdkafka/win32/librdkafka.autopkg.template +54 -0
- package/deps/librdkafka/win32/librdkafka.master.testing.targets +13 -0
- package/deps/librdkafka/win32/librdkafka.sln +226 -0
- package/deps/librdkafka/win32/librdkafka.vcxproj +276 -0
- package/deps/librdkafka/win32/librdkafkacpp/librdkafkacpp.vcxproj +104 -0
- package/deps/librdkafka/win32/msbuild.ps1 +15 -0
- package/deps/librdkafka/win32/openssl_engine_example/openssl_engine_example.vcxproj +132 -0
- package/deps/librdkafka/win32/package-zip.ps1 +46 -0
- package/deps/librdkafka/win32/packages/repositories.config +4 -0
- package/deps/librdkafka/win32/push-package.bat +4 -0
- package/deps/librdkafka/win32/rdkafka_complex_consumer_example_cpp/rdkafka_complex_consumer_example_cpp.vcxproj +67 -0
- package/deps/librdkafka/win32/rdkafka_example/rdkafka_example.vcxproj +97 -0
- package/deps/librdkafka/win32/rdkafka_performance/rdkafka_performance.vcxproj +97 -0
- package/deps/librdkafka/win32/setup-msys2.ps1 +47 -0
- package/deps/librdkafka/win32/setup-vcpkg.ps1 +34 -0
- package/deps/librdkafka/win32/tests/test.conf.example +25 -0
- package/deps/librdkafka/win32/tests/tests.vcxproj +253 -0
- package/deps/librdkafka/win32/win_ssl_cert_store/win_ssl_cert_store.vcxproj +132 -0
- package/deps/librdkafka/win32/wingetopt.c +564 -0
- package/deps/librdkafka/win32/wingetopt.h +101 -0
- package/deps/librdkafka/win32/wintime.h +33 -0
- package/deps/librdkafka.gyp +62 -0
- package/lib/admin.js +233 -0
- package/lib/client.js +573 -0
- package/lib/error.js +500 -0
- package/lib/index.js +34 -0
- package/lib/kafka-consumer-stream.js +397 -0
- package/lib/kafka-consumer.js +698 -0
- package/lib/producer/high-level-producer.js +323 -0
- package/lib/producer-stream.js +307 -0
- package/lib/producer.js +375 -0
- package/lib/tools/ref-counter.js +52 -0
- package/lib/topic-partition.js +88 -0
- package/lib/topic.js +42 -0
- package/lib/util.js +29 -0
- package/package.json +61 -0
- package/prebuilds/darwin-arm64/@point3+node-rdkafka.node +0 -0
- package/prebuilds/linux-x64/@point3+node-rdkafka.node +0 -0
- package/util/configure.js +30 -0
- package/util/get-env.js +6 -0
- package/util/test-compile.js +11 -0
- package/util/test-producer-delivery.js +100 -0
|
@@ -0,0 +1,830 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* librdkafka - The Apache Kafka C/C++ library
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2021-2022, Magnus Edenhill
|
|
5
|
+
* All rights reserved.
|
|
6
|
+
*
|
|
7
|
+
* Redistribution and use in source and binary forms, with or without
|
|
8
|
+
* modification, are permitted provided that the following conditions are met:
|
|
9
|
+
*
|
|
10
|
+
* 1. Redistributions of source code must retain the above copyright notice,
|
|
11
|
+
* this list of conditions and the following disclaimer.
|
|
12
|
+
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
* this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
* and/or other materials provided with the distribution.
|
|
15
|
+
*
|
|
16
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
17
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
18
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
19
|
+
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
20
|
+
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
21
|
+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
22
|
+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
23
|
+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
24
|
+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
25
|
+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
26
|
+
* POSSIBILITY OF SUCH DAMAGE.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @name HTTP client
|
|
32
|
+
*
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
#include "rdkafka_int.h"
|
|
36
|
+
#include "rdunittest.h"
|
|
37
|
+
|
|
38
|
+
#include <stdarg.h>
|
|
39
|
+
|
|
40
|
+
#include <curl/curl.h>
|
|
41
|
+
#include "rdhttp.h"
|
|
42
|
+
|
|
43
|
+
#if WITH_SSL
|
|
44
|
+
#include "rdkafka_ssl.h"
|
|
45
|
+
#endif
|
|
46
|
+
|
|
47
|
+
/** Maximum response size, increase as necessary. */
|
|
48
|
+
#define RD_HTTP_RESPONSE_SIZE_MAX 1024 * 1024 * 500 /* 500kb */
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
void rd_http_error_destroy(rd_http_error_t *herr) {
|
|
52
|
+
rd_free(herr);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
static rd_http_error_t *rd_http_error_new(int code, const char *fmt, ...)
|
|
56
|
+
RD_FORMAT(printf, 2, 3);
|
|
57
|
+
static rd_http_error_t *rd_http_error_new(int code, const char *fmt, ...) {
|
|
58
|
+
size_t len = 0;
|
|
59
|
+
rd_http_error_t *herr;
|
|
60
|
+
va_list ap;
|
|
61
|
+
|
|
62
|
+
va_start(ap, fmt);
|
|
63
|
+
|
|
64
|
+
if (fmt && *fmt) {
|
|
65
|
+
va_list ap2;
|
|
66
|
+
va_copy(ap2, ap);
|
|
67
|
+
len = rd_vsnprintf(NULL, 0, fmt, ap2);
|
|
68
|
+
va_end(ap2);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/* Use single allocation for both herr and the error string */
|
|
72
|
+
herr = rd_malloc(sizeof(*herr) + len + 1);
|
|
73
|
+
herr->code = code;
|
|
74
|
+
herr->errstr = herr->data;
|
|
75
|
+
|
|
76
|
+
if (len > 0)
|
|
77
|
+
rd_vsnprintf(herr->errstr, len + 1, fmt, ap);
|
|
78
|
+
else
|
|
79
|
+
herr->errstr[0] = '\0';
|
|
80
|
+
|
|
81
|
+
va_end(ap);
|
|
82
|
+
|
|
83
|
+
return herr;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* @brief Same as rd_http_error_new() but reads the error string from the
|
|
88
|
+
* provided buffer.
|
|
89
|
+
*/
|
|
90
|
+
static rd_http_error_t *rd_http_error_new_from_buf(int code,
|
|
91
|
+
const rd_buf_t *rbuf) {
|
|
92
|
+
rd_http_error_t *herr;
|
|
93
|
+
rd_slice_t slice;
|
|
94
|
+
size_t len = rd_buf_len(rbuf);
|
|
95
|
+
|
|
96
|
+
if (len == 0)
|
|
97
|
+
return rd_http_error_new(
|
|
98
|
+
code, "Server did not provide an error string");
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
/* Use single allocation for both herr and the error string */
|
|
102
|
+
herr = rd_malloc(sizeof(*herr) + len + 1);
|
|
103
|
+
herr->code = code;
|
|
104
|
+
herr->errstr = herr->data;
|
|
105
|
+
rd_slice_init_full(&slice, rbuf);
|
|
106
|
+
rd_slice_read(&slice, herr->errstr, len);
|
|
107
|
+
herr->errstr[len] = '\0';
|
|
108
|
+
|
|
109
|
+
return herr;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
void rd_http_req_destroy(rd_http_req_t *hreq) {
|
|
113
|
+
RD_IF_FREE(hreq->hreq_curl, curl_easy_cleanup);
|
|
114
|
+
RD_IF_FREE(hreq->hreq_buf, rd_buf_destroy_free);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* @brief Curl writefunction. Writes the bytes passed from curl
|
|
120
|
+
* to the hreq's buffer.
|
|
121
|
+
*/
|
|
122
|
+
static size_t
|
|
123
|
+
rd_http_req_write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
|
|
124
|
+
rd_http_req_t *hreq = (rd_http_req_t *)userdata;
|
|
125
|
+
|
|
126
|
+
if (unlikely(rd_buf_len(hreq->hreq_buf) + nmemb >
|
|
127
|
+
RD_HTTP_RESPONSE_SIZE_MAX))
|
|
128
|
+
return 0; /* FIXME: Set some overflow flag or rely on curl? */
|
|
129
|
+
|
|
130
|
+
rd_buf_write(hreq->hreq_buf, ptr, nmemb);
|
|
131
|
+
|
|
132
|
+
return nmemb;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
#if WITH_SSL
|
|
136
|
+
/**
|
|
137
|
+
* @brief Callback function for setting up the SSL_CTX for HTTPS requests.
|
|
138
|
+
*
|
|
139
|
+
* This function sets the default CA paths for the SSL_CTX, and if that fails,
|
|
140
|
+
* it attempts to probe and set a default CA location. If `probe` is forced
|
|
141
|
+
* it skips the default CA paths and directly probes for CA certificates.
|
|
142
|
+
*
|
|
143
|
+
* On Windows, it attempts to load CA root certificates from the
|
|
144
|
+
* configured Windows certificate stores before falling back to the default.
|
|
145
|
+
*
|
|
146
|
+
* @return `CURLE_OK` on success, or `CURLE_SSL_CACERT_BADFILE` on failure.
|
|
147
|
+
*/
|
|
148
|
+
static CURLcode
|
|
149
|
+
rd_http_ssl_ctx_function(CURL *curl, void *sslctx, void *userptr) {
|
|
150
|
+
SSL_CTX *ctx = (SSL_CTX *)sslctx;
|
|
151
|
+
rd_kafka_t *rk = (rd_kafka_t *)userptr;
|
|
152
|
+
int r = -1;
|
|
153
|
+
rd_bool_t force_probe =
|
|
154
|
+
!rd_strcmp(rk->rk_conf.https.ca_location, "probe");
|
|
155
|
+
rd_bool_t use_probe = force_probe;
|
|
156
|
+
|
|
157
|
+
#if WITH_STATIC_LIB_libcrypto
|
|
158
|
+
/* We fallback to `probe` when statically linked. */
|
|
159
|
+
use_probe = rd_true;
|
|
160
|
+
#endif
|
|
161
|
+
|
|
162
|
+
#ifdef _WIN32
|
|
163
|
+
/* Attempt to load CA root certificates from the
|
|
164
|
+
* configured Windows certificate stores. */
|
|
165
|
+
r = rd_kafka_ssl_win_load_cert_stores(rk, "https", ctx,
|
|
166
|
+
rk->rk_conf.ssl.ca_cert_stores);
|
|
167
|
+
if (r == 0) {
|
|
168
|
+
rd_kafka_log(rk, LOG_NOTICE, "CERTSTORE",
|
|
169
|
+
"No CA certificates loaded for `https` from "
|
|
170
|
+
"Windows certificate stores: "
|
|
171
|
+
"falling back to default OpenSSL CA paths");
|
|
172
|
+
r = -1;
|
|
173
|
+
} else if (r == -1)
|
|
174
|
+
rd_kafka_log(rk, LOG_NOTICE, "CERTSTORE",
|
|
175
|
+
"Failed to load CA certificates for `https` from "
|
|
176
|
+
"Windows certificate stores: "
|
|
177
|
+
"falling back to default OpenSSL CA paths");
|
|
178
|
+
|
|
179
|
+
if (r != -1) {
|
|
180
|
+
rd_kafka_dbg(rk, SECURITY, "SSL",
|
|
181
|
+
"Successfully loaded CA certificates for `https` "
|
|
182
|
+
"from Windows certificate stores");
|
|
183
|
+
return CURLE_OK; /* Success, CA certs loaded on Windows */
|
|
184
|
+
}
|
|
185
|
+
#endif
|
|
186
|
+
|
|
187
|
+
if (!force_probe) {
|
|
188
|
+
/* Previous default behavior: use predefined paths set when
|
|
189
|
+
* building OpenSSL. */
|
|
190
|
+
char errstr[512];
|
|
191
|
+
r = SSL_CTX_set_default_verify_paths(ctx);
|
|
192
|
+
if (r == 1) {
|
|
193
|
+
rd_kafka_dbg(rk, SECURITY, "SSL",
|
|
194
|
+
"SSL_CTX_set_default_verify_paths() "
|
|
195
|
+
"for `https` "
|
|
196
|
+
"succeeded");
|
|
197
|
+
return CURLE_OK; /* Success */
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/* Read error and clear the error stack. */
|
|
201
|
+
rd_kafka_ssl_error0(rk, NULL, "https", errstr, sizeof(errstr));
|
|
202
|
+
rd_kafka_dbg(rk, SECURITY, "SSL",
|
|
203
|
+
"SSL_CTX_set_default_verify_paths() "
|
|
204
|
+
"for `https` "
|
|
205
|
+
"failed: %s",
|
|
206
|
+
errstr);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
if (use_probe) {
|
|
210
|
+
/* We asked for probing or we're using
|
|
211
|
+
* a statically linked version of OpenSSL. */
|
|
212
|
+
|
|
213
|
+
r = rd_kafka_ssl_probe_and_set_default_ca_location(rk, "https",
|
|
214
|
+
ctx);
|
|
215
|
+
if (r == 0)
|
|
216
|
+
return CURLE_OK;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return CURLE_SSL_CACERT_BADFILE;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
static void rd_http_ssl_configure(rd_kafka_t *rk, CURL *hreq_curl) {
|
|
223
|
+
rd_bool_t force_probe =
|
|
224
|
+
!rd_strcmp(rk->rk_conf.https.ca_location, "probe");
|
|
225
|
+
|
|
226
|
+
if (!force_probe && rk->rk_conf.https.ca_location) {
|
|
227
|
+
rd_bool_t is_dir;
|
|
228
|
+
rd_kafka_dbg(rk, SECURITY, "SSL",
|
|
229
|
+
"Setting `https` CA certs from "
|
|
230
|
+
"configured location: %s",
|
|
231
|
+
rk->rk_conf.https.ca_location);
|
|
232
|
+
if (rd_file_stat(rk->rk_conf.https.ca_location, &is_dir)) {
|
|
233
|
+
if (is_dir) {
|
|
234
|
+
curl_easy_setopt(hreq_curl, CURLOPT_CAPATH,
|
|
235
|
+
rk->rk_conf.https.ca_location);
|
|
236
|
+
curl_easy_setopt(hreq_curl, CURLOPT_CAINFO,
|
|
237
|
+
NULL);
|
|
238
|
+
} else {
|
|
239
|
+
curl_easy_setopt(hreq_curl, CURLOPT_CAPATH,
|
|
240
|
+
NULL);
|
|
241
|
+
curl_easy_setopt(hreq_curl, CURLOPT_CAINFO,
|
|
242
|
+
rk->rk_conf.https.ca_location);
|
|
243
|
+
}
|
|
244
|
+
} else {
|
|
245
|
+
/* Path doesn't exist, don't set any trusted
|
|
246
|
+
* certificate. */
|
|
247
|
+
curl_easy_setopt(hreq_curl, CURLOPT_CAINFO, NULL);
|
|
248
|
+
curl_easy_setopt(hreq_curl, CURLOPT_CAPATH, NULL);
|
|
249
|
+
}
|
|
250
|
+
} else if (!force_probe && rk->rk_conf.https.ca_pem) {
|
|
251
|
+
#if CURL_AT_LEAST_VERSION(7, 77, 0)
|
|
252
|
+
struct curl_blob ca_blob = {
|
|
253
|
+
.data = rk->rk_conf.https.ca_pem,
|
|
254
|
+
.len = strlen(rk->rk_conf.https.ca_pem),
|
|
255
|
+
.flags = CURL_BLOB_COPY};
|
|
256
|
+
rd_kafka_dbg(rk, SECURITY, "SSL",
|
|
257
|
+
"Setting `https` CA certs from "
|
|
258
|
+
"configured PEM string");
|
|
259
|
+
curl_easy_setopt(hreq_curl, CURLOPT_CAINFO_BLOB, &ca_blob);
|
|
260
|
+
#endif
|
|
261
|
+
/* Only the blob should be set, no default paths. */
|
|
262
|
+
curl_easy_setopt(hreq_curl, CURLOPT_CAINFO, NULL);
|
|
263
|
+
curl_easy_setopt(hreq_curl, CURLOPT_CAPATH, NULL);
|
|
264
|
+
} else {
|
|
265
|
+
curl_easy_setopt(hreq_curl, CURLOPT_SSL_CTX_FUNCTION,
|
|
266
|
+
rd_http_ssl_ctx_function);
|
|
267
|
+
curl_easy_setopt(hreq_curl, CURLOPT_SSL_CTX_DATA, rk);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
#endif
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* @brief Check if the error returned from HTTP(S) is temporary or not.
|
|
274
|
+
*
|
|
275
|
+
* @returns If the \p error_code is temporary, return rd_true,
|
|
276
|
+
* otherwise return rd_false.
|
|
277
|
+
*
|
|
278
|
+
* @locality Any thread.
|
|
279
|
+
* @locks None.
|
|
280
|
+
* @locks_acquired None.
|
|
281
|
+
*/
|
|
282
|
+
static rd_bool_t rd_http_is_failure_temporary(int error_code) {
|
|
283
|
+
switch (error_code) {
|
|
284
|
+
case 408: /**< Request timeout */
|
|
285
|
+
case 425: /**< Too early */
|
|
286
|
+
case 429: /**< Too many requests */
|
|
287
|
+
case 500: /**< Internal server error */
|
|
288
|
+
case 502: /**< Bad gateway */
|
|
289
|
+
case 503: /**< Service unavailable */
|
|
290
|
+
case 504: /**< Gateway timeout */
|
|
291
|
+
return rd_true;
|
|
292
|
+
|
|
293
|
+
default:
|
|
294
|
+
return rd_false;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
rd_http_error_t *
|
|
299
|
+
rd_http_req_init(rd_kafka_t *rk, rd_http_req_t *hreq, const char *url) {
|
|
300
|
+
memset(hreq, 0, sizeof(*hreq));
|
|
301
|
+
|
|
302
|
+
hreq->hreq_curl = curl_easy_init();
|
|
303
|
+
if (!hreq->hreq_curl)
|
|
304
|
+
return rd_http_error_new(-1, "Failed to create curl handle");
|
|
305
|
+
|
|
306
|
+
hreq->hreq_buf = rd_buf_new(1, 1024);
|
|
307
|
+
|
|
308
|
+
curl_easy_setopt(hreq->hreq_curl, CURLOPT_URL, url);
|
|
309
|
+
#if CURL_AT_LEAST_VERSION(7, 85, 0)
|
|
310
|
+
curl_easy_setopt(hreq->hreq_curl, CURLOPT_PROTOCOLS_STR, "http,https");
|
|
311
|
+
#else
|
|
312
|
+
/* As of 06/10/2025 Debian 10 and CentOS Stream 9 ship with
|
|
313
|
+
* older CURL versions, remove this condition once they're not supported
|
|
314
|
+
* anymore. */
|
|
315
|
+
curl_easy_setopt(hreq->hreq_curl, CURLOPT_PROTOCOLS,
|
|
316
|
+
CURLPROTO_HTTP | CURLPROTO_HTTPS);
|
|
317
|
+
#endif
|
|
318
|
+
curl_easy_setopt(hreq->hreq_curl, CURLOPT_MAXREDIRS, 16);
|
|
319
|
+
curl_easy_setopt(hreq->hreq_curl, CURLOPT_TIMEOUT, 30);
|
|
320
|
+
curl_easy_setopt(hreq->hreq_curl, CURLOPT_ERRORBUFFER,
|
|
321
|
+
hreq->hreq_curl_errstr);
|
|
322
|
+
curl_easy_setopt(hreq->hreq_curl, CURLOPT_NOSIGNAL, 1);
|
|
323
|
+
curl_easy_setopt(hreq->hreq_curl, CURLOPT_WRITEFUNCTION,
|
|
324
|
+
rd_http_req_write_cb);
|
|
325
|
+
curl_easy_setopt(hreq->hreq_curl, CURLOPT_WRITEDATA, (void *)hreq);
|
|
326
|
+
|
|
327
|
+
#if WITH_SSL
|
|
328
|
+
rd_http_ssl_configure(rk, hreq->hreq_curl);
|
|
329
|
+
#endif
|
|
330
|
+
|
|
331
|
+
return NULL;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* @brief Synchronously (blockingly) perform the HTTP operation.
|
|
336
|
+
*/
|
|
337
|
+
rd_http_error_t *rd_http_req_perform_sync(rd_http_req_t *hreq) {
|
|
338
|
+
CURLcode res;
|
|
339
|
+
long code = 0;
|
|
340
|
+
|
|
341
|
+
res = curl_easy_perform(hreq->hreq_curl);
|
|
342
|
+
if (unlikely(res != CURLE_OK))
|
|
343
|
+
return rd_http_error_new(-1, "%s", hreq->hreq_curl_errstr);
|
|
344
|
+
|
|
345
|
+
curl_easy_getinfo(hreq->hreq_curl, CURLINFO_RESPONSE_CODE, &code);
|
|
346
|
+
hreq->hreq_code = (int)code;
|
|
347
|
+
if (hreq->hreq_code >= 400)
|
|
348
|
+
return rd_http_error_new_from_buf(hreq->hreq_code,
|
|
349
|
+
hreq->hreq_buf);
|
|
350
|
+
|
|
351
|
+
return NULL;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
int rd_http_req_get_code(const rd_http_req_t *hreq) {
|
|
356
|
+
return hreq->hreq_code;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
const char *rd_http_req_get_content_type(rd_http_req_t *hreq) {
|
|
360
|
+
const char *content_type = NULL;
|
|
361
|
+
|
|
362
|
+
if (curl_easy_getinfo(hreq->hreq_curl, CURLINFO_CONTENT_TYPE,
|
|
363
|
+
&content_type))
|
|
364
|
+
return NULL;
|
|
365
|
+
|
|
366
|
+
return content_type;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* @brief Perform a blocking HTTP(S) request to \p url.
|
|
372
|
+
* Retries the request \p retries times with linear backoff.
|
|
373
|
+
* Interval of \p retry_ms milliseconds is used between retries.
|
|
374
|
+
*
|
|
375
|
+
* @param url The URL to perform the request to.
|
|
376
|
+
* @param headers_array Array of HTTP(S) headers to set, each element
|
|
377
|
+
* is a string in the form "key: value"
|
|
378
|
+
* @param headers_array_cnt Number of elements in \p headers_array.
|
|
379
|
+
* @param timeout_s Timeout in seconds for the request, 0 means default
|
|
380
|
+
* `rd_http_req_init()` timeout.
|
|
381
|
+
* @param retries Number of retries to perform on failure.
|
|
382
|
+
* @param retry_ms Milliseconds to wait between retries.
|
|
383
|
+
* @param rbufp (out) Pointer to a buffer that will be filled with the response.
|
|
384
|
+
* @param content_type (out, optional) Pointer to a string that will be filled
|
|
385
|
+
* with the content type of the response, if not NULL.
|
|
386
|
+
* @param response_code (out, optional) Pointer to an integer that will be
|
|
387
|
+
* filled with the HTTP response code, if not NULL.
|
|
388
|
+
*
|
|
389
|
+
* @return Returns NULL on success (HTTP response code < 400), or an error
|
|
390
|
+
* object on transport or HTTP error.
|
|
391
|
+
*
|
|
392
|
+
* @remark Returned error object, when non-NULL, must be destroyed
|
|
393
|
+
* by calling rd_http_error_destroy().
|
|
394
|
+
*
|
|
395
|
+
* @locality Any thread.
|
|
396
|
+
* @locks None.
|
|
397
|
+
* @locks_acquired None.
|
|
398
|
+
*/
|
|
399
|
+
rd_http_error_t *rd_http_get(rd_kafka_t *rk,
|
|
400
|
+
const char *url,
|
|
401
|
+
char **headers_array,
|
|
402
|
+
size_t headers_array_cnt,
|
|
403
|
+
int timeout_s,
|
|
404
|
+
int retries,
|
|
405
|
+
int retry_ms,
|
|
406
|
+
rd_buf_t **rbufp,
|
|
407
|
+
char **content_type,
|
|
408
|
+
int *response_code) {
|
|
409
|
+
rd_http_req_t hreq;
|
|
410
|
+
rd_http_error_t *herr = NULL;
|
|
411
|
+
struct curl_slist *headers = NULL;
|
|
412
|
+
char *header;
|
|
413
|
+
int i;
|
|
414
|
+
size_t len, j;
|
|
415
|
+
|
|
416
|
+
*rbufp = NULL;
|
|
417
|
+
if (content_type)
|
|
418
|
+
*content_type = NULL;
|
|
419
|
+
if (response_code)
|
|
420
|
+
*response_code = -1;
|
|
421
|
+
|
|
422
|
+
herr = rd_http_req_init(rk, &hreq, url);
|
|
423
|
+
if (unlikely(herr != NULL))
|
|
424
|
+
return herr;
|
|
425
|
+
|
|
426
|
+
for (j = 0; j < headers_array_cnt; j++) {
|
|
427
|
+
header = headers_array[j];
|
|
428
|
+
if (header && *header)
|
|
429
|
+
headers = curl_slist_append(headers, header);
|
|
430
|
+
}
|
|
431
|
+
curl_easy_setopt(hreq.hreq_curl, CURLOPT_HTTPHEADER, headers);
|
|
432
|
+
if (timeout_s > 0)
|
|
433
|
+
curl_easy_setopt(hreq.hreq_curl, CURLOPT_TIMEOUT, timeout_s);
|
|
434
|
+
|
|
435
|
+
for (i = 0; i <= retries; i++) {
|
|
436
|
+
if (rd_kafka_terminating(rk)) {
|
|
437
|
+
herr = rd_http_error_new(-1, "Terminating");
|
|
438
|
+
goto done;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
herr = rd_http_req_perform_sync(&hreq);
|
|
442
|
+
len = rd_buf_len(hreq.hreq_buf);
|
|
443
|
+
|
|
444
|
+
if (!herr) {
|
|
445
|
+
if (len > 0)
|
|
446
|
+
break; /* Success */
|
|
447
|
+
/* Empty response */
|
|
448
|
+
goto done;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
/* Retry if HTTP(S) request returns temporary error and there
|
|
452
|
+
* are remaining retries, else fail. */
|
|
453
|
+
if (i == retries || !rd_http_is_failure_temporary(herr->code)) {
|
|
454
|
+
goto done;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
/* Retry */
|
|
458
|
+
rd_http_error_destroy(herr);
|
|
459
|
+
rd_usleep(retry_ms * 1000 * (i + 1), &rk->rk_terminate);
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
*rbufp = hreq.hreq_buf;
|
|
463
|
+
hreq.hreq_buf = NULL;
|
|
464
|
+
|
|
465
|
+
if (content_type) {
|
|
466
|
+
const char *ct = rd_http_req_get_content_type(&hreq);
|
|
467
|
+
if (ct && *ct)
|
|
468
|
+
*content_type = rd_strdup(ct);
|
|
469
|
+
else
|
|
470
|
+
*content_type = NULL;
|
|
471
|
+
}
|
|
472
|
+
if (response_code)
|
|
473
|
+
*response_code = hreq.hreq_code;
|
|
474
|
+
|
|
475
|
+
done:
|
|
476
|
+
RD_IF_FREE(headers, curl_slist_free_all);
|
|
477
|
+
rd_http_req_destroy(&hreq);
|
|
478
|
+
return herr;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
|
|
482
|
+
/**
|
|
483
|
+
* @brief Extract the JSON object from \p hreq and return it in \p *jsonp.
|
|
484
|
+
*
|
|
485
|
+
* @returns Returns NULL on success, or an JSON parsing error - this
|
|
486
|
+
* error object must be destroyed by calling rd_http_error_destroy().
|
|
487
|
+
*/
|
|
488
|
+
rd_http_error_t *rd_http_parse_json(rd_http_req_t *hreq, cJSON **jsonp) {
|
|
489
|
+
size_t len;
|
|
490
|
+
char *raw_json;
|
|
491
|
+
const char *end = NULL;
|
|
492
|
+
rd_slice_t slice;
|
|
493
|
+
rd_http_error_t *herr = NULL;
|
|
494
|
+
|
|
495
|
+
/* cJSON requires the entire input to parse in contiguous memory. */
|
|
496
|
+
rd_slice_init_full(&slice, hreq->hreq_buf);
|
|
497
|
+
len = rd_buf_len(hreq->hreq_buf);
|
|
498
|
+
|
|
499
|
+
raw_json = rd_malloc(len + 1);
|
|
500
|
+
rd_slice_read(&slice, raw_json, len);
|
|
501
|
+
raw_json[len] = '\0';
|
|
502
|
+
|
|
503
|
+
/* Parse JSON */
|
|
504
|
+
*jsonp = cJSON_ParseWithOpts(raw_json, &end, 0);
|
|
505
|
+
|
|
506
|
+
if (!*jsonp)
|
|
507
|
+
herr = rd_http_error_new(hreq->hreq_code,
|
|
508
|
+
"Failed to parse JSON response "
|
|
509
|
+
"at %" PRIusz "/%" PRIusz,
|
|
510
|
+
(size_t)(end - raw_json), len);
|
|
511
|
+
rd_free(raw_json);
|
|
512
|
+
return herr;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
|
|
516
|
+
/**
|
|
517
|
+
* @brief Perform a blocking HTTP(S) request to \p url with
|
|
518
|
+
* HTTP(S) headers and data with \p timeout_s.
|
|
519
|
+
* If the HTTP(S) request fails, will retry another \p retries times
|
|
520
|
+
* with multiplying backoff \p retry_ms.
|
|
521
|
+
*
|
|
522
|
+
* @returns The result will be returned in \p *jsonp.
|
|
523
|
+
* Returns NULL on success (HTTP response code < 400), or an error
|
|
524
|
+
* object on transport, HTTP error or a JSON parsing error - this
|
|
525
|
+
* error object must be destroyed by calling rd_http_error_destroy().
|
|
526
|
+
*
|
|
527
|
+
* @locality Any thread.
|
|
528
|
+
*/
|
|
529
|
+
rd_http_error_t *rd_http_post_expect_json(rd_kafka_t *rk,
|
|
530
|
+
const char *url,
|
|
531
|
+
const struct curl_slist *headers,
|
|
532
|
+
const char *post_fields,
|
|
533
|
+
size_t post_fields_size,
|
|
534
|
+
int timeout_s,
|
|
535
|
+
int retries,
|
|
536
|
+
int retry_ms,
|
|
537
|
+
cJSON **jsonp) {
|
|
538
|
+
rd_http_error_t *herr;
|
|
539
|
+
rd_http_req_t hreq;
|
|
540
|
+
int i;
|
|
541
|
+
size_t len;
|
|
542
|
+
const char *content_type;
|
|
543
|
+
|
|
544
|
+
herr = rd_http_req_init(rk, &hreq, url);
|
|
545
|
+
if (unlikely(herr != NULL))
|
|
546
|
+
return herr;
|
|
547
|
+
|
|
548
|
+
curl_easy_setopt(hreq.hreq_curl, CURLOPT_HTTPHEADER, headers);
|
|
549
|
+
curl_easy_setopt(hreq.hreq_curl, CURLOPT_TIMEOUT, timeout_s);
|
|
550
|
+
|
|
551
|
+
curl_easy_setopt(hreq.hreq_curl, CURLOPT_POSTFIELDSIZE,
|
|
552
|
+
post_fields_size);
|
|
553
|
+
curl_easy_setopt(hreq.hreq_curl, CURLOPT_POSTFIELDS, post_fields);
|
|
554
|
+
|
|
555
|
+
for (i = 0; i <= retries; i++) {
|
|
556
|
+
if (rd_kafka_terminating(rk)) {
|
|
557
|
+
rd_http_req_destroy(&hreq);
|
|
558
|
+
return rd_http_error_new(-1, "Terminating");
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
herr = rd_http_req_perform_sync(&hreq);
|
|
562
|
+
len = rd_buf_len(hreq.hreq_buf);
|
|
563
|
+
|
|
564
|
+
if (!herr) {
|
|
565
|
+
if (len > 0)
|
|
566
|
+
break; /* Success */
|
|
567
|
+
/* Empty response */
|
|
568
|
+
rd_http_req_destroy(&hreq);
|
|
569
|
+
return NULL;
|
|
570
|
+
}
|
|
571
|
+
/* Retry if HTTP(S) request returns temporary error and there
|
|
572
|
+
* are remaining retries, else fail. */
|
|
573
|
+
if (i == retries || !rd_http_is_failure_temporary(herr->code)) {
|
|
574
|
+
rd_http_req_destroy(&hreq);
|
|
575
|
+
return herr;
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
/* Retry */
|
|
579
|
+
rd_http_error_destroy(herr);
|
|
580
|
+
rd_usleep(retry_ms * 1000 * (i + 1), &rk->rk_terminate);
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
content_type = rd_http_req_get_content_type(&hreq);
|
|
584
|
+
|
|
585
|
+
if (!content_type || rd_strncasecmp(content_type, "application/json",
|
|
586
|
+
strlen("application/json"))) {
|
|
587
|
+
if (!herr)
|
|
588
|
+
herr = rd_http_error_new(
|
|
589
|
+
hreq.hreq_code, "Response is not JSON encoded: %s",
|
|
590
|
+
content_type ? content_type : "(n/a)");
|
|
591
|
+
rd_http_req_destroy(&hreq);
|
|
592
|
+
return herr;
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
herr = rd_http_parse_json(&hreq, jsonp);
|
|
596
|
+
|
|
597
|
+
rd_http_req_destroy(&hreq);
|
|
598
|
+
|
|
599
|
+
return herr;
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
/**
|
|
603
|
+
* @brief Append \p params to \p url, taking care of existing query parameters
|
|
604
|
+
* and hash fragments. \p params must be already URL encoded.
|
|
605
|
+
*
|
|
606
|
+
* @returns A newly allocated string with the appended parameters or NULL
|
|
607
|
+
* on error.
|
|
608
|
+
*/
|
|
609
|
+
char *rd_http_get_params_append(const char *url, const char *params) {
|
|
610
|
+
char *new_url;
|
|
611
|
+
CURLU *u = curl_url();
|
|
612
|
+
CURLUcode rc = curl_url_set(u, CURLUPART_URL, url, 0);
|
|
613
|
+
if (rc != CURLUE_OK)
|
|
614
|
+
goto err;
|
|
615
|
+
|
|
616
|
+
rc = curl_url_set(u, CURLUPART_QUERY, params, CURLU_APPENDQUERY);
|
|
617
|
+
if (rc != CURLUE_OK)
|
|
618
|
+
goto err;
|
|
619
|
+
|
|
620
|
+
rc = curl_url_set(u, CURLUPART_FRAGMENT, NULL,
|
|
621
|
+
0); // remove hash fragment
|
|
622
|
+
if (rc != CURLUE_OK)
|
|
623
|
+
goto err;
|
|
624
|
+
|
|
625
|
+
rc = curl_url_get(u, CURLUPART_URL, &new_url, 0);
|
|
626
|
+
if (rc != CURLUE_OK)
|
|
627
|
+
goto err;
|
|
628
|
+
|
|
629
|
+
curl_url_cleanup(u);
|
|
630
|
+
return new_url;
|
|
631
|
+
err:
|
|
632
|
+
curl_url_cleanup(u);
|
|
633
|
+
return NULL;
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
/**
|
|
637
|
+
* @brief Same as rd_http_get() but requires a JSON response.
|
|
638
|
+
* The response is parsed and a JSON object is returned in \p *jsonp.
|
|
639
|
+
*
|
|
640
|
+
* Same error semantics as rd_http_get().
|
|
641
|
+
*/
|
|
642
|
+
rd_http_error_t *rd_http_get_json(rd_kafka_t *rk,
|
|
643
|
+
const char *url,
|
|
644
|
+
char **headers_array,
|
|
645
|
+
size_t headers_array_cnt,
|
|
646
|
+
int timeout_s,
|
|
647
|
+
int retries,
|
|
648
|
+
int retry_ms,
|
|
649
|
+
cJSON **jsonp) {
|
|
650
|
+
rd_http_error_t *herr;
|
|
651
|
+
int response_code;
|
|
652
|
+
char *content_type;
|
|
653
|
+
rd_buf_t *rbuf;
|
|
654
|
+
char **headers_array_new =
|
|
655
|
+
rd_calloc(headers_array_cnt + 1, sizeof(*headers_array_new));
|
|
656
|
+
rd_http_req_t hreq;
|
|
657
|
+
|
|
658
|
+
*jsonp = NULL;
|
|
659
|
+
|
|
660
|
+
memcpy(headers_array_new, headers_array,
|
|
661
|
+
headers_array_cnt * sizeof(*headers_array_new));
|
|
662
|
+
headers_array_new[headers_array_cnt++] = "Accept: application/json";
|
|
663
|
+
|
|
664
|
+
herr = rd_http_get(rk, url, headers_array_new, headers_array_cnt,
|
|
665
|
+
timeout_s, retries, retry_ms, &rbuf, &content_type,
|
|
666
|
+
&response_code);
|
|
667
|
+
rd_free(headers_array_new);
|
|
668
|
+
|
|
669
|
+
if (unlikely(herr != NULL))
|
|
670
|
+
return herr;
|
|
671
|
+
|
|
672
|
+
if (!content_type || rd_strncasecmp(content_type, "application/json",
|
|
673
|
+
strlen("application/json"))) {
|
|
674
|
+
herr = rd_http_error_new(response_code,
|
|
675
|
+
"Response is not JSON encoded: %s",
|
|
676
|
+
content_type ? content_type : "(n/a)");
|
|
677
|
+
RD_IF_FREE(rbuf, rd_buf_destroy_free);
|
|
678
|
+
RD_IF_FREE(content_type, rd_free);
|
|
679
|
+
return herr;
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
hreq.hreq_buf = rbuf;
|
|
683
|
+
hreq.hreq_code = response_code;
|
|
684
|
+
herr = rd_http_parse_json(&hreq, jsonp);
|
|
685
|
+
RD_IF_FREE(rbuf, rd_buf_destroy_free);
|
|
686
|
+
RD_IF_FREE(content_type, rd_free);
|
|
687
|
+
|
|
688
|
+
return herr;
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
|
|
692
|
+
void rd_http_global_init(void) {
|
|
693
|
+
curl_global_init(CURL_GLOBAL_DEFAULT);
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
|
|
697
|
+
int unittest_http_get(void) {
|
|
698
|
+
const char *base_url = rd_getenv("RD_UT_HTTP_URL", NULL);
|
|
699
|
+
char *error_url;
|
|
700
|
+
size_t error_url_size;
|
|
701
|
+
cJSON *json, *jval;
|
|
702
|
+
rd_http_error_t *herr;
|
|
703
|
+
rd_bool_t empty;
|
|
704
|
+
rd_kafka_t *rk;
|
|
705
|
+
|
|
706
|
+
if (!base_url || !*base_url)
|
|
707
|
+
RD_UT_SKIP("RD_UT_HTTP_URL environment variable not set");
|
|
708
|
+
|
|
709
|
+
RD_UT_BEGIN();
|
|
710
|
+
|
|
711
|
+
rk = rd_calloc(1, sizeof(*rk));
|
|
712
|
+
error_url_size = strlen(base_url) + strlen("/error") + 1;
|
|
713
|
+
error_url = rd_alloca(error_url_size);
|
|
714
|
+
rd_snprintf(error_url, error_url_size, "%s/error", base_url);
|
|
715
|
+
|
|
716
|
+
/* Try the base url first, parse its JSON and extract a key-value. */
|
|
717
|
+
json = NULL;
|
|
718
|
+
herr = rd_http_get_json(rk, base_url, NULL, 0, 5, 1, 1000, &json);
|
|
719
|
+
RD_UT_ASSERT(!herr, "Expected get_json(%s) to succeed, got: %s",
|
|
720
|
+
base_url, herr->errstr);
|
|
721
|
+
|
|
722
|
+
empty = rd_true;
|
|
723
|
+
cJSON_ArrayForEach(jval, json) {
|
|
724
|
+
empty = rd_false;
|
|
725
|
+
break;
|
|
726
|
+
}
|
|
727
|
+
RD_UT_ASSERT(!empty, "Expected non-empty JSON response from %s",
|
|
728
|
+
base_url);
|
|
729
|
+
RD_UT_SAY(
|
|
730
|
+
"URL %s returned no error and a non-empty "
|
|
731
|
+
"JSON object/array as expected",
|
|
732
|
+
base_url);
|
|
733
|
+
cJSON_Delete(json);
|
|
734
|
+
|
|
735
|
+
|
|
736
|
+
/* Try the error URL, verify error code. */
|
|
737
|
+
json = NULL;
|
|
738
|
+
herr = rd_http_get_json(rk, error_url, NULL, 0, 5, 1, 1000, &json);
|
|
739
|
+
RD_UT_ASSERT(herr != NULL, "Expected get_json(%s) to fail", error_url);
|
|
740
|
+
RD_UT_ASSERT(herr->code >= 400,
|
|
741
|
+
"Expected get_json(%s) error code >= "
|
|
742
|
+
"400, got %d",
|
|
743
|
+
error_url, herr->code);
|
|
744
|
+
RD_UT_SAY(
|
|
745
|
+
"Error URL %s returned code %d, errstr \"%s\" "
|
|
746
|
+
"and %s JSON object as expected",
|
|
747
|
+
error_url, herr->code, herr->errstr, json ? "a" : "no");
|
|
748
|
+
/* Check if there's a JSON document returned */
|
|
749
|
+
if (json)
|
|
750
|
+
cJSON_Delete(json);
|
|
751
|
+
rd_http_error_destroy(herr);
|
|
752
|
+
rd_free(rk);
|
|
753
|
+
|
|
754
|
+
RD_UT_PASS();
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
int unittest_http_get_params_append(void) {
|
|
758
|
+
rd_kafka_t *rk;
|
|
759
|
+
char *res;
|
|
760
|
+
RD_UT_BEGIN();
|
|
761
|
+
char *tests[] = {"http://localhost:1234",
|
|
762
|
+
"",
|
|
763
|
+
"http://localhost:1234/",
|
|
764
|
+
|
|
765
|
+
"http://localhost:1234/",
|
|
766
|
+
"a=1",
|
|
767
|
+
"http://localhost:1234/?a=1",
|
|
768
|
+
|
|
769
|
+
"https://localhost:1234/",
|
|
770
|
+
"a=1&b=2",
|
|
771
|
+
"https://localhost:1234/?a=1&b=2",
|
|
772
|
+
|
|
773
|
+
"http://mydomain.com/?a=1",
|
|
774
|
+
"c=hi",
|
|
775
|
+
"http://mydomain.com/?a=1&c=hi",
|
|
776
|
+
|
|
777
|
+
"https://mydomain.com/?",
|
|
778
|
+
"c=hi",
|
|
779
|
+
"https://mydomain.com/?c=hi",
|
|
780
|
+
|
|
781
|
+
"http://localhost:1234/path?a=1&b=2#&c=3",
|
|
782
|
+
"c=hi",
|
|
783
|
+
"http://localhost:1234/path?a=1&b=2&c=hi",
|
|
784
|
+
|
|
785
|
+
"http://localhost:1234#?c=3",
|
|
786
|
+
"a=1",
|
|
787
|
+
"http://localhost:1234/?a=1",
|
|
788
|
+
|
|
789
|
+
"https://otherdomain.io/path?a=1&#c=3",
|
|
790
|
+
"b=2",
|
|
791
|
+
"https://otherdomain.io/path?a=1&b=2",
|
|
792
|
+
NULL};
|
|
793
|
+
|
|
794
|
+
|
|
795
|
+
res = rd_http_get_params_append("", "");
|
|
796
|
+
RD_UT_ASSERT(!res, "Expected NULL result, got: \"%s\"", res);
|
|
797
|
+
res = rd_http_get_params_append("", "a=2&b=3");
|
|
798
|
+
RD_UT_ASSERT(!res, "Expected NULL result, got: \"%s\"", res);
|
|
799
|
+
|
|
800
|
+
char **test = tests;
|
|
801
|
+
rk = rd_calloc(1, sizeof(*rk));
|
|
802
|
+
while (test[0]) {
|
|
803
|
+
res = rd_http_get_params_append(test[0], test[1]);
|
|
804
|
+
RD_UT_ASSERT(!strcmp(res, test[2]),
|
|
805
|
+
"Expected \"%s\", got: \"%s\"", test[2], res);
|
|
806
|
+
rd_free(res);
|
|
807
|
+
test += 3;
|
|
808
|
+
}
|
|
809
|
+
rd_free(rk);
|
|
810
|
+
|
|
811
|
+
RD_UT_PASS();
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
/**
|
|
815
|
+
* @brief Unittest. Requires a (local) webserver to be set with env var
|
|
816
|
+
* RD_UT_HTTP_URL=http://localhost:1234/some-path
|
|
817
|
+
*
|
|
818
|
+
* This server must return a JSON object or array containing at least one
|
|
819
|
+
* object on the main URL with a 2xx response code,
|
|
820
|
+
* and 4xx response on $RD_UT_HTTP_URL/error (with whatever type of body).
|
|
821
|
+
*/
|
|
822
|
+
|
|
823
|
+
int unittest_http(void) {
|
|
824
|
+
int fails = 0;
|
|
825
|
+
|
|
826
|
+
fails += unittest_http_get();
|
|
827
|
+
fails += unittest_http_get_params_append();
|
|
828
|
+
|
|
829
|
+
return fails;
|
|
830
|
+
}
|