fluentd 1.14.4-x64-mingw-ucrt

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of fluentd might be problematic. Click here for more details.

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