fluentd222 1.16.2-x86_64-linux

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (562) hide show
  1. checksums.yaml +7 -0
  2. data/.deepsource.toml +13 -0
  3. data/.github/ISSUE_TEMPLATE/bug_report.yaml +71 -0
  4. data/.github/ISSUE_TEMPLATE/config.yml +5 -0
  5. data/.github/ISSUE_TEMPLATE/feature_request.yaml +39 -0
  6. data/.github/ISSUE_TEMPLATE.md +17 -0
  7. data/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  8. data/.github/workflows/stale-actions.yml +24 -0
  9. data/.github/workflows/test-ruby-head.yaml +31 -0
  10. data/.github/workflows/test.yaml +32 -0
  11. data/.gitignore +30 -0
  12. data/ADOPTERS.md +5 -0
  13. data/AUTHORS +2 -0
  14. data/CHANGELOG.md +2720 -0
  15. data/CONTRIBUTING.md +45 -0
  16. data/GOVERNANCE.md +55 -0
  17. data/Gemfile +9 -0
  18. data/GithubWorkflow.md +78 -0
  19. data/LICENSE +202 -0
  20. data/MAINTAINERS.md +13 -0
  21. data/README.md +75 -0
  22. data/Rakefile +79 -0
  23. data/SECURITY.md +14 -0
  24. data/bin/fluent-binlog-reader +7 -0
  25. data/bin/fluent-ca-generate +6 -0
  26. data/bin/fluent-cap-ctl +7 -0
  27. data/bin/fluent-cat +5 -0
  28. data/bin/fluent-ctl +7 -0
  29. data/bin/fluent-debug +5 -0
  30. data/bin/fluent-gem +9 -0
  31. data/bin/fluent-plugin-config-format +5 -0
  32. data/bin/fluent-plugin-generate +5 -0
  33. data/bin/fluentd +15 -0
  34. data/code-of-conduct.md +3 -0
  35. data/docs/SECURITY_AUDIT.pdf +0 -0
  36. data/example/copy_roundrobin.conf +39 -0
  37. data/example/counter.conf +18 -0
  38. data/example/filter_stdout.conf +22 -0
  39. data/example/in_forward.conf +14 -0
  40. data/example/in_forward_client.conf +37 -0
  41. data/example/in_forward_shared_key.conf +15 -0
  42. data/example/in_forward_tls.conf +14 -0
  43. data/example/in_forward_users.conf +24 -0
  44. data/example/in_forward_workers.conf +21 -0
  45. data/example/in_http.conf +16 -0
  46. data/example/in_out_forward.conf +17 -0
  47. data/example/in_sample_blocks.conf +17 -0
  48. data/example/in_sample_with_compression.conf +23 -0
  49. data/example/in_syslog.conf +15 -0
  50. data/example/in_tail.conf +14 -0
  51. data/example/in_tcp.conf +13 -0
  52. data/example/in_udp.conf +13 -0
  53. data/example/logevents.conf +25 -0
  54. data/example/multi_filters.conf +61 -0
  55. data/example/out_copy.conf +20 -0
  56. data/example/out_exec_filter.conf +42 -0
  57. data/example/out_file.conf +13 -0
  58. data/example/out_forward.conf +35 -0
  59. data/example/out_forward_buf_file.conf +23 -0
  60. data/example/out_forward_client.conf +109 -0
  61. data/example/out_forward_heartbeat_none.conf +16 -0
  62. data/example/out_forward_sd.conf +17 -0
  63. data/example/out_forward_shared_key.conf +36 -0
  64. data/example/out_forward_tls.conf +18 -0
  65. data/example/out_forward_users.conf +65 -0
  66. data/example/out_null.conf +36 -0
  67. data/example/sd.yaml +8 -0
  68. data/example/secondary_file.conf +42 -0
  69. data/example/suppress_config_dump.conf +7 -0
  70. data/example/v0_12_filter.conf +78 -0
  71. data/example/v1_literal_example.conf +36 -0
  72. data/example/worker_section.conf +36 -0
  73. data/fluent.conf +139 -0
  74. data/fluentd.gemspec +54 -0
  75. data/lib/fluent/agent.rb +168 -0
  76. data/lib/fluent/capability.rb +87 -0
  77. data/lib/fluent/clock.rb +66 -0
  78. data/lib/fluent/command/binlog_reader.rb +244 -0
  79. data/lib/fluent/command/bundler_injection.rb +45 -0
  80. data/lib/fluent/command/ca_generate.rb +184 -0
  81. data/lib/fluent/command/cap_ctl.rb +174 -0
  82. data/lib/fluent/command/cat.rb +365 -0
  83. data/lib/fluent/command/ctl.rb +180 -0
  84. data/lib/fluent/command/debug.rb +103 -0
  85. data/lib/fluent/command/fluentd.rb +374 -0
  86. data/lib/fluent/command/plugin_config_formatter.rb +308 -0
  87. data/lib/fluent/command/plugin_generator.rb +365 -0
  88. data/lib/fluent/compat/call_super_mixin.rb +76 -0
  89. data/lib/fluent/compat/detach_process_mixin.rb +33 -0
  90. data/lib/fluent/compat/exec_util.rb +129 -0
  91. data/lib/fluent/compat/file_util.rb +54 -0
  92. data/lib/fluent/compat/filter.rb +68 -0
  93. data/lib/fluent/compat/formatter.rb +111 -0
  94. data/lib/fluent/compat/formatter_utils.rb +85 -0
  95. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  96. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  97. data/lib/fluent/compat/input.rb +49 -0
  98. data/lib/fluent/compat/output.rb +721 -0
  99. data/lib/fluent/compat/output_chain.rb +60 -0
  100. data/lib/fluent/compat/parser.rb +310 -0
  101. data/lib/fluent/compat/parser_utils.rb +40 -0
  102. data/lib/fluent/compat/propagate_default.rb +62 -0
  103. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  104. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  105. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  106. data/lib/fluent/compat/socket_util.rb +165 -0
  107. data/lib/fluent/compat/string_util.rb +34 -0
  108. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  109. data/lib/fluent/compat/type_converter.rb +90 -0
  110. data/lib/fluent/config/basic_parser.rb +123 -0
  111. data/lib/fluent/config/configure_proxy.rb +424 -0
  112. data/lib/fluent/config/dsl.rb +152 -0
  113. data/lib/fluent/config/element.rb +265 -0
  114. data/lib/fluent/config/error.rb +44 -0
  115. data/lib/fluent/config/literal_parser.rb +286 -0
  116. data/lib/fluent/config/parser.rb +107 -0
  117. data/lib/fluent/config/section.rb +272 -0
  118. data/lib/fluent/config/types.rb +249 -0
  119. data/lib/fluent/config/v1_parser.rb +192 -0
  120. data/lib/fluent/config/yaml_parser/fluent_value.rb +47 -0
  121. data/lib/fluent/config/yaml_parser/loader.rb +108 -0
  122. data/lib/fluent/config/yaml_parser/parser.rb +166 -0
  123. data/lib/fluent/config/yaml_parser/section_builder.rb +107 -0
  124. data/lib/fluent/config/yaml_parser.rb +56 -0
  125. data/lib/fluent/config.rb +89 -0
  126. data/lib/fluent/configurable.rb +201 -0
  127. data/lib/fluent/counter/base_socket.rb +44 -0
  128. data/lib/fluent/counter/client.rb +297 -0
  129. data/lib/fluent/counter/error.rb +86 -0
  130. data/lib/fluent/counter/mutex_hash.rb +163 -0
  131. data/lib/fluent/counter/server.rb +273 -0
  132. data/lib/fluent/counter/store.rb +205 -0
  133. data/lib/fluent/counter/validator.rb +145 -0
  134. data/lib/fluent/counter.rb +23 -0
  135. data/lib/fluent/daemon.rb +13 -0
  136. data/lib/fluent/daemonizer.rb +88 -0
  137. data/lib/fluent/engine.rb +253 -0
  138. data/lib/fluent/env.rb +40 -0
  139. data/lib/fluent/error.rb +37 -0
  140. data/lib/fluent/event.rb +330 -0
  141. data/lib/fluent/event_router.rb +315 -0
  142. data/lib/fluent/ext_monitor_require.rb +28 -0
  143. data/lib/fluent/file_wrapper.rb +137 -0
  144. data/lib/fluent/filter.rb +21 -0
  145. data/lib/fluent/fluent_log_event_router.rb +139 -0
  146. data/lib/fluent/formatter.rb +23 -0
  147. data/lib/fluent/input.rb +21 -0
  148. data/lib/fluent/label.rb +46 -0
  149. data/lib/fluent/load.rb +34 -0
  150. data/lib/fluent/log/console_adapter.rb +66 -0
  151. data/lib/fluent/log.rb +752 -0
  152. data/lib/fluent/match.rb +187 -0
  153. data/lib/fluent/mixin.rb +31 -0
  154. data/lib/fluent/msgpack_factory.rb +111 -0
  155. data/lib/fluent/oj_options.rb +61 -0
  156. data/lib/fluent/output.rb +29 -0
  157. data/lib/fluent/output_chain.rb +23 -0
  158. data/lib/fluent/parser.rb +23 -0
  159. data/lib/fluent/plugin/bare_output.rb +104 -0
  160. data/lib/fluent/plugin/base.rb +214 -0
  161. data/lib/fluent/plugin/buf_file.rb +242 -0
  162. data/lib/fluent/plugin/buf_file_single.rb +254 -0
  163. data/lib/fluent/plugin/buf_memory.rb +34 -0
  164. data/lib/fluent/plugin/buffer/chunk.rb +240 -0
  165. data/lib/fluent/plugin/buffer/file_chunk.rb +413 -0
  166. data/lib/fluent/plugin/buffer/file_single_chunk.rb +310 -0
  167. data/lib/fluent/plugin/buffer/memory_chunk.rb +91 -0
  168. data/lib/fluent/plugin/buffer.rb +941 -0
  169. data/lib/fluent/plugin/compressable.rb +96 -0
  170. data/lib/fluent/plugin/exec_util.rb +22 -0
  171. data/lib/fluent/plugin/file_util.rb +22 -0
  172. data/lib/fluent/plugin/filter.rb +127 -0
  173. data/lib/fluent/plugin/filter_grep.rb +189 -0
  174. data/lib/fluent/plugin/filter_parser.rb +130 -0
  175. data/lib/fluent/plugin/filter_record_transformer.rb +324 -0
  176. data/lib/fluent/plugin/filter_stdout.rb +53 -0
  177. data/lib/fluent/plugin/formatter.rb +75 -0
  178. data/lib/fluent/plugin/formatter_csv.rb +78 -0
  179. data/lib/fluent/plugin/formatter_hash.rb +35 -0
  180. data/lib/fluent/plugin/formatter_json.rb +59 -0
  181. data/lib/fluent/plugin/formatter_ltsv.rb +44 -0
  182. data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
  183. data/lib/fluent/plugin/formatter_out_file.rb +53 -0
  184. data/lib/fluent/plugin/formatter_single_value.rb +36 -0
  185. data/lib/fluent/plugin/formatter_stdout.rb +76 -0
  186. data/lib/fluent/plugin/formatter_tsv.rb +40 -0
  187. data/lib/fluent/plugin/in_debug_agent.rb +71 -0
  188. data/lib/fluent/plugin/in_dummy.rb +18 -0
  189. data/lib/fluent/plugin/in_exec.rb +110 -0
  190. data/lib/fluent/plugin/in_forward.rb +473 -0
  191. data/lib/fluent/plugin/in_gc_stat.rb +72 -0
  192. data/lib/fluent/plugin/in_http.rb +677 -0
  193. data/lib/fluent/plugin/in_monitor_agent.rb +412 -0
  194. data/lib/fluent/plugin/in_object_space.rb +93 -0
  195. data/lib/fluent/plugin/in_sample.rb +141 -0
  196. data/lib/fluent/plugin/in_syslog.rb +276 -0
  197. data/lib/fluent/plugin/in_tail/group_watch.rb +204 -0
  198. data/lib/fluent/plugin/in_tail/position_file.rb +269 -0
  199. data/lib/fluent/plugin/in_tail.rb +1299 -0
  200. data/lib/fluent/plugin/in_tcp.rb +226 -0
  201. data/lib/fluent/plugin/in_udp.rb +92 -0
  202. data/lib/fluent/plugin/in_unix.rb +195 -0
  203. data/lib/fluent/plugin/input.rb +75 -0
  204. data/lib/fluent/plugin/metrics.rb +119 -0
  205. data/lib/fluent/plugin/metrics_local.rb +96 -0
  206. data/lib/fluent/plugin/multi_output.rb +195 -0
  207. data/lib/fluent/plugin/out_copy.rb +120 -0
  208. data/lib/fluent/plugin/out_exec.rb +105 -0
  209. data/lib/fluent/plugin/out_exec_filter.rb +319 -0
  210. data/lib/fluent/plugin/out_file.rb +340 -0
  211. data/lib/fluent/plugin/out_forward/ack_handler.rb +176 -0
  212. data/lib/fluent/plugin/out_forward/connection_manager.rb +113 -0
  213. data/lib/fluent/plugin/out_forward/error.rb +28 -0
  214. data/lib/fluent/plugin/out_forward/failure_detector.rb +84 -0
  215. data/lib/fluent/plugin/out_forward/handshake_protocol.rb +125 -0
  216. data/lib/fluent/plugin/out_forward/load_balancer.rb +114 -0
  217. data/lib/fluent/plugin/out_forward/socket_cache.rb +142 -0
  218. data/lib/fluent/plugin/out_forward.rb +826 -0
  219. data/lib/fluent/plugin/out_http.rb +275 -0
  220. data/lib/fluent/plugin/out_null.rb +74 -0
  221. data/lib/fluent/plugin/out_relabel.rb +32 -0
  222. data/lib/fluent/plugin/out_roundrobin.rb +84 -0
  223. data/lib/fluent/plugin/out_secondary_file.rb +148 -0
  224. data/lib/fluent/plugin/out_stdout.rb +74 -0
  225. data/lib/fluent/plugin/out_stream.rb +130 -0
  226. data/lib/fluent/plugin/output.rb +1603 -0
  227. data/lib/fluent/plugin/owned_by_mixin.rb +41 -0
  228. data/lib/fluent/plugin/parser.rb +274 -0
  229. data/lib/fluent/plugin/parser_apache.rb +28 -0
  230. data/lib/fluent/plugin/parser_apache2.rb +88 -0
  231. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  232. data/lib/fluent/plugin/parser_csv.rb +114 -0
  233. data/lib/fluent/plugin/parser_json.rb +96 -0
  234. data/lib/fluent/plugin/parser_ltsv.rb +51 -0
  235. data/lib/fluent/plugin/parser_msgpack.rb +50 -0
  236. data/lib/fluent/plugin/parser_multiline.rb +152 -0
  237. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  238. data/lib/fluent/plugin/parser_none.rb +36 -0
  239. data/lib/fluent/plugin/parser_regexp.rb +68 -0
  240. data/lib/fluent/plugin/parser_syslog.rb +496 -0
  241. data/lib/fluent/plugin/parser_tsv.rb +42 -0
  242. data/lib/fluent/plugin/sd_file.rb +156 -0
  243. data/lib/fluent/plugin/sd_srv.rb +135 -0
  244. data/lib/fluent/plugin/sd_static.rb +58 -0
  245. data/lib/fluent/plugin/service_discovery.rb +65 -0
  246. data/lib/fluent/plugin/socket_util.rb +22 -0
  247. data/lib/fluent/plugin/storage.rb +84 -0
  248. data/lib/fluent/plugin/storage_local.rb +162 -0
  249. data/lib/fluent/plugin/string_util.rb +22 -0
  250. data/lib/fluent/plugin.rb +206 -0
  251. data/lib/fluent/plugin_helper/cert_option.rb +191 -0
  252. data/lib/fluent/plugin_helper/child_process.rb +369 -0
  253. data/lib/fluent/plugin_helper/compat_parameters.rb +343 -0
  254. data/lib/fluent/plugin_helper/counter.rb +51 -0
  255. data/lib/fluent/plugin_helper/event_emitter.rb +100 -0
  256. data/lib/fluent/plugin_helper/event_loop.rb +170 -0
  257. data/lib/fluent/plugin_helper/extract.rb +104 -0
  258. data/lib/fluent/plugin_helper/formatter.rb +147 -0
  259. data/lib/fluent/plugin_helper/http_server/app.rb +79 -0
  260. data/lib/fluent/plugin_helper/http_server/compat/server.rb +92 -0
  261. data/lib/fluent/plugin_helper/http_server/compat/ssl_context_extractor.rb +52 -0
  262. data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
  263. data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
  264. data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
  265. data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
  266. data/lib/fluent/plugin_helper/http_server/server.rb +94 -0
  267. data/lib/fluent/plugin_helper/http_server/ssl_context_builder.rb +41 -0
  268. data/lib/fluent/plugin_helper/http_server.rb +135 -0
  269. data/lib/fluent/plugin_helper/inject.rb +154 -0
  270. data/lib/fluent/plugin_helper/metrics.rb +129 -0
  271. data/lib/fluent/plugin_helper/parser.rb +147 -0
  272. data/lib/fluent/plugin_helper/record_accessor.rb +207 -0
  273. data/lib/fluent/plugin_helper/retry_state.rb +219 -0
  274. data/lib/fluent/plugin_helper/server.rb +828 -0
  275. data/lib/fluent/plugin_helper/service_discovery/manager.rb +146 -0
  276. data/lib/fluent/plugin_helper/service_discovery/round_robin_balancer.rb +43 -0
  277. data/lib/fluent/plugin_helper/service_discovery.rb +125 -0
  278. data/lib/fluent/plugin_helper/socket.rb +288 -0
  279. data/lib/fluent/plugin_helper/socket_option.rb +98 -0
  280. data/lib/fluent/plugin_helper/storage.rb +349 -0
  281. data/lib/fluent/plugin_helper/thread.rb +180 -0
  282. data/lib/fluent/plugin_helper/timer.rb +92 -0
  283. data/lib/fluent/plugin_helper.rb +75 -0
  284. data/lib/fluent/plugin_id.rb +93 -0
  285. data/lib/fluent/process.rb +22 -0
  286. data/lib/fluent/registry.rb +117 -0
  287. data/lib/fluent/root_agent.rb +372 -0
  288. data/lib/fluent/rpc.rb +95 -0
  289. data/lib/fluent/static_config_analysis.rb +194 -0
  290. data/lib/fluent/supervisor.rb +1076 -0
  291. data/lib/fluent/system_config.rb +189 -0
  292. data/lib/fluent/test/base.rb +78 -0
  293. data/lib/fluent/test/driver/base.rb +231 -0
  294. data/lib/fluent/test/driver/base_owned.rb +83 -0
  295. data/lib/fluent/test/driver/base_owner.rb +135 -0
  296. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  297. data/lib/fluent/test/driver/filter.rb +61 -0
  298. data/lib/fluent/test/driver/formatter.rb +30 -0
  299. data/lib/fluent/test/driver/input.rb +31 -0
  300. data/lib/fluent/test/driver/multi_output.rb +53 -0
  301. data/lib/fluent/test/driver/output.rb +102 -0
  302. data/lib/fluent/test/driver/parser.rb +30 -0
  303. data/lib/fluent/test/driver/storage.rb +30 -0
  304. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  305. data/lib/fluent/test/filter_test.rb +77 -0
  306. data/lib/fluent/test/formatter_test.rb +65 -0
  307. data/lib/fluent/test/helpers.rb +134 -0
  308. data/lib/fluent/test/input_test.rb +174 -0
  309. data/lib/fluent/test/log.rb +79 -0
  310. data/lib/fluent/test/output_test.rb +156 -0
  311. data/lib/fluent/test/parser_test.rb +70 -0
  312. data/lib/fluent/test/startup_shutdown.rb +44 -0
  313. data/lib/fluent/test.rb +58 -0
  314. data/lib/fluent/time.rb +512 -0
  315. data/lib/fluent/timezone.rb +171 -0
  316. data/lib/fluent/tls.rb +81 -0
  317. data/lib/fluent/unique_id.rb +39 -0
  318. data/lib/fluent/variable_store.rb +40 -0
  319. data/lib/fluent/version.rb +21 -0
  320. data/lib/fluent/win32api.rb +38 -0
  321. data/lib/fluent/winsvc.rb +100 -0
  322. data/templates/new_gem/Gemfile +3 -0
  323. data/templates/new_gem/README.md.erb +43 -0
  324. data/templates/new_gem/Rakefile +13 -0
  325. data/templates/new_gem/fluent-plugin.gemspec.erb +27 -0
  326. data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
  327. data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
  328. data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
  329. data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
  330. data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
  331. data/templates/new_gem/lib/fluent/plugin/storage.rb.erb +40 -0
  332. data/templates/new_gem/test/helper.rb.erb +7 -0
  333. data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
  334. data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
  335. data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
  336. data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
  337. data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
  338. data/templates/new_gem/test/plugin/test_storage.rb.erb +18 -0
  339. data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
  340. data/templates/plugin_config_formatter/param.md-table.erb +10 -0
  341. data/templates/plugin_config_formatter/param.md.erb +34 -0
  342. data/templates/plugin_config_formatter/section.md.erb +12 -0
  343. data/test/command/test_binlog_reader.rb +362 -0
  344. data/test/command/test_ca_generate.rb +70 -0
  345. data/test/command/test_cap_ctl.rb +100 -0
  346. data/test/command/test_cat.rb +128 -0
  347. data/test/command/test_ctl.rb +56 -0
  348. data/test/command/test_fluentd.rb +1291 -0
  349. data/test/command/test_plugin_config_formatter.rb +397 -0
  350. data/test/command/test_plugin_generator.rb +109 -0
  351. data/test/compat/test_calls_super.rb +166 -0
  352. data/test/compat/test_parser.rb +92 -0
  353. data/test/config/assertions.rb +42 -0
  354. data/test/config/test_config_parser.rb +551 -0
  355. data/test/config/test_configurable.rb +1784 -0
  356. data/test/config/test_configure_proxy.rb +604 -0
  357. data/test/config/test_dsl.rb +415 -0
  358. data/test/config/test_element.rb +518 -0
  359. data/test/config/test_literal_parser.rb +309 -0
  360. data/test/config/test_plugin_configuration.rb +56 -0
  361. data/test/config/test_section.rb +191 -0
  362. data/test/config/test_system_config.rb +195 -0
  363. data/test/config/test_types.rb +408 -0
  364. data/test/counter/test_client.rb +563 -0
  365. data/test/counter/test_error.rb +44 -0
  366. data/test/counter/test_mutex_hash.rb +179 -0
  367. data/test/counter/test_server.rb +589 -0
  368. data/test/counter/test_store.rb +258 -0
  369. data/test/counter/test_validator.rb +137 -0
  370. data/test/helper.rb +155 -0
  371. data/test/helpers/fuzzy_assert.rb +89 -0
  372. data/test/helpers/process_extenstion.rb +33 -0
  373. data/test/log/test_console_adapter.rb +110 -0
  374. data/test/plugin/data/2010/01/20100102-030405.log +0 -0
  375. data/test/plugin/data/2010/01/20100102-030406.log +0 -0
  376. data/test/plugin/data/2010/01/20100102.log +0 -0
  377. data/test/plugin/data/log/bar +0 -0
  378. data/test/plugin/data/log/foo/bar.log +0 -0
  379. data/test/plugin/data/log/foo/bar2 +0 -0
  380. data/test/plugin/data/log/test.log +0 -0
  381. data/test/plugin/data/sd_file/config +11 -0
  382. data/test/plugin/data/sd_file/config.json +17 -0
  383. data/test/plugin/data/sd_file/config.yaml +11 -0
  384. data/test/plugin/data/sd_file/config.yml +11 -0
  385. data/test/plugin/data/sd_file/invalid_config.yml +7 -0
  386. data/test/plugin/in_tail/test_fifo.rb +121 -0
  387. data/test/plugin/in_tail/test_io_handler.rb +150 -0
  388. data/test/plugin/in_tail/test_position_file.rb +346 -0
  389. data/test/plugin/out_forward/test_ack_handler.rb +140 -0
  390. data/test/plugin/out_forward/test_connection_manager.rb +145 -0
  391. data/test/plugin/out_forward/test_handshake_protocol.rb +112 -0
  392. data/test/plugin/out_forward/test_load_balancer.rb +106 -0
  393. data/test/plugin/out_forward/test_socket_cache.rb +174 -0
  394. data/test/plugin/test_bare_output.rb +131 -0
  395. data/test/plugin/test_base.rb +247 -0
  396. data/test/plugin/test_buf_file.rb +1314 -0
  397. data/test/plugin/test_buf_file_single.rb +898 -0
  398. data/test/plugin/test_buf_memory.rb +42 -0
  399. data/test/plugin/test_buffer.rb +1434 -0
  400. data/test/plugin/test_buffer_chunk.rb +209 -0
  401. data/test/plugin/test_buffer_file_chunk.rb +871 -0
  402. data/test/plugin/test_buffer_file_single_chunk.rb +611 -0
  403. data/test/plugin/test_buffer_memory_chunk.rb +339 -0
  404. data/test/plugin/test_compressable.rb +87 -0
  405. data/test/plugin/test_file_util.rb +96 -0
  406. data/test/plugin/test_filter.rb +368 -0
  407. data/test/plugin/test_filter_grep.rb +697 -0
  408. data/test/plugin/test_filter_parser.rb +731 -0
  409. data/test/plugin/test_filter_record_transformer.rb +577 -0
  410. data/test/plugin/test_filter_stdout.rb +207 -0
  411. data/test/plugin/test_formatter_csv.rb +136 -0
  412. data/test/plugin/test_formatter_hash.rb +38 -0
  413. data/test/plugin/test_formatter_json.rb +61 -0
  414. data/test/plugin/test_formatter_ltsv.rb +70 -0
  415. data/test/plugin/test_formatter_msgpack.rb +28 -0
  416. data/test/plugin/test_formatter_out_file.rb +116 -0
  417. data/test/plugin/test_formatter_single_value.rb +44 -0
  418. data/test/plugin/test_formatter_tsv.rb +76 -0
  419. data/test/plugin/test_in_debug_agent.rb +49 -0
  420. data/test/plugin/test_in_exec.rb +261 -0
  421. data/test/plugin/test_in_forward.rb +1178 -0
  422. data/test/plugin/test_in_gc_stat.rb +62 -0
  423. data/test/plugin/test_in_http.rb +1102 -0
  424. data/test/plugin/test_in_monitor_agent.rb +922 -0
  425. data/test/plugin/test_in_object_space.rb +66 -0
  426. data/test/plugin/test_in_sample.rb +190 -0
  427. data/test/plugin/test_in_syslog.rb +505 -0
  428. data/test/plugin/test_in_tail.rb +3125 -0
  429. data/test/plugin/test_in_tcp.rb +328 -0
  430. data/test/plugin/test_in_udp.rb +296 -0
  431. data/test/plugin/test_in_unix.rb +181 -0
  432. data/test/plugin/test_input.rb +137 -0
  433. data/test/plugin/test_metadata.rb +89 -0
  434. data/test/plugin/test_metrics.rb +294 -0
  435. data/test/plugin/test_metrics_local.rb +96 -0
  436. data/test/plugin/test_multi_output.rb +204 -0
  437. data/test/plugin/test_out_copy.rb +308 -0
  438. data/test/plugin/test_out_exec.rb +312 -0
  439. data/test/plugin/test_out_exec_filter.rb +606 -0
  440. data/test/plugin/test_out_file.rb +1038 -0
  441. data/test/plugin/test_out_forward.rb +1361 -0
  442. data/test/plugin/test_out_http.rb +429 -0
  443. data/test/plugin/test_out_null.rb +105 -0
  444. data/test/plugin/test_out_relabel.rb +28 -0
  445. data/test/plugin/test_out_roundrobin.rb +146 -0
  446. data/test/plugin/test_out_secondary_file.rb +458 -0
  447. data/test/plugin/test_out_stdout.rb +205 -0
  448. data/test/plugin/test_out_stream.rb +103 -0
  449. data/test/plugin/test_output.rb +1334 -0
  450. data/test/plugin/test_output_as_buffered.rb +2024 -0
  451. data/test/plugin/test_output_as_buffered_backup.rb +363 -0
  452. data/test/plugin/test_output_as_buffered_compress.rb +179 -0
  453. data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
  454. data/test/plugin/test_output_as_buffered_retries.rb +966 -0
  455. data/test/plugin/test_output_as_buffered_secondary.rb +882 -0
  456. data/test/plugin/test_output_as_standard.rb +374 -0
  457. data/test/plugin/test_owned_by.rb +34 -0
  458. data/test/plugin/test_parser.rb +399 -0
  459. data/test/plugin/test_parser_apache.rb +42 -0
  460. data/test/plugin/test_parser_apache2.rb +47 -0
  461. data/test/plugin/test_parser_apache_error.rb +45 -0
  462. data/test/plugin/test_parser_csv.rb +200 -0
  463. data/test/plugin/test_parser_json.rb +138 -0
  464. data/test/plugin/test_parser_labeled_tsv.rb +160 -0
  465. data/test/plugin/test_parser_multiline.rb +111 -0
  466. data/test/plugin/test_parser_nginx.rb +88 -0
  467. data/test/plugin/test_parser_none.rb +52 -0
  468. data/test/plugin/test_parser_regexp.rb +284 -0
  469. data/test/plugin/test_parser_syslog.rb +650 -0
  470. data/test/plugin/test_parser_tsv.rb +122 -0
  471. data/test/plugin/test_sd_file.rb +228 -0
  472. data/test/plugin/test_sd_srv.rb +230 -0
  473. data/test/plugin/test_storage.rb +166 -0
  474. data/test/plugin/test_storage_local.rb +335 -0
  475. data/test/plugin/test_string_util.rb +26 -0
  476. data/test/plugin_helper/data/cert/cert-key.pem +27 -0
  477. data/test/plugin_helper/data/cert/cert-with-CRLF.pem +19 -0
  478. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
  479. data/test/plugin_helper/data/cert/cert.pem +19 -0
  480. data/test/plugin_helper/data/cert/cert_chains/ca-cert-key.pem +27 -0
  481. data/test/plugin_helper/data/cert/cert_chains/ca-cert.pem +20 -0
  482. data/test/plugin_helper/data/cert/cert_chains/cert-key.pem +27 -0
  483. data/test/plugin_helper/data/cert/cert_chains/cert.pem +40 -0
  484. data/test/plugin_helper/data/cert/empty.pem +0 -0
  485. data/test/plugin_helper/data/cert/generate_cert.rb +125 -0
  486. data/test/plugin_helper/data/cert/with_ca/ca-cert-key-pass.pem +30 -0
  487. data/test/plugin_helper/data/cert/with_ca/ca-cert-key.pem +27 -0
  488. data/test/plugin_helper/data/cert/with_ca/ca-cert-pass.pem +20 -0
  489. data/test/plugin_helper/data/cert/with_ca/ca-cert.pem +20 -0
  490. data/test/plugin_helper/data/cert/with_ca/cert-key-pass.pem +30 -0
  491. data/test/plugin_helper/data/cert/with_ca/cert-key.pem +27 -0
  492. data/test/plugin_helper/data/cert/with_ca/cert-pass.pem +21 -0
  493. data/test/plugin_helper/data/cert/with_ca/cert.pem +21 -0
  494. data/test/plugin_helper/data/cert/without_ca/cert-key-pass.pem +30 -0
  495. data/test/plugin_helper/data/cert/without_ca/cert-key.pem +27 -0
  496. data/test/plugin_helper/data/cert/without_ca/cert-pass.pem +20 -0
  497. data/test/plugin_helper/data/cert/without_ca/cert.pem +20 -0
  498. data/test/plugin_helper/http_server/test_app.rb +65 -0
  499. data/test/plugin_helper/http_server/test_route.rb +32 -0
  500. data/test/plugin_helper/service_discovery/test_manager.rb +93 -0
  501. data/test/plugin_helper/service_discovery/test_round_robin_balancer.rb +21 -0
  502. data/test/plugin_helper/test_cert_option.rb +25 -0
  503. data/test/plugin_helper/test_child_process.rb +862 -0
  504. data/test/plugin_helper/test_compat_parameters.rb +358 -0
  505. data/test/plugin_helper/test_event_emitter.rb +80 -0
  506. data/test/plugin_helper/test_event_loop.rb +52 -0
  507. data/test/plugin_helper/test_extract.rb +194 -0
  508. data/test/plugin_helper/test_formatter.rb +255 -0
  509. data/test/plugin_helper/test_http_server_helper.rb +372 -0
  510. data/test/plugin_helper/test_inject.rb +561 -0
  511. data/test/plugin_helper/test_metrics.rb +137 -0
  512. data/test/plugin_helper/test_parser.rb +264 -0
  513. data/test/plugin_helper/test_record_accessor.rb +238 -0
  514. data/test/plugin_helper/test_retry_state.rb +1006 -0
  515. data/test/plugin_helper/test_server.rb +1895 -0
  516. data/test/plugin_helper/test_service_discovery.rb +165 -0
  517. data/test/plugin_helper/test_socket.rb +146 -0
  518. data/test/plugin_helper/test_storage.rb +542 -0
  519. data/test/plugin_helper/test_thread.rb +164 -0
  520. data/test/plugin_helper/test_timer.rb +130 -0
  521. data/test/scripts/exec_script.rb +32 -0
  522. data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +7 -0
  523. data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +7 -0
  524. data/test/scripts/fluent/plugin/formatter_known.rb +8 -0
  525. data/test/scripts/fluent/plugin/out_test.rb +81 -0
  526. data/test/scripts/fluent/plugin/out_test2.rb +80 -0
  527. data/test/scripts/fluent/plugin/parser_known.rb +4 -0
  528. data/test/test_capability.rb +74 -0
  529. data/test/test_clock.rb +164 -0
  530. data/test/test_config.rb +369 -0
  531. data/test/test_configdsl.rb +148 -0
  532. data/test/test_daemonizer.rb +91 -0
  533. data/test/test_engine.rb +203 -0
  534. data/test/test_event.rb +531 -0
  535. data/test/test_event_router.rb +348 -0
  536. data/test/test_event_time.rb +199 -0
  537. data/test/test_file_wrapper.rb +53 -0
  538. data/test/test_filter.rb +121 -0
  539. data/test/test_fluent_log_event_router.rb +99 -0
  540. data/test/test_formatter.rb +369 -0
  541. data/test/test_input.rb +31 -0
  542. data/test/test_log.rb +1076 -0
  543. data/test/test_match.rb +148 -0
  544. data/test/test_mixin.rb +351 -0
  545. data/test/test_msgpack_factory.rb +50 -0
  546. data/test/test_oj_options.rb +55 -0
  547. data/test/test_output.rb +278 -0
  548. data/test/test_plugin.rb +251 -0
  549. data/test/test_plugin_classes.rb +370 -0
  550. data/test/test_plugin_helper.rb +81 -0
  551. data/test/test_plugin_id.rb +119 -0
  552. data/test/test_process.rb +14 -0
  553. data/test/test_root_agent.rb +951 -0
  554. data/test/test_static_config_analysis.rb +177 -0
  555. data/test/test_supervisor.rb +821 -0
  556. data/test/test_test_drivers.rb +136 -0
  557. data/test/test_time_formatter.rb +301 -0
  558. data/test/test_time_parser.rb +362 -0
  559. data/test/test_tls.rb +65 -0
  560. data/test/test_unique_id.rb +47 -0
  561. data/test/test_variable_store.rb +65 -0
  562. metadata +1183 -0
