fluid_cli 0.1.2
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.
- checksums.yaml +7 -0
- data/README.md +1 -0
- data/dev.yml +5 -0
- data/exe/fluid +24 -0
- data/lib/fluid_cli/api.rb +135 -0
- data/lib/fluid_cli/assets/post_auth_page/index.html.erb +34 -0
- data/lib/fluid_cli/assets/post_auth_page/style.css +58 -0
- data/lib/fluid_cli/command.rb +55 -0
- data/lib/fluid_cli/commands/help.rb +21 -0
- data/lib/fluid_cli/commands/login.rb +30 -0
- data/lib/fluid_cli/commands/logout.rb +38 -0
- data/lib/fluid_cli/commands/switch.rb +23 -0
- data/lib/fluid_cli/commands/theme/common/company_helper.rb +15 -0
- data/lib/fluid_cli/commands/theme/common/root_helper.rb +95 -0
- data/lib/fluid_cli/commands/theme/dev.rb +61 -0
- data/lib/fluid_cli/commands/theme/help.rb +21 -0
- data/lib/fluid_cli/commands/theme/init.rb +46 -0
- data/lib/fluid_cli/commands/theme/pull.rb +68 -0
- data/lib/fluid_cli/commands/theme/push.rb +132 -0
- data/lib/fluid_cli/commands/theme.rb +23 -0
- data/lib/fluid_cli/commands/whoami.rb +23 -0
- data/lib/fluid_cli/commands.rb +19 -0
- data/lib/fluid_cli/company_switcher.rb +69 -0
- data/lib/fluid_cli/context.rb +691 -0
- data/lib/fluid_cli/db.rb +114 -0
- data/lib/fluid_cli/entry_point.rb +10 -0
- data/lib/fluid_cli/environment.rb +32 -0
- data/lib/fluid_cli/file_system_listener.rb +29 -0
- data/lib/fluid_cli/form.rb +42 -0
- data/lib/fluid_cli/git.rb +319 -0
- data/lib/fluid_cli/http_request.rb +54 -0
- data/lib/fluid_cli/identity_auth/servlet.rb +39 -0
- data/lib/fluid_cli/identity_auth.rb +126 -0
- data/lib/fluid_cli/options.rb +38 -0
- data/lib/fluid_cli/theme/dev_server/certificate_manager.rb +79 -0
- data/lib/fluid_cli/theme/dev_server/errors.rb +9 -0
- data/lib/fluid_cli/theme/dev_server/header_hash.rb +98 -0
- data/lib/fluid_cli/theme/dev_server/hooks/file_change_hook.rb +39 -0
- data/lib/fluid_cli/theme/dev_server/hot_reload/resources/hot-reload-no-script.html +27 -0
- data/lib/fluid_cli/theme/dev_server/hot_reload/resources/hot_reload.js +28 -0
- data/lib/fluid_cli/theme/dev_server/hot_reload/resources/sse_client.js +43 -0
- data/lib/fluid_cli/theme/dev_server/hot_reload/resources/theme.js +16 -0
- data/lib/fluid_cli/theme/dev_server/hot_reload/script_injector.rb +54 -0
- data/lib/fluid_cli/theme/dev_server/hot_reload.rb +75 -0
- data/lib/fluid_cli/theme/dev_server/local_assets.rb +92 -0
- data/lib/fluid_cli/theme/dev_server/proxy.rb +235 -0
- data/lib/fluid_cli/theme/dev_server/proxy_param_builder.rb +82 -0
- data/lib/fluid_cli/theme/dev_server/reload_mode.rb +34 -0
- data/lib/fluid_cli/theme/dev_server/sse.rb +75 -0
- data/lib/fluid_cli/theme/dev_server/watcher.rb +57 -0
- data/lib/fluid_cli/theme/dev_server/web_server.rb +140 -0
- data/lib/fluid_cli/theme/dev_server.rb +289 -0
- data/lib/fluid_cli/theme/development_theme.rb +101 -0
- data/lib/fluid_cli/theme/file.rb +105 -0
- data/lib/fluid_cli/theme/forms/select.rb +33 -0
- data/lib/fluid_cli/theme/mime_type.rb +34 -0
- data/lib/fluid_cli/theme/presenters/theme_presenter.rb +49 -0
- data/lib/fluid_cli/theme/presenters/themes_presenter.rb +31 -0
- data/lib/fluid_cli/theme/root.rb +62 -0
- data/lib/fluid_cli/theme/syncer/checksums.rb +66 -0
- data/lib/fluid_cli/theme/syncer/downloader.rb +54 -0
- data/lib/fluid_cli/theme/syncer/error_reporter.rb +45 -0
- data/lib/fluid_cli/theme/syncer/merger.rb +53 -0
- data/lib/fluid_cli/theme/syncer/operation.rb +58 -0
- data/lib/fluid_cli/theme/syncer/standard_reporter.rb +32 -0
- data/lib/fluid_cli/theme/syncer/unsupported_script_warning.rb +90 -0
- data/lib/fluid_cli/theme/syncer/uploader/forms/apply_to_all.rb +41 -0
- data/lib/fluid_cli/theme/syncer/uploader/forms/apply_to_all_form.rb +37 -0
- data/lib/fluid_cli/theme/syncer/uploader/forms/base_strategy_form.rb +64 -0
- data/lib/fluid_cli/theme/syncer/uploader/forms/select_delete_strategy.rb +29 -0
- data/lib/fluid_cli/theme/syncer/uploader/forms/select_update_strategy.rb +30 -0
- data/lib/fluid_cli/theme/syncer/uploader/json_delete_handler.rb +49 -0
- data/lib/fluid_cli/theme/syncer/uploader/json_update_handler.rb +71 -0
- data/lib/fluid_cli/theme/syncer/uploader.rb +105 -0
- data/lib/fluid_cli/theme/syncer.rb +412 -0
- data/lib/fluid_cli/theme/theme.rb +186 -0
- data/lib/fluid_cli/theme/ui/sync_progress_bar.rb +22 -0
- data/lib/fluid_cli/thread_pool/job.rb +35 -0
- data/lib/fluid_cli/thread_pool.rb +49 -0
- data/lib/fluid_cli/version.rb +3 -0
- data/lib/fluid_cli.rb +59 -0
- data/vendor/deps/base64/.document +5 -0
- data/vendor/deps/base64/.gitignore +9 -0
- data/vendor/deps/base64/BSDL +22 -0
- data/vendor/deps/base64/COPYING +56 -0
- data/vendor/deps/base64/Gemfile +9 -0
- data/vendor/deps/base64/LEGAL +60 -0
- data/vendor/deps/base64/README.md +48 -0
- data/vendor/deps/base64/Rakefile +31 -0
- data/vendor/deps/base64/base64.gemspec +28 -0
- data/vendor/deps/base64/bin/console +14 -0
- data/vendor/deps/base64/bin/setup +8 -0
- data/vendor/deps/base64/lib/base64.rb +382 -0
- data/vendor/deps/base64/sig/base64.rbs +358 -0
- data/vendor/deps/base64/test/base64/test_base64.rb +115 -0
- data/vendor/deps/base64/test_sig/test_base64.rb +44 -0
- data/vendor/deps/cli-kit/REVISION +1 -0
- data/vendor/deps/cli-kit/lib/cli/kit/args/definition.rb +286 -0
- data/vendor/deps/cli-kit/lib/cli/kit/args/evaluation.rb +215 -0
- data/vendor/deps/cli-kit/lib/cli/kit/args/parser/node.rb +128 -0
- data/vendor/deps/cli-kit/lib/cli/kit/args/parser.rb +125 -0
- data/vendor/deps/cli-kit/lib/cli/kit/args/tokenizer.rb +130 -0
- data/vendor/deps/cli-kit/lib/cli/kit/args.rb +16 -0
- data/vendor/deps/cli-kit/lib/cli/kit/base_command.rb +30 -0
- data/vendor/deps/cli-kit/lib/cli/kit/command_help.rb +268 -0
- data/vendor/deps/cli-kit/lib/cli/kit/command_registry.rb +150 -0
- data/vendor/deps/cli-kit/lib/cli/kit/config.rb +137 -0
- data/vendor/deps/cli-kit/lib/cli/kit/core_ext.rb +28 -0
- data/vendor/deps/cli-kit/lib/cli/kit/error_handler.rb +166 -0
- data/vendor/deps/cli-kit/lib/cli/kit/executor.rb +92 -0
- data/vendor/deps/cli-kit/lib/cli/kit/ini.rb +91 -0
- data/vendor/deps/cli-kit/lib/cli/kit/levenshtein.rb +92 -0
- data/vendor/deps/cli-kit/lib/cli/kit/logger.rb +94 -0
- data/vendor/deps/cli-kit/lib/cli/kit/opts.rb +248 -0
- data/vendor/deps/cli-kit/lib/cli/kit/parse_args.rb +55 -0
- data/vendor/deps/cli-kit/lib/cli/kit/resolver.rb +66 -0
- data/vendor/deps/cli-kit/lib/cli/kit/support/test_helper.rb +260 -0
- data/vendor/deps/cli-kit/lib/cli/kit/support.rb +11 -0
- data/vendor/deps/cli-kit/lib/cli/kit/system.rb +290 -0
- data/vendor/deps/cli-kit/lib/cli/kit/util.rb +118 -0
- data/vendor/deps/cli-kit/lib/cli/kit/version.rb +7 -0
- data/vendor/deps/cli-kit/lib/cli/kit.rb +139 -0
- data/vendor/deps/cli-ui/REVISION +1 -0
- data/vendor/deps/cli-ui/lib/cli/ui/ansi.rb +218 -0
- data/vendor/deps/cli-ui/lib/cli/ui/color.rb +101 -0
- data/vendor/deps/cli-ui/lib/cli/ui/formatter.rb +219 -0
- data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_stack.rb +67 -0
- data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style/box.rb +179 -0
- data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style/bracket.rb +152 -0
- data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style.rb +127 -0
- data/vendor/deps/cli-ui/lib/cli/ui/frame.rb +286 -0
- data/vendor/deps/cli-ui/lib/cli/ui/glyph.rb +92 -0
- data/vendor/deps/cli-ui/lib/cli/ui/os.rb +63 -0
- data/vendor/deps/cli-ui/lib/cli/ui/printer.rb +64 -0
- data/vendor/deps/cli-ui/lib/cli/ui/progress.rb +132 -0
- data/vendor/deps/cli-ui/lib/cli/ui/progress_reporter.rb +209 -0
- data/vendor/deps/cli-ui/lib/cli/ui/prompt/interactive_options.rb +583 -0
- data/vendor/deps/cli-ui/lib/cli/ui/prompt/options_handler.rb +36 -0
- data/vendor/deps/cli-ui/lib/cli/ui/prompt.rb +381 -0
- data/vendor/deps/cli-ui/lib/cli/ui/spinner/async.rb +48 -0
- data/vendor/deps/cli-ui/lib/cli/ui/spinner/spin_group.rb +602 -0
- data/vendor/deps/cli-ui/lib/cli/ui/spinner.rb +79 -0
- data/vendor/deps/cli-ui/lib/cli/ui/stdout_router.rb +399 -0
- data/vendor/deps/cli-ui/lib/cli/ui/table.rb +83 -0
- data/vendor/deps/cli-ui/lib/cli/ui/terminal.rb +55 -0
- data/vendor/deps/cli-ui/lib/cli/ui/truncater.rb +106 -0
- data/vendor/deps/cli-ui/lib/cli/ui/version.rb +8 -0
- data/vendor/deps/cli-ui/lib/cli/ui/widgets/base.rb +46 -0
- data/vendor/deps/cli-ui/lib/cli/ui/widgets/status.rb +79 -0
- data/vendor/deps/cli-ui/lib/cli/ui/widgets.rb +89 -0
- data/vendor/deps/cli-ui/lib/cli/ui/work_queue.rb +142 -0
- data/vendor/deps/cli-ui/lib/cli/ui/wrap.rb +61 -0
- data/vendor/deps/cli-ui/lib/cli/ui.rb +359 -0
- data/vendor/deps/cli-ui/vendor/reentrant_mutex.rb +78 -0
- data/vendor/deps/debug/CONTRIBUTING.md +573 -0
- data/vendor/deps/debug/Gemfile +10 -0
- data/vendor/deps/debug/LICENSE.txt +22 -0
- data/vendor/deps/debug/README.md +996 -0
- data/vendor/deps/debug/Rakefile +57 -0
- data/vendor/deps/debug/TODO.md +23 -0
- data/vendor/deps/debug/debug.gemspec +33 -0
- data/vendor/deps/debug/exe/rdbg +53 -0
- data/vendor/deps/debug/ext/debug/Makefile +273 -0
- data/vendor/deps/debug/ext/debug/debug.c +228 -0
- data/vendor/deps/debug/ext/debug/debug_version.h +1 -0
- data/vendor/deps/debug/ext/debug/extconf.rb +27 -0
- data/vendor/deps/debug/ext/debug/iseq_collector.c +93 -0
- data/vendor/deps/debug/lib/debug/abbrev_command.rb +77 -0
- data/vendor/deps/debug/lib/debug/breakpoint.rb +556 -0
- data/vendor/deps/debug/lib/debug/client.rb +263 -0
- data/vendor/deps/debug/lib/debug/color.rb +123 -0
- data/vendor/deps/debug/lib/debug/config.rb +592 -0
- data/vendor/deps/debug/lib/debug/console.rb +224 -0
- data/vendor/deps/debug/lib/debug/dap_custom/traceInspector.rb +336 -0
- data/vendor/deps/debug/lib/debug/debug.bundle +0 -0
- data/vendor/deps/debug/lib/debug/frame_info.rb +190 -0
- data/vendor/deps/debug/lib/debug/irb_integration.rb +37 -0
- data/vendor/deps/debug/lib/debug/local.rb +115 -0
- data/vendor/deps/debug/lib/debug/open.rb +13 -0
- data/vendor/deps/debug/lib/debug/open_nonstop.rb +15 -0
- data/vendor/deps/debug/lib/debug/prelude.rb +50 -0
- data/vendor/deps/debug/lib/debug/server.rb +534 -0
- data/vendor/deps/debug/lib/debug/server_cdp.rb +1348 -0
- data/vendor/deps/debug/lib/debug/server_dap.rb +1108 -0
- data/vendor/deps/debug/lib/debug/session.rb +2667 -0
- data/vendor/deps/debug/lib/debug/source_repository.rb +150 -0
- data/vendor/deps/debug/lib/debug/start.rb +5 -0
- data/vendor/deps/debug/lib/debug/thread_client.rb +1457 -0
- data/vendor/deps/debug/lib/debug/tracer.rb +241 -0
- data/vendor/deps/debug/lib/debug/version.rb +5 -0
- data/vendor/deps/debug/lib/debug.rb +9 -0
- data/vendor/deps/debug/misc/README.md.erb +660 -0
- data/vendor/deps/listen/.github/release-drafter.yml +17 -0
- data/vendor/deps/listen/.github/workflows/development.yml +67 -0
- data/vendor/deps/listen/.github/workflows/push.yml +12 -0
- data/vendor/deps/listen/.gitignore +28 -0
- data/vendor/deps/listen/.rspec +3 -0
- data/vendor/deps/listen/.rubocop.yml +283 -0
- data/vendor/deps/listen/.yardopts +11 -0
- data/vendor/deps/listen/CHANGELOG.md +1 -0
- data/vendor/deps/listen/CONTRIBUTING.md +45 -0
- data/vendor/deps/listen/Gemfile +33 -0
- data/vendor/deps/listen/Guardfile +26 -0
- data/vendor/deps/listen/LICENSE.txt +22 -0
- data/vendor/deps/listen/README.md +490 -0
- data/vendor/deps/listen/Rakefile +154 -0
- data/vendor/deps/listen/bin/listen +11 -0
- data/vendor/deps/listen/lib/listen/adapter/base.rb +129 -0
- data/vendor/deps/listen/lib/listen/adapter/bsd.rb +104 -0
- data/vendor/deps/listen/lib/listen/adapter/config.rb +31 -0
- data/vendor/deps/listen/lib/listen/adapter/darwin.rb +77 -0
- data/vendor/deps/listen/lib/listen/adapter/linux.rb +108 -0
- data/vendor/deps/listen/lib/listen/adapter/polling.rb +40 -0
- data/vendor/deps/listen/lib/listen/adapter/windows.rb +96 -0
- data/vendor/deps/listen/lib/listen/adapter.rb +43 -0
- data/vendor/deps/listen/lib/listen/backend.rb +40 -0
- data/vendor/deps/listen/lib/listen/change.rb +69 -0
- data/vendor/deps/listen/lib/listen/cli.rb +65 -0
- data/vendor/deps/listen/lib/listen/directory.rb +93 -0
- data/vendor/deps/listen/lib/listen/error.rb +11 -0
- data/vendor/deps/listen/lib/listen/event/config.rb +39 -0
- data/vendor/deps/listen/lib/listen/event/loop.rb +92 -0
- data/vendor/deps/listen/lib/listen/event/processor.rb +128 -0
- data/vendor/deps/listen/lib/listen/event/queue.rb +52 -0
- data/vendor/deps/listen/lib/listen/file.rb +95 -0
- data/vendor/deps/listen/lib/listen/fsm.rb +131 -0
- data/vendor/deps/listen/lib/listen/listener/config.rb +41 -0
- data/vendor/deps/listen/lib/listen/listener.rb +136 -0
- data/vendor/deps/listen/lib/listen/logger.rb +65 -0
- data/vendor/deps/listen/lib/listen/monotonic_time.rb +27 -0
- data/vendor/deps/listen/lib/listen/options.rb +24 -0
- data/vendor/deps/listen/lib/listen/queue_optimizer.rb +129 -0
- data/vendor/deps/listen/lib/listen/record/entry.rb +66 -0
- data/vendor/deps/listen/lib/listen/record/symlink_detector.rb +47 -0
- data/vendor/deps/listen/lib/listen/record.rb +122 -0
- data/vendor/deps/listen/lib/listen/silencer/controller.rb +50 -0
- data/vendor/deps/listen/lib/listen/silencer.rb +106 -0
- data/vendor/deps/listen/lib/listen/thread.rb +54 -0
- data/vendor/deps/listen/lib/listen/version.rb +5 -0
- data/vendor/deps/listen/lib/listen.rb +47 -0
- data/vendor/deps/listen/listen.gemspec +40 -0
- data/vendor/deps/listen/spec/acceptance/listen_spec.rb +320 -0
- data/vendor/deps/listen/spec/lib/listen/adapter/base_spec.rb +101 -0
- data/vendor/deps/listen/spec/lib/listen/adapter/bsd_spec.rb +13 -0
- data/vendor/deps/listen/spec/lib/listen/adapter/config_spec.rb +122 -0
- data/vendor/deps/listen/spec/lib/listen/adapter/darwin_spec.rb +82 -0
- data/vendor/deps/listen/spec/lib/listen/adapter/linux_spec.rb +199 -0
- data/vendor/deps/listen/spec/lib/listen/adapter/polling_spec.rb +83 -0
- data/vendor/deps/listen/spec/lib/listen/adapter/windows_spec.rb +13 -0
- data/vendor/deps/listen/spec/lib/listen/adapter_spec.rb +69 -0
- data/vendor/deps/listen/spec/lib/listen/backend_spec.rb +82 -0
- data/vendor/deps/listen/spec/lib/listen/change_spec.rb +102 -0
- data/vendor/deps/listen/spec/lib/listen/cli_spec.rb +116 -0
- data/vendor/deps/listen/spec/lib/listen/directory_spec.rb +284 -0
- data/vendor/deps/listen/spec/lib/listen/event/config_spec.rb +33 -0
- data/vendor/deps/listen/spec/lib/listen/event/loop_spec.rb +118 -0
- data/vendor/deps/listen/spec/lib/listen/event/processor_spec.rb +250 -0
- data/vendor/deps/listen/spec/lib/listen/event/queue_spec.rb +118 -0
- data/vendor/deps/listen/spec/lib/listen/file_spec.rb +254 -0
- data/vendor/deps/listen/spec/lib/listen/fsm_spec.rb +147 -0
- data/vendor/deps/listen/spec/lib/listen/listener/config_spec.rb +29 -0
- data/vendor/deps/listen/spec/lib/listen/listener_spec.rb +321 -0
- data/vendor/deps/listen/spec/lib/listen/logger_spec.rb +212 -0
- data/vendor/deps/listen/spec/lib/listen/monotonic_time_spec.rb +58 -0
- data/vendor/deps/listen/spec/lib/listen/queue_optimizer_spec.rb +111 -0
- data/vendor/deps/listen/spec/lib/listen/record_spec.rb +424 -0
- data/vendor/deps/listen/spec/lib/listen/silencer/controller_spec.rb +97 -0
- data/vendor/deps/listen/spec/lib/listen/silencer_spec.rb +109 -0
- data/vendor/deps/listen/spec/lib/listen/thread_spec.rb +133 -0
- data/vendor/deps/listen/spec/lib/listen_spec.rb +25 -0
- data/vendor/deps/listen/spec/spec_helper.rb +49 -0
- data/vendor/deps/listen/spec/support/acceptance_helper.rb +260 -0
- data/vendor/deps/listen/spec/support/fixtures_helper.rb +32 -0
- data/vendor/deps/listen/spec/support/platform_helper.rb +17 -0
- data/vendor/deps/observer/.github/dependabot.yml +6 -0
- data/vendor/deps/observer/.github/workflows/test.yml +33 -0
- data/vendor/deps/observer/.gitignore +8 -0
- data/vendor/deps/observer/BSDL +22 -0
- data/vendor/deps/observer/COPYING +56 -0
- data/vendor/deps/observer/Gemfile +9 -0
- data/vendor/deps/observer/README.md +139 -0
- data/vendor/deps/observer/Rakefile +10 -0
- data/vendor/deps/observer/bin/console +14 -0
- data/vendor/deps/observer/bin/setup +8 -0
- data/vendor/deps/observer/lib/observer.rb +229 -0
- data/vendor/deps/observer/observer.gemspec +32 -0
- data/vendor/deps/observer/test/test_observer.rb +66 -0
- data/vendor/deps/webrick/.gitignore +9 -0
- data/vendor/deps/webrick/Gemfile +3 -0
- data/vendor/deps/webrick/LICENSE.txt +22 -0
- data/vendor/deps/webrick/README.md +61 -0
- data/vendor/deps/webrick/Rakefile +10 -0
- data/vendor/deps/webrick/lib/webrick/accesslog.rb +157 -0
- data/vendor/deps/webrick/lib/webrick/cgi.rb +313 -0
- data/vendor/deps/webrick/lib/webrick/compat.rb +36 -0
- data/vendor/deps/webrick/lib/webrick/config.rb +158 -0
- data/vendor/deps/webrick/lib/webrick/cookie.rb +172 -0
- data/vendor/deps/webrick/lib/webrick/htmlutils.rb +30 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/authenticator.rb +117 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/basicauth.rb +116 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/digestauth.rb +395 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/htdigest.rb +132 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/htgroup.rb +97 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/htpasswd.rb +158 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/userdb.rb +53 -0
- data/vendor/deps/webrick/lib/webrick/httpauth.rb +96 -0
- data/vendor/deps/webrick/lib/webrick/httpproxy.rb +354 -0
- data/vendor/deps/webrick/lib/webrick/httprequest.rb +636 -0
- data/vendor/deps/webrick/lib/webrick/httpresponse.rb +564 -0
- data/vendor/deps/webrick/lib/webrick/https.rb +152 -0
- data/vendor/deps/webrick/lib/webrick/httpserver.rb +294 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet/abstract.rb +152 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet/cgi_runner.rb +47 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet/cgihandler.rb +126 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet/erbhandler.rb +88 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet/filehandler.rb +552 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet/prochandler.rb +47 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet.rb +23 -0
- data/vendor/deps/webrick/lib/webrick/httpstatus.rb +194 -0
- data/vendor/deps/webrick/lib/webrick/httputils.rb +512 -0
- data/vendor/deps/webrick/lib/webrick/httpversion.rb +76 -0
- data/vendor/deps/webrick/lib/webrick/log.rb +156 -0
- data/vendor/deps/webrick/lib/webrick/server.rb +381 -0
- data/vendor/deps/webrick/lib/webrick/ssl.rb +215 -0
- data/vendor/deps/webrick/lib/webrick/utils.rb +265 -0
- data/vendor/deps/webrick/lib/webrick/version.rb +18 -0
- data/vendor/deps/webrick/lib/webrick.rb +232 -0
- data/vendor/deps/webrick/webrick.gemspec +74 -0
- metadata +412 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
#--
|
|
3
|
+
# HTTPVersion.rb -- presentation of HTTP version
|
|
4
|
+
#
|
|
5
|
+
# Author: IPR -- Internet Programming with Ruby -- writers
|
|
6
|
+
# Copyright (c) 2002 Internet Programming with Ruby writers. All rights
|
|
7
|
+
# reserved.
|
|
8
|
+
#
|
|
9
|
+
# $IPR: httpversion.rb,v 1.5 2002/09/21 12:23:37 gotoyuzo Exp $
|
|
10
|
+
|
|
11
|
+
module WEBrick
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
# Represents an HTTP protocol version
|
|
15
|
+
|
|
16
|
+
class HTTPVersion
|
|
17
|
+
include Comparable
|
|
18
|
+
|
|
19
|
+
##
|
|
20
|
+
# The major protocol version number
|
|
21
|
+
|
|
22
|
+
attr_accessor :major
|
|
23
|
+
|
|
24
|
+
##
|
|
25
|
+
# The minor protocol version number
|
|
26
|
+
|
|
27
|
+
attr_accessor :minor
|
|
28
|
+
|
|
29
|
+
##
|
|
30
|
+
# Converts +version+ into an HTTPVersion
|
|
31
|
+
|
|
32
|
+
def self.convert(version)
|
|
33
|
+
version.is_a?(self) ? version : new(version)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
##
|
|
37
|
+
# Creates a new HTTPVersion from +version+.
|
|
38
|
+
|
|
39
|
+
def initialize(version)
|
|
40
|
+
case version
|
|
41
|
+
when HTTPVersion
|
|
42
|
+
@major, @minor = version.major, version.minor
|
|
43
|
+
when String
|
|
44
|
+
if /^(\d+)\.(\d+)$/ =~ version
|
|
45
|
+
@major, @minor = $1.to_i, $2.to_i
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
if @major.nil? || @minor.nil?
|
|
49
|
+
raise ArgumentError,
|
|
50
|
+
format("cannot convert %s into %s", version.class, self.class)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
##
|
|
55
|
+
# Compares this version with +other+ according to the HTTP specification
|
|
56
|
+
# rules.
|
|
57
|
+
|
|
58
|
+
def <=>(other)
|
|
59
|
+
unless other.is_a?(self.class)
|
|
60
|
+
other = self.class.new(other)
|
|
61
|
+
end
|
|
62
|
+
if (ret = @major <=> other.major) == 0
|
|
63
|
+
return @minor <=> other.minor
|
|
64
|
+
end
|
|
65
|
+
return ret
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
##
|
|
69
|
+
# The HTTP version as show in the HTTP request and response. For example,
|
|
70
|
+
# "1.1"
|
|
71
|
+
|
|
72
|
+
def to_s
|
|
73
|
+
format("%d.%d", @major, @minor)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
#--
|
|
3
|
+
# log.rb -- Log Class
|
|
4
|
+
#
|
|
5
|
+
# Author: IPR -- Internet Programming with Ruby -- writers
|
|
6
|
+
# Copyright (c) 2000, 2001 TAKAHASHI Masayoshi, GOTOU Yuuzou
|
|
7
|
+
# Copyright (c) 2002 Internet Programming with Ruby writers. All rights
|
|
8
|
+
# reserved.
|
|
9
|
+
#
|
|
10
|
+
# $IPR: log.rb,v 1.26 2002/10/06 17:06:10 gotoyuzo Exp $
|
|
11
|
+
|
|
12
|
+
module WEBrick
|
|
13
|
+
|
|
14
|
+
##
|
|
15
|
+
# A generic logging class
|
|
16
|
+
|
|
17
|
+
class BasicLog
|
|
18
|
+
|
|
19
|
+
# Fatal log level which indicates a server crash
|
|
20
|
+
|
|
21
|
+
FATAL = 1
|
|
22
|
+
|
|
23
|
+
# Error log level which indicates a recoverable error
|
|
24
|
+
|
|
25
|
+
ERROR = 2
|
|
26
|
+
|
|
27
|
+
# Warning log level which indicates a possible problem
|
|
28
|
+
|
|
29
|
+
WARN = 3
|
|
30
|
+
|
|
31
|
+
# Information log level which indicates possibly useful information
|
|
32
|
+
|
|
33
|
+
INFO = 4
|
|
34
|
+
|
|
35
|
+
# Debugging error level for messages used in server development or
|
|
36
|
+
# debugging
|
|
37
|
+
|
|
38
|
+
DEBUG = 5
|
|
39
|
+
|
|
40
|
+
# log-level, messages above this level will be logged
|
|
41
|
+
attr_accessor :level
|
|
42
|
+
|
|
43
|
+
##
|
|
44
|
+
# Initializes a new logger for +log_file+ that outputs messages at +level+
|
|
45
|
+
# or higher. +log_file+ can be a filename, an IO-like object that
|
|
46
|
+
# responds to #<< or nil which outputs to $stderr.
|
|
47
|
+
#
|
|
48
|
+
# If no level is given INFO is chosen by default
|
|
49
|
+
|
|
50
|
+
def initialize(log_file=nil, level=nil)
|
|
51
|
+
@level = level || INFO
|
|
52
|
+
case log_file
|
|
53
|
+
when String
|
|
54
|
+
@log = File.open(log_file, "a+")
|
|
55
|
+
@log.sync = true
|
|
56
|
+
@opened = true
|
|
57
|
+
when NilClass
|
|
58
|
+
@log = $stderr
|
|
59
|
+
else
|
|
60
|
+
@log = log_file # requires "<<". (see BasicLog#log)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
##
|
|
65
|
+
# Closes the logger (also closes the log device associated to the logger)
|
|
66
|
+
def close
|
|
67
|
+
@log.close if @opened
|
|
68
|
+
@log = nil
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
##
|
|
72
|
+
# Logs +data+ at +level+ if the given level is above the current log
|
|
73
|
+
# level.
|
|
74
|
+
|
|
75
|
+
def log(level, data)
|
|
76
|
+
if @log && level <= @level
|
|
77
|
+
data += "\n" if /\n\Z/ !~ data
|
|
78
|
+
@log << data
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
##
|
|
83
|
+
# Synonym for log(INFO, obj.to_s)
|
|
84
|
+
def <<(obj)
|
|
85
|
+
log(INFO, obj.to_s)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Shortcut for logging a FATAL message
|
|
89
|
+
def fatal(msg) log(FATAL, "FATAL " + format(msg)); end
|
|
90
|
+
# Shortcut for logging an ERROR message
|
|
91
|
+
def error(msg) log(ERROR, "ERROR " + format(msg)); end
|
|
92
|
+
# Shortcut for logging a WARN message
|
|
93
|
+
def warn(msg) log(WARN, "WARN " + format(msg)); end
|
|
94
|
+
# Shortcut for logging an INFO message
|
|
95
|
+
def info(msg) log(INFO, "INFO " + format(msg)); end
|
|
96
|
+
# Shortcut for logging a DEBUG message
|
|
97
|
+
def debug(msg) log(DEBUG, "DEBUG " + format(msg)); end
|
|
98
|
+
|
|
99
|
+
# Will the logger output FATAL messages?
|
|
100
|
+
def fatal?; @level >= FATAL; end
|
|
101
|
+
# Will the logger output ERROR messages?
|
|
102
|
+
def error?; @level >= ERROR; end
|
|
103
|
+
# Will the logger output WARN messages?
|
|
104
|
+
def warn?; @level >= WARN; end
|
|
105
|
+
# Will the logger output INFO messages?
|
|
106
|
+
def info?; @level >= INFO; end
|
|
107
|
+
# Will the logger output DEBUG messages?
|
|
108
|
+
def debug?; @level >= DEBUG; end
|
|
109
|
+
|
|
110
|
+
private
|
|
111
|
+
|
|
112
|
+
##
|
|
113
|
+
# Formats +arg+ for the logger
|
|
114
|
+
#
|
|
115
|
+
# * If +arg+ is an Exception, it will format the error message and
|
|
116
|
+
# the back trace.
|
|
117
|
+
# * If +arg+ responds to #to_str, it will return it.
|
|
118
|
+
# * Otherwise it will return +arg+.inspect.
|
|
119
|
+
def format(arg)
|
|
120
|
+
if arg.is_a?(Exception)
|
|
121
|
+
+"#{arg.class}: #{AccessLog.escape(arg.message)}\n\t" <<
|
|
122
|
+
arg.backtrace.join("\n\t") << "\n"
|
|
123
|
+
elsif arg.respond_to?(:to_str)
|
|
124
|
+
AccessLog.escape(arg.to_str)
|
|
125
|
+
else
|
|
126
|
+
arg.inspect
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
##
|
|
132
|
+
# A logging class that prepends a timestamp to each message.
|
|
133
|
+
|
|
134
|
+
class Log < BasicLog
|
|
135
|
+
# Format of the timestamp which is applied to each logged line. The
|
|
136
|
+
# default is <tt>"[%Y-%m-%d %H:%M:%S]"</tt>
|
|
137
|
+
attr_accessor :time_format
|
|
138
|
+
|
|
139
|
+
##
|
|
140
|
+
# Same as BasicLog#initialize
|
|
141
|
+
#
|
|
142
|
+
# You can set the timestamp format through #time_format
|
|
143
|
+
def initialize(log_file=nil, level=nil)
|
|
144
|
+
super(log_file, level)
|
|
145
|
+
@time_format = "[%Y-%m-%d %H:%M:%S]"
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
##
|
|
149
|
+
# Same as BasicLog#log
|
|
150
|
+
def log(level, data)
|
|
151
|
+
tmp = Time.now.strftime(@time_format)
|
|
152
|
+
tmp << " " << data
|
|
153
|
+
super(level, tmp)
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
#
|
|
3
|
+
# server.rb -- GenericServer Class
|
|
4
|
+
#
|
|
5
|
+
# Author: IPR -- Internet Programming with Ruby -- writers
|
|
6
|
+
# Copyright (c) 2000, 2001 TAKAHASHI Masayoshi, GOTOU Yuuzou
|
|
7
|
+
# Copyright (c) 2002 Internet Programming with Ruby writers. All rights
|
|
8
|
+
# reserved.
|
|
9
|
+
#
|
|
10
|
+
# $IPR: server.rb,v 1.62 2003/07/22 19:20:43 gotoyuzo Exp $
|
|
11
|
+
|
|
12
|
+
require 'socket'
|
|
13
|
+
require_relative 'config'
|
|
14
|
+
require_relative 'log'
|
|
15
|
+
|
|
16
|
+
module WEBrick
|
|
17
|
+
|
|
18
|
+
##
|
|
19
|
+
# Server error exception
|
|
20
|
+
|
|
21
|
+
class ServerError < StandardError; end
|
|
22
|
+
|
|
23
|
+
##
|
|
24
|
+
# Base server class
|
|
25
|
+
|
|
26
|
+
class SimpleServer
|
|
27
|
+
|
|
28
|
+
##
|
|
29
|
+
# A SimpleServer only yields when you start it
|
|
30
|
+
|
|
31
|
+
def SimpleServer.start
|
|
32
|
+
yield
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
##
|
|
37
|
+
# A generic module for daemonizing a process
|
|
38
|
+
|
|
39
|
+
class Daemon
|
|
40
|
+
|
|
41
|
+
##
|
|
42
|
+
# Performs the standard operations for daemonizing a process. Runs a
|
|
43
|
+
# block, if given.
|
|
44
|
+
|
|
45
|
+
def Daemon.start
|
|
46
|
+
Process.daemon
|
|
47
|
+
File.umask(0)
|
|
48
|
+
yield if block_given?
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
##
|
|
53
|
+
# Base TCP server class. You must subclass GenericServer and provide a #run
|
|
54
|
+
# method.
|
|
55
|
+
|
|
56
|
+
class GenericServer
|
|
57
|
+
|
|
58
|
+
##
|
|
59
|
+
# The server status. One of :Stop, :Running or :Shutdown
|
|
60
|
+
|
|
61
|
+
attr_reader :status
|
|
62
|
+
|
|
63
|
+
##
|
|
64
|
+
# The server configuration
|
|
65
|
+
|
|
66
|
+
attr_reader :config
|
|
67
|
+
|
|
68
|
+
##
|
|
69
|
+
# The server logger. This is independent from the HTTP access log.
|
|
70
|
+
|
|
71
|
+
attr_reader :logger
|
|
72
|
+
|
|
73
|
+
##
|
|
74
|
+
# Tokens control the number of outstanding clients. The
|
|
75
|
+
# <code>:MaxClients</code> configuration sets this.
|
|
76
|
+
|
|
77
|
+
attr_reader :tokens
|
|
78
|
+
|
|
79
|
+
##
|
|
80
|
+
# Sockets listening for connections.
|
|
81
|
+
|
|
82
|
+
attr_reader :listeners
|
|
83
|
+
|
|
84
|
+
##
|
|
85
|
+
# Creates a new generic server from +config+. The default configuration
|
|
86
|
+
# comes from +default+.
|
|
87
|
+
|
|
88
|
+
def initialize(config={}, default=Config::General)
|
|
89
|
+
@config = default.dup.update(config)
|
|
90
|
+
@status = :Stop
|
|
91
|
+
@config[:Logger] ||= Log::new
|
|
92
|
+
@logger = @config[:Logger]
|
|
93
|
+
|
|
94
|
+
@tokens = Thread::SizedQueue.new(@config[:MaxClients])
|
|
95
|
+
@config[:MaxClients].times{ @tokens.push(nil) }
|
|
96
|
+
|
|
97
|
+
webrickv = WEBrick::VERSION
|
|
98
|
+
rubyv = "#{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
|
|
99
|
+
@logger.info("WEBrick #{webrickv}")
|
|
100
|
+
@logger.info("ruby #{rubyv}")
|
|
101
|
+
|
|
102
|
+
@listeners = []
|
|
103
|
+
@shutdown_pipe = nil
|
|
104
|
+
unless @config[:DoNotListen]
|
|
105
|
+
raise ArgumentError, "Port must an integer" unless @config[:Port].to_s == @config[:Port].to_i.to_s
|
|
106
|
+
|
|
107
|
+
@config[:Port] = @config[:Port].to_i
|
|
108
|
+
if @config[:Listen]
|
|
109
|
+
warn(":Listen option is deprecated; use GenericServer#listen", uplevel: 1)
|
|
110
|
+
end
|
|
111
|
+
listen(@config[:BindAddress], @config[:Port])
|
|
112
|
+
if @config[:Port] == 0
|
|
113
|
+
@config[:Port] = @listeners[0].addr[1]
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
##
|
|
119
|
+
# Retrieves +key+ from the configuration
|
|
120
|
+
|
|
121
|
+
def [](key)
|
|
122
|
+
@config[key]
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
##
|
|
126
|
+
# Adds listeners from +address+ and +port+ to the server. See
|
|
127
|
+
# WEBrick::Utils::create_listeners for details.
|
|
128
|
+
|
|
129
|
+
def listen(address, port)
|
|
130
|
+
@listeners += Utils::create_listeners(address, port)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
##
|
|
134
|
+
# Starts the server and runs the +block+ for each connection. This method
|
|
135
|
+
# does not return until the server is stopped from a signal handler or
|
|
136
|
+
# another thread using #stop or #shutdown.
|
|
137
|
+
#
|
|
138
|
+
# If the block raises a subclass of StandardError the exception is logged
|
|
139
|
+
# and ignored. If an IOError or Errno::EBADF exception is raised the
|
|
140
|
+
# exception is ignored. If an Exception subclass is raised the exception
|
|
141
|
+
# is logged and re-raised which stops the server.
|
|
142
|
+
#
|
|
143
|
+
# To completely shut down a server call #shutdown from ensure:
|
|
144
|
+
#
|
|
145
|
+
# server = WEBrick::GenericServer.new
|
|
146
|
+
# # or WEBrick::HTTPServer.new
|
|
147
|
+
#
|
|
148
|
+
# begin
|
|
149
|
+
# server.start
|
|
150
|
+
# ensure
|
|
151
|
+
# server.shutdown
|
|
152
|
+
# end
|
|
153
|
+
|
|
154
|
+
def start(&block)
|
|
155
|
+
raise ServerError, "already started." if @status != :Stop
|
|
156
|
+
server_type = @config[:ServerType] || SimpleServer
|
|
157
|
+
|
|
158
|
+
setup_shutdown_pipe
|
|
159
|
+
|
|
160
|
+
server_type.start{
|
|
161
|
+
@logger.info \
|
|
162
|
+
"#{self.class}#start: pid=#{$$} port=#{@config[:Port]}"
|
|
163
|
+
@status = :Running
|
|
164
|
+
call_callback(:StartCallback)
|
|
165
|
+
|
|
166
|
+
shutdown_pipe = @shutdown_pipe
|
|
167
|
+
|
|
168
|
+
thgroup = ThreadGroup.new
|
|
169
|
+
begin
|
|
170
|
+
while @status == :Running
|
|
171
|
+
begin
|
|
172
|
+
sp = shutdown_pipe[0]
|
|
173
|
+
if svrs = IO.select([sp, *@listeners])
|
|
174
|
+
if svrs[0].include? sp
|
|
175
|
+
# swallow shutdown pipe
|
|
176
|
+
buf = String.new
|
|
177
|
+
nil while String ===
|
|
178
|
+
sp.read_nonblock([sp.nread, 8].max, buf, exception: false)
|
|
179
|
+
break
|
|
180
|
+
end
|
|
181
|
+
svrs[0].each{|svr|
|
|
182
|
+
@tokens.pop # blocks while no token is there.
|
|
183
|
+
if sock = accept_client(svr)
|
|
184
|
+
unless config[:DoNotReverseLookup].nil?
|
|
185
|
+
sock.do_not_reverse_lookup = !!config[:DoNotReverseLookup]
|
|
186
|
+
end
|
|
187
|
+
th = start_thread(sock, &block)
|
|
188
|
+
th[:WEBrickThread] = true
|
|
189
|
+
thgroup.add(th)
|
|
190
|
+
else
|
|
191
|
+
@tokens.push(nil)
|
|
192
|
+
end
|
|
193
|
+
}
|
|
194
|
+
end
|
|
195
|
+
rescue Errno::EBADF, Errno::ENOTSOCK, IOError => ex
|
|
196
|
+
# if the listening socket was closed in GenericServer#shutdown,
|
|
197
|
+
# IO::select raise it.
|
|
198
|
+
rescue StandardError => ex
|
|
199
|
+
msg = "#{ex.class}: #{ex.message}\n\t#{ex.backtrace[0]}"
|
|
200
|
+
@logger.error msg
|
|
201
|
+
rescue Exception => ex
|
|
202
|
+
@logger.fatal ex
|
|
203
|
+
raise
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
ensure
|
|
207
|
+
cleanup_shutdown_pipe(shutdown_pipe)
|
|
208
|
+
cleanup_listener
|
|
209
|
+
@status = :Shutdown
|
|
210
|
+
@logger.info "going to shutdown ..."
|
|
211
|
+
thgroup.list.each{|th| th.join if th[:WEBrickThread] }
|
|
212
|
+
call_callback(:StopCallback)
|
|
213
|
+
@logger.info "#{self.class}#start done."
|
|
214
|
+
@status = :Stop
|
|
215
|
+
end
|
|
216
|
+
}
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
##
|
|
220
|
+
# Stops the server from accepting new connections.
|
|
221
|
+
|
|
222
|
+
def stop
|
|
223
|
+
if @status == :Running
|
|
224
|
+
@status = :Shutdown
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
alarm_shutdown_pipe {|f| f.write_nonblock("\0")}
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
##
|
|
231
|
+
# Shuts down the server and all listening sockets. New listeners must be
|
|
232
|
+
# provided to restart the server.
|
|
233
|
+
|
|
234
|
+
def shutdown
|
|
235
|
+
stop
|
|
236
|
+
|
|
237
|
+
alarm_shutdown_pipe(&:close)
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
##
|
|
241
|
+
# You must subclass GenericServer and implement \#run which accepts a TCP
|
|
242
|
+
# client socket
|
|
243
|
+
|
|
244
|
+
def run(sock)
|
|
245
|
+
@logger.fatal "run() must be provided by user."
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
private
|
|
249
|
+
|
|
250
|
+
# :stopdoc:
|
|
251
|
+
|
|
252
|
+
##
|
|
253
|
+
# Accepts a TCP client socket from the TCP server socket +svr+ and returns
|
|
254
|
+
# the client socket.
|
|
255
|
+
|
|
256
|
+
def accept_client(svr)
|
|
257
|
+
case sock = svr.to_io.accept_nonblock(exception: false)
|
|
258
|
+
when :wait_readable
|
|
259
|
+
nil
|
|
260
|
+
else
|
|
261
|
+
if svr.respond_to?(:start_immediately)
|
|
262
|
+
sock = OpenSSL::SSL::SSLSocket.new(sock, ssl_context)
|
|
263
|
+
sock.sync_close = true
|
|
264
|
+
# we cannot do OpenSSL::SSL::SSLSocket#accept here because
|
|
265
|
+
# a slow client can prevent us from accepting connections
|
|
266
|
+
# from other clients
|
|
267
|
+
end
|
|
268
|
+
sock
|
|
269
|
+
end
|
|
270
|
+
rescue Errno::ECONNRESET, Errno::ECONNABORTED,
|
|
271
|
+
Errno::EPROTO, Errno::EINVAL
|
|
272
|
+
nil
|
|
273
|
+
rescue StandardError => ex
|
|
274
|
+
msg = "#{ex.class}: #{ex.message}\n\t#{ex.backtrace[0]}"
|
|
275
|
+
@logger.error msg
|
|
276
|
+
nil
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
##
|
|
280
|
+
# Starts a server thread for the client socket +sock+ that runs the given
|
|
281
|
+
# +block+.
|
|
282
|
+
#
|
|
283
|
+
# Sets the socket to the <code>:WEBrickSocket</code> thread local variable
|
|
284
|
+
# in the thread.
|
|
285
|
+
#
|
|
286
|
+
# If any errors occur in the block they are logged and handled.
|
|
287
|
+
|
|
288
|
+
def start_thread(sock, &block)
|
|
289
|
+
Thread.start{
|
|
290
|
+
begin
|
|
291
|
+
Thread.current[:WEBrickSocket] = sock
|
|
292
|
+
begin
|
|
293
|
+
addr = sock.peeraddr
|
|
294
|
+
@logger.debug "accept: #{addr[3]}:#{addr[1]}"
|
|
295
|
+
rescue SocketError
|
|
296
|
+
@logger.debug "accept: <address unknown>"
|
|
297
|
+
raise
|
|
298
|
+
end
|
|
299
|
+
if sock.respond_to?(:sync_close=) && @config[:SSLStartImmediately]
|
|
300
|
+
WEBrick::Utils.timeout(@config[:RequestTimeout]) do
|
|
301
|
+
begin
|
|
302
|
+
sock.accept # OpenSSL::SSL::SSLSocket#accept
|
|
303
|
+
rescue Errno::ECONNRESET, Errno::ECONNABORTED,
|
|
304
|
+
Errno::EPROTO, Errno::EINVAL
|
|
305
|
+
Thread.exit
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
call_callback(:AcceptCallback, sock)
|
|
310
|
+
block ? block.call(sock) : run(sock)
|
|
311
|
+
rescue Errno::ENOTCONN
|
|
312
|
+
@logger.debug "Errno::ENOTCONN raised"
|
|
313
|
+
rescue ServerError => ex
|
|
314
|
+
msg = "#{ex.class}: #{ex.message}\n\t#{ex.backtrace[0]}"
|
|
315
|
+
@logger.error msg
|
|
316
|
+
rescue Exception => ex
|
|
317
|
+
@logger.error ex
|
|
318
|
+
ensure
|
|
319
|
+
@tokens.push(nil)
|
|
320
|
+
Thread.current[:WEBrickSocket] = nil
|
|
321
|
+
if addr
|
|
322
|
+
@logger.debug "close: #{addr[3]}:#{addr[1]}"
|
|
323
|
+
else
|
|
324
|
+
@logger.debug "close: <address unknown>"
|
|
325
|
+
end
|
|
326
|
+
sock.close
|
|
327
|
+
end
|
|
328
|
+
}
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
##
|
|
332
|
+
# Calls the callback +callback_name+ from the configuration with +args+
|
|
333
|
+
|
|
334
|
+
def call_callback(callback_name, *args)
|
|
335
|
+
@config[callback_name]&.call(*args)
|
|
336
|
+
end
|
|
337
|
+
|
|
338
|
+
def setup_shutdown_pipe
|
|
339
|
+
return @shutdown_pipe ||= IO.pipe
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
def cleanup_shutdown_pipe(shutdown_pipe)
|
|
343
|
+
@shutdown_pipe = nil
|
|
344
|
+
shutdown_pipe&.each(&:close)
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
def alarm_shutdown_pipe
|
|
348
|
+
_, pipe = @shutdown_pipe # another thread may modify @shutdown_pipe.
|
|
349
|
+
if pipe
|
|
350
|
+
if !pipe.closed?
|
|
351
|
+
begin
|
|
352
|
+
yield pipe
|
|
353
|
+
rescue IOError # closed by another thread.
|
|
354
|
+
end
|
|
355
|
+
end
|
|
356
|
+
end
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
def cleanup_listener
|
|
360
|
+
@listeners.each{|s|
|
|
361
|
+
if @logger.debug?
|
|
362
|
+
addr = s.addr
|
|
363
|
+
@logger.debug("close TCPSocket(#{addr[2]}, #{addr[1]})")
|
|
364
|
+
end
|
|
365
|
+
begin
|
|
366
|
+
s.shutdown
|
|
367
|
+
rescue Errno::ENOTCONN
|
|
368
|
+
# when `Errno::ENOTCONN: Socket is not connected' on some platforms,
|
|
369
|
+
# call #close instead of #shutdown.
|
|
370
|
+
# (ignore @config[:ShutdownSocketWithoutClose])
|
|
371
|
+
s.close
|
|
372
|
+
else
|
|
373
|
+
unless @config[:ShutdownSocketWithoutClose]
|
|
374
|
+
s.close
|
|
375
|
+
end
|
|
376
|
+
end
|
|
377
|
+
}
|
|
378
|
+
@listeners.clear
|
|
379
|
+
end
|
|
380
|
+
end # end of GenericServer
|
|
381
|
+
end
|