@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.
Files changed (707) hide show
  1. package/LICENSE.txt +20 -0
  2. package/README.md +636 -0
  3. package/binding.gyp +154 -0
  4. package/deps/librdkafka/.clang-format +136 -0
  5. package/deps/librdkafka/.clang-format-cpp +103 -0
  6. package/deps/librdkafka/.dir-locals.el +10 -0
  7. package/deps/librdkafka/.formatignore +33 -0
  8. package/deps/librdkafka/.gdbmacros +19 -0
  9. package/deps/librdkafka/.github/CODEOWNERS +1 -0
  10. package/deps/librdkafka/.github/ISSUE_TEMPLATE +34 -0
  11. package/deps/librdkafka/.semaphore/run-all-tests.yml +77 -0
  12. package/deps/librdkafka/.semaphore/semaphore-integration.yml +250 -0
  13. package/deps/librdkafka/.semaphore/semaphore.yml +378 -0
  14. package/deps/librdkafka/.semaphore/verify-linux-packages.yml +41 -0
  15. package/deps/librdkafka/CHANGELOG.md +2208 -0
  16. package/deps/librdkafka/CMakeLists.txt +291 -0
  17. package/deps/librdkafka/CODE_OF_CONDUCT.md +46 -0
  18. package/deps/librdkafka/CONFIGURATION.md +209 -0
  19. package/deps/librdkafka/CONTRIBUTING.md +431 -0
  20. package/deps/librdkafka/Doxyfile +2375 -0
  21. package/deps/librdkafka/INTRODUCTION.md +2481 -0
  22. package/deps/librdkafka/LICENSE +26 -0
  23. package/deps/librdkafka/LICENSE.cjson +22 -0
  24. package/deps/librdkafka/LICENSE.crc32c +28 -0
  25. package/deps/librdkafka/LICENSE.fnv1a +18 -0
  26. package/deps/librdkafka/LICENSE.hdrhistogram +27 -0
  27. package/deps/librdkafka/LICENSE.lz4 +26 -0
  28. package/deps/librdkafka/LICENSE.murmur2 +25 -0
  29. package/deps/librdkafka/LICENSE.nanopb +22 -0
  30. package/deps/librdkafka/LICENSE.opentelemetry +203 -0
  31. package/deps/librdkafka/LICENSE.pycrc +23 -0
  32. package/deps/librdkafka/LICENSE.queue +31 -0
  33. package/deps/librdkafka/LICENSE.regexp +5 -0
  34. package/deps/librdkafka/LICENSE.snappy +36 -0
  35. package/deps/librdkafka/LICENSE.tinycthread +26 -0
  36. package/deps/librdkafka/LICENSE.wingetopt +49 -0
  37. package/deps/librdkafka/LICENSES.txt +625 -0
  38. package/deps/librdkafka/Makefile +125 -0
  39. package/deps/librdkafka/README.md +199 -0
  40. package/deps/librdkafka/README.win32 +26 -0
  41. package/deps/librdkafka/STATISTICS.md +624 -0
  42. package/deps/librdkafka/configure +214 -0
  43. package/deps/librdkafka/configure.self +331 -0
  44. package/deps/librdkafka/debian/changelog +111 -0
  45. package/deps/librdkafka/debian/compat +1 -0
  46. package/deps/librdkafka/debian/control +71 -0
  47. package/deps/librdkafka/debian/copyright +99 -0
  48. package/deps/librdkafka/debian/gbp.conf +9 -0
  49. package/deps/librdkafka/debian/librdkafka++1.install +1 -0
  50. package/deps/librdkafka/debian/librdkafka-dev.examples +2 -0
  51. package/deps/librdkafka/debian/librdkafka-dev.install +9 -0
  52. package/deps/librdkafka/debian/librdkafka1.docs +5 -0
  53. package/deps/librdkafka/debian/librdkafka1.install +1 -0
  54. package/deps/librdkafka/debian/librdkafka1.symbols +135 -0
  55. package/deps/librdkafka/debian/rules +19 -0
  56. package/deps/librdkafka/debian/source/format +1 -0
  57. package/deps/librdkafka/debian/watch +2 -0
  58. package/deps/librdkafka/dev-conf.sh +123 -0
  59. package/deps/librdkafka/examples/CMakeLists.txt +79 -0
  60. package/deps/librdkafka/examples/Makefile +167 -0
  61. package/deps/librdkafka/examples/README.md +42 -0
  62. package/deps/librdkafka/examples/alter_consumer_group_offsets.c +338 -0
  63. package/deps/librdkafka/examples/consumer.c +271 -0
  64. package/deps/librdkafka/examples/delete_records.c +233 -0
  65. package/deps/librdkafka/examples/describe_cluster.c +322 -0
  66. package/deps/librdkafka/examples/describe_consumer_groups.c +455 -0
  67. package/deps/librdkafka/examples/describe_topics.c +427 -0
  68. package/deps/librdkafka/examples/elect_leaders.c +317 -0
  69. package/deps/librdkafka/examples/globals.json +11 -0
  70. package/deps/librdkafka/examples/idempotent_producer.c +344 -0
  71. package/deps/librdkafka/examples/incremental_alter_configs.c +347 -0
  72. package/deps/librdkafka/examples/kafkatest_verifiable_client.cpp +945 -0
  73. package/deps/librdkafka/examples/list_consumer_group_offsets.c +359 -0
  74. package/deps/librdkafka/examples/list_consumer_groups.c +365 -0
  75. package/deps/librdkafka/examples/list_offsets.c +327 -0
  76. package/deps/librdkafka/examples/misc.c +287 -0
  77. package/deps/librdkafka/examples/openssl_engine_example.cpp +248 -0
  78. package/deps/librdkafka/examples/producer.c +251 -0
  79. package/deps/librdkafka/examples/producer.cpp +228 -0
  80. package/deps/librdkafka/examples/rdkafka_complex_consumer_example.c +617 -0
  81. package/deps/librdkafka/examples/rdkafka_complex_consumer_example.cpp +467 -0
  82. package/deps/librdkafka/examples/rdkafka_consume_batch.cpp +264 -0
  83. package/deps/librdkafka/examples/rdkafka_example.c +853 -0
  84. package/deps/librdkafka/examples/rdkafka_example.cpp +679 -0
  85. package/deps/librdkafka/examples/rdkafka_performance.c +1781 -0
  86. package/deps/librdkafka/examples/transactions-older-broker.c +668 -0
  87. package/deps/librdkafka/examples/transactions.c +665 -0
  88. package/deps/librdkafka/examples/user_scram.c +491 -0
  89. package/deps/librdkafka/examples/win_ssl_cert_store.cpp +396 -0
  90. package/deps/librdkafka/lds-gen.py +73 -0
  91. package/deps/librdkafka/mainpage.doxy +40 -0
  92. package/deps/librdkafka/mklove/Makefile.base +329 -0
  93. package/deps/librdkafka/mklove/modules/configure.atomics +144 -0
  94. package/deps/librdkafka/mklove/modules/configure.base +2484 -0
  95. package/deps/librdkafka/mklove/modules/configure.builtin +70 -0
  96. package/deps/librdkafka/mklove/modules/configure.cc +186 -0
  97. package/deps/librdkafka/mklove/modules/configure.cxx +8 -0
  98. package/deps/librdkafka/mklove/modules/configure.fileversion +65 -0
  99. package/deps/librdkafka/mklove/modules/configure.gitversion +29 -0
  100. package/deps/librdkafka/mklove/modules/configure.good_cflags +18 -0
  101. package/deps/librdkafka/mklove/modules/configure.host +132 -0
  102. package/deps/librdkafka/mklove/modules/configure.lib +49 -0
  103. package/deps/librdkafka/mklove/modules/configure.libcurl +99 -0
  104. package/deps/librdkafka/mklove/modules/configure.libsasl2 +36 -0
  105. package/deps/librdkafka/mklove/modules/configure.libssl +147 -0
  106. package/deps/librdkafka/mklove/modules/configure.libzstd +58 -0
  107. package/deps/librdkafka/mklove/modules/configure.parseversion +95 -0
  108. package/deps/librdkafka/mklove/modules/configure.pic +16 -0
  109. package/deps/librdkafka/mklove/modules/configure.socket +20 -0
  110. package/deps/librdkafka/mklove/modules/configure.zlib +61 -0
  111. package/deps/librdkafka/mklove/modules/patches/README.md +8 -0
  112. package/deps/librdkafka/mklove/modules/patches/libcurl.0000-no-runtime-linking-check.patch +11 -0
  113. package/deps/librdkafka/mklove/modules/patches/libssl.0000-osx-rand-include-fix-OpenSSL-PR16409.patch +56 -0
  114. package/deps/librdkafka/packaging/RELEASE.md +319 -0
  115. package/deps/librdkafka/packaging/alpine/build-alpine.sh +38 -0
  116. package/deps/librdkafka/packaging/archlinux/PKGBUILD +30 -0
  117. package/deps/librdkafka/packaging/cmake/Config.cmake.in +37 -0
  118. package/deps/librdkafka/packaging/cmake/Modules/FindLZ4.cmake +38 -0
  119. package/deps/librdkafka/packaging/cmake/Modules/FindZSTD.cmake +27 -0
  120. package/deps/librdkafka/packaging/cmake/Modules/LICENSE.FindZstd +178 -0
  121. package/deps/librdkafka/packaging/cmake/README.md +38 -0
  122. package/deps/librdkafka/packaging/cmake/config.h.in +52 -0
  123. package/deps/librdkafka/packaging/cmake/parseversion.cmake +60 -0
  124. package/deps/librdkafka/packaging/cmake/rdkafka.pc.in +12 -0
  125. package/deps/librdkafka/packaging/cmake/try_compile/atomic_32_test.c +8 -0
  126. package/deps/librdkafka/packaging/cmake/try_compile/atomic_64_test.c +8 -0
  127. package/deps/librdkafka/packaging/cmake/try_compile/c11threads_test.c +14 -0
  128. package/deps/librdkafka/packaging/cmake/try_compile/crc32c_hw_test.c +27 -0
  129. package/deps/librdkafka/packaging/cmake/try_compile/dlopen_test.c +11 -0
  130. package/deps/librdkafka/packaging/cmake/try_compile/libsasl2_test.c +7 -0
  131. package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_darwin_test.c +6 -0
  132. package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_freebsd_test.c +7 -0
  133. package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_gnu_test.c +5 -0
  134. package/deps/librdkafka/packaging/cmake/try_compile/rand_r_test.c +7 -0
  135. package/deps/librdkafka/packaging/cmake/try_compile/rdkafka_setup.cmake +122 -0
  136. package/deps/librdkafka/packaging/cmake/try_compile/regex_test.c +10 -0
  137. package/deps/librdkafka/packaging/cmake/try_compile/strndup_test.c +5 -0
  138. package/deps/librdkafka/packaging/cmake/try_compile/sync_32_test.c +8 -0
  139. package/deps/librdkafka/packaging/cmake/try_compile/sync_64_test.c +8 -0
  140. package/deps/librdkafka/packaging/cp/README.md +16 -0
  141. package/deps/librdkafka/packaging/cp/check_features.c +72 -0
  142. package/deps/librdkafka/packaging/cp/verify-deb.sh +33 -0
  143. package/deps/librdkafka/packaging/cp/verify-packages.sh +69 -0
  144. package/deps/librdkafka/packaging/cp/verify-rpm.sh +32 -0
  145. package/deps/librdkafka/packaging/debian/changelog +66 -0
  146. package/deps/librdkafka/packaging/debian/compat +1 -0
  147. package/deps/librdkafka/packaging/debian/control +49 -0
  148. package/deps/librdkafka/packaging/debian/copyright +84 -0
  149. package/deps/librdkafka/packaging/debian/docs +5 -0
  150. package/deps/librdkafka/packaging/debian/gbp.conf +9 -0
  151. package/deps/librdkafka/packaging/debian/librdkafka-dev.dirs +2 -0
  152. package/deps/librdkafka/packaging/debian/librdkafka-dev.examples +2 -0
  153. package/deps/librdkafka/packaging/debian/librdkafka-dev.install +6 -0
  154. package/deps/librdkafka/packaging/debian/librdkafka-dev.substvars +1 -0
  155. package/deps/librdkafka/packaging/debian/librdkafka.dsc +16 -0
  156. package/deps/librdkafka/packaging/debian/librdkafka1-dbg.substvars +1 -0
  157. package/deps/librdkafka/packaging/debian/librdkafka1.dirs +1 -0
  158. package/deps/librdkafka/packaging/debian/librdkafka1.install +2 -0
  159. package/deps/librdkafka/packaging/debian/librdkafka1.postinst.debhelper +5 -0
  160. package/deps/librdkafka/packaging/debian/librdkafka1.postrm.debhelper +5 -0
  161. package/deps/librdkafka/packaging/debian/librdkafka1.symbols +64 -0
  162. package/deps/librdkafka/packaging/debian/rules +19 -0
  163. package/deps/librdkafka/packaging/debian/source/format +1 -0
  164. package/deps/librdkafka/packaging/debian/watch +2 -0
  165. package/deps/librdkafka/packaging/get_version.py +21 -0
  166. package/deps/librdkafka/packaging/homebrew/README.md +15 -0
  167. package/deps/librdkafka/packaging/homebrew/brew-update-pr.sh +31 -0
  168. package/deps/librdkafka/packaging/mingw-w64/configure-build-msys2-mingw-static.sh +52 -0
  169. package/deps/librdkafka/packaging/mingw-w64/configure-build-msys2-mingw.sh +21 -0
  170. package/deps/librdkafka/packaging/mingw-w64/export-variables.sh +13 -0
  171. package/deps/librdkafka/packaging/mingw-w64/run-tests.sh +6 -0
  172. package/deps/librdkafka/packaging/mingw-w64/semaphoreci-build.sh +38 -0
  173. package/deps/librdkafka/packaging/nuget/README.md +84 -0
  174. package/deps/librdkafka/packaging/nuget/artifact.py +177 -0
  175. package/deps/librdkafka/packaging/nuget/cleanup-s3.py +143 -0
  176. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-win32__bldtype-Release/msvcr120.zip +0 -0
  177. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-win32__bldtype-Release/msvcr140.zip +0 -0
  178. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-x64__bldtype-Release/msvcr120.zip +0 -0
  179. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-x64__bldtype-Release/msvcr140.zip +0 -0
  180. package/deps/librdkafka/packaging/nuget/nuget.sh +21 -0
  181. package/deps/librdkafka/packaging/nuget/nugetpackage.py +278 -0
  182. package/deps/librdkafka/packaging/nuget/packaging.py +448 -0
  183. package/deps/librdkafka/packaging/nuget/push-to-nuget.sh +21 -0
  184. package/deps/librdkafka/packaging/nuget/release.py +167 -0
  185. package/deps/librdkafka/packaging/nuget/requirements.txt +3 -0
  186. package/deps/librdkafka/packaging/nuget/staticpackage.py +178 -0
  187. package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.nuspec +21 -0
  188. package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.props +18 -0
  189. package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.targets +19 -0
  190. package/deps/librdkafka/packaging/nuget/zfile/__init__.py +0 -0
  191. package/deps/librdkafka/packaging/nuget/zfile/zfile.py +98 -0
  192. package/deps/librdkafka/packaging/rpm/Makefile +92 -0
  193. package/deps/librdkafka/packaging/rpm/README.md +23 -0
  194. package/deps/librdkafka/packaging/rpm/el7-x86_64.cfg +40 -0
  195. package/deps/librdkafka/packaging/rpm/librdkafka.spec +118 -0
  196. package/deps/librdkafka/packaging/rpm/mock-on-docker.sh +96 -0
  197. package/deps/librdkafka/packaging/rpm/tests/Makefile +25 -0
  198. package/deps/librdkafka/packaging/rpm/tests/README.md +8 -0
  199. package/deps/librdkafka/packaging/rpm/tests/run-test.sh +42 -0
  200. package/deps/librdkafka/packaging/rpm/tests/test-on-docker.sh +56 -0
  201. package/deps/librdkafka/packaging/rpm/tests/test.c +77 -0
  202. package/deps/librdkafka/packaging/rpm/tests/test.cpp +34 -0
  203. package/deps/librdkafka/packaging/tools/Dockerfile +31 -0
  204. package/deps/librdkafka/packaging/tools/build-configurations-checks.sh +12 -0
  205. package/deps/librdkafka/packaging/tools/build-deb-package.sh +64 -0
  206. package/deps/librdkafka/packaging/tools/build-debian.sh +65 -0
  207. package/deps/librdkafka/packaging/tools/build-manylinux.sh +68 -0
  208. package/deps/librdkafka/packaging/tools/build-release-artifacts.sh +139 -0
  209. package/deps/librdkafka/packaging/tools/distro-build.sh +38 -0
  210. package/deps/librdkafka/packaging/tools/gh-release-checksums.py +39 -0
  211. package/deps/librdkafka/packaging/tools/rdutcoverage.sh +25 -0
  212. package/deps/librdkafka/packaging/tools/requirements.txt +2 -0
  213. package/deps/librdkafka/packaging/tools/run-in-docker.sh +28 -0
  214. package/deps/librdkafka/packaging/tools/run-integration-tests.sh +31 -0
  215. package/deps/librdkafka/packaging/tools/run-style-check.sh +4 -0
  216. package/deps/librdkafka/packaging/tools/style-format.sh +149 -0
  217. package/deps/librdkafka/packaging/tools/update_rpcs_max_versions.py +100 -0
  218. package/deps/librdkafka/service.yml +172 -0
  219. package/deps/librdkafka/src/CMakeLists.txt +374 -0
  220. package/deps/librdkafka/src/Makefile +103 -0
  221. package/deps/librdkafka/src/README.lz4.md +30 -0
  222. package/deps/librdkafka/src/cJSON.c +2834 -0
  223. package/deps/librdkafka/src/cJSON.h +398 -0
  224. package/deps/librdkafka/src/crc32c.c +430 -0
  225. package/deps/librdkafka/src/crc32c.h +38 -0
  226. package/deps/librdkafka/src/generate_proto.sh +66 -0
  227. package/deps/librdkafka/src/librdkafka_cgrp_synch.png +0 -0
  228. package/deps/librdkafka/src/lz4.c +2727 -0
  229. package/deps/librdkafka/src/lz4.h +842 -0
  230. package/deps/librdkafka/src/lz4frame.c +2078 -0
  231. package/deps/librdkafka/src/lz4frame.h +692 -0
  232. package/deps/librdkafka/src/lz4frame_static.h +47 -0
  233. package/deps/librdkafka/src/lz4hc.c +1631 -0
  234. package/deps/librdkafka/src/lz4hc.h +413 -0
  235. package/deps/librdkafka/src/nanopb/pb.h +917 -0
  236. package/deps/librdkafka/src/nanopb/pb_common.c +388 -0
  237. package/deps/librdkafka/src/nanopb/pb_common.h +49 -0
  238. package/deps/librdkafka/src/nanopb/pb_decode.c +1727 -0
  239. package/deps/librdkafka/src/nanopb/pb_decode.h +193 -0
  240. package/deps/librdkafka/src/nanopb/pb_encode.c +1000 -0
  241. package/deps/librdkafka/src/nanopb/pb_encode.h +185 -0
  242. package/deps/librdkafka/src/opentelemetry/common.pb.c +32 -0
  243. package/deps/librdkafka/src/opentelemetry/common.pb.h +170 -0
  244. package/deps/librdkafka/src/opentelemetry/metrics.options +2 -0
  245. package/deps/librdkafka/src/opentelemetry/metrics.pb.c +67 -0
  246. package/deps/librdkafka/src/opentelemetry/metrics.pb.h +966 -0
  247. package/deps/librdkafka/src/opentelemetry/resource.pb.c +12 -0
  248. package/deps/librdkafka/src/opentelemetry/resource.pb.h +58 -0
  249. package/deps/librdkafka/src/queue.h +850 -0
  250. package/deps/librdkafka/src/rd.h +584 -0
  251. package/deps/librdkafka/src/rdaddr.c +255 -0
  252. package/deps/librdkafka/src/rdaddr.h +202 -0
  253. package/deps/librdkafka/src/rdatomic.h +230 -0
  254. package/deps/librdkafka/src/rdavg.h +260 -0
  255. package/deps/librdkafka/src/rdavl.c +210 -0
  256. package/deps/librdkafka/src/rdavl.h +250 -0
  257. package/deps/librdkafka/src/rdbase64.c +200 -0
  258. package/deps/librdkafka/src/rdbase64.h +43 -0
  259. package/deps/librdkafka/src/rdbuf.c +1884 -0
  260. package/deps/librdkafka/src/rdbuf.h +375 -0
  261. package/deps/librdkafka/src/rdcrc32.c +114 -0
  262. package/deps/librdkafka/src/rdcrc32.h +170 -0
  263. package/deps/librdkafka/src/rddl.c +179 -0
  264. package/deps/librdkafka/src/rddl.h +43 -0
  265. package/deps/librdkafka/src/rdendian.h +175 -0
  266. package/deps/librdkafka/src/rdfloat.h +67 -0
  267. package/deps/librdkafka/src/rdfnv1a.c +113 -0
  268. package/deps/librdkafka/src/rdfnv1a.h +35 -0
  269. package/deps/librdkafka/src/rdgz.c +120 -0
  270. package/deps/librdkafka/src/rdgz.h +46 -0
  271. package/deps/librdkafka/src/rdhdrhistogram.c +721 -0
  272. package/deps/librdkafka/src/rdhdrhistogram.h +87 -0
  273. package/deps/librdkafka/src/rdhttp.c +830 -0
  274. package/deps/librdkafka/src/rdhttp.h +101 -0
  275. package/deps/librdkafka/src/rdinterval.h +177 -0
  276. package/deps/librdkafka/src/rdkafka.c +5505 -0
  277. package/deps/librdkafka/src/rdkafka.h +10686 -0
  278. package/deps/librdkafka/src/rdkafka_admin.c +9794 -0
  279. package/deps/librdkafka/src/rdkafka_admin.h +661 -0
  280. package/deps/librdkafka/src/rdkafka_assignment.c +1010 -0
  281. package/deps/librdkafka/src/rdkafka_assignment.h +73 -0
  282. package/deps/librdkafka/src/rdkafka_assignor.c +1786 -0
  283. package/deps/librdkafka/src/rdkafka_assignor.h +402 -0
  284. package/deps/librdkafka/src/rdkafka_aux.c +409 -0
  285. package/deps/librdkafka/src/rdkafka_aux.h +174 -0
  286. package/deps/librdkafka/src/rdkafka_background.c +221 -0
  287. package/deps/librdkafka/src/rdkafka_broker.c +6337 -0
  288. package/deps/librdkafka/src/rdkafka_broker.h +744 -0
  289. package/deps/librdkafka/src/rdkafka_buf.c +543 -0
  290. package/deps/librdkafka/src/rdkafka_buf.h +1525 -0
  291. package/deps/librdkafka/src/rdkafka_cert.c +576 -0
  292. package/deps/librdkafka/src/rdkafka_cert.h +62 -0
  293. package/deps/librdkafka/src/rdkafka_cgrp.c +7587 -0
  294. package/deps/librdkafka/src/rdkafka_cgrp.h +477 -0
  295. package/deps/librdkafka/src/rdkafka_conf.c +4880 -0
  296. package/deps/librdkafka/src/rdkafka_conf.h +732 -0
  297. package/deps/librdkafka/src/rdkafka_confval.h +97 -0
  298. package/deps/librdkafka/src/rdkafka_coord.c +623 -0
  299. package/deps/librdkafka/src/rdkafka_coord.h +132 -0
  300. package/deps/librdkafka/src/rdkafka_error.c +228 -0
  301. package/deps/librdkafka/src/rdkafka_error.h +80 -0
  302. package/deps/librdkafka/src/rdkafka_event.c +502 -0
  303. package/deps/librdkafka/src/rdkafka_event.h +126 -0
  304. package/deps/librdkafka/src/rdkafka_feature.c +898 -0
  305. package/deps/librdkafka/src/rdkafka_feature.h +104 -0
  306. package/deps/librdkafka/src/rdkafka_fetcher.c +1422 -0
  307. package/deps/librdkafka/src/rdkafka_fetcher.h +44 -0
  308. package/deps/librdkafka/src/rdkafka_header.c +220 -0
  309. package/deps/librdkafka/src/rdkafka_header.h +76 -0
  310. package/deps/librdkafka/src/rdkafka_idempotence.c +807 -0
  311. package/deps/librdkafka/src/rdkafka_idempotence.h +144 -0
  312. package/deps/librdkafka/src/rdkafka_int.h +1260 -0
  313. package/deps/librdkafka/src/rdkafka_interceptor.c +819 -0
  314. package/deps/librdkafka/src/rdkafka_interceptor.h +104 -0
  315. package/deps/librdkafka/src/rdkafka_lz4.c +450 -0
  316. package/deps/librdkafka/src/rdkafka_lz4.h +49 -0
  317. package/deps/librdkafka/src/rdkafka_metadata.c +2209 -0
  318. package/deps/librdkafka/src/rdkafka_metadata.h +345 -0
  319. package/deps/librdkafka/src/rdkafka_metadata_cache.c +1183 -0
  320. package/deps/librdkafka/src/rdkafka_mock.c +3661 -0
  321. package/deps/librdkafka/src/rdkafka_mock.h +610 -0
  322. package/deps/librdkafka/src/rdkafka_mock_cgrp.c +1876 -0
  323. package/deps/librdkafka/src/rdkafka_mock_handlers.c +3113 -0
  324. package/deps/librdkafka/src/rdkafka_mock_int.h +710 -0
  325. package/deps/librdkafka/src/rdkafka_msg.c +2589 -0
  326. package/deps/librdkafka/src/rdkafka_msg.h +614 -0
  327. package/deps/librdkafka/src/rdkafka_msgbatch.h +62 -0
  328. package/deps/librdkafka/src/rdkafka_msgset.h +98 -0
  329. package/deps/librdkafka/src/rdkafka_msgset_reader.c +1806 -0
  330. package/deps/librdkafka/src/rdkafka_msgset_writer.c +1474 -0
  331. package/deps/librdkafka/src/rdkafka_offset.c +1565 -0
  332. package/deps/librdkafka/src/rdkafka_offset.h +150 -0
  333. package/deps/librdkafka/src/rdkafka_op.c +997 -0
  334. package/deps/librdkafka/src/rdkafka_op.h +858 -0
  335. package/deps/librdkafka/src/rdkafka_partition.c +4896 -0
  336. package/deps/librdkafka/src/rdkafka_partition.h +1182 -0
  337. package/deps/librdkafka/src/rdkafka_pattern.c +228 -0
  338. package/deps/librdkafka/src/rdkafka_pattern.h +70 -0
  339. package/deps/librdkafka/src/rdkafka_plugin.c +213 -0
  340. package/deps/librdkafka/src/rdkafka_plugin.h +41 -0
  341. package/deps/librdkafka/src/rdkafka_proto.h +736 -0
  342. package/deps/librdkafka/src/rdkafka_protocol.h +128 -0
  343. package/deps/librdkafka/src/rdkafka_queue.c +1230 -0
  344. package/deps/librdkafka/src/rdkafka_queue.h +1220 -0
  345. package/deps/librdkafka/src/rdkafka_range_assignor.c +1748 -0
  346. package/deps/librdkafka/src/rdkafka_request.c +7089 -0
  347. package/deps/librdkafka/src/rdkafka_request.h +732 -0
  348. package/deps/librdkafka/src/rdkafka_roundrobin_assignor.c +123 -0
  349. package/deps/librdkafka/src/rdkafka_sasl.c +530 -0
  350. package/deps/librdkafka/src/rdkafka_sasl.h +63 -0
  351. package/deps/librdkafka/src/rdkafka_sasl_cyrus.c +722 -0
  352. package/deps/librdkafka/src/rdkafka_sasl_int.h +89 -0
  353. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.c +1833 -0
  354. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.h +52 -0
  355. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.c +1666 -0
  356. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.h +47 -0
  357. package/deps/librdkafka/src/rdkafka_sasl_plain.c +142 -0
  358. package/deps/librdkafka/src/rdkafka_sasl_scram.c +858 -0
  359. package/deps/librdkafka/src/rdkafka_sasl_win32.c +550 -0
  360. package/deps/librdkafka/src/rdkafka_ssl.c +2129 -0
  361. package/deps/librdkafka/src/rdkafka_ssl.h +86 -0
  362. package/deps/librdkafka/src/rdkafka_sticky_assignor.c +4785 -0
  363. package/deps/librdkafka/src/rdkafka_subscription.c +278 -0
  364. package/deps/librdkafka/src/rdkafka_telemetry.c +760 -0
  365. package/deps/librdkafka/src/rdkafka_telemetry.h +52 -0
  366. package/deps/librdkafka/src/rdkafka_telemetry_decode.c +1053 -0
  367. package/deps/librdkafka/src/rdkafka_telemetry_decode.h +59 -0
  368. package/deps/librdkafka/src/rdkafka_telemetry_encode.c +997 -0
  369. package/deps/librdkafka/src/rdkafka_telemetry_encode.h +301 -0
  370. package/deps/librdkafka/src/rdkafka_timer.c +402 -0
  371. package/deps/librdkafka/src/rdkafka_timer.h +117 -0
  372. package/deps/librdkafka/src/rdkafka_topic.c +2161 -0
  373. package/deps/librdkafka/src/rdkafka_topic.h +334 -0
  374. package/deps/librdkafka/src/rdkafka_transport.c +1309 -0
  375. package/deps/librdkafka/src/rdkafka_transport.h +99 -0
  376. package/deps/librdkafka/src/rdkafka_transport_int.h +100 -0
  377. package/deps/librdkafka/src/rdkafka_txnmgr.c +3256 -0
  378. package/deps/librdkafka/src/rdkafka_txnmgr.h +171 -0
  379. package/deps/librdkafka/src/rdkafka_zstd.c +226 -0
  380. package/deps/librdkafka/src/rdkafka_zstd.h +57 -0
  381. package/deps/librdkafka/src/rdlist.c +576 -0
  382. package/deps/librdkafka/src/rdlist.h +434 -0
  383. package/deps/librdkafka/src/rdlog.c +89 -0
  384. package/deps/librdkafka/src/rdlog.h +41 -0
  385. package/deps/librdkafka/src/rdmap.c +508 -0
  386. package/deps/librdkafka/src/rdmap.h +492 -0
  387. package/deps/librdkafka/src/rdmurmur2.c +167 -0
  388. package/deps/librdkafka/src/rdmurmur2.h +35 -0
  389. package/deps/librdkafka/src/rdports.c +61 -0
  390. package/deps/librdkafka/src/rdports.h +38 -0
  391. package/deps/librdkafka/src/rdposix.h +250 -0
  392. package/deps/librdkafka/src/rdrand.c +80 -0
  393. package/deps/librdkafka/src/rdrand.h +43 -0
  394. package/deps/librdkafka/src/rdregex.c +156 -0
  395. package/deps/librdkafka/src/rdregex.h +43 -0
  396. package/deps/librdkafka/src/rdsignal.h +57 -0
  397. package/deps/librdkafka/src/rdstring.c +645 -0
  398. package/deps/librdkafka/src/rdstring.h +98 -0
  399. package/deps/librdkafka/src/rdsysqueue.h +404 -0
  400. package/deps/librdkafka/src/rdtime.h +356 -0
  401. package/deps/librdkafka/src/rdtypes.h +86 -0
  402. package/deps/librdkafka/src/rdunittest.c +549 -0
  403. package/deps/librdkafka/src/rdunittest.h +232 -0
  404. package/deps/librdkafka/src/rdvarint.c +134 -0
  405. package/deps/librdkafka/src/rdvarint.h +165 -0
  406. package/deps/librdkafka/src/rdwin32.h +382 -0
  407. package/deps/librdkafka/src/rdxxhash.c +1030 -0
  408. package/deps/librdkafka/src/rdxxhash.h +328 -0
  409. package/deps/librdkafka/src/regexp.c +1352 -0
  410. package/deps/librdkafka/src/regexp.h +41 -0
  411. package/deps/librdkafka/src/snappy.c +1866 -0
  412. package/deps/librdkafka/src/snappy.h +62 -0
  413. package/deps/librdkafka/src/snappy_compat.h +138 -0
  414. package/deps/librdkafka/src/statistics_schema.json +444 -0
  415. package/deps/librdkafka/src/tinycthread.c +932 -0
  416. package/deps/librdkafka/src/tinycthread.h +503 -0
  417. package/deps/librdkafka/src/tinycthread_extra.c +199 -0
  418. package/deps/librdkafka/src/tinycthread_extra.h +212 -0
  419. package/deps/librdkafka/src/win32_config.h +58 -0
  420. package/deps/librdkafka/src-cpp/CMakeLists.txt +90 -0
  421. package/deps/librdkafka/src-cpp/ConfImpl.cpp +84 -0
  422. package/deps/librdkafka/src-cpp/ConsumerImpl.cpp +244 -0
  423. package/deps/librdkafka/src-cpp/HandleImpl.cpp +436 -0
  424. package/deps/librdkafka/src-cpp/HeadersImpl.cpp +48 -0
  425. package/deps/librdkafka/src-cpp/KafkaConsumerImpl.cpp +296 -0
  426. package/deps/librdkafka/src-cpp/Makefile +55 -0
  427. package/deps/librdkafka/src-cpp/MessageImpl.cpp +38 -0
  428. package/deps/librdkafka/src-cpp/MetadataImpl.cpp +170 -0
  429. package/deps/librdkafka/src-cpp/ProducerImpl.cpp +197 -0
  430. package/deps/librdkafka/src-cpp/QueueImpl.cpp +70 -0
  431. package/deps/librdkafka/src-cpp/README.md +16 -0
  432. package/deps/librdkafka/src-cpp/RdKafka.cpp +59 -0
  433. package/deps/librdkafka/src-cpp/TopicImpl.cpp +124 -0
  434. package/deps/librdkafka/src-cpp/TopicPartitionImpl.cpp +57 -0
  435. package/deps/librdkafka/src-cpp/rdkafkacpp.h +3797 -0
  436. package/deps/librdkafka/src-cpp/rdkafkacpp_int.h +1641 -0
  437. package/deps/librdkafka/tests/0000-unittests.c +72 -0
  438. package/deps/librdkafka/tests/0001-multiobj.c +102 -0
  439. package/deps/librdkafka/tests/0002-unkpart.c +244 -0
  440. package/deps/librdkafka/tests/0003-msgmaxsize.c +173 -0
  441. package/deps/librdkafka/tests/0004-conf.c +934 -0
  442. package/deps/librdkafka/tests/0005-order.c +133 -0
  443. package/deps/librdkafka/tests/0006-symbols.c +163 -0
  444. package/deps/librdkafka/tests/0007-autotopic.c +136 -0
  445. package/deps/librdkafka/tests/0008-reqacks.c +179 -0
  446. package/deps/librdkafka/tests/0009-mock_cluster.c +97 -0
  447. package/deps/librdkafka/tests/0011-produce_batch.c +753 -0
  448. package/deps/librdkafka/tests/0012-produce_consume.c +537 -0
  449. package/deps/librdkafka/tests/0013-null-msgs.c +473 -0
  450. package/deps/librdkafka/tests/0014-reconsume-191.c +512 -0
  451. package/deps/librdkafka/tests/0015-offset_seeks.c +172 -0
  452. package/deps/librdkafka/tests/0016-client_swname.c +181 -0
  453. package/deps/librdkafka/tests/0017-compression.c +140 -0
  454. package/deps/librdkafka/tests/0018-cgrp_term.c +338 -0
  455. package/deps/librdkafka/tests/0019-list_groups.c +289 -0
  456. package/deps/librdkafka/tests/0020-destroy_hang.c +162 -0
  457. package/deps/librdkafka/tests/0021-rkt_destroy.c +72 -0
  458. package/deps/librdkafka/tests/0022-consume_batch.c +279 -0
  459. package/deps/librdkafka/tests/0025-timers.c +147 -0
  460. package/deps/librdkafka/tests/0026-consume_pause.c +547 -0
  461. package/deps/librdkafka/tests/0028-long_topicnames.c +79 -0
  462. package/deps/librdkafka/tests/0029-assign_offset.c +202 -0
  463. package/deps/librdkafka/tests/0030-offset_commit.c +589 -0
  464. package/deps/librdkafka/tests/0031-get_offsets.c +235 -0
  465. package/deps/librdkafka/tests/0033-regex_subscribe.c +536 -0
  466. package/deps/librdkafka/tests/0034-offset_reset.c +398 -0
  467. package/deps/librdkafka/tests/0035-api_version.c +73 -0
  468. package/deps/librdkafka/tests/0036-partial_fetch.c +87 -0
  469. package/deps/librdkafka/tests/0037-destroy_hang_local.c +85 -0
  470. package/deps/librdkafka/tests/0038-performance.c +121 -0
  471. package/deps/librdkafka/tests/0039-event.c +284 -0
  472. package/deps/librdkafka/tests/0040-io_event.c +257 -0
  473. package/deps/librdkafka/tests/0041-fetch_max_bytes.c +97 -0
  474. package/deps/librdkafka/tests/0042-many_topics.c +252 -0
  475. package/deps/librdkafka/tests/0043-no_connection.c +77 -0
  476. package/deps/librdkafka/tests/0044-partition_cnt.c +94 -0
  477. package/deps/librdkafka/tests/0045-subscribe_update.c +1010 -0
  478. package/deps/librdkafka/tests/0046-rkt_cache.c +65 -0
  479. package/deps/librdkafka/tests/0047-partial_buf_tmout.c +98 -0
  480. package/deps/librdkafka/tests/0048-partitioner.c +283 -0
  481. package/deps/librdkafka/tests/0049-consume_conn_close.c +162 -0
  482. package/deps/librdkafka/tests/0050-subscribe_adds.c +145 -0
  483. package/deps/librdkafka/tests/0051-assign_adds.c +126 -0
  484. package/deps/librdkafka/tests/0052-msg_timestamps.c +238 -0
  485. package/deps/librdkafka/tests/0053-stats_cb.cpp +527 -0
  486. package/deps/librdkafka/tests/0054-offset_time.cpp +236 -0
  487. package/deps/librdkafka/tests/0055-producer_latency.c +539 -0
  488. package/deps/librdkafka/tests/0056-balanced_group_mt.c +315 -0
  489. package/deps/librdkafka/tests/0057-invalid_topic.cpp +112 -0
  490. package/deps/librdkafka/tests/0058-log.cpp +123 -0
  491. package/deps/librdkafka/tests/0059-bsearch.cpp +241 -0
  492. package/deps/librdkafka/tests/0060-op_prio.cpp +163 -0
  493. package/deps/librdkafka/tests/0061-consumer_lag.cpp +295 -0
  494. package/deps/librdkafka/tests/0062-stats_event.c +126 -0
  495. package/deps/librdkafka/tests/0063-clusterid.cpp +180 -0
  496. package/deps/librdkafka/tests/0064-interceptors.c +481 -0
  497. package/deps/librdkafka/tests/0065-yield.cpp +140 -0
  498. package/deps/librdkafka/tests/0066-plugins.cpp +129 -0
  499. package/deps/librdkafka/tests/0067-empty_topic.cpp +151 -0
  500. package/deps/librdkafka/tests/0068-produce_timeout.c +136 -0
  501. package/deps/librdkafka/tests/0069-consumer_add_parts.c +119 -0
  502. package/deps/librdkafka/tests/0070-null_empty.cpp +197 -0
  503. package/deps/librdkafka/tests/0072-headers_ut.c +448 -0
  504. package/deps/librdkafka/tests/0073-headers.c +381 -0
  505. package/deps/librdkafka/tests/0074-producev.c +87 -0
  506. package/deps/librdkafka/tests/0075-retry.c +290 -0
  507. package/deps/librdkafka/tests/0076-produce_retry.c +452 -0
  508. package/deps/librdkafka/tests/0077-compaction.c +363 -0
  509. package/deps/librdkafka/tests/0078-c_from_cpp.cpp +96 -0
  510. package/deps/librdkafka/tests/0079-fork.c +93 -0
  511. package/deps/librdkafka/tests/0080-admin_ut.c +3095 -0
  512. package/deps/librdkafka/tests/0081-admin.c +5633 -0
  513. package/deps/librdkafka/tests/0082-fetch_max_bytes.cpp +137 -0
  514. package/deps/librdkafka/tests/0083-cb_event.c +233 -0
  515. package/deps/librdkafka/tests/0084-destroy_flags.c +208 -0
  516. package/deps/librdkafka/tests/0085-headers.cpp +392 -0
  517. package/deps/librdkafka/tests/0086-purge.c +368 -0
  518. package/deps/librdkafka/tests/0088-produce_metadata_timeout.c +162 -0
  519. package/deps/librdkafka/tests/0089-max_poll_interval.c +511 -0
  520. package/deps/librdkafka/tests/0090-idempotence.c +171 -0
  521. package/deps/librdkafka/tests/0091-max_poll_interval_timeout.c +295 -0
  522. package/deps/librdkafka/tests/0092-mixed_msgver.c +103 -0
  523. package/deps/librdkafka/tests/0093-holb.c +200 -0
  524. package/deps/librdkafka/tests/0094-idempotence_msg_timeout.c +231 -0
  525. package/deps/librdkafka/tests/0095-all_brokers_down.cpp +122 -0
  526. package/deps/librdkafka/tests/0097-ssl_verify.cpp +658 -0
  527. package/deps/librdkafka/tests/0098-consumer-txn.cpp +1218 -0
  528. package/deps/librdkafka/tests/0099-commit_metadata.c +194 -0
  529. package/deps/librdkafka/tests/0100-thread_interceptors.cpp +195 -0
  530. package/deps/librdkafka/tests/0101-fetch-from-follower.cpp +446 -0
  531. package/deps/librdkafka/tests/0102-static_group_rebalance.c +836 -0
  532. package/deps/librdkafka/tests/0103-transactions.c +1383 -0
  533. package/deps/librdkafka/tests/0104-fetch_from_follower_mock.c +625 -0
  534. package/deps/librdkafka/tests/0105-transactions_mock.c +3930 -0
  535. package/deps/librdkafka/tests/0106-cgrp_sess_timeout.c +318 -0
  536. package/deps/librdkafka/tests/0107-topic_recreate.c +259 -0
  537. package/deps/librdkafka/tests/0109-auto_create_topics.cpp +278 -0
  538. package/deps/librdkafka/tests/0110-batch_size.cpp +182 -0
  539. package/deps/librdkafka/tests/0111-delay_create_topics.cpp +127 -0
  540. package/deps/librdkafka/tests/0112-assign_unknown_part.c +87 -0
  541. package/deps/librdkafka/tests/0113-cooperative_rebalance.cpp +3473 -0
  542. package/deps/librdkafka/tests/0114-sticky_partitioning.cpp +176 -0
  543. package/deps/librdkafka/tests/0115-producer_auth.cpp +182 -0
  544. package/deps/librdkafka/tests/0116-kafkaconsumer_close.cpp +216 -0
  545. package/deps/librdkafka/tests/0117-mock_errors.c +331 -0
  546. package/deps/librdkafka/tests/0118-commit_rebalance.c +154 -0
  547. package/deps/librdkafka/tests/0119-consumer_auth.cpp +167 -0
  548. package/deps/librdkafka/tests/0120-asymmetric_subscription.c +185 -0
  549. package/deps/librdkafka/tests/0121-clusterid.c +115 -0
  550. package/deps/librdkafka/tests/0122-buffer_cleaning_after_rebalance.c +227 -0
  551. package/deps/librdkafka/tests/0123-connections_max_idle.c +98 -0
  552. package/deps/librdkafka/tests/0124-openssl_invalid_engine.c +69 -0
  553. package/deps/librdkafka/tests/0125-immediate_flush.c +144 -0
  554. package/deps/librdkafka/tests/0126-oauthbearer_oidc.c +528 -0
  555. package/deps/librdkafka/tests/0127-fetch_queue_backoff.cpp +165 -0
  556. package/deps/librdkafka/tests/0128-sasl_callback_queue.cpp +125 -0
  557. package/deps/librdkafka/tests/0129-fetch_aborted_msgs.c +79 -0
  558. package/deps/librdkafka/tests/0130-store_offsets.c +178 -0
  559. package/deps/librdkafka/tests/0131-connect_timeout.c +81 -0
  560. package/deps/librdkafka/tests/0132-strategy_ordering.c +179 -0
  561. package/deps/librdkafka/tests/0133-ssl_keys.c +150 -0
  562. package/deps/librdkafka/tests/0134-ssl_provider.c +92 -0
  563. package/deps/librdkafka/tests/0135-sasl_credentials.cpp +143 -0
  564. package/deps/librdkafka/tests/0136-resolve_cb.c +181 -0
  565. package/deps/librdkafka/tests/0137-barrier_batch_consume.c +619 -0
  566. package/deps/librdkafka/tests/0138-admin_mock.c +281 -0
  567. package/deps/librdkafka/tests/0139-offset_validation_mock.c +950 -0
  568. package/deps/librdkafka/tests/0140-commit_metadata.cpp +108 -0
  569. package/deps/librdkafka/tests/0142-reauthentication.c +515 -0
  570. package/deps/librdkafka/tests/0143-exponential_backoff_mock.c +552 -0
  571. package/deps/librdkafka/tests/0144-idempotence_mock.c +373 -0
  572. package/deps/librdkafka/tests/0145-pause_resume_mock.c +119 -0
  573. package/deps/librdkafka/tests/0146-metadata_mock.c +505 -0
  574. package/deps/librdkafka/tests/0147-consumer_group_consumer_mock.c +952 -0
  575. package/deps/librdkafka/tests/0148-offset_fetch_commit_error_mock.c +563 -0
  576. package/deps/librdkafka/tests/0149-broker-same-host-port.c +140 -0
  577. package/deps/librdkafka/tests/0150-telemetry_mock.c +651 -0
  578. package/deps/librdkafka/tests/0151-purge-brokers.c +566 -0
  579. package/deps/librdkafka/tests/0152-rebootstrap.c +59 -0
  580. package/deps/librdkafka/tests/0153-memberid.c +128 -0
  581. package/deps/librdkafka/tests/1000-unktopic.c +164 -0
  582. package/deps/librdkafka/tests/8000-idle.cpp +60 -0
  583. package/deps/librdkafka/tests/8001-fetch_from_follower_mock_manual.c +113 -0
  584. package/deps/librdkafka/tests/CMakeLists.txt +170 -0
  585. package/deps/librdkafka/tests/LibrdkafkaTestApp.py +291 -0
  586. package/deps/librdkafka/tests/Makefile +182 -0
  587. package/deps/librdkafka/tests/README.md +509 -0
  588. package/deps/librdkafka/tests/autotest.sh +33 -0
  589. package/deps/librdkafka/tests/backtrace.gdb +30 -0
  590. package/deps/librdkafka/tests/broker_version_tests.py +315 -0
  591. package/deps/librdkafka/tests/buildbox.sh +17 -0
  592. package/deps/librdkafka/tests/cleanup-checker-tests.sh +20 -0
  593. package/deps/librdkafka/tests/cluster_testing.py +191 -0
  594. package/deps/librdkafka/tests/delete-test-topics.sh +56 -0
  595. package/deps/librdkafka/tests/fixtures/oauthbearer/jwt_assertion_template.json +10 -0
  596. package/deps/librdkafka/tests/fixtures/ssl/Makefile +8 -0
  597. package/deps/librdkafka/tests/fixtures/ssl/README.md +13 -0
  598. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.intermediate.p12 +0 -0
  599. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.p12 +0 -0
  600. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.intermediate.pem +72 -0
  601. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.pem +50 -0
  602. package/deps/librdkafka/tests/fixtures/ssl/client2.intermediate.key +46 -0
  603. package/deps/librdkafka/tests/fixtures/ssl/client2.key +46 -0
  604. package/deps/librdkafka/tests/fixtures/ssl/create_keys.sh +168 -0
  605. package/deps/librdkafka/tests/fuzzers/Makefile +12 -0
  606. package/deps/librdkafka/tests/fuzzers/README.md +31 -0
  607. package/deps/librdkafka/tests/fuzzers/fuzz_regex.c +74 -0
  608. package/deps/librdkafka/tests/fuzzers/helpers.h +90 -0
  609. package/deps/librdkafka/tests/gen-ssl-certs.sh +165 -0
  610. package/deps/librdkafka/tests/interactive_broker_version.py +170 -0
  611. package/deps/librdkafka/tests/interceptor_test/CMakeLists.txt +16 -0
  612. package/deps/librdkafka/tests/interceptor_test/Makefile +22 -0
  613. package/deps/librdkafka/tests/interceptor_test/interceptor_test.c +314 -0
  614. package/deps/librdkafka/tests/interceptor_test/interceptor_test.h +54 -0
  615. package/deps/librdkafka/tests/java/IncrementalRebalanceCli.java +97 -0
  616. package/deps/librdkafka/tests/java/Makefile +13 -0
  617. package/deps/librdkafka/tests/java/Murmur2Cli.java +46 -0
  618. package/deps/librdkafka/tests/java/README.md +14 -0
  619. package/deps/librdkafka/tests/java/TransactionProducerCli.java +162 -0
  620. package/deps/librdkafka/tests/java/run-class.sh +11 -0
  621. package/deps/librdkafka/tests/librdkafka.suppressions +483 -0
  622. package/deps/librdkafka/tests/lz4_manual_test.sh +59 -0
  623. package/deps/librdkafka/tests/multi-broker-version-test.sh +50 -0
  624. package/deps/librdkafka/tests/parse-refcnt.sh +43 -0
  625. package/deps/librdkafka/tests/performance_plot.py +115 -0
  626. package/deps/librdkafka/tests/plugin_test/Makefile +19 -0
  627. package/deps/librdkafka/tests/plugin_test/plugin_test.c +58 -0
  628. package/deps/librdkafka/tests/requirements.txt +2 -0
  629. package/deps/librdkafka/tests/run-all-tests.sh +79 -0
  630. package/deps/librdkafka/tests/run-consumer-tests.sh +16 -0
  631. package/deps/librdkafka/tests/run-producer-tests.sh +16 -0
  632. package/deps/librdkafka/tests/run-test-batches.py +157 -0
  633. package/deps/librdkafka/tests/run-test.sh +140 -0
  634. package/deps/librdkafka/tests/rusage.c +249 -0
  635. package/deps/librdkafka/tests/sasl_test.py +289 -0
  636. package/deps/librdkafka/tests/scenarios/README.md +6 -0
  637. package/deps/librdkafka/tests/scenarios/ak23.json +6 -0
  638. package/deps/librdkafka/tests/scenarios/default.json +5 -0
  639. package/deps/librdkafka/tests/scenarios/noautocreate.json +5 -0
  640. package/deps/librdkafka/tests/sockem.c +801 -0
  641. package/deps/librdkafka/tests/sockem.h +85 -0
  642. package/deps/librdkafka/tests/sockem_ctrl.c +145 -0
  643. package/deps/librdkafka/tests/sockem_ctrl.h +61 -0
  644. package/deps/librdkafka/tests/test.c +7778 -0
  645. package/deps/librdkafka/tests/test.conf.example +27 -0
  646. package/deps/librdkafka/tests/test.h +1028 -0
  647. package/deps/librdkafka/tests/testcpp.cpp +131 -0
  648. package/deps/librdkafka/tests/testcpp.h +388 -0
  649. package/deps/librdkafka/tests/testshared.h +416 -0
  650. package/deps/librdkafka/tests/tools/README.md +4 -0
  651. package/deps/librdkafka/tests/tools/stats/README.md +21 -0
  652. package/deps/librdkafka/tests/tools/stats/filter.jq +42 -0
  653. package/deps/librdkafka/tests/tools/stats/graph.py +150 -0
  654. package/deps/librdkafka/tests/tools/stats/requirements.txt +3 -0
  655. package/deps/librdkafka/tests/tools/stats/to_csv.py +124 -0
  656. package/deps/librdkafka/tests/trivup/trivup-0.14.0.tar.gz +0 -0
  657. package/deps/librdkafka/tests/until-fail.sh +87 -0
  658. package/deps/librdkafka/tests/xxxx-assign_partition.c +122 -0
  659. package/deps/librdkafka/tests/xxxx-metadata.cpp +159 -0
  660. package/deps/librdkafka/vcpkg.json +23 -0
  661. package/deps/librdkafka/win32/README.md +5 -0
  662. package/deps/librdkafka/win32/build-package.bat +3 -0
  663. package/deps/librdkafka/win32/build.bat +19 -0
  664. package/deps/librdkafka/win32/common.vcxproj +84 -0
  665. package/deps/librdkafka/win32/interceptor_test/interceptor_test.vcxproj +87 -0
  666. package/deps/librdkafka/win32/librdkafka.autopkg.template +54 -0
  667. package/deps/librdkafka/win32/librdkafka.master.testing.targets +13 -0
  668. package/deps/librdkafka/win32/librdkafka.sln +226 -0
  669. package/deps/librdkafka/win32/librdkafka.vcxproj +276 -0
  670. package/deps/librdkafka/win32/librdkafkacpp/librdkafkacpp.vcxproj +104 -0
  671. package/deps/librdkafka/win32/msbuild.ps1 +15 -0
  672. package/deps/librdkafka/win32/openssl_engine_example/openssl_engine_example.vcxproj +132 -0
  673. package/deps/librdkafka/win32/package-zip.ps1 +46 -0
  674. package/deps/librdkafka/win32/packages/repositories.config +4 -0
  675. package/deps/librdkafka/win32/push-package.bat +4 -0
  676. package/deps/librdkafka/win32/rdkafka_complex_consumer_example_cpp/rdkafka_complex_consumer_example_cpp.vcxproj +67 -0
  677. package/deps/librdkafka/win32/rdkafka_example/rdkafka_example.vcxproj +97 -0
  678. package/deps/librdkafka/win32/rdkafka_performance/rdkafka_performance.vcxproj +97 -0
  679. package/deps/librdkafka/win32/setup-msys2.ps1 +47 -0
  680. package/deps/librdkafka/win32/setup-vcpkg.ps1 +34 -0
  681. package/deps/librdkafka/win32/tests/test.conf.example +25 -0
  682. package/deps/librdkafka/win32/tests/tests.vcxproj +253 -0
  683. package/deps/librdkafka/win32/win_ssl_cert_store/win_ssl_cert_store.vcxproj +132 -0
  684. package/deps/librdkafka/win32/wingetopt.c +564 -0
  685. package/deps/librdkafka/win32/wingetopt.h +101 -0
  686. package/deps/librdkafka/win32/wintime.h +33 -0
  687. package/deps/librdkafka.gyp +62 -0
  688. package/lib/admin.js +233 -0
  689. package/lib/client.js +573 -0
  690. package/lib/error.js +500 -0
  691. package/lib/index.js +34 -0
  692. package/lib/kafka-consumer-stream.js +397 -0
  693. package/lib/kafka-consumer.js +698 -0
  694. package/lib/producer/high-level-producer.js +323 -0
  695. package/lib/producer-stream.js +307 -0
  696. package/lib/producer.js +375 -0
  697. package/lib/tools/ref-counter.js +52 -0
  698. package/lib/topic-partition.js +88 -0
  699. package/lib/topic.js +42 -0
  700. package/lib/util.js +29 -0
  701. package/package.json +61 -0
  702. package/prebuilds/darwin-arm64/@point3+node-rdkafka.node +0 -0
  703. package/prebuilds/linux-x64/@point3+node-rdkafka.node +0 -0
  704. package/util/configure.js +30 -0
  705. package/util/get-env.js +6 -0
  706. package/util/test-compile.js +11 -0
  707. 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
+ }