@@ -0,0 +1,677 @@
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
+ elsif ndjson = params['ndjson']
318
+ events = []
319
+ ndjson.split(/\r?\n/).each do |js|
320
+ @parser_json.parse(js) do |_time, record|
321
+ events.push(record)
322
+ end
323
+ end
324
+ return nil, events
325
+ else
326
+ raise "'json', 'ndjson' or 'msgpack' parameter is required"
327
+ end
328
+ end
329
+
330
+ def parse_params_with_parser(params)
331
+ if content = params[EVENT_RECORD_PARAMETER]
332
+ @custom_parser.parse(content) { |time, record|
333
+ raise "Received event is not #{@format_name}: #{content}" if record.nil?
334
+ return time, record
335
+ }
336
+ else
337
+ raise "'#{EVENT_RECORD_PARAMETER}' parameter is required"
338
+ end
339
+ end
340
+
341
+ def add_params_to_record(record, params)
342
+ if @add_http_headers
343
+ params.each_pair { |k, v|
344
+ if k.start_with?("HTTP_".freeze)
345
+ record[k] = v
346
+ end
347
+ }
348
+ end
349
+
350
+ if @add_query_params
351
+ params.each_pair { |k, v|
352
+ if k.start_with?("QUERY_".freeze)
353
+ record[k] = v
354
+ end
355
+ }
356
+ end
357
+
358
+ if @add_remote_addr
359
+ record['REMOTE_ADDR'] = params['REMOTE_ADDR']
360
+ end
361
+ end
362
+
363
+ def convert_time_field(record)
364
+ if t = @default_keep_time_key ? record[@parser_time_key] : record.delete(@parser_time_key)
365
+ if @default_time_parser
366
+ @default_time_parser.parse(t)
367
+ else
368
+ Fluent::EventTime.from_time(Time.at(t))
369
+ end
370
+ else
371
+ Fluent::EventTime.now
372
+ end
373
+ end
374
+
375
+ class Handler
376
+ attr_reader :content_type
377
+
378
+ def initialize(io, km, callback, body_size_limit, format_name, log,
379
+ cors_allow_origins, cors_allow_credentials, add_query_params)
380
+ @io = io
381
+ @km = km
382
+ @callback = callback
383
+ @body_size_limit = body_size_limit
384
+ @next_close = false
385
+ @format_name = format_name
386
+ @log = log
387
+ @cors_allow_origins = cors_allow_origins
388
+ @cors_allow_credentials = cors_allow_credentials
389
+ @idle = 0
390
+ @add_query_params = add_query_params
391
+ @km.add(self)
392
+
393
+ @remote_port, @remote_addr = io.remote_port, io.remote_addr
394
+ @parser = Http::Parser.new(self)
395
+ end
396
+
397
+ def step_idle
398
+ @idle += 1
399
+ end
400
+
401
+ def on_close
402
+ @km.delete(self)
403
+ end
404
+
405
+ def on_read(data)
406
+ @idle = 0
407
+ @parser << data
408
+ rescue
409
+ @log.warn "unexpected error", error: $!.to_s
410
+ @log.warn_backtrace
411
+ @io.close
412
+ end
413
+
414
+ def on_message_begin
415
+ @body = ''
416
+ end
417
+
418
+ def on_headers_complete(headers)
419
+ expect = nil
420
+ size = nil
421
+
422
+ if @parser.http_version == [1, 1]
423
+ @keep_alive = true
424
+ else
425
+ @keep_alive = false
426
+ end
427
+ @env = {}
428
+ @content_type = ""
429
+ @content_encoding = ""
430
+ headers.each_pair {|k,v|
431
+ @env["HTTP_#{k.tr('-','_').upcase}"] = v
432
+ case k
433
+ when /\AExpect\z/i
434
+ expect = v
435
+ when /\AContent-Length\Z/i
436
+ size = v.to_i
437
+ when /\AContent-Type\Z/i
438
+ @content_type = v
439
+ when /\AContent-Encoding\Z/i
440
+ @content_encoding = v
441
+ when /\AConnection\Z/i
442
+ if /close/i.match?(v)
443
+ @keep_alive = false
444
+ elsif /Keep-alive/i.match?(v)
445
+ @keep_alive = true
446
+ end
447
+ when /\AOrigin\Z/i
448
+ @origin = v
449
+ when /\AX-Forwarded-For\Z/i
450
+ # For multiple X-Forwarded-For headers. Use first header value.
451
+ v = v.first if v.is_a?(Array)
452
+ @remote_addr = v.split(",").first
453
+ when /\AAccess-Control-Request-Method\Z/i
454
+ @access_control_request_method = v
455
+ when /\AAccess-Control-Request-Headers\Z/i
456
+ @access_control_request_headers = v
457
+ end
458
+ }
459
+ if expect
460
+ if expect == '100-continue'.freeze
461
+ if !size || size < @body_size_limit
462
+ send_response_nobody("100 Continue", {})
463
+ else
464
+ send_response_and_close("413 Request Entity Too Large", {}, "Too large")
465
+ end
466
+ else
467
+ send_response_and_close("417 Expectation Failed", {}, "")
468
+ end
469
+ end
470
+ end
471
+
472
+ def on_body(chunk)
473
+ if @body.bytesize + chunk.bytesize > @body_size_limit
474
+ unless closing?
475
+ send_response_and_close("413 Request Entity Too Large", {}, "Too large")
476
+ end
477
+ return
478
+ end
479
+ @body << chunk
480
+ end
481
+
482
+ RES_200_STATUS = "200 OK".freeze
483
+ RES_403_STATUS = "403 Forbidden".freeze
484
+
485
+ # Azure App Service sends GET requests for health checking purpose.
486
+ # Respond with `200 OK` to accommodate it.
487
+ def handle_get_request
488
+ return send_response_and_close(RES_200_STATUS, {}, "")
489
+ end
490
+
491
+ # Web browsers can send an OPTIONS request before performing POST
492
+ # to check if cross-origin requests are supported.
493
+ def handle_options_request
494
+ # Is CORS enabled in the first place?
495
+ if @cors_allow_origins.nil?
496
+ return send_response_and_close(RES_403_STATUS, {}, "")
497
+ end
498
+
499
+ # in_http does not support HTTP methods except POST
500
+ if @access_control_request_method != 'POST'
501
+ return send_response_and_close(RES_403_STATUS, {}, "")
502
+ end
503
+
504
+ header = {
505
+ "Access-Control-Allow-Methods" => "POST",
506
+ "Access-Control-Allow-Headers" => @access_control_request_headers || "",
507
+ }
508
+
509
+ # Check the origin and send back a CORS response
510
+ if @cors_allow_origins.include?('*')
511
+ header["Access-Control-Allow-Origin"] = "*"
512
+ send_response_and_close(RES_200_STATUS, header, "")
513
+ elsif include_cors_allow_origin
514
+ header["Access-Control-Allow-Origin"] = @origin
515
+ if @cors_allow_credentials
516
+ header["Access-Control-Allow-Credentials"] = true
517
+ end
518
+ send_response_and_close(RES_200_STATUS, header, "")
519
+ else
520
+ send_response_and_close(RES_403_STATUS, {}, "")
521
+ end
522
+ end
523
+
524
+ def on_message_complete
525
+ return if closing?
526
+
527
+ if @parser.http_method == 'GET'.freeze
528
+ return handle_get_request()
529
+ end
530
+
531
+ if @parser.http_method == 'OPTIONS'.freeze
532
+ return handle_options_request()
533
+ end
534
+
535
+ # CORS check
536
+ # ==========
537
+ # For every incoming request, we check if we have some CORS
538
+ # restrictions and allow listed origins through @cors_allow_origins.
539
+ unless @cors_allow_origins.nil?
540
+ unless @cors_allow_origins.include?('*') || include_cors_allow_origin
541
+ send_response_and_close(RES_403_STATUS, {'Connection' => 'close'}, "")
542
+ return
543
+ end
544
+ end
545
+
546
+ # Content Encoding
547
+ # =================
548
+ # Decode payload according to the "Content-Encoding" header.
549
+ # For now, we only support 'gzip' and 'deflate'.
550
+ begin
551
+ if @content_encoding == 'gzip'.freeze
552
+ @body = Zlib::GzipReader.new(StringIO.new(@body)).read
553
+ elsif @content_encoding == 'deflate'.freeze
554
+ @body = Zlib::Inflate.inflate(@body)
555
+ end
556
+ rescue
557
+ @log.warn 'fails to decode payload', error: $!.to_s
558
+ send_response_and_close(RES_400_STATUS, {}, "")
559
+ return
560
+ end
561
+
562
+ @env['REMOTE_ADDR'] = @remote_addr if @remote_addr
563
+
564
+ uri = URI.parse(@parser.request_url)
565
+ params = WEBrick::HTTPUtils.parse_query(uri.query)
566
+
567
+ if @format_name != 'default'
568
+ params[EVENT_RECORD_PARAMETER] = @body
569
+ elsif /^application\/x-www-form-urlencoded/.match?(@content_type)
570
+ params.update WEBrick::HTTPUtils.parse_query(@body)
571
+ elsif @content_type =~ /^multipart\/form-data; boundary=(.+)/
572
+ boundary = WEBrick::HTTPUtils.dequote($1)
573
+ params.update WEBrick::HTTPUtils.parse_form_data(@body, boundary)
574
+ elsif /^application\/json/.match?(@content_type)
575
+ params['json'] = @body
576
+ elsif /^application\/msgpack/.match?(@content_type)
577
+ params['msgpack'] = @body
578
+ elsif /^application\/x-ndjson/.match?(@content_type)
579
+ params['ndjson'] = @body
580
+ end
581
+ path_info = uri.path
582
+
583
+ if (@add_query_params)
584
+
585
+ query_params = WEBrick::HTTPUtils.parse_query(uri.query)
586
+
587
+ query_params.each_pair {|k,v|
588
+ params["QUERY_#{k.tr('-','_').upcase}"] = v
589
+ }
590
+ end
591
+
592
+ params.merge!(@env)
593
+
594
+ @env.clear
595
+
596
+ code, header, body = @callback.call(path_info, params)
597
+ body = body.to_s
598
+ header = header.dup if header.frozen?
599
+
600
+ unless @cors_allow_origins.nil?
601
+ if @cors_allow_origins.include?('*')
602
+ header['Access-Control-Allow-Origin'] = '*'
603
+ elsif include_cors_allow_origin
604
+ header['Access-Control-Allow-Origin'] = @origin
605
+ if @cors_allow_credentials
606
+ header["Access-Control-Allow-Credentials"] = true
607
+ end
608
+ end
609
+ end
610
+
611
+ if @keep_alive
612
+ header['Connection'] = 'Keep-Alive'.freeze
613
+ send_response(code, header, body)
614
+ else
615
+ send_response_and_close(code, header, body)
616
+ end
617
+ end
618
+
619
+ def close
620
+ @io.close
621
+ end
622
+
623
+ def on_write_complete
624
+ @io.close if @next_close
625
+ end
626
+
627
+ def send_response_and_close(code, header, body)
628
+ send_response(code, header, body)
629
+ @next_close = true
630
+ end
631
+
632
+ def closing?
633
+ @next_close
634
+ end
635
+
636
+ def send_response(code, header, body)
637
+ header['Content-Length'] ||= body.bytesize
638
+ header['Content-Type'] ||= 'text/plain'.freeze
639
+
640
+ data = %[HTTP/1.1 #{code}\r\n]
641
+ header.each_pair {|k,v|
642
+ data << "#{k}: #{v}\r\n"
643
+ }
644
+ data << "\r\n".freeze
645
+ @io.write(data)
646
+
647
+ @io.write(body)
648
+ end
649
+
650
+ def send_response_nobody(code, header)
651
+ data = %[HTTP/1.1 #{code}\r\n]
652
+ header.each_pair {|k,v|
653
+ data << "#{k}: #{v}\r\n"
654
+ }
655
+ data << "\r\n".freeze
656
+ @io.write(data)
657
+ end
658
+
659
+ def include_cors_allow_origin
660
+ if @origin.nil?
661
+ return false
662
+ end
663
+
664
+ if @cors_allow_origins.include?(@origin)
665
+ return true
666
+ end
667
+ filtered_cors_allow_origins = @cors_allow_origins.select {|origin| origin != ""}
668
+ r = filtered_cors_allow_origins.find do |origin|
669
+ (start_str, end_str) = origin.split("*", 2)
670
+ @origin.start_with?(start_str) && @origin.end_with?(end_str)
671
+ end
672
+
673
+ !r.nil?
674
+ end
675
+ end
676
+ end
677
+ end