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,294 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
#
|
|
3
|
+
# httpserver.rb -- HTTPServer 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: httpserver.rb,v 1.63 2002/10/01 17:16:32 gotoyuzo Exp $
|
|
11
|
+
|
|
12
|
+
require 'io/wait'
|
|
13
|
+
require_relative 'server'
|
|
14
|
+
require_relative 'httputils'
|
|
15
|
+
require_relative 'httpstatus'
|
|
16
|
+
require_relative 'httprequest'
|
|
17
|
+
require_relative 'httpresponse'
|
|
18
|
+
require_relative 'httpservlet'
|
|
19
|
+
require_relative 'accesslog'
|
|
20
|
+
|
|
21
|
+
module WEBrick
|
|
22
|
+
class HTTPServerError < ServerError; end
|
|
23
|
+
|
|
24
|
+
##
|
|
25
|
+
# An HTTP Server
|
|
26
|
+
|
|
27
|
+
class HTTPServer < ::WEBrick::GenericServer
|
|
28
|
+
##
|
|
29
|
+
# Creates a new HTTP server according to +config+
|
|
30
|
+
#
|
|
31
|
+
# An HTTP server uses the following attributes:
|
|
32
|
+
#
|
|
33
|
+
# :AccessLog:: An array of access logs. See WEBrick::AccessLog
|
|
34
|
+
# :BindAddress:: Local address for the server to bind to
|
|
35
|
+
# :DocumentRoot:: Root path to serve files from
|
|
36
|
+
# :DocumentRootOptions:: Options for the default HTTPServlet::FileHandler
|
|
37
|
+
# :HTTPVersion:: The HTTP version of this server
|
|
38
|
+
# :Port:: Port to listen on
|
|
39
|
+
# :RequestCallback:: Called with a request and response before each
|
|
40
|
+
# request is serviced.
|
|
41
|
+
# :RequestTimeout:: Maximum time to wait between requests
|
|
42
|
+
# :ServerAlias:: Array of alternate names for this server for virtual
|
|
43
|
+
# hosting
|
|
44
|
+
# :ServerName:: Name for this server for virtual hosting
|
|
45
|
+
|
|
46
|
+
def initialize(config={}, default=Config::HTTP)
|
|
47
|
+
super(config, default)
|
|
48
|
+
@http_version = HTTPVersion::convert(@config[:HTTPVersion])
|
|
49
|
+
|
|
50
|
+
@mount_tab = MountTable.new
|
|
51
|
+
if @config[:DocumentRoot]
|
|
52
|
+
mount("/", HTTPServlet::FileHandler, @config[:DocumentRoot],
|
|
53
|
+
@config[:DocumentRootOptions])
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
unless @config[:AccessLog]
|
|
57
|
+
@config[:AccessLog] = [
|
|
58
|
+
[ $stderr, AccessLog::COMMON_LOG_FORMAT ],
|
|
59
|
+
[ $stderr, AccessLog::REFERER_LOG_FORMAT ]
|
|
60
|
+
]
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
@virtual_hosts = Array.new
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
##
|
|
67
|
+
# Processes requests on +sock+
|
|
68
|
+
|
|
69
|
+
def run(sock)
|
|
70
|
+
while true
|
|
71
|
+
req = create_request(@config)
|
|
72
|
+
res = create_response(@config)
|
|
73
|
+
server = self
|
|
74
|
+
begin
|
|
75
|
+
timeout = @config[:RequestTimeout]
|
|
76
|
+
while timeout > 0
|
|
77
|
+
break if sock.to_io.wait_readable(0.5)
|
|
78
|
+
break if @status != :Running
|
|
79
|
+
timeout -= 0.5
|
|
80
|
+
end
|
|
81
|
+
raise HTTPStatus::EOFError if timeout <= 0 || @status != :Running
|
|
82
|
+
raise HTTPStatus::EOFError if sock.eof?
|
|
83
|
+
req.parse(sock)
|
|
84
|
+
res.request_method = req.request_method
|
|
85
|
+
res.request_uri = req.request_uri
|
|
86
|
+
res.request_http_version = req.http_version
|
|
87
|
+
res.keep_alive = req.keep_alive?
|
|
88
|
+
server = lookup_server(req) || self
|
|
89
|
+
if callback = server[:RequestCallback]
|
|
90
|
+
callback.call(req, res)
|
|
91
|
+
elsif callback = server[:RequestHandler]
|
|
92
|
+
msg = ":RequestHandler is deprecated, please use :RequestCallback"
|
|
93
|
+
@logger.warn(msg)
|
|
94
|
+
callback.call(req, res)
|
|
95
|
+
end
|
|
96
|
+
server.service(req, res)
|
|
97
|
+
rescue HTTPStatus::EOFError, HTTPStatus::RequestTimeout => ex
|
|
98
|
+
res.set_error(ex)
|
|
99
|
+
rescue HTTPStatus::Error => ex
|
|
100
|
+
@logger.error(ex.message)
|
|
101
|
+
res.set_error(ex)
|
|
102
|
+
rescue HTTPStatus::Status => ex
|
|
103
|
+
res.status = ex.code
|
|
104
|
+
rescue StandardError => ex
|
|
105
|
+
@logger.error(ex)
|
|
106
|
+
res.set_error(ex, true)
|
|
107
|
+
ensure
|
|
108
|
+
if req.request_line
|
|
109
|
+
if req.keep_alive? && res.keep_alive?
|
|
110
|
+
req.fixup()
|
|
111
|
+
end
|
|
112
|
+
res.send_response(sock)
|
|
113
|
+
server.access_log(@config, req, res)
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
break if @http_version < "1.1"
|
|
117
|
+
break unless req.keep_alive?
|
|
118
|
+
break unless res.keep_alive?
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
##
|
|
123
|
+
# Services +req+ and fills in +res+
|
|
124
|
+
|
|
125
|
+
def service(req, res)
|
|
126
|
+
if req.unparsed_uri == "*"
|
|
127
|
+
if req.request_method == "OPTIONS"
|
|
128
|
+
do_OPTIONS(req, res)
|
|
129
|
+
raise HTTPStatus::OK
|
|
130
|
+
end
|
|
131
|
+
raise HTTPStatus::NotFound, "`#{req.unparsed_uri}' not found."
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
servlet, options, script_name, path_info = search_servlet(req.path)
|
|
135
|
+
raise HTTPStatus::NotFound, "`#{req.path}' not found." unless servlet
|
|
136
|
+
req.script_name = script_name
|
|
137
|
+
req.path_info = path_info
|
|
138
|
+
si = servlet.get_instance(self, *options)
|
|
139
|
+
@logger.debug(format("%s is invoked.", si.class.name))
|
|
140
|
+
si.service(req, res)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
##
|
|
144
|
+
# The default OPTIONS request handler says GET, HEAD, POST and OPTIONS
|
|
145
|
+
# requests are allowed.
|
|
146
|
+
|
|
147
|
+
def do_OPTIONS(req, res)
|
|
148
|
+
res["allow"] = "GET,HEAD,POST,OPTIONS"
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
##
|
|
152
|
+
# Mounts +servlet+ on +dir+ passing +options+ to the servlet at creation
|
|
153
|
+
# time
|
|
154
|
+
|
|
155
|
+
def mount(dir, servlet, *options)
|
|
156
|
+
@logger.debug(sprintf("%s is mounted on %s.", servlet.inspect, dir))
|
|
157
|
+
@mount_tab[dir] = [ servlet, options ]
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
##
|
|
161
|
+
# Mounts +proc+ or +block+ on +dir+ and calls it with a
|
|
162
|
+
# WEBrick::HTTPRequest and WEBrick::HTTPResponse
|
|
163
|
+
|
|
164
|
+
def mount_proc(dir, proc=nil, &block)
|
|
165
|
+
proc ||= block
|
|
166
|
+
raise HTTPServerError, "must pass a proc or block" unless proc
|
|
167
|
+
mount(dir, HTTPServlet::ProcHandler.new(proc))
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
##
|
|
171
|
+
# Unmounts +dir+
|
|
172
|
+
|
|
173
|
+
def unmount(dir)
|
|
174
|
+
@logger.debug(sprintf("unmount %s.", dir))
|
|
175
|
+
@mount_tab.delete(dir)
|
|
176
|
+
end
|
|
177
|
+
alias umount unmount
|
|
178
|
+
|
|
179
|
+
##
|
|
180
|
+
# Finds a servlet for +path+
|
|
181
|
+
|
|
182
|
+
def search_servlet(path)
|
|
183
|
+
script_name, path_info = @mount_tab.scan(path)
|
|
184
|
+
servlet, options = @mount_tab[script_name]
|
|
185
|
+
if servlet
|
|
186
|
+
[ servlet, options, script_name, path_info ]
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
##
|
|
191
|
+
# Adds +server+ as a virtual host.
|
|
192
|
+
|
|
193
|
+
def virtual_host(server)
|
|
194
|
+
@virtual_hosts << server
|
|
195
|
+
@virtual_hosts = @virtual_hosts.sort_by{|s|
|
|
196
|
+
num = 0
|
|
197
|
+
num -= 4 if s[:BindAddress]
|
|
198
|
+
num -= 2 if s[:Port]
|
|
199
|
+
num -= 1 if s[:ServerName]
|
|
200
|
+
num
|
|
201
|
+
}
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
##
|
|
205
|
+
# Finds the appropriate virtual host to handle +req+
|
|
206
|
+
|
|
207
|
+
def lookup_server(req)
|
|
208
|
+
@virtual_hosts.find{|s|
|
|
209
|
+
(s[:BindAddress].nil? || req.addr[3] == s[:BindAddress]) &&
|
|
210
|
+
(s[:Port].nil? || req.port == s[:Port]) &&
|
|
211
|
+
((s[:ServerName].nil? || req.host == s[:ServerName]) ||
|
|
212
|
+
(!s[:ServerAlias].nil? && s[:ServerAlias].find{|h| h === req.host}))
|
|
213
|
+
}
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
##
|
|
217
|
+
# Logs +req+ and +res+ in the access logs. +config+ is used for the
|
|
218
|
+
# server name.
|
|
219
|
+
|
|
220
|
+
def access_log(config, req, res)
|
|
221
|
+
param = AccessLog::setup_params(config, req, res)
|
|
222
|
+
@config[:AccessLog].each{|logger, fmt|
|
|
223
|
+
logger << AccessLog::format(fmt+"\n", param)
|
|
224
|
+
}
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
##
|
|
228
|
+
# Creates the HTTPRequest used when handling the HTTP
|
|
229
|
+
# request. Can be overridden by subclasses.
|
|
230
|
+
def create_request(with_webrick_config)
|
|
231
|
+
HTTPRequest.new(with_webrick_config)
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
##
|
|
235
|
+
# Creates the HTTPResponse used when handling the HTTP
|
|
236
|
+
# request. Can be overridden by subclasses.
|
|
237
|
+
def create_response(with_webrick_config)
|
|
238
|
+
HTTPResponse.new(with_webrick_config)
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
##
|
|
242
|
+
# Mount table for the path a servlet is mounted on in the directory space
|
|
243
|
+
# of the server. Users of WEBrick can only access this indirectly via
|
|
244
|
+
# WEBrick::HTTPServer#mount, WEBrick::HTTPServer#unmount and
|
|
245
|
+
# WEBrick::HTTPServer#search_servlet
|
|
246
|
+
|
|
247
|
+
class MountTable # :nodoc:
|
|
248
|
+
def initialize
|
|
249
|
+
@tab = Hash.new
|
|
250
|
+
compile
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
def [](dir)
|
|
254
|
+
dir = normalize(dir)
|
|
255
|
+
@tab[dir]
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
def []=(dir, val)
|
|
259
|
+
dir = normalize(dir)
|
|
260
|
+
@tab[dir] = val
|
|
261
|
+
compile
|
|
262
|
+
val
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
def delete(dir)
|
|
266
|
+
dir = normalize(dir)
|
|
267
|
+
res = @tab.delete(dir)
|
|
268
|
+
compile
|
|
269
|
+
res
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
def scan(path)
|
|
273
|
+
@scanner =~ path
|
|
274
|
+
[ $&, $' ]
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
private
|
|
278
|
+
|
|
279
|
+
def compile
|
|
280
|
+
k = @tab.keys
|
|
281
|
+
k.sort!
|
|
282
|
+
k.reverse!
|
|
283
|
+
k.collect!{|path| Regexp.escape(path) }
|
|
284
|
+
@scanner = Regexp.new("\\A(" + k.join("|") +")(?=/|\\z)")
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
def normalize(dir)
|
|
288
|
+
ret = dir ? dir.dup : +""
|
|
289
|
+
ret.sub!(%r|/+\z|, "")
|
|
290
|
+
ret
|
|
291
|
+
end
|
|
292
|
+
end
|
|
293
|
+
end
|
|
294
|
+
end
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
#
|
|
3
|
+
# httpservlet.rb -- HTTPServlet Module
|
|
4
|
+
#
|
|
5
|
+
# Author: IPR -- Internet Programming with Ruby -- writers
|
|
6
|
+
# Copyright (c) 2000 TAKAHASHI Masayoshi, GOTOU Yuuzou
|
|
7
|
+
# Copyright (c) 2002 Internet Programming with Ruby writers. All rights
|
|
8
|
+
# reserved.
|
|
9
|
+
#
|
|
10
|
+
# $IPR: abstract.rb,v 1.24 2003/07/11 11:16:46 gotoyuzo Exp $
|
|
11
|
+
|
|
12
|
+
require_relative '../htmlutils'
|
|
13
|
+
require_relative '../httputils'
|
|
14
|
+
require_relative '../httpstatus'
|
|
15
|
+
|
|
16
|
+
module WEBrick
|
|
17
|
+
module HTTPServlet
|
|
18
|
+
class HTTPServletError < StandardError; end
|
|
19
|
+
|
|
20
|
+
##
|
|
21
|
+
# AbstractServlet allows HTTP server modules to be reused across multiple
|
|
22
|
+
# servers and allows encapsulation of functionality.
|
|
23
|
+
#
|
|
24
|
+
# By default a servlet will respond to GET, HEAD (through an alias to GET)
|
|
25
|
+
# and OPTIONS requests.
|
|
26
|
+
#
|
|
27
|
+
# By default a new servlet is initialized for every request. A servlet
|
|
28
|
+
# instance can be reused by overriding ::get_instance in the
|
|
29
|
+
# AbstractServlet subclass.
|
|
30
|
+
#
|
|
31
|
+
# == A Simple Servlet
|
|
32
|
+
#
|
|
33
|
+
# class Simple < WEBrick::HTTPServlet::AbstractServlet
|
|
34
|
+
# def do_GET request, response
|
|
35
|
+
# status, content_type, body = do_stuff_with request
|
|
36
|
+
#
|
|
37
|
+
# response.status = status
|
|
38
|
+
# response['Content-Type'] = content_type
|
|
39
|
+
# response.body = body
|
|
40
|
+
# end
|
|
41
|
+
#
|
|
42
|
+
# def do_stuff_with request
|
|
43
|
+
# return 200, 'text/plain', 'you got a page'
|
|
44
|
+
# end
|
|
45
|
+
# end
|
|
46
|
+
#
|
|
47
|
+
# This servlet can be mounted on a server at a given path:
|
|
48
|
+
#
|
|
49
|
+
# server.mount '/simple', Simple
|
|
50
|
+
#
|
|
51
|
+
# == Servlet Configuration
|
|
52
|
+
#
|
|
53
|
+
# Servlets can be configured via initialize. The first argument is the
|
|
54
|
+
# HTTP server the servlet is being initialized for.
|
|
55
|
+
#
|
|
56
|
+
# class Configurable < Simple
|
|
57
|
+
# def initialize server, color, size
|
|
58
|
+
# super server
|
|
59
|
+
# @color = color
|
|
60
|
+
# @size = size
|
|
61
|
+
# end
|
|
62
|
+
#
|
|
63
|
+
# def do_stuff_with request
|
|
64
|
+
# content = "<p " \
|
|
65
|
+
# %q{style="color: #{@color}; font-size: #{@size}"} \
|
|
66
|
+
# ">Hello, World!"
|
|
67
|
+
#
|
|
68
|
+
# return 200, "text/html", content
|
|
69
|
+
# end
|
|
70
|
+
# end
|
|
71
|
+
#
|
|
72
|
+
# This servlet must be provided two arguments at mount time:
|
|
73
|
+
#
|
|
74
|
+
# server.mount '/configurable', Configurable, 'red', '2em'
|
|
75
|
+
|
|
76
|
+
class AbstractServlet
|
|
77
|
+
|
|
78
|
+
##
|
|
79
|
+
# Factory for servlet instances that will handle a request from +server+
|
|
80
|
+
# using +options+ from the mount point. By default a new servlet
|
|
81
|
+
# instance is created for every call.
|
|
82
|
+
|
|
83
|
+
def self.get_instance(server, *options)
|
|
84
|
+
self.new(server, *options)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
##
|
|
88
|
+
# Initializes a new servlet for +server+ using +options+ which are
|
|
89
|
+
# stored as-is in +@options+. +@logger+ is also provided.
|
|
90
|
+
|
|
91
|
+
def initialize(server, *options)
|
|
92
|
+
@server = @config = server
|
|
93
|
+
@logger = @server[:Logger]
|
|
94
|
+
@options = options
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
##
|
|
98
|
+
# Dispatches to a +do_+ method based on +req+ if such a method is
|
|
99
|
+
# available. (+do_GET+ for a GET request). Raises a MethodNotAllowed
|
|
100
|
+
# exception if the method is not implemented.
|
|
101
|
+
|
|
102
|
+
def service(req, res)
|
|
103
|
+
method_name = "do_" + req.request_method.gsub(/-/, "_")
|
|
104
|
+
if respond_to?(method_name)
|
|
105
|
+
__send__(method_name, req, res)
|
|
106
|
+
else
|
|
107
|
+
raise HTTPStatus::MethodNotAllowed,
|
|
108
|
+
"unsupported method `#{req.request_method}'."
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
##
|
|
113
|
+
# Raises a NotFound exception
|
|
114
|
+
|
|
115
|
+
def do_GET(req, res)
|
|
116
|
+
raise HTTPStatus::NotFound, "not found."
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
##
|
|
120
|
+
# Dispatches to do_GET
|
|
121
|
+
|
|
122
|
+
def do_HEAD(req, res)
|
|
123
|
+
do_GET(req, res)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
##
|
|
127
|
+
# Returns the allowed HTTP request methods
|
|
128
|
+
|
|
129
|
+
def do_OPTIONS(req, res)
|
|
130
|
+
m = self.methods.grep(/\Ado_([A-Z]+)\z/) {$1}
|
|
131
|
+
m.sort!
|
|
132
|
+
res["allow"] = m.join(",")
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
private
|
|
136
|
+
|
|
137
|
+
##
|
|
138
|
+
# Redirects to a path ending in /
|
|
139
|
+
|
|
140
|
+
def redirect_to_directory_uri(req, res)
|
|
141
|
+
if req.path[-1] != ?/
|
|
142
|
+
location = WEBrick::HTTPUtils.escape_path(req.path + "/")
|
|
143
|
+
if req.query_string && req.query_string.bytesize > 0
|
|
144
|
+
location << "?" << req.query_string
|
|
145
|
+
end
|
|
146
|
+
res.set_redirect(HTTPStatus::MovedPermanently, location)
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
end
|
|
152
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
#
|
|
3
|
+
# cgi_runner.rb -- CGI launcher.
|
|
4
|
+
#
|
|
5
|
+
# Author: IPR -- Internet Programming with Ruby -- writers
|
|
6
|
+
# Copyright (c) 2000 TAKAHASHI Masayoshi, GOTOU YUUZOU
|
|
7
|
+
# Copyright (c) 2002 Internet Programming with Ruby writers. All rights
|
|
8
|
+
# reserved.
|
|
9
|
+
#
|
|
10
|
+
# $IPR: cgi_runner.rb,v 1.9 2002/09/25 11:33:15 gotoyuzo Exp $
|
|
11
|
+
|
|
12
|
+
def sysread(io, size)
|
|
13
|
+
buf = +""
|
|
14
|
+
while size > 0
|
|
15
|
+
tmp = io.sysread(size)
|
|
16
|
+
buf << tmp
|
|
17
|
+
size -= tmp.bytesize
|
|
18
|
+
end
|
|
19
|
+
return buf
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
STDIN.binmode
|
|
23
|
+
|
|
24
|
+
len = sysread(STDIN, 8).to_i
|
|
25
|
+
out = sysread(STDIN, len)
|
|
26
|
+
STDOUT.reopen(File.open(out, "w"))
|
|
27
|
+
|
|
28
|
+
len = sysread(STDIN, 8).to_i
|
|
29
|
+
err = sysread(STDIN, len)
|
|
30
|
+
STDERR.reopen(File.open(err, "w"))
|
|
31
|
+
|
|
32
|
+
len = sysread(STDIN, 8).to_i
|
|
33
|
+
dump = sysread(STDIN, len)
|
|
34
|
+
hash = Marshal.restore(dump)
|
|
35
|
+
ENV.keys.each{|name| ENV.delete(name) }
|
|
36
|
+
hash.each{|k, v| ENV[k] = v if v }
|
|
37
|
+
|
|
38
|
+
dir = File::dirname(ENV["SCRIPT_FILENAME"])
|
|
39
|
+
Dir::chdir dir
|
|
40
|
+
|
|
41
|
+
if ARGV[0]
|
|
42
|
+
argv = ARGV.dup
|
|
43
|
+
argv << ENV["SCRIPT_FILENAME"]
|
|
44
|
+
exec(*argv)
|
|
45
|
+
# NOTREACHED
|
|
46
|
+
end
|
|
47
|
+
exec ENV["SCRIPT_FILENAME"]
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
#
|
|
3
|
+
# cgihandler.rb -- CGIHandler Class
|
|
4
|
+
#
|
|
5
|
+
# Author: IPR -- Internet Programming with Ruby -- writers
|
|
6
|
+
# Copyright (c) 2001 TAKAHASHI Masayoshi, GOTOU Yuuzou
|
|
7
|
+
# Copyright (c) 2002 Internet Programming with Ruby writers. All rights
|
|
8
|
+
# reserved.
|
|
9
|
+
#
|
|
10
|
+
# $IPR: cgihandler.rb,v 1.27 2003/03/21 19:56:01 gotoyuzo Exp $
|
|
11
|
+
|
|
12
|
+
require 'rbconfig'
|
|
13
|
+
require 'tempfile'
|
|
14
|
+
require_relative '../config'
|
|
15
|
+
require_relative 'abstract'
|
|
16
|
+
|
|
17
|
+
module WEBrick
|
|
18
|
+
module HTTPServlet
|
|
19
|
+
|
|
20
|
+
##
|
|
21
|
+
# Servlet for handling CGI scripts
|
|
22
|
+
#
|
|
23
|
+
# Example:
|
|
24
|
+
#
|
|
25
|
+
# server.mount('/cgi/my_script', WEBrick::HTTPServlet::CGIHandler,
|
|
26
|
+
# '/path/to/my_script')
|
|
27
|
+
|
|
28
|
+
class CGIHandler < AbstractServlet
|
|
29
|
+
Ruby = RbConfig.ruby # :nodoc:
|
|
30
|
+
CGIRunner = "\"#{Ruby}\" \"#{WEBrick::Config::LIBDIR}/httpservlet/cgi_runner.rb\"" # :nodoc:
|
|
31
|
+
CGIRunnerArray = [Ruby, "#{WEBrick::Config::LIBDIR}/httpservlet/cgi_runner.rb".freeze].freeze # :nodoc:
|
|
32
|
+
|
|
33
|
+
##
|
|
34
|
+
# Creates a new CGI script servlet for the script at +name+
|
|
35
|
+
|
|
36
|
+
def initialize(server, name)
|
|
37
|
+
super(server, name)
|
|
38
|
+
@script_filename = name
|
|
39
|
+
@tempdir = server[:TempDir]
|
|
40
|
+
interpreter = server[:CGIInterpreter]
|
|
41
|
+
if interpreter.is_a?(Array)
|
|
42
|
+
@cgicmd = CGIRunnerArray + interpreter
|
|
43
|
+
else
|
|
44
|
+
@cgicmd = "#{CGIRunner} #{interpreter}"
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# :stopdoc:
|
|
49
|
+
|
|
50
|
+
def do_GET(req, res)
|
|
51
|
+
cgi_in = IO::popen(@cgicmd, "wb")
|
|
52
|
+
cgi_out = Tempfile.new("webrick.cgiout.", @tempdir, mode: IO::BINARY)
|
|
53
|
+
cgi_out.set_encoding("ASCII-8BIT")
|
|
54
|
+
cgi_err = Tempfile.new("webrick.cgierr.", @tempdir, mode: IO::BINARY)
|
|
55
|
+
cgi_err.set_encoding("ASCII-8BIT")
|
|
56
|
+
begin
|
|
57
|
+
cgi_in.sync = true
|
|
58
|
+
meta = req.meta_vars
|
|
59
|
+
meta["SCRIPT_FILENAME"] = @script_filename
|
|
60
|
+
meta["PATH"] = @config[:CGIPathEnv]
|
|
61
|
+
meta.delete("HTTP_PROXY")
|
|
62
|
+
if /mswin|bccwin|mingw/ =~ RUBY_PLATFORM
|
|
63
|
+
meta["SystemRoot"] = ENV["SystemRoot"]
|
|
64
|
+
end
|
|
65
|
+
dump = Marshal.dump(meta)
|
|
66
|
+
|
|
67
|
+
cgi_in.write("%8d" % cgi_out.path.bytesize)
|
|
68
|
+
cgi_in.write(cgi_out.path)
|
|
69
|
+
cgi_in.write("%8d" % cgi_err.path.bytesize)
|
|
70
|
+
cgi_in.write(cgi_err.path)
|
|
71
|
+
cgi_in.write("%8d" % dump.bytesize)
|
|
72
|
+
cgi_in.write(dump)
|
|
73
|
+
|
|
74
|
+
req.body { |chunk| cgi_in.write(chunk) }
|
|
75
|
+
ensure
|
|
76
|
+
cgi_in.close
|
|
77
|
+
status = $?.exitstatus
|
|
78
|
+
sleep 0.1 if /mswin|bccwin|mingw/ =~ RUBY_PLATFORM
|
|
79
|
+
data = cgi_out.read
|
|
80
|
+
cgi_out.close(true)
|
|
81
|
+
if errmsg = cgi_err.read
|
|
82
|
+
if errmsg.bytesize > 0
|
|
83
|
+
@logger.error("CGIHandler: #{@script_filename}:\n" + errmsg)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
cgi_err.close(true)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
if status != 0
|
|
90
|
+
@logger.error("CGIHandler: #{@script_filename} exit with #{status}")
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
data = "" unless data
|
|
94
|
+
raw_header, body = data.split(/^[\xd\xa]+/, 2)
|
|
95
|
+
raise HTTPStatus::InternalServerError,
|
|
96
|
+
"Premature end of script headers: #{@script_filename}" if body.nil?
|
|
97
|
+
|
|
98
|
+
begin
|
|
99
|
+
header = HTTPUtils::parse_header(raw_header)
|
|
100
|
+
if /^(\d+)/ =~ header['status'][0]
|
|
101
|
+
res.status = $1.to_i
|
|
102
|
+
header.delete('status')
|
|
103
|
+
end
|
|
104
|
+
if header.has_key?('location')
|
|
105
|
+
# RFC 3875 6.2.3, 6.2.4
|
|
106
|
+
res.status = 302 unless (300...400) === res.status
|
|
107
|
+
end
|
|
108
|
+
if header.has_key?('set-cookie')
|
|
109
|
+
header['set-cookie'].each{|k|
|
|
110
|
+
res.cookies << Cookie.parse_set_cookie(k)
|
|
111
|
+
}
|
|
112
|
+
header.delete('set-cookie')
|
|
113
|
+
end
|
|
114
|
+
header.each{|key, val| res[key] = val.join(", ") }
|
|
115
|
+
rescue => ex
|
|
116
|
+
raise HTTPStatus::InternalServerError, ex.message
|
|
117
|
+
end
|
|
118
|
+
res.body = body
|
|
119
|
+
end
|
|
120
|
+
alias do_POST do_GET
|
|
121
|
+
|
|
122
|
+
# :startdoc:
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
end
|
|
126
|
+
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
#
|
|
3
|
+
# erbhandler.rb -- ERBHandler Class
|
|
4
|
+
#
|
|
5
|
+
# Author: IPR -- Internet Programming with Ruby -- writers
|
|
6
|
+
# Copyright (c) 2001 TAKAHASHI Masayoshi, GOTOU Yuuzou
|
|
7
|
+
# Copyright (c) 2002 Internet Programming with Ruby writers. All rights
|
|
8
|
+
# reserved.
|
|
9
|
+
#
|
|
10
|
+
# $IPR: erbhandler.rb,v 1.25 2003/02/24 19:25:31 gotoyuzo Exp $
|
|
11
|
+
|
|
12
|
+
require_relative 'abstract'
|
|
13
|
+
|
|
14
|
+
require 'erb'
|
|
15
|
+
|
|
16
|
+
module WEBrick
|
|
17
|
+
module HTTPServlet
|
|
18
|
+
|
|
19
|
+
##
|
|
20
|
+
# ERBHandler evaluates an ERB file and returns the result. This handler
|
|
21
|
+
# is automatically used if there are .rhtml files in a directory served by
|
|
22
|
+
# the FileHandler.
|
|
23
|
+
#
|
|
24
|
+
# ERBHandler supports GET and POST methods.
|
|
25
|
+
#
|
|
26
|
+
# The ERB file is evaluated with the local variables +servlet_request+ and
|
|
27
|
+
# +servlet_response+ which are a WEBrick::HTTPRequest and
|
|
28
|
+
# WEBrick::HTTPResponse respectively.
|
|
29
|
+
#
|
|
30
|
+
# Example .rhtml file:
|
|
31
|
+
#
|
|
32
|
+
# Request to <%= servlet_request.request_uri %>
|
|
33
|
+
#
|
|
34
|
+
# Query params <%= servlet_request.query.inspect %>
|
|
35
|
+
|
|
36
|
+
class ERBHandler < AbstractServlet
|
|
37
|
+
|
|
38
|
+
##
|
|
39
|
+
# Creates a new ERBHandler on +server+ that will evaluate and serve the
|
|
40
|
+
# ERB file +name+
|
|
41
|
+
|
|
42
|
+
def initialize(server, name)
|
|
43
|
+
super(server, name)
|
|
44
|
+
@script_filename = name
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
##
|
|
48
|
+
# Handles GET requests
|
|
49
|
+
|
|
50
|
+
def do_GET(req, res)
|
|
51
|
+
unless defined?(ERB)
|
|
52
|
+
@logger.warn "#{self.class}: ERB not defined."
|
|
53
|
+
raise HTTPStatus::Forbidden, "ERBHandler cannot work."
|
|
54
|
+
end
|
|
55
|
+
begin
|
|
56
|
+
data = File.open(@script_filename, &:read)
|
|
57
|
+
res.body = evaluate(ERB.new(data), req, res)
|
|
58
|
+
res['content-type'] ||=
|
|
59
|
+
HTTPUtils::mime_type(@script_filename, @config[:MimeTypes])
|
|
60
|
+
rescue StandardError
|
|
61
|
+
raise
|
|
62
|
+
rescue Exception => ex
|
|
63
|
+
@logger.error(ex)
|
|
64
|
+
raise HTTPStatus::InternalServerError, ex.message
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
##
|
|
69
|
+
# Handles POST requests
|
|
70
|
+
|
|
71
|
+
alias do_POST do_GET
|
|
72
|
+
|
|
73
|
+
private
|
|
74
|
+
|
|
75
|
+
##
|
|
76
|
+
# Evaluates +erb+ providing +servlet_request+ and +servlet_response+ as
|
|
77
|
+
# local variables.
|
|
78
|
+
|
|
79
|
+
def evaluate(erb, servlet_request, servlet_response)
|
|
80
|
+
Module.new.module_eval{
|
|
81
|
+
servlet_request.meta_vars
|
|
82
|
+
servlet_request.query
|
|
83
|
+
erb.result(binding)
|
|
84
|
+
}
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|