dtomasgu-fluentd 1.14.7.pre.dev

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 (564) hide show
  1. checksums.yaml +7 -0
  2. data/.deepsource.toml +13 -0
  3. data/.drone.yml +35 -0
  4. data/.github/ISSUE_TEMPLATE/bug_report.yaml +70 -0
  5. data/.github/ISSUE_TEMPLATE/config.yml +5 -0
  6. data/.github/ISSUE_TEMPLATE/feature_request.yaml +38 -0
  7. data/.github/ISSUE_TEMPLATE.md +17 -0
  8. data/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  9. data/.github/workflows/issue-auto-closer.yml +12 -0
  10. data/.github/workflows/linux-test.yaml +36 -0
  11. data/.github/workflows/macos-test.yaml +34 -0
  12. data/.github/workflows/stale-actions.yml +22 -0
  13. data/.github/workflows/windows-test.yaml +49 -0
  14. data/.gitignore +30 -0
  15. data/.gitlab-ci.yml +103 -0
  16. data/ADOPTERS.md +5 -0
  17. data/AUTHORS +2 -0
  18. data/CHANGELOG.md +2453 -0
  19. data/CONTRIBUTING.md +45 -0
  20. data/GOVERNANCE.md +55 -0
  21. data/Gemfile +9 -0
  22. data/GithubWorkflow.md +78 -0
  23. data/LICENSE +202 -0
  24. data/MAINTAINERS.md +11 -0
  25. data/README.md +76 -0
  26. data/Rakefile +79 -0
  27. data/SECURITY.md +18 -0
  28. data/bin/fluent-binlog-reader +7 -0
  29. data/bin/fluent-ca-generate +6 -0
  30. data/bin/fluent-cap-ctl +7 -0
  31. data/bin/fluent-cat +5 -0
  32. data/bin/fluent-ctl +7 -0
  33. data/bin/fluent-debug +5 -0
  34. data/bin/fluent-gem +9 -0
  35. data/bin/fluent-plugin-config-format +5 -0
  36. data/bin/fluent-plugin-generate +5 -0
  37. data/bin/fluentd +15 -0
  38. data/code-of-conduct.md +3 -0
  39. data/docs/SECURITY_AUDIT.pdf +0 -0
  40. data/example/copy_roundrobin.conf +39 -0
  41. data/example/counter.conf +18 -0
  42. data/example/filter_stdout.conf +22 -0
  43. data/example/in_forward.conf +14 -0
  44. data/example/in_forward_client.conf +37 -0
  45. data/example/in_forward_shared_key.conf +15 -0
  46. data/example/in_forward_tls.conf +14 -0
  47. data/example/in_forward_users.conf +24 -0
  48. data/example/in_forward_workers.conf +21 -0
  49. data/example/in_http.conf +16 -0
  50. data/example/in_out_forward.conf +17 -0
  51. data/example/in_sample_blocks.conf +17 -0
  52. data/example/in_sample_with_compression.conf +23 -0
  53. data/example/in_syslog.conf +15 -0
  54. data/example/in_tail.conf +14 -0
  55. data/example/in_tcp.conf +13 -0
  56. data/example/in_udp.conf +13 -0
  57. data/example/logevents.conf +25 -0
  58. data/example/multi_filters.conf +61 -0
  59. data/example/out_copy.conf +20 -0
  60. data/example/out_exec_filter.conf +42 -0
  61. data/example/out_file.conf +13 -0
  62. data/example/out_forward.conf +35 -0
  63. data/example/out_forward_buf_file.conf +23 -0
  64. data/example/out_forward_client.conf +109 -0
  65. data/example/out_forward_heartbeat_none.conf +16 -0
  66. data/example/out_forward_sd.conf +17 -0
  67. data/example/out_forward_shared_key.conf +36 -0
  68. data/example/out_forward_tls.conf +18 -0
  69. data/example/out_forward_users.conf +65 -0
  70. data/example/out_null.conf +36 -0
  71. data/example/sd.yaml +8 -0
  72. data/example/secondary_file.conf +42 -0
  73. data/example/suppress_config_dump.conf +7 -0
  74. data/example/v0_12_filter.conf +78 -0
  75. data/example/v1_literal_example.conf +36 -0
  76. data/example/worker_section.conf +36 -0
  77. data/fluent.conf +139 -0
  78. data/fluentd.gemspec +57 -0
  79. data/lib/fluent/agent.rb +168 -0
  80. data/lib/fluent/capability.rb +87 -0
  81. data/lib/fluent/clock.rb +66 -0
  82. data/lib/fluent/command/binlog_reader.rb +244 -0
  83. data/lib/fluent/command/bundler_injection.rb +45 -0
  84. data/lib/fluent/command/ca_generate.rb +184 -0
  85. data/lib/fluent/command/cap_ctl.rb +174 -0
  86. data/lib/fluent/command/cat.rb +365 -0
  87. data/lib/fluent/command/ctl.rb +180 -0
  88. data/lib/fluent/command/debug.rb +103 -0
  89. data/lib/fluent/command/fluentd.rb +388 -0
  90. data/lib/fluent/command/plugin_config_formatter.rb +308 -0
  91. data/lib/fluent/command/plugin_generator.rb +365 -0
  92. data/lib/fluent/compat/call_super_mixin.rb +76 -0
  93. data/lib/fluent/compat/detach_process_mixin.rb +33 -0
  94. data/lib/fluent/compat/exec_util.rb +129 -0
  95. data/lib/fluent/compat/file_util.rb +54 -0
  96. data/lib/fluent/compat/filter.rb +68 -0
  97. data/lib/fluent/compat/formatter.rb +111 -0
  98. data/lib/fluent/compat/formatter_utils.rb +85 -0
  99. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  100. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  101. data/lib/fluent/compat/input.rb +49 -0
  102. data/lib/fluent/compat/output.rb +721 -0
  103. data/lib/fluent/compat/output_chain.rb +60 -0
  104. data/lib/fluent/compat/parser.rb +310 -0
  105. data/lib/fluent/compat/parser_utils.rb +40 -0
  106. data/lib/fluent/compat/propagate_default.rb +62 -0
  107. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  108. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  109. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  110. data/lib/fluent/compat/socket_util.rb +165 -0
  111. data/lib/fluent/compat/string_util.rb +34 -0
  112. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  113. data/lib/fluent/compat/type_converter.rb +90 -0
  114. data/lib/fluent/config/basic_parser.rb +123 -0
  115. data/lib/fluent/config/configure_proxy.rb +424 -0
  116. data/lib/fluent/config/dsl.rb +152 -0
  117. data/lib/fluent/config/element.rb +265 -0
  118. data/lib/fluent/config/error.rb +44 -0
  119. data/lib/fluent/config/literal_parser.rb +286 -0
  120. data/lib/fluent/config/parser.rb +107 -0
  121. data/lib/fluent/config/section.rb +272 -0
  122. data/lib/fluent/config/types.rb +249 -0
  123. data/lib/fluent/config/v1_parser.rb +192 -0
  124. data/lib/fluent/config/yaml_parser/fluent_value.rb +47 -0
  125. data/lib/fluent/config/yaml_parser/loader.rb +91 -0
  126. data/lib/fluent/config/yaml_parser/parser.rb +166 -0
  127. data/lib/fluent/config/yaml_parser/section_builder.rb +107 -0
  128. data/lib/fluent/config/yaml_parser.rb +56 -0
  129. data/lib/fluent/config.rb +89 -0
  130. data/lib/fluent/configurable.rb +201 -0
  131. data/lib/fluent/counter/base_socket.rb +44 -0
  132. data/lib/fluent/counter/client.rb +297 -0
  133. data/lib/fluent/counter/error.rb +86 -0
  134. data/lib/fluent/counter/mutex_hash.rb +163 -0
  135. data/lib/fluent/counter/server.rb +273 -0
  136. data/lib/fluent/counter/store.rb +205 -0
  137. data/lib/fluent/counter/validator.rb +145 -0
  138. data/lib/fluent/counter.rb +23 -0
  139. data/lib/fluent/daemon.rb +15 -0
  140. data/lib/fluent/daemonizer.rb +88 -0
  141. data/lib/fluent/engine.rb +253 -0
  142. data/lib/fluent/env.rb +40 -0
  143. data/lib/fluent/error.rb +34 -0
  144. data/lib/fluent/event.rb +326 -0
  145. data/lib/fluent/event_router.rb +315 -0
  146. data/lib/fluent/ext_monitor_require.rb +28 -0
  147. data/lib/fluent/filter.rb +21 -0
  148. data/lib/fluent/fluent_log_event_router.rb +141 -0
  149. data/lib/fluent/formatter.rb +23 -0
  150. data/lib/fluent/input.rb +21 -0
  151. data/lib/fluent/label.rb +46 -0
  152. data/lib/fluent/load.rb +34 -0
  153. data/lib/fluent/log.rb +713 -0
  154. data/lib/fluent/match.rb +187 -0
  155. data/lib/fluent/mixin.rb +31 -0
  156. data/lib/fluent/msgpack_factory.rb +106 -0
  157. data/lib/fluent/oj_options.rb +62 -0
  158. data/lib/fluent/output.rb +29 -0
  159. data/lib/fluent/output_chain.rb +23 -0
  160. data/lib/fluent/parser.rb +23 -0
  161. data/lib/fluent/plugin/bare_output.rb +104 -0
  162. data/lib/fluent/plugin/base.rb +197 -0
  163. data/lib/fluent/plugin/buf_file.rb +213 -0
  164. data/lib/fluent/plugin/buf_file_single.rb +225 -0
  165. data/lib/fluent/plugin/buf_memory.rb +34 -0
  166. data/lib/fluent/plugin/buffer/chunk.rb +240 -0
  167. data/lib/fluent/plugin/buffer/file_chunk.rb +413 -0
  168. data/lib/fluent/plugin/buffer/file_single_chunk.rb +311 -0
  169. data/lib/fluent/plugin/buffer/memory_chunk.rb +91 -0
  170. data/lib/fluent/plugin/buffer.rb +918 -0
  171. data/lib/fluent/plugin/compressable.rb +96 -0
  172. data/lib/fluent/plugin/exec_util.rb +22 -0
  173. data/lib/fluent/plugin/file_util.rb +22 -0
  174. data/lib/fluent/plugin/file_wrapper.rb +132 -0
  175. data/lib/fluent/plugin/filter.rb +127 -0
  176. data/lib/fluent/plugin/filter_grep.rb +189 -0
  177. data/lib/fluent/plugin/filter_parser.rb +130 -0
  178. data/lib/fluent/plugin/filter_record_transformer.rb +324 -0
  179. data/lib/fluent/plugin/filter_stdout.rb +53 -0
  180. data/lib/fluent/plugin/formatter.rb +75 -0
  181. data/lib/fluent/plugin/formatter_csv.rb +78 -0
  182. data/lib/fluent/plugin/formatter_hash.rb +35 -0
  183. data/lib/fluent/plugin/formatter_json.rb +59 -0
  184. data/lib/fluent/plugin/formatter_ltsv.rb +44 -0
  185. data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
  186. data/lib/fluent/plugin/formatter_out_file.rb +53 -0
  187. data/lib/fluent/plugin/formatter_single_value.rb +36 -0
  188. data/lib/fluent/plugin/formatter_stdout.rb +76 -0
  189. data/lib/fluent/plugin/formatter_tsv.rb +40 -0
  190. data/lib/fluent/plugin/in_debug_agent.rb +71 -0
  191. data/lib/fluent/plugin/in_dummy.rb +18 -0
  192. data/lib/fluent/plugin/in_exec.rb +110 -0
  193. data/lib/fluent/plugin/in_forward.rb +473 -0
  194. data/lib/fluent/plugin/in_gc_stat.rb +72 -0
  195. data/lib/fluent/plugin/in_http.rb +677 -0
  196. data/lib/fluent/plugin/in_monitor_agent.rb +412 -0
  197. data/lib/fluent/plugin/in_object_space.rb +93 -0
  198. data/lib/fluent/plugin/in_sample.rb +141 -0
  199. data/lib/fluent/plugin/in_syslog.rb +276 -0
  200. data/lib/fluent/plugin/in_tail/group_watch.rb +204 -0
  201. data/lib/fluent/plugin/in_tail/position_file.rb +255 -0
  202. data/lib/fluent/plugin/in_tail.rb +1247 -0
  203. data/lib/fluent/plugin/in_tcp.rb +181 -0
  204. data/lib/fluent/plugin/in_udp.rb +92 -0
  205. data/lib/fluent/plugin/in_unix.rb +195 -0
  206. data/lib/fluent/plugin/input.rb +75 -0
  207. data/lib/fluent/plugin/metrics.rb +119 -0
  208. data/lib/fluent/plugin/metrics_local.rb +96 -0
  209. data/lib/fluent/plugin/multi_output.rb +195 -0
  210. data/lib/fluent/plugin/out_copy.rb +120 -0
  211. data/lib/fluent/plugin/out_exec.rb +105 -0
  212. data/lib/fluent/plugin/out_exec_filter.rb +319 -0
  213. data/lib/fluent/plugin/out_file.rb +334 -0
  214. data/lib/fluent/plugin/out_forward/ack_handler.rb +161 -0
  215. data/lib/fluent/plugin/out_forward/connection_manager.rb +113 -0
  216. data/lib/fluent/plugin/out_forward/error.rb +28 -0
  217. data/lib/fluent/plugin/out_forward/failure_detector.rb +84 -0
  218. data/lib/fluent/plugin/out_forward/handshake_protocol.rb +125 -0
  219. data/lib/fluent/plugin/out_forward/load_balancer.rb +114 -0
  220. data/lib/fluent/plugin/out_forward/socket_cache.rb +142 -0
  221. data/lib/fluent/plugin/out_forward.rb +826 -0
  222. data/lib/fluent/plugin/out_http.rb +280 -0
  223. data/lib/fluent/plugin/out_null.rb +74 -0
  224. data/lib/fluent/plugin/out_relabel.rb +32 -0
  225. data/lib/fluent/plugin/out_roundrobin.rb +84 -0
  226. data/lib/fluent/plugin/out_secondary_file.rb +131 -0
  227. data/lib/fluent/plugin/out_stdout.rb +74 -0
  228. data/lib/fluent/plugin/out_stream.rb +130 -0
  229. data/lib/fluent/plugin/output.rb +1566 -0
  230. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  231. data/lib/fluent/plugin/parser.rb +274 -0
  232. data/lib/fluent/plugin/parser_apache.rb +28 -0
  233. data/lib/fluent/plugin/parser_apache2.rb +88 -0
  234. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  235. data/lib/fluent/plugin/parser_csv.rb +114 -0
  236. data/lib/fluent/plugin/parser_json.rb +96 -0
  237. data/lib/fluent/plugin/parser_ltsv.rb +51 -0
  238. data/lib/fluent/plugin/parser_msgpack.rb +50 -0
  239. data/lib/fluent/plugin/parser_multiline.rb +152 -0
  240. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  241. data/lib/fluent/plugin/parser_none.rb +36 -0
  242. data/lib/fluent/plugin/parser_regexp.rb +68 -0
  243. data/lib/fluent/plugin/parser_syslog.rb +496 -0
  244. data/lib/fluent/plugin/parser_tsv.rb +42 -0
  245. data/lib/fluent/plugin/sd_file.rb +156 -0
  246. data/lib/fluent/plugin/sd_srv.rb +135 -0
  247. data/lib/fluent/plugin/sd_static.rb +58 -0
  248. data/lib/fluent/plugin/service_discovery.rb +65 -0
  249. data/lib/fluent/plugin/socket_util.rb +22 -0
  250. data/lib/fluent/plugin/storage.rb +84 -0
  251. data/lib/fluent/plugin/storage_local.rb +162 -0
  252. data/lib/fluent/plugin/string_util.rb +22 -0
  253. data/lib/fluent/plugin.rb +206 -0
  254. data/lib/fluent/plugin_helper/cert_option.rb +191 -0
  255. data/lib/fluent/plugin_helper/child_process.rb +366 -0
  256. data/lib/fluent/plugin_helper/compat_parameters.rb +343 -0
  257. data/lib/fluent/plugin_helper/counter.rb +51 -0
  258. data/lib/fluent/plugin_helper/event_emitter.rb +100 -0
  259. data/lib/fluent/plugin_helper/event_loop.rb +170 -0
  260. data/lib/fluent/plugin_helper/extract.rb +104 -0
  261. data/lib/fluent/plugin_helper/formatter.rb +147 -0
  262. data/lib/fluent/plugin_helper/http_server/app.rb +79 -0
  263. data/lib/fluent/plugin_helper/http_server/compat/server.rb +92 -0
  264. data/lib/fluent/plugin_helper/http_server/compat/ssl_context_extractor.rb +52 -0
  265. data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
  266. data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
  267. data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
  268. data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
  269. data/lib/fluent/plugin_helper/http_server/server.rb +93 -0
  270. data/lib/fluent/plugin_helper/http_server/ssl_context_builder.rb +41 -0
  271. data/lib/fluent/plugin_helper/http_server.rb +135 -0
  272. data/lib/fluent/plugin_helper/inject.rb +154 -0
  273. data/lib/fluent/plugin_helper/metrics.rb +129 -0
  274. data/lib/fluent/plugin_helper/parser.rb +147 -0
  275. data/lib/fluent/plugin_helper/record_accessor.rb +207 -0
  276. data/lib/fluent/plugin_helper/retry_state.rb +219 -0
  277. data/lib/fluent/plugin_helper/server.rb +820 -0
  278. data/lib/fluent/plugin_helper/service_discovery/manager.rb +146 -0
  279. data/lib/fluent/plugin_helper/service_discovery/round_robin_balancer.rb +43 -0
  280. data/lib/fluent/plugin_helper/service_discovery.rb +125 -0
  281. data/lib/fluent/plugin_helper/socket.rb +288 -0
  282. data/lib/fluent/plugin_helper/socket_option.rb +98 -0
  283. data/lib/fluent/plugin_helper/storage.rb +349 -0
  284. data/lib/fluent/plugin_helper/thread.rb +180 -0
  285. data/lib/fluent/plugin_helper/timer.rb +92 -0
  286. data/lib/fluent/plugin_helper.rb +75 -0
  287. data/lib/fluent/plugin_id.rb +93 -0
  288. data/lib/fluent/process.rb +22 -0
  289. data/lib/fluent/registry.rb +117 -0
  290. data/lib/fluent/root_agent.rb +372 -0
  291. data/lib/fluent/rpc.rb +95 -0
  292. data/lib/fluent/static_config_analysis.rb +194 -0
  293. data/lib/fluent/supervisor.rb +1141 -0
  294. data/lib/fluent/system_config.rb +188 -0
  295. data/lib/fluent/test/base.rb +78 -0
  296. data/lib/fluent/test/driver/base.rb +225 -0
  297. data/lib/fluent/test/driver/base_owned.rb +83 -0
  298. data/lib/fluent/test/driver/base_owner.rb +135 -0
  299. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  300. data/lib/fluent/test/driver/filter.rb +57 -0
  301. data/lib/fluent/test/driver/formatter.rb +30 -0
  302. data/lib/fluent/test/driver/input.rb +31 -0
  303. data/lib/fluent/test/driver/multi_output.rb +53 -0
  304. data/lib/fluent/test/driver/output.rb +102 -0
  305. data/lib/fluent/test/driver/parser.rb +30 -0
  306. data/lib/fluent/test/driver/storage.rb +30 -0
  307. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  308. data/lib/fluent/test/filter_test.rb +77 -0
  309. data/lib/fluent/test/formatter_test.rb +65 -0
  310. data/lib/fluent/test/helpers.rb +134 -0
  311. data/lib/fluent/test/input_test.rb +174 -0
  312. data/lib/fluent/test/log.rb +79 -0
  313. data/lib/fluent/test/output_test.rb +156 -0
  314. data/lib/fluent/test/parser_test.rb +70 -0
  315. data/lib/fluent/test/startup_shutdown.rb +46 -0
  316. data/lib/fluent/test.rb +58 -0
  317. data/lib/fluent/time.rb +512 -0
  318. data/lib/fluent/timezone.rb +171 -0
  319. data/lib/fluent/tls.rb +81 -0
  320. data/lib/fluent/unique_id.rb +39 -0
  321. data/lib/fluent/variable_store.rb +40 -0
  322. data/lib/fluent/version.rb +21 -0
  323. data/lib/fluent/winsvc.rb +105 -0
  324. data/templates/new_gem/Gemfile +3 -0
  325. data/templates/new_gem/README.md.erb +43 -0
  326. data/templates/new_gem/Rakefile +13 -0
  327. data/templates/new_gem/fluent-plugin.gemspec.erb +27 -0
  328. data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
  329. data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
  330. data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
  331. data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
  332. data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
  333. data/templates/new_gem/lib/fluent/plugin/storage.rb.erb +40 -0
  334. data/templates/new_gem/test/helper.rb.erb +8 -0
  335. data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
  336. data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
  337. data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
  338. data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
  339. data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
  340. data/templates/new_gem/test/plugin/test_storage.rb.erb +18 -0
  341. data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
  342. data/templates/plugin_config_formatter/param.md-table.erb +10 -0
  343. data/templates/plugin_config_formatter/param.md.erb +34 -0
  344. data/templates/plugin_config_formatter/section.md.erb +12 -0
  345. data/test/command/test_binlog_reader.rb +362 -0
  346. data/test/command/test_ca_generate.rb +70 -0
  347. data/test/command/test_cap_ctl.rb +100 -0
  348. data/test/command/test_cat.rb +128 -0
  349. data/test/command/test_ctl.rb +56 -0
  350. data/test/command/test_fluentd.rb +1139 -0
  351. data/test/command/test_plugin_config_formatter.rb +398 -0
  352. data/test/command/test_plugin_generator.rb +109 -0
  353. data/test/compat/test_calls_super.rb +166 -0
  354. data/test/compat/test_parser.rb +92 -0
  355. data/test/config/assertions.rb +42 -0
  356. data/test/config/test_config_parser.rb +551 -0
  357. data/test/config/test_configurable.rb +1784 -0
  358. data/test/config/test_configure_proxy.rb +604 -0
  359. data/test/config/test_dsl.rb +415 -0
  360. data/test/config/test_element.rb +518 -0
  361. data/test/config/test_literal_parser.rb +309 -0
  362. data/test/config/test_plugin_configuration.rb +56 -0
  363. data/test/config/test_section.rb +191 -0
  364. data/test/config/test_system_config.rb +201 -0
  365. data/test/config/test_types.rb +408 -0
  366. data/test/counter/test_client.rb +563 -0
  367. data/test/counter/test_error.rb +44 -0
  368. data/test/counter/test_mutex_hash.rb +179 -0
  369. data/test/counter/test_server.rb +589 -0
  370. data/test/counter/test_store.rb +258 -0
  371. data/test/counter/test_validator.rb +137 -0
  372. data/test/helper.rb +155 -0
  373. data/test/helpers/fuzzy_assert.rb +89 -0
  374. data/test/helpers/process_extenstion.rb +33 -0
  375. data/test/plugin/data/2010/01/20100102-030405.log +0 -0
  376. data/test/plugin/data/2010/01/20100102-030406.log +0 -0
  377. data/test/plugin/data/2010/01/20100102.log +0 -0
  378. data/test/plugin/data/log/bar +0 -0
  379. data/test/plugin/data/log/foo/bar.log +0 -0
  380. data/test/plugin/data/log/foo/bar2 +0 -0
  381. data/test/plugin/data/log/test.log +0 -0
  382. data/test/plugin/data/sd_file/config +11 -0
  383. data/test/plugin/data/sd_file/config.json +17 -0
  384. data/test/plugin/data/sd_file/config.yaml +11 -0
  385. data/test/plugin/data/sd_file/config.yml +11 -0
  386. data/test/plugin/data/sd_file/invalid_config.yml +7 -0
  387. data/test/plugin/in_tail/test_fifo.rb +121 -0
  388. data/test/plugin/in_tail/test_io_handler.rb +150 -0
  389. data/test/plugin/in_tail/test_position_file.rb +316 -0
  390. data/test/plugin/out_forward/test_ack_handler.rb +101 -0
  391. data/test/plugin/out_forward/test_connection_manager.rb +145 -0
  392. data/test/plugin/out_forward/test_handshake_protocol.rb +112 -0
  393. data/test/plugin/out_forward/test_load_balancer.rb +106 -0
  394. data/test/plugin/out_forward/test_socket_cache.rb +174 -0
  395. data/test/plugin/test_bare_output.rb +131 -0
  396. data/test/plugin/test_base.rb +115 -0
  397. data/test/plugin/test_buf_file.rb +1275 -0
  398. data/test/plugin/test_buf_file_single.rb +833 -0
  399. data/test/plugin/test_buf_memory.rb +42 -0
  400. data/test/plugin/test_buffer.rb +1383 -0
  401. data/test/plugin/test_buffer_chunk.rb +198 -0
  402. data/test/plugin/test_buffer_file_chunk.rb +871 -0
  403. data/test/plugin/test_buffer_file_single_chunk.rb +611 -0
  404. data/test/plugin/test_buffer_memory_chunk.rb +339 -0
  405. data/test/plugin/test_compressable.rb +87 -0
  406. data/test/plugin/test_file_util.rb +96 -0
  407. data/test/plugin/test_file_wrapper.rb +58 -0
  408. data/test/plugin/test_filter.rb +368 -0
  409. data/test/plugin/test_filter_grep.rb +697 -0
  410. data/test/plugin/test_filter_parser.rb +731 -0
  411. data/test/plugin/test_filter_record_transformer.rb +577 -0
  412. data/test/plugin/test_filter_stdout.rb +207 -0
  413. data/test/plugin/test_formatter_csv.rb +136 -0
  414. data/test/plugin/test_formatter_hash.rb +38 -0
  415. data/test/plugin/test_formatter_json.rb +61 -0
  416. data/test/plugin/test_formatter_ltsv.rb +70 -0
  417. data/test/plugin/test_formatter_msgpack.rb +28 -0
  418. data/test/plugin/test_formatter_out_file.rb +116 -0
  419. data/test/plugin/test_formatter_single_value.rb +44 -0
  420. data/test/plugin/test_formatter_tsv.rb +76 -0
  421. data/test/plugin/test_in_debug_agent.rb +49 -0
  422. data/test/plugin/test_in_exec.rb +261 -0
  423. data/test/plugin/test_in_forward.rb +1178 -0
  424. data/test/plugin/test_in_gc_stat.rb +62 -0
  425. data/test/plugin/test_in_http.rb +1103 -0
  426. data/test/plugin/test_in_monitor_agent.rb +923 -0
  427. data/test/plugin/test_in_object_space.rb +66 -0
  428. data/test/plugin/test_in_sample.rb +190 -0
  429. data/test/plugin/test_in_syslog.rb +505 -0
  430. data/test/plugin/test_in_tail.rb +2639 -0
  431. data/test/plugin/test_in_tcp.rb +243 -0
  432. data/test/plugin/test_in_udp.rb +268 -0
  433. data/test/plugin/test_in_unix.rb +181 -0
  434. data/test/plugin/test_input.rb +137 -0
  435. data/test/plugin/test_metadata.rb +89 -0
  436. data/test/plugin/test_metrics.rb +294 -0
  437. data/test/plugin/test_metrics_local.rb +96 -0
  438. data/test/plugin/test_multi_output.rb +204 -0
  439. data/test/plugin/test_out_copy.rb +308 -0
  440. data/test/plugin/test_out_exec.rb +312 -0
  441. data/test/plugin/test_out_exec_filter.rb +606 -0
  442. data/test/plugin/test_out_file.rb +1037 -0
  443. data/test/plugin/test_out_forward.rb +1358 -0
  444. data/test/plugin/test_out_http.rb +428 -0
  445. data/test/plugin/test_out_null.rb +105 -0
  446. data/test/plugin/test_out_relabel.rb +28 -0
  447. data/test/plugin/test_out_roundrobin.rb +146 -0
  448. data/test/plugin/test_out_secondary_file.rb +458 -0
  449. data/test/plugin/test_out_stdout.rb +205 -0
  450. data/test/plugin/test_out_stream.rb +103 -0
  451. data/test/plugin/test_output.rb +1065 -0
  452. data/test/plugin/test_output_as_buffered.rb +2024 -0
  453. data/test/plugin/test_output_as_buffered_backup.rb +363 -0
  454. data/test/plugin/test_output_as_buffered_compress.rb +165 -0
  455. data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
  456. data/test/plugin/test_output_as_buffered_retries.rb +966 -0
  457. data/test/plugin/test_output_as_buffered_secondary.rb +882 -0
  458. data/test/plugin/test_output_as_standard.rb +374 -0
  459. data/test/plugin/test_owned_by.rb +35 -0
  460. data/test/plugin/test_parser.rb +399 -0
  461. data/test/plugin/test_parser_apache.rb +42 -0
  462. data/test/plugin/test_parser_apache2.rb +47 -0
  463. data/test/plugin/test_parser_apache_error.rb +45 -0
  464. data/test/plugin/test_parser_csv.rb +200 -0
  465. data/test/plugin/test_parser_json.rb +138 -0
  466. data/test/plugin/test_parser_labeled_tsv.rb +160 -0
  467. data/test/plugin/test_parser_multiline.rb +111 -0
  468. data/test/plugin/test_parser_nginx.rb +88 -0
  469. data/test/plugin/test_parser_none.rb +52 -0
  470. data/test/plugin/test_parser_regexp.rb +289 -0
  471. data/test/plugin/test_parser_syslog.rb +650 -0
  472. data/test/plugin/test_parser_tsv.rb +122 -0
  473. data/test/plugin/test_sd_file.rb +228 -0
  474. data/test/plugin/test_sd_srv.rb +230 -0
  475. data/test/plugin/test_storage.rb +167 -0
  476. data/test/plugin/test_storage_local.rb +335 -0
  477. data/test/plugin/test_string_util.rb +26 -0
  478. data/test/plugin_helper/data/cert/cert-key.pem +27 -0
  479. data/test/plugin_helper/data/cert/cert-with-CRLF.pem +19 -0
  480. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
  481. data/test/plugin_helper/data/cert/cert.pem +19 -0
  482. data/test/plugin_helper/data/cert/cert_chains/ca-cert-key.pem +27 -0
  483. data/test/plugin_helper/data/cert/cert_chains/ca-cert.pem +20 -0
  484. data/test/plugin_helper/data/cert/cert_chains/cert-key.pem +27 -0
  485. data/test/plugin_helper/data/cert/cert_chains/cert.pem +40 -0
  486. data/test/plugin_helper/data/cert/empty.pem +0 -0
  487. data/test/plugin_helper/data/cert/generate_cert.rb +125 -0
  488. data/test/plugin_helper/data/cert/with_ca/ca-cert-key-pass.pem +30 -0
  489. data/test/plugin_helper/data/cert/with_ca/ca-cert-key.pem +27 -0
  490. data/test/plugin_helper/data/cert/with_ca/ca-cert-pass.pem +20 -0
  491. data/test/plugin_helper/data/cert/with_ca/ca-cert.pem +20 -0
  492. data/test/plugin_helper/data/cert/with_ca/cert-key-pass.pem +30 -0
  493. data/test/plugin_helper/data/cert/with_ca/cert-key.pem +27 -0
  494. data/test/plugin_helper/data/cert/with_ca/cert-pass.pem +21 -0
  495. data/test/plugin_helper/data/cert/with_ca/cert.pem +21 -0
  496. data/test/plugin_helper/data/cert/without_ca/cert-key-pass.pem +30 -0
  497. data/test/plugin_helper/data/cert/without_ca/cert-key.pem +27 -0
  498. data/test/plugin_helper/data/cert/without_ca/cert-pass.pem +20 -0
  499. data/test/plugin_helper/data/cert/without_ca/cert.pem +20 -0
  500. data/test/plugin_helper/http_server/test_app.rb +65 -0
  501. data/test/plugin_helper/http_server/test_route.rb +32 -0
  502. data/test/plugin_helper/service_discovery/test_manager.rb +93 -0
  503. data/test/plugin_helper/service_discovery/test_round_robin_balancer.rb +21 -0
  504. data/test/plugin_helper/test_cert_option.rb +25 -0
  505. data/test/plugin_helper/test_child_process.rb +852 -0
  506. data/test/plugin_helper/test_compat_parameters.rb +358 -0
  507. data/test/plugin_helper/test_event_emitter.rb +80 -0
  508. data/test/plugin_helper/test_event_loop.rb +52 -0
  509. data/test/plugin_helper/test_extract.rb +194 -0
  510. data/test/plugin_helper/test_formatter.rb +255 -0
  511. data/test/plugin_helper/test_http_server_helper.rb +372 -0
  512. data/test/plugin_helper/test_inject.rb +561 -0
  513. data/test/plugin_helper/test_metrics.rb +137 -0
  514. data/test/plugin_helper/test_parser.rb +264 -0
  515. data/test/plugin_helper/test_record_accessor.rb +238 -0
  516. data/test/plugin_helper/test_retry_state.rb +1006 -0
  517. data/test/plugin_helper/test_server.rb +1841 -0
  518. data/test/plugin_helper/test_service_discovery.rb +165 -0
  519. data/test/plugin_helper/test_socket.rb +146 -0
  520. data/test/plugin_helper/test_storage.rb +542 -0
  521. data/test/plugin_helper/test_thread.rb +164 -0
  522. data/test/plugin_helper/test_timer.rb +130 -0
  523. data/test/scripts/exec_script.rb +32 -0
  524. data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +7 -0
  525. data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +7 -0
  526. data/test/scripts/fluent/plugin/formatter_known.rb +8 -0
  527. data/test/scripts/fluent/plugin/out_test.rb +81 -0
  528. data/test/scripts/fluent/plugin/out_test2.rb +80 -0
  529. data/test/scripts/fluent/plugin/parser_known.rb +4 -0
  530. data/test/test_capability.rb +74 -0
  531. data/test/test_clock.rb +164 -0
  532. data/test/test_config.rb +333 -0
  533. data/test/test_configdsl.rb +148 -0
  534. data/test/test_daemonizer.rb +91 -0
  535. data/test/test_engine.rb +203 -0
  536. data/test/test_event.rb +531 -0
  537. data/test/test_event_router.rb +348 -0
  538. data/test/test_event_time.rb +199 -0
  539. data/test/test_filter.rb +121 -0
  540. data/test/test_fluent_log_event_router.rb +99 -0
  541. data/test/test_formatter.rb +366 -0
  542. data/test/test_input.rb +31 -0
  543. data/test/test_log.rb +994 -0
  544. data/test/test_logger_initializer.rb +46 -0
  545. data/test/test_match.rb +148 -0
  546. data/test/test_mixin.rb +351 -0
  547. data/test/test_msgpack_factory.rb +18 -0
  548. data/test/test_oj_options.rb +55 -0
  549. data/test/test_output.rb +278 -0
  550. data/test/test_plugin.rb +251 -0
  551. data/test/test_plugin_classes.rb +370 -0
  552. data/test/test_plugin_helper.rb +81 -0
  553. data/test/test_plugin_id.rb +119 -0
  554. data/test/test_process.rb +14 -0
  555. data/test/test_root_agent.rb +951 -0
  556. data/test/test_static_config_analysis.rb +177 -0
  557. data/test/test_supervisor.rb +791 -0
  558. data/test/test_test_drivers.rb +136 -0
  559. data/test/test_time_formatter.rb +301 -0
  560. data/test/test_time_parser.rb +362 -0
  561. data/test/test_tls.rb +65 -0
  562. data/test/test_unique_id.rb +47 -0
  563. data/test/test_variable_store.rb +65 -0
  564. metadata +1191 -0
