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,667 @@
1
+ #
2
+ # Fluentd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'fluent/plugin/input'
18
+ require 'fluent/plugin/parser'
19
+ require 'fluent/event'
20
+
21
+ require 'http/parser'
22
+ require 'webrick/httputils'
23
+ require 'uri'
24
+ require 'socket'
25
+ require 'json'
26
+
27
+ module Fluent::Plugin
28
+ class InHttpParser < Parser
29
+ Fluent::Plugin.register_parser('in_http', self)
30
+
31
+ config_set_default :time_key, 'time'
32
+
33
+ def configure(conf)
34
+ super
35
+
36
+ # if no time parser related parameters, use in_http's time convert rule
37
+ @time_parser = if conf.has_key?('time_type') || conf.has_key?('time_format')
38
+ time_parser_create
39
+ else
40
+ nil
41
+ end
42
+ end
43
+
44
+ def parse(text)
45
+ # this plugin is dummy implementation not to raise error
46
+ yield nil, nil
47
+ end
48
+
49
+ def get_time_parser
50
+ @time_parser
51
+ end
52
+ end
53
+
54
+ class HttpInput < Input
55
+ Fluent::Plugin.register_input('http', self)
56
+
57
+ helpers :parser, :compat_parameters, :event_loop, :server
58
+
59
+ EMPTY_GIF_IMAGE = "GIF89a\u0001\u0000\u0001\u0000\x80\xFF\u0000\xFF\xFF\xFF\u0000\u0000\u0000,\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0002\u0002D\u0001\u0000;".force_encoding("UTF-8")
60
+
61
+ desc 'The port to listen to.'
62
+ config_param :port, :integer, default: 9880
63
+ desc 'The bind address to listen to.'
64
+ config_param :bind, :string, default: '0.0.0.0'
65
+ desc 'The size limit of the POSTed element. Default is 32MB.'
66
+ config_param :body_size_limit, :size, default: 32*1024*1024 # TODO default
67
+ desc 'The timeout limit for keeping the connection alive.'
68
+ config_param :keepalive_timeout, :time, default: 10 # TODO default
69
+ config_param :backlog, :integer, default: nil
70
+ desc 'Add HTTP_ prefix headers to the record.'
71
+ config_param :add_http_headers, :bool, default: false
72
+ desc 'Add REMOTE_ADDR header to the record.'
73
+ config_param :add_remote_addr, :bool, default: false
74
+ config_param :blocking_timeout, :time, default: 0.5
75
+ desc 'Set a allow list of domains that can do CORS (Cross-Origin Resource Sharing)'
76
+ config_param :cors_allow_origins, :array, default: nil
77
+ desc 'Tells browsers whether to expose the response to frontend when the credentials mode is "include".'
78
+ config_param :cors_allow_credentials, :bool, default: false
79
+ desc 'Respond with empty gif image of 1x1 pixel.'
80
+ config_param :respond_with_empty_img, :bool, default: false
81
+ desc 'Respond status code with 204.'
82
+ config_param :use_204_response, :bool, default: false
83
+ desc 'Dump error log or not'
84
+ config_param :dump_error_log, :bool, default: true
85
+ desc 'Add QUERY_ prefix query params to record'
86
+ config_param :add_query_params, :bool, default: false
87
+
88
+ config_section :parse do
89
+ config_set_default :@type, 'in_http'
90
+ end
91
+
92
+ EVENT_RECORD_PARAMETER = '_event_record'
93
+
94
+ def initialize
95
+ super
96
+
97
+ @km = nil
98
+ @format_name = nil
99
+ @parser_time_key = nil
100
+
101
+ # default parsers
102
+ @parser_msgpack = nil
103
+ @parser_json = nil
104
+ @default_time_parser = nil
105
+ @default_keep_time_key = nil
106
+ @float_time_parser = nil
107
+
108
+ # <parse> configured parser
109
+ @custom_parser = nil
110
+ end
111
+
112
+ def configure(conf)
113
+ compat_parameters_convert(conf, :parser)
114
+
115
+ super
116
+
117
+ if @cors_allow_credentials
118
+ if @cors_allow_origins.nil? || @cors_allow_origins.include?('*')
119
+ raise Fluent::ConfigError, "Cannot enable cors_allow_credentials without specific origins"
120
+ end
121
+ end
122
+
123
+ m = if @parser_configs.first['@type'] == 'in_http'
124
+ @parser_msgpack = parser_create(usage: 'parser_in_http_msgpack', type: 'msgpack')
125
+ @parser_msgpack.time_key = nil
126
+ @parser_msgpack.estimate_current_event = false
127
+ @parser_json = parser_create(usage: 'parser_in_http_json', type: 'json')
128
+ @parser_json.time_key = nil
129
+ @parser_json.estimate_current_event = false
130
+
131
+ default_parser = parser_create(usage: '')
132
+ @format_name = 'default'
133
+ @parser_time_key = default_parser.time_key
134
+ @default_time_parser = default_parser.get_time_parser
135
+ @default_keep_time_key = default_parser.keep_time_key
136
+ method(:parse_params_default)
137
+ else
138
+ @custom_parser = parser_create
139
+ @format_name = @parser_configs.first['@type']
140
+ @parser_time_key = @custom_parser.time_key
141
+ method(:parse_params_with_parser)
142
+ end
143
+ self.singleton_class.module_eval do
144
+ define_method(:parse_params, m)
145
+ end
146
+ end
147
+
148
+ class KeepaliveManager < Coolio::TimerWatcher
149
+ def initialize(timeout)
150
+ super(1, true)
151
+ @cons = {}
152
+ @timeout = timeout.to_i
153
+ end
154
+
155
+ def add(sock)
156
+ @cons[sock] = sock
157
+ end
158
+
159
+ def delete(sock)
160
+ @cons.delete(sock)
161
+ end
162
+
163
+ def on_timer
164
+ @cons.each_pair {|sock,val|
165
+ if sock.step_idle > @timeout
166
+ sock.close
167
+ end
168
+ }
169
+ end
170
+ end
171
+
172
+ def multi_workers_ready?
173
+ true
174
+ end
175
+
176
+ def start
177
+ @_event_loop_run_timeout = @blocking_timeout
178
+
179
+ super
180
+
181
+ log.debug "listening http", bind: @bind, port: @port
182
+
183
+ @km = KeepaliveManager.new(@keepalive_timeout)
184
+ event_loop_attach(@km)
185
+
186
+ server_create_connection(:in_http, @port, bind: @bind, backlog: @backlog, &method(:on_server_connect))
187
+ @float_time_parser = Fluent::NumericTimeParser.new(:float)
188
+ end
189
+
190
+ def close
191
+ server_wait_until_stop
192
+ super
193
+ end
194
+
195
+ RES_TEXT_HEADER = {'Content-Type' => 'text/plain'}.freeze
196
+ RESPONSE_200 = ["200 OK".freeze, RES_TEXT_HEADER, "".freeze].freeze
197
+ RESPONSE_204 = ["204 No Content".freeze, {}.freeze].freeze
198
+ RESPONSE_IMG = ["200 OK".freeze, {'Content-Type'=>'image/gif; charset=utf-8'}.freeze, EMPTY_GIF_IMAGE].freeze
199
+ RES_400_STATUS = "400 Bad Request".freeze
200
+ RES_500_STATUS = "500 Internal Server Error".freeze
201
+
202
+ def on_request(path_info, params)
203
+ begin
204
+ path = path_info[1..-1] # remove /
205
+ tag = path.split('/').join('.')
206
+ record_time, record = parse_params(params)
207
+
208
+ # Skip nil record
209
+ if record.nil?
210
+ log.debug { "incoming event is invalid: path=#{path_info} params=#{params.to_json}" }
211
+ if @respond_with_empty_img
212
+ return RESPONSE_IMG
213
+ else
214
+ if @use_204_response
215
+ return RESPONSE_204
216
+ else
217
+ return RESPONSE_200
218
+ end
219
+ end
220
+ end
221
+
222
+ mes = nil
223
+ # Support batched requests
224
+ if record.is_a?(Array)
225
+ mes = Fluent::MultiEventStream.new
226
+ record.each do |single_record|
227
+ add_params_to_record(single_record, params)
228
+
229
+ if param_time = params['time']
230
+ param_time = param_time.to_f
231
+ single_time = param_time.zero? ? Fluent::EventTime.now : @float_time_parser.parse(param_time)
232
+ elsif @custom_parser
233
+ single_time = @custom_parser.parse_time(single_record)
234
+ single_time, single_record = @custom_parser.convert_values(single_time, single_record)
235
+ else
236
+ single_time = convert_time_field(single_record)
237
+ end
238
+
239
+ mes.add(single_time, single_record)
240
+ end
241
+ else
242
+ add_params_to_record(record, params)
243
+
244
+ time = if param_time = params['time']
245
+ param_time = param_time.to_f
246
+ param_time.zero? ? Fluent::EventTime.now : @float_time_parser.parse(param_time)
247
+ else
248
+ if record_time.nil?
249
+ convert_time_field(record)
250
+ else
251
+ record_time
252
+ end
253
+ end
254
+ end
255
+ rescue => e
256
+ if @dump_error_log
257
+ log.error "failed to process request", error: e
258
+ end
259
+ return [RES_400_STATUS, RES_TEXT_HEADER, "400 Bad Request\n#{e}\n"]
260
+ end
261
+
262
+ # TODO server error
263
+ begin
264
+ if mes
265
+ router.emit_stream(tag, mes)
266
+ else
267
+ router.emit(tag, time, record)
268
+ end
269
+ rescue => e
270
+ if @dump_error_log
271
+ log.error "failed to emit data", error: e
272
+ end
273
+ return [RES_500_STATUS, RES_TEXT_HEADER, "500 Internal Server Error\n#{e}\n"]
274
+ end
275
+
276
+ if @respond_with_empty_img
277
+ return RESPONSE_IMG
278
+ else
279
+ if @use_204_response
280
+ return RESPONSE_204
281
+ else
282
+ return RESPONSE_200
283
+ end
284
+ end
285
+ end
286
+
287
+ private
288
+
289
+ def on_server_connect(conn)
290
+ handler = Handler.new(conn, @km, method(:on_request),
291
+ @body_size_limit, @format_name, log,
292
+ @cors_allow_origins, @cors_allow_credentials,
293
+ @add_query_params)
294
+
295
+ conn.on(:data) do |data|
296
+ handler.on_read(data)
297
+ end
298
+
299
+ conn.on(:write_complete) do |_|
300
+ handler.on_write_complete
301
+ end
302
+
303
+ conn.on(:close) do |_|
304
+ handler.on_close
305
+ end
306
+ end
307
+
308
+ def parse_params_default(params)
309
+ if msgpack = params['msgpack']
310
+ @parser_msgpack.parse(msgpack) do |_time, record|
311
+ return nil, record
312
+ end
313
+ elsif js = params['json']
314
+ @parser_json.parse(js) do |_time, record|
315
+ return nil, record
316
+ end
317
+ else
318
+ raise "'json' or 'msgpack' parameter is required"
319
+ end
320
+ end
321
+
322
+ def parse_params_with_parser(params)
323
+ if content = params[EVENT_RECORD_PARAMETER]
324
+ @custom_parser.parse(content) { |time, record|
325
+ raise "Received event is not #{@format_name}: #{content}" if record.nil?
326
+ return time, record
327
+ }
328
+ else
329
+ raise "'#{EVENT_RECORD_PARAMETER}' parameter is required"
330
+ end
331
+ end
332
+
333
+ def add_params_to_record(record, params)
334
+ if @add_http_headers
335
+ params.each_pair { |k, v|
336
+ if k.start_with?("HTTP_".freeze)
337
+ record[k] = v
338
+ end
339
+ }
340
+ end
341
+
342
+ if @add_query_params
343
+ params.each_pair { |k, v|
344
+ if k.start_with?("QUERY_".freeze)
345
+ record[k] = v
346
+ end
347
+ }
348
+ end
349
+
350
+ if @add_remote_addr
351
+ record['REMOTE_ADDR'] = params['REMOTE_ADDR']
352
+ end
353
+ end
354
+
355
+ def convert_time_field(record)
356
+ if t = @default_keep_time_key ? record[@parser_time_key] : record.delete(@parser_time_key)
357
+ if @default_time_parser
358
+ @default_time_parser.parse(t)
359
+ else
360
+ Fluent::EventTime.from_time(Time.at(t))
361
+ end
362
+ else
363
+ Fluent::EventTime.now
364
+ end
365
+ end
366
+
367
+ class Handler
368
+ attr_reader :content_type
369
+
370
+ def initialize(io, km, callback, body_size_limit, format_name, log,
371
+ cors_allow_origins, cors_allow_credentials, add_query_params)
372
+ @io = io
373
+ @km = km
374
+ @callback = callback
375
+ @body_size_limit = body_size_limit
376
+ @next_close = false
377
+ @format_name = format_name
378
+ @log = log
379
+ @cors_allow_origins = cors_allow_origins
380
+ @cors_allow_credentials = cors_allow_credentials
381
+ @idle = 0
382
+ @add_query_params = add_query_params
383
+ @km.add(self)
384
+
385
+ @remote_port, @remote_addr = io.remote_port, io.remote_addr
386
+ @parser = Http::Parser.new(self)
387
+ end
388
+
389
+ def step_idle
390
+ @idle += 1
391
+ end
392
+
393
+ def on_close
394
+ @km.delete(self)
395
+ end
396
+
397
+ def on_read(data)
398
+ @idle = 0
399
+ @parser << data
400
+ rescue
401
+ @log.warn "unexpected error", error: $!.to_s
402
+ @log.warn_backtrace
403
+ @io.close
404
+ end
405
+
406
+ def on_message_begin
407
+ @body = ''
408
+ end
409
+
410
+ def on_headers_complete(headers)
411
+ expect = nil
412
+ size = nil
413
+
414
+ if @parser.http_version == [1, 1]
415
+ @keep_alive = true
416
+ else
417
+ @keep_alive = false
418
+ end
419
+ @env = {}
420
+ @content_type = ""
421
+ @content_encoding = ""
422
+ headers.each_pair {|k,v|
423
+ @env["HTTP_#{k.gsub('-','_').upcase}"] = v
424
+ case k
425
+ when /\AExpect\z/i
426
+ expect = v
427
+ when /\AContent-Length\Z/i
428
+ size = v.to_i
429
+ when /\AContent-Type\Z/i
430
+ @content_type = v
431
+ when /\AContent-Encoding\Z/i
432
+ @content_encoding = v
433
+ when /\AConnection\Z/i
434
+ if v =~ /close/i
435
+ @keep_alive = false
436
+ elsif v =~ /Keep-alive/i
437
+ @keep_alive = true
438
+ end
439
+ when /\AOrigin\Z/i
440
+ @origin = v
441
+ when /\AX-Forwarded-For\Z/i
442
+ # For multiple X-Forwarded-For headers. Use first header value.
443
+ v = v.first if v.is_a?(Array)
444
+ @remote_addr = v.split(",").first
445
+ when /\AAccess-Control-Request-Method\Z/i
446
+ @access_control_request_method = v
447
+ when /\AAccess-Control-Request-Headers\Z/i
448
+ @access_control_request_headers = v
449
+ end
450
+ }
451
+ if expect
452
+ if expect == '100-continue'.freeze
453
+ if !size || size < @body_size_limit
454
+ send_response_nobody("100 Continue", {})
455
+ else
456
+ send_response_and_close("413 Request Entity Too Large", {}, "Too large")
457
+ end
458
+ else
459
+ send_response_and_close("417 Expectation Failed", {}, "")
460
+ end
461
+ end
462
+ end
463
+
464
+ def on_body(chunk)
465
+ if @body.bytesize + chunk.bytesize > @body_size_limit
466
+ unless closing?
467
+ send_response_and_close("413 Request Entity Too Large", {}, "Too large")
468
+ end
469
+ return
470
+ end
471
+ @body << chunk
472
+ end
473
+
474
+ RES_200_STATUS = "200 OK".freeze
475
+ RES_403_STATUS = "403 Forbidden".freeze
476
+
477
+ # Azure App Service sends GET requests for health checking purpose.
478
+ # Respond with `200 OK` to accommodate it.
479
+ def handle_get_request
480
+ return send_response_and_close(RES_200_STATUS, {}, "")
481
+ end
482
+
483
+ # Web browsers can send an OPTIONS request before performing POST
484
+ # to check if cross-origin requests are supported.
485
+ def handle_options_request
486
+ # Is CORS enabled in the first place?
487
+ if @cors_allow_origins.nil?
488
+ return send_response_and_close(RES_403_STATUS, {}, "")
489
+ end
490
+
491
+ # in_http does not support HTTP methods except POST
492
+ if @access_control_request_method != 'POST'
493
+ return send_response_and_close(RES_403_STATUS, {}, "")
494
+ end
495
+
496
+ header = {
497
+ "Access-Control-Allow-Methods" => "POST",
498
+ "Access-Control-Allow-Headers" => @access_control_request_headers || "",
499
+ }
500
+
501
+ # Check the origin and send back a CORS response
502
+ if @cors_allow_origins.include?('*')
503
+ header["Access-Control-Allow-Origin"] = "*"
504
+ send_response_and_close(RES_200_STATUS, header, "")
505
+ elsif include_cors_allow_origin
506
+ header["Access-Control-Allow-Origin"] = @origin
507
+ if @cors_allow_credentials
508
+ header["Access-Control-Allow-Credentials"] = true
509
+ end
510
+ send_response_and_close(RES_200_STATUS, header, "")
511
+ else
512
+ send_response_and_close(RES_403_STATUS, {}, "")
513
+ end
514
+ end
515
+
516
+ def on_message_complete
517
+ return if closing?
518
+
519
+ if @parser.http_method == 'GET'.freeze
520
+ return handle_get_request()
521
+ end
522
+
523
+ if @parser.http_method == 'OPTIONS'.freeze
524
+ return handle_options_request()
525
+ end
526
+
527
+ # CORS check
528
+ # ==========
529
+ # For every incoming request, we check if we have some CORS
530
+ # restrictions and allow listed origins through @cors_allow_origins.
531
+ unless @cors_allow_origins.nil?
532
+ unless @cors_allow_origins.include?('*') || include_cors_allow_origin
533
+ send_response_and_close(RES_403_STATUS, {'Connection' => 'close'}, "")
534
+ return
535
+ end
536
+ end
537
+
538
+ # Content Encoding
539
+ # =================
540
+ # Decode payload according to the "Content-Encoding" header.
541
+ # For now, we only support 'gzip' and 'deflate'.
542
+ begin
543
+ if @content_encoding == 'gzip'.freeze
544
+ @body = Zlib::GzipReader.new(StringIO.new(@body)).read
545
+ elsif @content_encoding == 'deflate'.freeze
546
+ @body = Zlib::Inflate.inflate(@body)
547
+ end
548
+ rescue
549
+ @log.warn 'fails to decode payload', error: $!.to_s
550
+ send_response_and_close(RES_400_STATUS, {}, "")
551
+ return
552
+ end
553
+
554
+ @env['REMOTE_ADDR'] = @remote_addr if @remote_addr
555
+
556
+ uri = URI.parse(@parser.request_url)
557
+ params = WEBrick::HTTPUtils.parse_query(uri.query)
558
+
559
+ if @format_name != 'default'
560
+ params[EVENT_RECORD_PARAMETER] = @body
561
+ elsif @content_type =~ /^application\/x-www-form-urlencoded/
562
+ params.update WEBrick::HTTPUtils.parse_query(@body)
563
+ elsif @content_type =~ /^multipart\/form-data; boundary=(.+)/
564
+ boundary = WEBrick::HTTPUtils.dequote($1)
565
+ params.update WEBrick::HTTPUtils.parse_form_data(@body, boundary)
566
+ elsif @content_type =~ /^application\/json/
567
+ params['json'] = @body
568
+ elsif @content_type =~ /^application\/msgpack/
569
+ params['msgpack'] = @body
570
+ end
571
+ path_info = uri.path
572
+
573
+ if (@add_query_params)
574
+
575
+ query_params = WEBrick::HTTPUtils.parse_query(uri.query)
576
+
577
+ query_params.each_pair {|k,v|
578
+ params["QUERY_#{k.gsub('-','_').upcase}"] = v
579
+ }
580
+ end
581
+
582
+ params.merge!(@env)
583
+
584
+ @env.clear
585
+
586
+ code, header, body = @callback.call(path_info, params)
587
+ body = body.to_s
588
+ header = header.dup if header.frozen?
589
+
590
+ unless @cors_allow_origins.nil?
591
+ if @cors_allow_origins.include?('*')
592
+ header['Access-Control-Allow-Origin'] = '*'
593
+ elsif include_cors_allow_origin
594
+ header['Access-Control-Allow-Origin'] = @origin
595
+ if @cors_allow_credentials
596
+ header["Access-Control-Allow-Credentials"] = true
597
+ end
598
+ end
599
+ end
600
+
601
+ if @keep_alive
602
+ header['Connection'] = 'Keep-Alive'.freeze
603
+ send_response(code, header, body)
604
+ else
605
+ send_response_and_close(code, header, body)
606
+ end
607
+ end
608
+
609
+ def close
610
+ @io.close
611
+ end
612
+
613
+ def on_write_complete
614
+ @io.close if @next_close
615
+ end
616
+
617
+ def send_response_and_close(code, header, body)
618
+ send_response(code, header, body)
619
+ @next_close = true
620
+ end
621
+
622
+ def closing?
623
+ @next_close
624
+ end
625
+
626
+ def send_response(code, header, body)
627
+ header['Content-Length'] ||= body.bytesize
628
+ header['Content-Type'] ||= 'text/plain'.freeze
629
+
630
+ data = %[HTTP/1.1 #{code}\r\n]
631
+ header.each_pair {|k,v|
632
+ data << "#{k}: #{v}\r\n"
633
+ }
634
+ data << "\r\n".freeze
635
+ @io.write(data)
636
+
637
+ @io.write(body)
638
+ end
639
+
640
+ def send_response_nobody(code, header)
641
+ data = %[HTTP/1.1 #{code}\r\n]
642
+ header.each_pair {|k,v|
643
+ data << "#{k}: #{v}\r\n"
644
+ }
645
+ data << "\r\n".freeze
646
+ @io.write(data)
647
+ end
648
+
649
+ def include_cors_allow_origin
650
+ if @origin.nil?
651
+ return false
652
+ end
653
+
654
+ if @cors_allow_origins.include?(@origin)
655
+ return true
656
+ end
657
+ filtered_cors_allow_origins = @cors_allow_origins.select {|origin| origin != ""}
658
+ r = filtered_cors_allow_origins.find do |origin|
659
+ (start_str, end_str) = origin.split("*", 2)
660
+ @origin.start_with?(start_str) && @origin.end_with?(end_str)
661
+ end
662
+
663
+ !r.nil?
664
+ end
665
+ end
666
+ end
667
+ end