@@ -0,0 +1,1103 @@
1
+ require_relative '../helper'
2
+ require 'fluent/test/driver/input'
3
+ require 'fluent/plugin/in_http'
4
+ require 'net/http'
5
+ require 'timecop'
6
+
7
+ class HttpInputTest < Test::Unit::TestCase
8
+ class << self
9
+ def startup
10
+ socket_manager_path = ServerEngine::SocketManager::Server.generate_path
11
+ @server = ServerEngine::SocketManager::Server.open(socket_manager_path)
12
+ ENV['SERVERENGINE_SOCKETMANAGER_PATH'] = socket_manager_path.to_s
13
+ end
14
+
15
+ def shutdown
16
+ @server.close
17
+ end
18
+ end
19
+
20
+ def setup
21
+ Fluent::Test.setup
22
+ @port = unused_port
23
+ end
24
+
25
+ def teardown
26
+ Timecop.return
27
+ @port = nil
28
+ end
29
+
30
+ def config
31
+ %[
32
+ port #{@port}
33
+ bind "127.0.0.1"
34
+ body_size_limit 10m
35
+ keepalive_timeout 5
36
+ respond_with_empty_img true
37
+ use_204_response false
38
+ ]
39
+ end
40
+
41
+ def create_driver(conf=config)
42
+ Fluent::Test::Driver::Input.new(Fluent::Plugin::HttpInput).configure(conf)
43
+ end
44
+
45
+ def test_configure
46
+ d = create_driver
47
+ assert_equal @port, d.instance.port
48
+ assert_equal '127.0.0.1', d.instance.bind
49
+ assert_equal 10*1024*1024, d.instance.body_size_limit
50
+ assert_equal 5, d.instance.keepalive_timeout
51
+ assert_equal false, d.instance.add_http_headers
52
+ assert_equal false, d.instance.add_query_params
53
+ end
54
+
55
+ def test_time
56
+ d = create_driver
57
+ time = event_time("2011-01-02 13:14:15.123 UTC")
58
+ Timecop.freeze(Time.at(time))
59
+
60
+ events = [
61
+ ["tag1", time, {"a" => 1}],
62
+ ["tag2", time, {"a" => 2}],
63
+ ]
64
+ res_codes = []
65
+
66
+ d.run(expect_records: 2) do
67
+ events.each do |tag, _time, record|
68
+ res = post("/#{tag}", {"json"=>record.to_json})
69
+ res_codes << res.code
70
+ end
71
+ end
72
+
73
+ assert_equal ["200", "200"], res_codes
74
+ assert_equal events, d.events
75
+ assert_equal_event_time time, d.events[0][1]
76
+ assert_equal_event_time time, d.events[1][1]
77
+ end
78
+
79
+ def test_time_as_float
80
+ d = create_driver
81
+ time = event_time("2011-01-02 13:14:15.123 UTC")
82
+ float_time = time.to_f
83
+
84
+ events = [
85
+ ["tag1", time, {"a"=>1}],
86
+ ]
87
+ res_codes = []
88
+
89
+ d.run(expect_records: 1) do
90
+ events.each do |tag, t, record|
91
+ res = post("/#{tag}", {"json"=>record.to_json, "time"=>float_time.to_s})
92
+ res_codes << res.code
93
+ end
94
+ end
95
+ assert_equal ["200"], res_codes
96
+ assert_equal events, d.events
97
+ assert_equal_event_time time, d.events[0][1]
98
+ end
99
+
100
+ def test_json
101
+ d = create_driver
102
+ time = event_time("2011-01-02 13:14:15 UTC")
103
+ time_i = time.to_i
104
+
105
+ events = [
106
+ ["tag1", time_i, {"a"=>1}],
107
+ ["tag2", time_i, {"a"=>2}],
108
+ ]
109
+ res_codes = []
110
+
111
+ d.run(expect_records: 2) do
112
+ events.each do |tag, t, record|
113
+ res = post("/#{tag}", {"json"=>record.to_json, "time"=>t.to_s})
114
+ res_codes << res.code
115
+ end
116
+ end
117
+ assert_equal ["200", "200"], res_codes
118
+ assert_equal events, d.events
119
+ assert_equal_event_time time, d.events[0][1]
120
+ assert_equal_event_time time, d.events[1][1]
121
+ end
122
+
123
+ data('json' => ['json', :to_json],
124
+ 'msgpack' => ['msgpack', :to_msgpack])
125
+ def test_default_with_time_format(data)
126
+ param, method_name = data
127
+ d = create_driver(config + %[
128
+ <parse>
129
+ keep_time_key
130
+ time_format %iso8601
131
+ </parse>
132
+ ])
133
+
134
+ time = event_time("2020-06-10T01:14:27+00:00")
135
+ events = [
136
+ ["tag1", time, {"a" => 1, "time" => '2020-06-10T01:14:27+00:00'}],
137
+ ["tag2", time, {"a" => 2, "time" => '2020-06-10T01:14:27+00:00'}],
138
+ ]
139
+ res_codes = []
140
+
141
+ d.run(expect_records: 2) do
142
+ events.each do |tag, t, record|
143
+ res = post("/#{tag}", {param => record.__send__(method_name)})
144
+ res_codes << res.code
145
+ end
146
+ end
147
+ assert_equal ["200", "200"], res_codes
148
+ assert_equal events, d.events
149
+ assert_equal_event_time time, d.events[0][1]
150
+ assert_equal_event_time time, d.events[1][1]
151
+ end
152
+
153
+ def test_multi_json
154
+ d = create_driver
155
+ time = event_time("2011-01-02 13:14:15 UTC")
156
+ time_i = time.to_i
157
+
158
+ records = [{"a"=>1},{"a"=>2}]
159
+ events = [
160
+ ["tag1", time_i, records[0]],
161
+ ["tag1", time_i, records[1]],
162
+ ]
163
+ tag = "tag1"
164
+ res_codes = []
165
+ d.run(expect_records: 2, timeout: 5) do
166
+ res = post("/#{tag}", {"json"=>records.to_json, "time"=>time_i.to_s})
167
+ res_codes << res.code
168
+ end
169
+ assert_equal ["200"], res_codes
170
+ assert_equal events, d.events
171
+ assert_equal_event_time time, d.events[0][1]
172
+ assert_equal_event_time time, d.events[1][1]
173
+ end
174
+
175
+ def test_multi_json_with_time_field
176
+ d = create_driver
177
+ time = event_time("2011-01-02 13:14:15 UTC")
178
+ time_i = time.to_i
179
+ time_f = time.to_f
180
+
181
+ records = [{"a" => 1, 'time' => time_i},{"a" => 2, 'time' => time_f}]
182
+ events = [
183
+ ["tag1", time, {'a' => 1}],
184
+ ["tag1", time, {'a' => 2}],
185
+ ]
186
+ tag = "tag1"
187
+ res_codes = []
188
+ d.run(expect_records: 2, timeout: 5) do
189
+ res = post("/#{tag}", {"json" => records.to_json})
190
+ res_codes << res.code
191
+ end
192
+ assert_equal ["200"], res_codes
193
+ assert_equal events, d.events
194
+ assert_instance_of Fluent::EventTime, d.events[0][1]
195
+ assert_instance_of Fluent::EventTime, d.events[1][1]
196
+ assert_equal_event_time time, d.events[0][1]
197
+ assert_equal_event_time time, d.events[1][1]
198
+ end
199
+
200
+ data('json' => ['json', :to_json],
201
+ 'msgpack' => ['msgpack', :to_msgpack])
202
+ def test_default_multi_with_time_format(data)
203
+ param, method_name = data
204
+ d = create_driver(config + %[
205
+ <parse>
206
+ keep_time_key
207
+ time_format %iso8601
208
+ </parse>
209
+ ])
210
+ time = event_time("2020-06-10T01:14:27+00:00")
211
+ events = [
212
+ ["tag1", time, {'a' => 1, 'time' => "2020-06-10T01:14:27+00:00"}],
213
+ ["tag1", time, {'a' => 2, 'time' => "2020-06-10T01:14:27+00:00"}],
214
+ ]
215
+ tag = "tag1"
216
+ res_codes = []
217
+ d.run(expect_records: 2, timeout: 5) do
218
+ res = post("/#{tag}", {param => events.map { |e| e[2] }.__send__(method_name)})
219
+ res_codes << res.code
220
+ end
221
+ assert_equal ["200"], res_codes
222
+ assert_equal events, d.events
223
+ assert_equal_event_time time, d.events[0][1]
224
+ assert_equal_event_time time, d.events[1][1]
225
+ end
226
+
227
+ def test_multi_json_with_nonexistent_time_key
228
+ d = create_driver(config + %[
229
+ <parse>
230
+ time_key missing
231
+ </parse>
232
+ ])
233
+ time = event_time("2011-01-02 13:14:15 UTC")
234
+ time_i = time.to_i
235
+ time_f = time.to_f
236
+
237
+ records = [{"a" => 1, 'time' => time_i},{"a" => 2, 'time' => time_f}]
238
+ tag = "tag1"
239
+ res_codes = []
240
+ d.run(expect_records: 2, timeout: 5) do
241
+ res = post("/#{tag}", {"json" => records.to_json})
242
+ res_codes << res.code
243
+ end
244
+ assert_equal ["200"], res_codes
245
+ assert_equal 2, d.events.size
246
+ assert_not_equal time_i, d.events[0][1].sec # current time is used because "missing" field doesn't exist
247
+ assert_not_equal time_i, d.events[1][1].sec
248
+ end
249
+
250
+ def test_json_with_add_remote_addr
251
+ d = create_driver(config + "add_remote_addr true")
252
+ time = event_time("2011-01-02 13:14:15 UTC")
253
+ time_i = time.to_i
254
+
255
+ events = [
256
+ ["tag1", time, {"REMOTE_ADDR"=>"127.0.0.1", "a"=>1}],
257
+ ["tag2", time, {"REMOTE_ADDR"=>"127.0.0.1", "a"=>2}],
258
+ ]
259
+ res_codes = []
260
+ d.run(expect_records: 2) do
261
+ events.each do |tag, _t, record|
262
+ res = post("/#{tag}", {"json"=>record.to_json, "time"=>time_i.to_s})
263
+ res_codes << res.code
264
+ end
265
+ end
266
+ assert_equal ["200", "200"], res_codes
267
+ assert_equal events, d.events
268
+ assert_equal_event_time time, d.events[0][1]
269
+ assert_equal_event_time time, d.events[1][1]
270
+ end
271
+
272
+ def test_exact_match_for_expect
273
+ d = create_driver(config)
274
+ records = [{ "a" => 1}, { "a" => 2 }]
275
+ tag = "tag1"
276
+ res_codes = []
277
+
278
+ d.run(expect_records: 0, timeout: 5) do
279
+ res = post("/#{tag}", { "json" => records.to_json }, { 'Expect' => 'something' })
280
+ res_codes << res.code
281
+ end
282
+ assert_equal ["417"], res_codes
283
+ end
284
+
285
+ def test_exact_match_for_expect_with_other_header
286
+ d = create_driver(config)
287
+
288
+ records = [{ "a" => 1}, { "a" => 2 }]
289
+ tag = "tag1"
290
+ res_codes = []
291
+
292
+ d.run(expect_records: 2, timeout: 5) do
293
+ res = post("/#{tag}", { "json" => records.to_json, 'x-envoy-expected-rq-timeout-ms' => 4 })
294
+ res_codes << res.code
295
+ end
296
+ assert_equal ["200"], res_codes
297
+
298
+ assert_equal "tag1", d.events[0][0]
299
+ assert_equal 1, d.events[0][2]["a"]
300
+ assert_equal "tag1", d.events[1][0]
301
+ assert_equal 2, d.events[1][2]["a"]
302
+ end
303
+
304
+ def test_multi_json_with_add_remote_addr
305
+ d = create_driver(config + "add_remote_addr true")
306
+ time = event_time("2011-01-02 13:14:15 UTC")
307
+ time_i = time.to_i
308
+
309
+ records = [{"a"=>1},{"a"=>2}]
310
+ tag = "tag1"
311
+ res_codes = []
312
+
313
+ d.run(expect_records: 2, timeout: 5) do
314
+ res = post("/#{tag}", {"json"=>records.to_json, "time"=>time_i.to_s})
315
+ res_codes << res.code
316
+ end
317
+ assert_equal ["200"], res_codes
318
+
319
+ assert_equal "tag1", d.events[0][0]
320
+ assert_equal_event_time time, d.events[0][1]
321
+ assert_equal 1, d.events[0][2]["a"]
322
+ assert{ d.events[0][2].has_key?("REMOTE_ADDR") && d.events[0][2]["REMOTE_ADDR"] =~ /^\d{1,4}(\.\d{1,4}){3}$/ }
323
+
324
+ assert_equal "tag1", d.events[1][0]
325
+ assert_equal_event_time time, d.events[1][1]
326
+ assert_equal 2, d.events[1][2]["a"]
327
+ end
328
+
329
+ def test_json_with_add_remote_addr_given_x_forwarded_for
330
+ d = create_driver(config + "add_remote_addr true")
331
+ time = event_time("2011-01-02 13:14:15 UTC")
332
+ time_i = time.to_i
333
+
334
+ events = [
335
+ ["tag1", time, {"a"=>1}],
336
+ ["tag2", time, {"a"=>2}],
337
+ ]
338
+ res_codes = []
339
+
340
+ d.run(expect_records: 2) do
341
+ events.each do |tag, _t, record|
342
+ res = post("/#{tag}", {"json"=>record.to_json, "time"=>time_i.to_s}, {"X-Forwarded-For"=>"129.78.138.66, 127.0.0.1"})
343
+ res_codes << res.code
344
+ end
345
+ end
346
+ assert_equal ["200", "200"], res_codes
347
+
348
+ assert_equal "tag1", d.events[0][0]
349
+ assert_equal_event_time time, d.events[0][1]
350
+ assert_equal({"REMOTE_ADDR"=>"129.78.138.66", "a"=>1}, d.events[0][2])
351
+
352
+ assert_equal "tag2", d.events[1][0]
353
+ assert_equal_event_time time, d.events[1][1]
354
+ assert_equal({"REMOTE_ADDR"=>"129.78.138.66", "a"=>2}, d.events[1][2])
355
+ end
356
+
357
+ def test_multi_json_with_add_remote_addr_given_x_forwarded_for
358
+ d = create_driver(config + "add_remote_addr true")
359
+
360
+ tag = "tag1"
361
+ time = event_time("2011-01-02 13:14:15 UTC")
362
+ time_i = time.to_i
363
+ records = [{"a"=>1},{"a"=>2}]
364
+ events = [
365
+ [tag, time, {"REMOTE_ADDR"=>"129.78.138.66", "a"=>1}],
366
+ [tag, time, {"REMOTE_ADDR"=>"129.78.138.66", "a"=>2}],
367
+ ]
368
+ res_codes = []
369
+
370
+ d.run(expect_records: 2, timeout: 5) do
371
+ res = post("/#{tag}", {"json"=>records.to_json, "time"=>time_i.to_s}, {"X-Forwarded-For"=>"129.78.138.66, 127.0.0.1"})
372
+ res_codes << res.code
373
+ end
374
+ assert_equal ["200"], res_codes
375
+ assert_equal events, d.events
376
+ assert_equal_event_time time, d.events[0][1]
377
+ assert_equal_event_time time, d.events[1][1]
378
+ end
379
+
380
+ def test_add_remote_addr_given_multi_x_forwarded_for
381
+ d = create_driver(config + "add_remote_addr true")
382
+
383
+ tag = "tag1"
384
+ time = event_time("2011-01-02 13:14:15 UTC")
385
+ time_i = time.to_i
386
+ record = {"a" => 1}
387
+ event = ["tag1", time, {"REMOTE_ADDR" => "129.78.138.66", "a" => 1}]
388
+ res_code = nil
389
+
390
+ d.run(expect_records: 1, timeout: 5) do
391
+ res = post("/#{tag}", {"json" => record.to_json, "time" => time_i.to_s}) { |http, req|
392
+ # net/http can't send multiple headers so overwrite it.
393
+ def req.each_capitalized
394
+ block_given? or return enum_for(__method__) { @header.size }
395
+ @header.each do |k, vs|
396
+ vs.each { |v|
397
+ yield capitalize(k), v
398
+ }
399
+ end
400
+ end
401
+ req.add_field("X-Forwarded-For", "129.78.138.66, 127.0.0.1")
402
+ req.add_field("X-Forwarded-For", "8.8.8.8")
403
+ }
404
+ res_code = res.code
405
+ end
406
+ assert_equal "200", res_code
407
+ assert_equal event, d.events.first
408
+ assert_equal_event_time time, d.events.first[1]
409
+ end
410
+
411
+ def test_multi_json_with_add_http_headers
412
+ d = create_driver(config + "add_http_headers true")
413
+ time = event_time("2011-01-02 13:14:15 UTC")
414
+ time_i = time.to_i
415
+ records = [{"a"=>1},{"a"=>2}]
416
+ tag = "tag1"
417
+ res_codes = []
418
+
419
+ d.run(expect_records: 2, timeout: 5) do
420
+ res = post("/#{tag}", {"json"=>records.to_json, "time"=>time_i.to_s})
421
+ res_codes << res.code
422
+ end
423
+ assert_equal ["200"], res_codes
424
+
425
+ assert_equal "tag1", d.events[0][0]
426
+ assert_equal_event_time time, d.events[0][1]
427
+ assert_equal 1, d.events[0][2]["a"]
428
+
429
+ assert_equal "tag1", d.events[1][0]
430
+ assert_equal_event_time time, d.events[1][1]
431
+ assert_equal 2, d.events[1][2]["a"]
432
+
433
+ assert include_http_header?(d.events[0][2])
434
+ assert include_http_header?(d.events[1][2])
435
+ end
436
+
437
+ def test_json_with_add_http_headers
438
+ d = create_driver(config + "add_http_headers true")
439
+ time = event_time("2011-01-02 13:14:15 UTC")
440
+ time_i = time.to_i
441
+ events = [
442
+ ["tag1", time, {"a"=>1}],
443
+ ["tag2", time, {"a"=>2}],
444
+ ]
445
+ res_codes = []
446
+
447
+ d.run(expect_records: 2) do
448
+ events.each do |tag, t, record|
449
+ res = post("/#{tag}", {"json"=>record.to_json, "time"=>time_i.to_s})
450
+ res_codes << res.code
451
+ end
452
+ end
453
+ assert_equal ["200", "200"], res_codes
454
+
455
+ assert_equal "tag1", d.events[0][0]
456
+ assert_equal_event_time time, d.events[0][1]
457
+ assert_equal 1, d.events[0][2]["a"]
458
+
459
+ assert_equal "tag2", d.events[1][0]
460
+ assert_equal_event_time time, d.events[1][1]
461
+ assert_equal 2, d.events[1][2]["a"]
462
+
463
+ assert include_http_header?(d.events[0][2])
464
+ assert include_http_header?(d.events[1][2])
465
+ end
466
+
467
+ def test_multi_json_with_custom_parser
468
+ d = create_driver(config + %[
469
+ <parse>
470
+ @type json
471
+ keep_time_key true
472
+ time_key foo
473
+ time_format %iso8601
474
+ </parse>
475
+ ])
476
+
477
+ time = event_time("2011-01-02 13:14:15 UTC")
478
+ time_s = Time.at(time).iso8601
479
+
480
+ records = [{"foo"=>time_s,"bar"=>"test1"},{"foo"=>time_s,"bar"=>"test2"}]
481
+ tag = "tag1"
482
+ res_codes = []
483
+
484
+ d.run(expect_records: 2, timeout: 5) do
485
+ res = post("/#{tag}", records.to_json, {"Content-Type"=>"application/octet-stream"})
486
+ res_codes << res.code
487
+ end
488
+ assert_equal ["200"], res_codes
489
+
490
+ assert_equal "tag1", d.events[0][0]
491
+ assert_equal_event_time time, d.events[0][1]
492
+ assert_equal d.events[0][2], records[0]
493
+
494
+ assert_equal "tag1", d.events[1][0]
495
+ assert_equal_event_time time, d.events[1][1]
496
+ assert_equal d.events[1][2], records[1]
497
+ end
498
+
499
+ def test_application_json
500
+ d = create_driver
501
+ time = event_time("2011-01-02 13:14:15 UTC")
502
+ time_i = time.to_i
503
+ events = [
504
+ ["tag1", time, {"a"=>1}],
505
+ ["tag2", time, {"a"=>2}],
506
+ ]
507
+ res_codes = []
508
+
509
+ d.run(expect_records: 2) do
510
+ events.each do |tag, t, record|
511
+ res = post("/#{tag}?time=#{time_i.to_s}", record.to_json, {"Content-Type"=>"application/json; charset=utf-8"})
512
+ res_codes << res.code
513
+ end
514
+ end
515
+ assert_equal ["200", "200"], res_codes
516
+ assert_equal events, d.events
517
+ assert_equal_event_time time, d.events[0][1]
518
+ assert_equal_event_time time, d.events[1][1]
519
+ end
520
+
521
+ def test_application_msgpack
522
+ d = create_driver
523
+ time = event_time("2011-01-02 13:14:15 UTC")
524
+ time_i = time.to_i
525
+ events = [
526
+ ["tag1", time, {"a"=>1}],
527
+ ["tag2", time, {"a"=>2}],
528
+ ]
529
+ res_codes = []
530
+
531
+ d.run(expect_records: 2) do
532
+ events.each do |tag, t, record|
533
+ res = post("/#{tag}?time=#{time_i.to_s}", record.to_msgpack, {"Content-Type"=>"application/msgpack"})
534
+ res_codes << res.code
535
+ end
536
+ end
537
+ assert_equal ["200", "200"], res_codes
538
+ assert_equal events, d.events
539
+ assert_equal_event_time time, d.events[0][1]
540
+ assert_equal_event_time time, d.events[1][1]
541
+ end
542
+
543
+ def test_application_ndjson
544
+ d = create_driver
545
+ events = [
546
+ ["tag1", 1643935663, "{\"a\":1}\n{\"b\":2}"],
547
+ ["tag2", 1643935664, "{\"a\":3}\r\n{\"b\":4}"]
548
+ ]
549
+
550
+ expected = [
551
+ ["tag1", 1643935663, {"a"=>1}],
552
+ ["tag1", 1643935663, {"b"=>2}],
553
+ ["tag2", 1643935664, {"a"=>3}],
554
+ ["tag2", 1643935664, {"b"=>4}]
555
+ ]
556
+
557
+ d.run(expect_records: 1) do
558
+ events.each do |tag, time, record|
559
+ res = post("/#{tag}?time=#{time}", record, {"Content-Type"=>"application/x-ndjson"})
560
+ assert_equal("200", res.code)
561
+ end
562
+ end
563
+ assert_equal(expected, d.events)
564
+ end
565
+
566
+ def test_msgpack
567
+ d = create_driver
568
+ time = event_time("2011-01-02 13:14:15 UTC")
569
+ time_i = time.to_i
570
+
571
+ events = [
572
+ ["tag1", time, {"a"=>1}],
573
+ ["tag2", time, {"a"=>2}],
574
+ ]
575
+ res_codes = []
576
+
577
+ d.run(expect_records: 2) do
578
+ events.each do |tag, t, record|
579
+ res = post("/#{tag}", {"msgpack"=>record.to_msgpack, "time"=>time_i.to_s})
580
+ res_codes << res.code
581
+ end
582
+ end
583
+ assert_equal ["200", "200"], res_codes
584
+ assert_equal events, d.events
585
+ assert_equal_event_time time, d.events[0][1]
586
+ assert_equal_event_time time, d.events[1][1]
587
+ end
588
+
589
+ def test_multi_msgpack
590
+ d = create_driver
591
+
592
+ time = event_time("2011-01-02 13:14:15 UTC")
593
+ time_i = time.to_i
594
+
595
+ records = [{"a"=>1},{"a"=>2}]
596
+ events = [
597
+ ["tag1", time, records[0]],
598
+ ["tag1", time, records[1]],
599
+ ]
600
+ tag = "tag1"
601
+ res_codes = []
602
+ d.run(expect_records: 2) do
603
+ res = post("/#{tag}", {"msgpack"=>records.to_msgpack, "time"=>time_i.to_s})
604
+ res_codes << res.code
605
+ end
606
+ assert_equal ["200"], res_codes
607
+ assert_equal events, d.events
608
+ assert_equal_event_time time, d.events[0][1]
609
+ assert_equal_event_time time, d.events[1][1]
610
+ end
611
+
612
+ def test_with_regexp
613
+ d = create_driver(config + %[
614
+ format /^(?<field_1>\\d+):(?<field_2>\\w+)$/
615
+ types field_1:integer
616
+ ])
617
+
618
+ time = event_time("2011-01-02 13:14:15 UTC")
619
+ time_i = time.to_i
620
+ events = [
621
+ ["tag1", time, {"field_1" => 1, "field_2" => 'str'}],
622
+ ["tag2", time, {"field_1" => 2, "field_2" => 'str'}],
623
+ ]
624
+ res_codes = []
625
+
626
+ d.run(expect_records: 2) do
627
+ events.each do |tag, t, record|
628
+ body = record.map { |k, v|
629
+ v.to_s
630
+ }.join(':')
631
+ res = post("/#{tag}?time=#{time_i.to_s}", body, {'Content-Type' => 'application/octet-stream'})
632
+ res_codes << res.code
633
+ end
634
+ end
635
+ assert_equal ["200", "200"], res_codes
636
+ assert_equal events, d.events
637
+ assert_equal_event_time time, d.events[0][1]
638
+ assert_equal_event_time time, d.events[1][1]
639
+ end
640
+
641
+ def test_with_csv
642
+ require 'csv'
643
+
644
+ d = create_driver(config + %[
645
+ format csv
646
+ keys foo,bar
647
+ ])
648
+ time = event_time("2011-01-02 13:14:15 UTC")
649
+ time_i = time.to_i
650
+ events = [
651
+ ["tag1", time, {"foo" => "1", "bar" => 'st"r'}],
652
+ ["tag2", time, {"foo" => "2", "bar" => 'str'}],
653
+ ]
654
+ res_codes = []
655
+
656
+ d.run(expect_records: 2) do
657
+ events.each do |tag, t, record|
658
+ body = record.map { |k, v| v }.to_csv
659
+ res = post("/#{tag}?time=#{time_i.to_s}", body, {'Content-Type' => 'text/comma-separated-values'})
660
+ res_codes << res.code
661
+ end
662
+ end
663
+ assert_equal ["200", "200"], res_codes
664
+ assert_equal events, d.events
665
+ assert_equal_event_time time, d.events[0][1]
666
+ assert_equal_event_time time, d.events[1][1]
667
+ end
668
+
669
+ def test_response_with_empty_img
670
+ d = create_driver(config)
671
+ assert_equal true, d.instance.respond_with_empty_img
672
+
673
+ time = event_time("2011-01-02 13:14:15 UTC")
674
+ time_i = time.to_i
675
+ events = [
676
+ ["tag1", time, {"a"=>1}],
677
+ ["tag2", time, {"a"=>2}],
678
+ ]
679
+ res_codes = []
680
+ res_bodies = []
681
+
682
+ d.run do
683
+ events.each do |tag, _t, record|
684
+ res = post("/#{tag}", {"json"=>record.to_json, "time"=>time_i.to_s})
685
+ res_codes << res.code
686
+ # Ruby returns ASCII-8 encoded string for GIF.
687
+ res_bodies << res.body.force_encoding("UTF-8")
688
+ end
689
+ end
690
+ assert_equal ["200", "200"], res_codes
691
+ assert_equal [Fluent::Plugin::HttpInput::EMPTY_GIF_IMAGE, Fluent::Plugin::HttpInput::EMPTY_GIF_IMAGE], res_bodies
692
+ assert_equal events, d.events
693
+ assert_equal_event_time time, d.events[0][1]
694
+ assert_equal_event_time time, d.events[1][1]
695
+ end
696
+
697
+ def test_response_without_empty_img
698
+ d = create_driver(config + "respond_with_empty_img false")
699
+ assert_equal false, d.instance.respond_with_empty_img
700
+
701
+ time = event_time("2011-01-02 13:14:15 UTC")
702
+ time_i = time.to_i
703
+ events = [
704
+ ["tag1", time, {"a"=>1}],
705
+ ["tag2", time, {"a"=>2}],
706
+ ]
707
+ res_codes = []
708
+ res_bodies = []
709
+
710
+ d.run do
711
+ events.each do |tag, _t, record|
712
+ res = post("/#{tag}", {"json"=>record.to_json, "time"=>time_i.to_s})
713
+ res_codes << res.code
714
+ end
715
+ end
716
+ assert_equal ["200", "200"], res_codes
717
+ assert_equal [], res_bodies
718
+ assert_equal events, d.events
719
+ assert_equal_event_time time, d.events[0][1]
720
+ assert_equal_event_time time, d.events[1][1]
721
+ end
722
+
723
+ def test_response_use_204_response
724
+ d = create_driver(config + %[
725
+ respond_with_empty_img false
726
+ use_204_response true
727
+ ])
728
+ assert_equal true, d.instance.use_204_response
729
+
730
+ time = event_time("2011-01-02 13:14:15 UTC")
731
+ time_i = time.to_i
732
+ events = [
733
+ ["tag1", time, {"a"=>1}],
734
+ ["tag2", time, {"a"=>2}],
735
+ ]
736
+ res_codes = []
737
+ res_bodies = []
738
+
739
+ d.run do
740
+ events.each do |tag, _t, record|
741
+ res = post("/#{tag}", {"json"=>record.to_json, "time"=>time_i.to_s})
742
+ res_codes << res.code
743
+ end
744
+ end
745
+ assert_equal ["204", "204"], res_codes
746
+ assert_equal [], res_bodies
747
+ assert_equal events, d.events
748
+ assert_equal_event_time time, d.events[0][1]
749
+ assert_equal_event_time time, d.events[1][1]
750
+ end
751
+
752
+ def test_cors_allowed
753
+ d = create_driver(config + "cors_allow_origins [\"http://foo.com\"]")
754
+ assert_equal ["http://foo.com"], d.instance.cors_allow_origins
755
+
756
+ time = event_time("2011-01-02 13:14:15 UTC")
757
+ time_i = time.to_i
758
+ events = [
759
+ ["tag1", time, {"a"=>1}],
760
+ ["tag2", time, {"a"=>2}],
761
+ ]
762
+ res_codes = []
763
+ res_headers = []
764
+
765
+ d.run do
766
+ events.each do |tag, _t, record|
767
+ res = post("/#{tag}", {"json"=>record.to_json, "time"=>time_i.to_s}, {"Origin"=>"http://foo.com"})
768
+ res_codes << res.code
769
+ res_headers << res["Access-Control-Allow-Origin"]
770
+ end
771
+ end
772
+ assert_equal ["200", "200"], res_codes
773
+ assert_equal ["http://foo.com", "http://foo.com"], res_headers
774
+ assert_equal events, d.events
775
+ assert_equal_event_time time, d.events[0][1]
776
+ assert_equal_event_time time, d.events[1][1]
777
+ end
778
+
779
+ def test_cors_allowed_wildcard
780
+ d = create_driver(config + 'cors_allow_origins ["*"]')
781
+
782
+ time = event_time("2011-01-02 13:14:15 UTC")
783
+ events = [
784
+ ["tag1", time, {"a"=>1}],
785
+ ]
786
+
787
+ d.run do
788
+ events.each do |tag, time, record|
789
+ headers = {"Origin" => "http://foo.com"}
790
+
791
+ res = post("/#{tag}", {"json" => record.to_json, "time" => time.to_i}, headers)
792
+
793
+ assert_equal "200", res.code
794
+ assert_equal "*", res["Access-Control-Allow-Origin"]
795
+ end
796
+ end
797
+ end
798
+
799
+ def test_get_request
800
+ d = create_driver(config)
801
+
802
+ d.run do
803
+ res = get("/cors.test", {}, {})
804
+ assert_equal "200", res.code
805
+ end
806
+ end
807
+
808
+ def test_cors_preflight
809
+ d = create_driver(config + 'cors_allow_origins ["*"]')
810
+
811
+ d.run do
812
+ header = {
813
+ "Origin" => "http://foo.com",
814
+ "Access-Control-Request-Method" => "POST",
815
+ "Access-Control-Request-Headers" => "Content-Type",
816
+ }
817
+ res = options("/cors.test", {}, header)
818
+
819
+ assert_equal "200", res.code
820
+ assert_equal "*", res["Access-Control-Allow-Origin"]
821
+ assert_equal "POST", res["Access-Control-Allow-Methods"]
822
+ end
823
+ end
824
+
825
+ def test_cors_allowed_wildcard_for_subdomain
826
+ d = create_driver(config + 'cors_allow_origins ["http://*.foo.com"]')
827
+
828
+ time = event_time("2011-01-02 13:14:15 UTC")
829
+ events = [
830
+ ["tag1", time, {"a"=>1}],
831
+ ]
832
+
833
+ d.run do
834
+ events.each do |tag, time, record|
835
+ headers = {"Origin" => "http://subdomain.foo.com"}
836
+
837
+ res = post("/#{tag}", {"json" => record.to_json, "time" => time.to_i}, headers)
838
+
839
+ assert_equal "200", res.code
840
+ assert_equal "http://subdomain.foo.com", res["Access-Control-Allow-Origin"]
841
+ end
842
+ end
843
+ end
844
+
845
+ def test_cors_allowed_exclude_empty_string
846
+ d = create_driver(config + 'cors_allow_origins ["", "http://*.foo.com"]')
847
+
848
+ time = event_time("2011-01-02 13:14:15 UTC")
849
+ events = [
850
+ ["tag1", time, {"a"=>1}],
851
+ ]
852
+
853
+ d.run do
854
+ events.each do |tag, time, record|
855
+ headers = {"Origin" => "http://subdomain.foo.com"}
856
+
857
+ res = post("/#{tag}", {"json" => record.to_json, "time" => time.to_i}, headers)
858
+
859
+ assert_equal "200", res.code
860
+ assert_equal "http://subdomain.foo.com", res["Access-Control-Allow-Origin"]
861
+ end
862
+ end
863
+ end
864
+
865
+ def test_cors_allowed_wildcard_preflight_for_subdomain
866
+ d = create_driver(config + 'cors_allow_origins ["http://*.foo.com"]')
867
+
868
+ d.run do
869
+ header = {
870
+ "Origin" => "http://subdomain.foo.com",
871
+ "Access-Control-Request-Method" => "POST",
872
+ "Access-Control-Request-Headers" => "Content-Type",
873
+ }
874
+ res = options("/cors.test", {}, header)
875
+
876
+ assert_equal "200", res.code
877
+ assert_equal "http://subdomain.foo.com", res["Access-Control-Allow-Origin"]
878
+ assert_equal "POST", res["Access-Control-Allow-Methods"]
879
+ end
880
+ end
881
+
882
+ def test_cors_allow_credentials
883
+ d = create_driver(config + %[
884
+ cors_allow_origins ["http://foo.com"]
885
+ cors_allow_credentials
886
+ ])
887
+ assert_equal true, d.instance.cors_allow_credentials
888
+
889
+ time = event_time("2011-01-02 13:14:15 UTC")
890
+ event = ["tag1", time, {"a"=>1}]
891
+ res_code = nil
892
+ res_header = nil
893
+
894
+ d.run do
895
+ res = post("/#{event[0]}", {"json"=>event[2].to_json, "time"=>time.to_i.to_s}, {"Origin"=>"http://foo.com"})
896
+ res_code = res.code
897
+ res_header = res["Access-Control-Allow-Credentials"]
898
+ end
899
+ assert_equal(
900
+ {
901
+ response_code: "200",
902
+ allow_credentials_header: "true",
903
+ events: [event]
904
+ },
905
+ {
906
+ response_code: res_code,
907
+ allow_credentials_header: res_header,
908
+ events: d.events
909
+ }
910
+ )
911
+ end
912
+
913
+ def test_cors_allow_credentials_for_wildcard_origins
914
+ assert_raise(Fluent::ConfigError) do
915
+ create_driver(config + %[
916
+ cors_allow_origins ["*"]
917
+ cors_allow_credentials
918
+ ])
919
+ end
920
+ end
921
+
922
+ def test_content_encoding_gzip
923
+ d = create_driver
924
+
925
+ time = event_time("2011-01-02 13:14:15 UTC")
926
+ events = [
927
+ ["tag1", time, {"a"=>1}],
928
+ ["tag2", time, {"a"=>2}],
929
+ ]
930
+ res_codes = []
931
+
932
+ d.run do
933
+ events.each do |tag, time, record|
934
+ header = {'Content-Type'=>'application/json', 'Content-Encoding'=>'gzip'}
935
+ res = post("/#{tag}?time=#{time}", compress_gzip(record.to_json), header)
936
+ res_codes << res.code
937
+ end
938
+ end
939
+ assert_equal ["200", "200"], res_codes
940
+ assert_equal events, d.events
941
+ assert_equal_event_time time, d.events[0][1]
942
+ assert_equal_event_time time, d.events[1][1]
943
+ end
944
+
945
+ def test_content_encoding_deflate
946
+ d = create_driver
947
+
948
+ time = event_time("2011-01-02 13:14:15 UTC")
949
+ events = [
950
+ ["tag1", time, {"a"=>1}],
951
+ ["tag2", time, {"a"=>2}],
952
+ ]
953
+ res_codes = []
954
+
955
+ d.run do
956
+ events.each do |tag, time, record|
957
+ header = {'Content-Type'=>'application/msgpack', 'Content-Encoding'=>'deflate'}
958
+ res = post("/#{tag}?time=#{time}", Zlib.deflate(record.to_msgpack), header)
959
+ res_codes << res.code
960
+ end
961
+ end
962
+ assert_equal ["200", "200"], res_codes
963
+ assert_equal events, d.events
964
+ assert_equal_event_time time, d.events[0][1]
965
+ assert_equal_event_time time, d.events[1][1]
966
+ end
967
+
968
+ def test_cors_disallowed
969
+ d = create_driver(config + "cors_allow_origins [\"http://foo.com\"]")
970
+ assert_equal ["http://foo.com"], d.instance.cors_allow_origins
971
+
972
+ time = event_time("2011-01-02 13:14:15 UTC")
973
+ time_i = time.to_i
974
+ res_codes = []
975
+
976
+ d.end_if{ res_codes.size == 2 }
977
+ d.run do
978
+ res = post("/tag1", {"json"=>{"a"=>1}.to_json, "time"=>time_i.to_s}, {"Origin"=>"http://bar.com"})
979
+ res_codes << res.code
980
+ res = post("/tag2", {"json"=>{"a"=>1}.to_json, "time"=>time_i.to_s}, {"Origin"=>"http://bar.com"})
981
+ res_codes << res.code
982
+ end
983
+ assert_equal ["403", "403"], res_codes
984
+ end
985
+
986
+ def test_add_query_params
987
+ d = create_driver(config + "add_query_params true")
988
+ assert_equal true, d.instance.add_query_params
989
+
990
+ time = event_time("2011-01-02 13:14:15 UTC")
991
+ time_i = time.to_i
992
+ events = [
993
+ ["tag1", time, {"a"=>1, "QUERY_A"=>"b"}],
994
+ ["tag2", time, {"a"=>2, "QUERY_A"=>"b"}],
995
+ ]
996
+ res_codes = []
997
+ res_bodies = []
998
+
999
+ d.run do
1000
+ events.each do |tag, _t, record|
1001
+ res = post("/#{tag}?a=b", {"json"=>record.to_json, "time"=>time_i.to_s})
1002
+ res_codes << res.code
1003
+ end
1004
+ end
1005
+ assert_equal ["200", "200"], res_codes
1006
+ assert_equal [], res_bodies
1007
+ assert_equal events, d.events
1008
+ end
1009
+
1010
+ $test_in_http_connection_object_ids = []
1011
+ $test_in_http_content_types = []
1012
+ $test_in_http_content_types_flag = false
1013
+ module ContentTypeHook
1014
+ def initialize(*args)
1015
+ @io_handler = nil
1016
+ super
1017
+ end
1018
+ def on_headers_complete(headers)
1019
+ super
1020
+ if $test_in_http_content_types_flag
1021
+ $test_in_http_content_types << self.content_type
1022
+ end
1023
+ end
1024
+
1025
+ def on_message_begin
1026
+ super
1027
+ if $test_in_http_content_types_flag
1028
+ $test_in_http_connection_object_ids << @io_handler.object_id
1029
+ end
1030
+ end
1031
+ end
1032
+
1033
+ class Fluent::Plugin::HttpInput::Handler
1034
+ prepend ContentTypeHook
1035
+ end
1036
+
1037
+ def test_if_content_type_is_initialized_properly
1038
+ # This test is to check if Fluent::HttpInput::Handler's @content_type is initialized properly.
1039
+ # Especially when in Keep-Alive and the second request has no 'Content-Type'.
1040
+
1041
+ begin
1042
+ d = create_driver
1043
+
1044
+ $test_in_http_content_types_flag = true
1045
+ d.run do
1046
+ # Send two requests the second one has no Content-Type in Keep-Alive
1047
+ Net::HTTP.start("127.0.0.1", @port) do |http|
1048
+ req = Net::HTTP::Post.new("/foodb/bartbl", {"connection" => "keepalive", "Content-Type" => "application/json"})
1049
+ http.request(req)
1050
+ req = Net::HTTP::Get.new("/foodb/bartbl", {"connection" => "keepalive"})
1051
+ http.request(req)
1052
+ end
1053
+
1054
+ end
1055
+ ensure
1056
+ $test_in_http_content_types_flag = false
1057
+ end
1058
+ assert_equal(['application/json', ''], $test_in_http_content_types)
1059
+ # Asserting keepalive
1060
+ assert_equal $test_in_http_connection_object_ids[0], $test_in_http_connection_object_ids[1]
1061
+ end
1062
+
1063
+ def get(path, params, header = {})
1064
+ http = Net::HTTP.new("127.0.0.1", @port)
1065
+ req = Net::HTTP::Get.new(path, header)
1066
+ http.request(req)
1067
+ end
1068
+
1069
+ def options(path, params, header = {})
1070
+ http = Net::HTTP.new("127.0.0.1", @port)
1071
+ req = Net::HTTP::Options.new(path, header)
1072
+ http.request(req)
1073
+ end
1074
+
1075
+ def post(path, params, header = {}, &block)
1076
+ http = Net::HTTP.new("127.0.0.1", @port)
1077
+ req = Net::HTTP::Post.new(path, header)
1078
+ block.call(http, req) if block
1079
+ if params.is_a?(String)
1080
+ unless header.has_key?('Content-Type')
1081
+ header['Content-Type'] = 'application/octet-stream'
1082
+ end
1083
+ req.body = params
1084
+ else
1085
+ unless header.has_key?('Content-Type')
1086
+ header['Content-Type'] = 'application/x-www-form-urlencoded'
1087
+ end
1088
+ req.set_form_data(params)
1089
+ end
1090
+ http.request(req)
1091
+ end
1092
+
1093
+ def compress_gzip(data)
1094
+ io = StringIO.new
1095
+ io.binmode
1096
+ Zlib::GzipWriter.wrap(io) { |gz| gz.write data }
1097
+ return io.string
1098
+ end
1099
+
1100
+ def include_http_header?(record)
1101
+ record.keys.find { |header| header.start_with?('HTTP_') }
1102
+ end
1103
+ end