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.
Files changed (329) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +1 -0
  3. data/dev.yml +5 -0
  4. data/exe/fluid +24 -0
  5. data/lib/fluid_cli/api.rb +135 -0
  6. data/lib/fluid_cli/assets/post_auth_page/index.html.erb +34 -0
  7. data/lib/fluid_cli/assets/post_auth_page/style.css +58 -0
  8. data/lib/fluid_cli/command.rb +55 -0
  9. data/lib/fluid_cli/commands/help.rb +21 -0
  10. data/lib/fluid_cli/commands/login.rb +30 -0
  11. data/lib/fluid_cli/commands/logout.rb +38 -0
  12. data/lib/fluid_cli/commands/switch.rb +23 -0
  13. data/lib/fluid_cli/commands/theme/common/company_helper.rb +15 -0
  14. data/lib/fluid_cli/commands/theme/common/root_helper.rb +95 -0
  15. data/lib/fluid_cli/commands/theme/dev.rb +61 -0
  16. data/lib/fluid_cli/commands/theme/help.rb +21 -0
  17. data/lib/fluid_cli/commands/theme/init.rb +46 -0
  18. data/lib/fluid_cli/commands/theme/pull.rb +68 -0
  19. data/lib/fluid_cli/commands/theme/push.rb +132 -0
  20. data/lib/fluid_cli/commands/theme.rb +23 -0
  21. data/lib/fluid_cli/commands/whoami.rb +23 -0
  22. data/lib/fluid_cli/commands.rb +19 -0
  23. data/lib/fluid_cli/company_switcher.rb +69 -0
  24. data/lib/fluid_cli/context.rb +691 -0
  25. data/lib/fluid_cli/db.rb +114 -0
  26. data/lib/fluid_cli/entry_point.rb +10 -0
  27. data/lib/fluid_cli/environment.rb +32 -0
  28. data/lib/fluid_cli/file_system_listener.rb +29 -0
  29. data/lib/fluid_cli/form.rb +42 -0
  30. data/lib/fluid_cli/git.rb +319 -0
  31. data/lib/fluid_cli/http_request.rb +54 -0
  32. data/lib/fluid_cli/identity_auth/servlet.rb +39 -0
  33. data/lib/fluid_cli/identity_auth.rb +126 -0
  34. data/lib/fluid_cli/options.rb +38 -0
  35. data/lib/fluid_cli/theme/dev_server/certificate_manager.rb +79 -0
  36. data/lib/fluid_cli/theme/dev_server/errors.rb +9 -0
  37. data/lib/fluid_cli/theme/dev_server/header_hash.rb +98 -0
  38. data/lib/fluid_cli/theme/dev_server/hooks/file_change_hook.rb +39 -0
  39. data/lib/fluid_cli/theme/dev_server/hot_reload/resources/hot-reload-no-script.html +27 -0
  40. data/lib/fluid_cli/theme/dev_server/hot_reload/resources/hot_reload.js +28 -0
  41. data/lib/fluid_cli/theme/dev_server/hot_reload/resources/sse_client.js +43 -0
  42. data/lib/fluid_cli/theme/dev_server/hot_reload/resources/theme.js +16 -0
  43. data/lib/fluid_cli/theme/dev_server/hot_reload/script_injector.rb +54 -0
  44. data/lib/fluid_cli/theme/dev_server/hot_reload.rb +75 -0
  45. data/lib/fluid_cli/theme/dev_server/local_assets.rb +92 -0
  46. data/lib/fluid_cli/theme/dev_server/proxy.rb +235 -0
  47. data/lib/fluid_cli/theme/dev_server/proxy_param_builder.rb +82 -0
  48. data/lib/fluid_cli/theme/dev_server/reload_mode.rb +34 -0
  49. data/lib/fluid_cli/theme/dev_server/sse.rb +75 -0
  50. data/lib/fluid_cli/theme/dev_server/watcher.rb +57 -0
  51. data/lib/fluid_cli/theme/dev_server/web_server.rb +140 -0
  52. data/lib/fluid_cli/theme/dev_server.rb +289 -0
  53. data/lib/fluid_cli/theme/development_theme.rb +101 -0
  54. data/lib/fluid_cli/theme/file.rb +105 -0
  55. data/lib/fluid_cli/theme/forms/select.rb +33 -0
  56. data/lib/fluid_cli/theme/mime_type.rb +34 -0
  57. data/lib/fluid_cli/theme/presenters/theme_presenter.rb +49 -0
  58. data/lib/fluid_cli/theme/presenters/themes_presenter.rb +31 -0
  59. data/lib/fluid_cli/theme/root.rb +62 -0
  60. data/lib/fluid_cli/theme/syncer/checksums.rb +66 -0
  61. data/lib/fluid_cli/theme/syncer/downloader.rb +54 -0
  62. data/lib/fluid_cli/theme/syncer/error_reporter.rb +45 -0
  63. data/lib/fluid_cli/theme/syncer/merger.rb +53 -0
  64. data/lib/fluid_cli/theme/syncer/operation.rb +58 -0
  65. data/lib/fluid_cli/theme/syncer/standard_reporter.rb +32 -0
  66. data/lib/fluid_cli/theme/syncer/unsupported_script_warning.rb +90 -0
  67. data/lib/fluid_cli/theme/syncer/uploader/forms/apply_to_all.rb +41 -0
  68. data/lib/fluid_cli/theme/syncer/uploader/forms/apply_to_all_form.rb +37 -0
  69. data/lib/fluid_cli/theme/syncer/uploader/forms/base_strategy_form.rb +64 -0
  70. data/lib/fluid_cli/theme/syncer/uploader/forms/select_delete_strategy.rb +29 -0
  71. data/lib/fluid_cli/theme/syncer/uploader/forms/select_update_strategy.rb +30 -0
  72. data/lib/fluid_cli/theme/syncer/uploader/json_delete_handler.rb +49 -0
  73. data/lib/fluid_cli/theme/syncer/uploader/json_update_handler.rb +71 -0
  74. data/lib/fluid_cli/theme/syncer/uploader.rb +105 -0
  75. data/lib/fluid_cli/theme/syncer.rb +412 -0
  76. data/lib/fluid_cli/theme/theme.rb +186 -0
  77. data/lib/fluid_cli/theme/ui/sync_progress_bar.rb +22 -0
  78. data/lib/fluid_cli/thread_pool/job.rb +35 -0
  79. data/lib/fluid_cli/thread_pool.rb +49 -0
  80. data/lib/fluid_cli/version.rb +3 -0
  81. data/lib/fluid_cli.rb +59 -0
  82. data/vendor/deps/base64/.document +5 -0
  83. data/vendor/deps/base64/.gitignore +9 -0
  84. data/vendor/deps/base64/BSDL +22 -0
  85. data/vendor/deps/base64/COPYING +56 -0
  86. data/vendor/deps/base64/Gemfile +9 -0
  87. data/vendor/deps/base64/LEGAL +60 -0
  88. data/vendor/deps/base64/README.md +48 -0
  89. data/vendor/deps/base64/Rakefile +31 -0
  90. data/vendor/deps/base64/base64.gemspec +28 -0
  91. data/vendor/deps/base64/bin/console +14 -0
  92. data/vendor/deps/base64/bin/setup +8 -0
  93. data/vendor/deps/base64/lib/base64.rb +382 -0
  94. data/vendor/deps/base64/sig/base64.rbs +358 -0
  95. data/vendor/deps/base64/test/base64/test_base64.rb +115 -0
  96. data/vendor/deps/base64/test_sig/test_base64.rb +44 -0
  97. data/vendor/deps/cli-kit/REVISION +1 -0
  98. data/vendor/deps/cli-kit/lib/cli/kit/args/definition.rb +286 -0
  99. data/vendor/deps/cli-kit/lib/cli/kit/args/evaluation.rb +215 -0
  100. data/vendor/deps/cli-kit/lib/cli/kit/args/parser/node.rb +128 -0
  101. data/vendor/deps/cli-kit/lib/cli/kit/args/parser.rb +125 -0
  102. data/vendor/deps/cli-kit/lib/cli/kit/args/tokenizer.rb +130 -0
  103. data/vendor/deps/cli-kit/lib/cli/kit/args.rb +16 -0
  104. data/vendor/deps/cli-kit/lib/cli/kit/base_command.rb +30 -0
  105. data/vendor/deps/cli-kit/lib/cli/kit/command_help.rb +268 -0
  106. data/vendor/deps/cli-kit/lib/cli/kit/command_registry.rb +150 -0
  107. data/vendor/deps/cli-kit/lib/cli/kit/config.rb +137 -0
  108. data/vendor/deps/cli-kit/lib/cli/kit/core_ext.rb +28 -0
  109. data/vendor/deps/cli-kit/lib/cli/kit/error_handler.rb +166 -0
  110. data/vendor/deps/cli-kit/lib/cli/kit/executor.rb +92 -0
  111. data/vendor/deps/cli-kit/lib/cli/kit/ini.rb +91 -0
  112. data/vendor/deps/cli-kit/lib/cli/kit/levenshtein.rb +92 -0
  113. data/vendor/deps/cli-kit/lib/cli/kit/logger.rb +94 -0
  114. data/vendor/deps/cli-kit/lib/cli/kit/opts.rb +248 -0
  115. data/vendor/deps/cli-kit/lib/cli/kit/parse_args.rb +55 -0
  116. data/vendor/deps/cli-kit/lib/cli/kit/resolver.rb +66 -0
  117. data/vendor/deps/cli-kit/lib/cli/kit/support/test_helper.rb +260 -0
  118. data/vendor/deps/cli-kit/lib/cli/kit/support.rb +11 -0
  119. data/vendor/deps/cli-kit/lib/cli/kit/system.rb +290 -0
  120. data/vendor/deps/cli-kit/lib/cli/kit/util.rb +118 -0
  121. data/vendor/deps/cli-kit/lib/cli/kit/version.rb +7 -0
  122. data/vendor/deps/cli-kit/lib/cli/kit.rb +139 -0
  123. data/vendor/deps/cli-ui/REVISION +1 -0
  124. data/vendor/deps/cli-ui/lib/cli/ui/ansi.rb +218 -0
  125. data/vendor/deps/cli-ui/lib/cli/ui/color.rb +101 -0
  126. data/vendor/deps/cli-ui/lib/cli/ui/formatter.rb +219 -0
  127. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_stack.rb +67 -0
  128. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style/box.rb +179 -0
  129. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style/bracket.rb +152 -0
  130. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style.rb +127 -0
  131. data/vendor/deps/cli-ui/lib/cli/ui/frame.rb +286 -0
  132. data/vendor/deps/cli-ui/lib/cli/ui/glyph.rb +92 -0
  133. data/vendor/deps/cli-ui/lib/cli/ui/os.rb +63 -0
  134. data/vendor/deps/cli-ui/lib/cli/ui/printer.rb +64 -0
  135. data/vendor/deps/cli-ui/lib/cli/ui/progress.rb +132 -0
  136. data/vendor/deps/cli-ui/lib/cli/ui/progress_reporter.rb +209 -0
  137. data/vendor/deps/cli-ui/lib/cli/ui/prompt/interactive_options.rb +583 -0
  138. data/vendor/deps/cli-ui/lib/cli/ui/prompt/options_handler.rb +36 -0
  139. data/vendor/deps/cli-ui/lib/cli/ui/prompt.rb +381 -0
  140. data/vendor/deps/cli-ui/lib/cli/ui/spinner/async.rb +48 -0
  141. data/vendor/deps/cli-ui/lib/cli/ui/spinner/spin_group.rb +602 -0
  142. data/vendor/deps/cli-ui/lib/cli/ui/spinner.rb +79 -0
  143. data/vendor/deps/cli-ui/lib/cli/ui/stdout_router.rb +399 -0
  144. data/vendor/deps/cli-ui/lib/cli/ui/table.rb +83 -0
  145. data/vendor/deps/cli-ui/lib/cli/ui/terminal.rb +55 -0
  146. data/vendor/deps/cli-ui/lib/cli/ui/truncater.rb +106 -0
  147. data/vendor/deps/cli-ui/lib/cli/ui/version.rb +8 -0
  148. data/vendor/deps/cli-ui/lib/cli/ui/widgets/base.rb +46 -0
  149. data/vendor/deps/cli-ui/lib/cli/ui/widgets/status.rb +79 -0
  150. data/vendor/deps/cli-ui/lib/cli/ui/widgets.rb +89 -0
  151. data/vendor/deps/cli-ui/lib/cli/ui/work_queue.rb +142 -0
  152. data/vendor/deps/cli-ui/lib/cli/ui/wrap.rb +61 -0
  153. data/vendor/deps/cli-ui/lib/cli/ui.rb +359 -0
  154. data/vendor/deps/cli-ui/vendor/reentrant_mutex.rb +78 -0
  155. data/vendor/deps/debug/CONTRIBUTING.md +573 -0
  156. data/vendor/deps/debug/Gemfile +10 -0
  157. data/vendor/deps/debug/LICENSE.txt +22 -0
  158. data/vendor/deps/debug/README.md +996 -0
  159. data/vendor/deps/debug/Rakefile +57 -0
  160. data/vendor/deps/debug/TODO.md +23 -0
  161. data/vendor/deps/debug/debug.gemspec +33 -0
  162. data/vendor/deps/debug/exe/rdbg +53 -0
  163. data/vendor/deps/debug/ext/debug/Makefile +273 -0
  164. data/vendor/deps/debug/ext/debug/debug.c +228 -0
  165. data/vendor/deps/debug/ext/debug/debug_version.h +1 -0
  166. data/vendor/deps/debug/ext/debug/extconf.rb +27 -0
  167. data/vendor/deps/debug/ext/debug/iseq_collector.c +93 -0
  168. data/vendor/deps/debug/lib/debug/abbrev_command.rb +77 -0
  169. data/vendor/deps/debug/lib/debug/breakpoint.rb +556 -0
  170. data/vendor/deps/debug/lib/debug/client.rb +263 -0
  171. data/vendor/deps/debug/lib/debug/color.rb +123 -0
  172. data/vendor/deps/debug/lib/debug/config.rb +592 -0
  173. data/vendor/deps/debug/lib/debug/console.rb +224 -0
  174. data/vendor/deps/debug/lib/debug/dap_custom/traceInspector.rb +336 -0
  175. data/vendor/deps/debug/lib/debug/debug.bundle +0 -0
  176. data/vendor/deps/debug/lib/debug/frame_info.rb +190 -0
  177. data/vendor/deps/debug/lib/debug/irb_integration.rb +37 -0
  178. data/vendor/deps/debug/lib/debug/local.rb +115 -0
  179. data/vendor/deps/debug/lib/debug/open.rb +13 -0
  180. data/vendor/deps/debug/lib/debug/open_nonstop.rb +15 -0
  181. data/vendor/deps/debug/lib/debug/prelude.rb +50 -0
  182. data/vendor/deps/debug/lib/debug/server.rb +534 -0
  183. data/vendor/deps/debug/lib/debug/server_cdp.rb +1348 -0
  184. data/vendor/deps/debug/lib/debug/server_dap.rb +1108 -0
  185. data/vendor/deps/debug/lib/debug/session.rb +2667 -0
  186. data/vendor/deps/debug/lib/debug/source_repository.rb +150 -0
  187. data/vendor/deps/debug/lib/debug/start.rb +5 -0
  188. data/vendor/deps/debug/lib/debug/thread_client.rb +1457 -0
  189. data/vendor/deps/debug/lib/debug/tracer.rb +241 -0
  190. data/vendor/deps/debug/lib/debug/version.rb +5 -0
  191. data/vendor/deps/debug/lib/debug.rb +9 -0
  192. data/vendor/deps/debug/misc/README.md.erb +660 -0
  193. data/vendor/deps/listen/.github/release-drafter.yml +17 -0
  194. data/vendor/deps/listen/.github/workflows/development.yml +67 -0
  195. data/vendor/deps/listen/.github/workflows/push.yml +12 -0
  196. data/vendor/deps/listen/.gitignore +28 -0
  197. data/vendor/deps/listen/.rspec +3 -0
  198. data/vendor/deps/listen/.rubocop.yml +283 -0
  199. data/vendor/deps/listen/.yardopts +11 -0
  200. data/vendor/deps/listen/CHANGELOG.md +1 -0
  201. data/vendor/deps/listen/CONTRIBUTING.md +45 -0
  202. data/vendor/deps/listen/Gemfile +33 -0
  203. data/vendor/deps/listen/Guardfile +26 -0
  204. data/vendor/deps/listen/LICENSE.txt +22 -0
  205. data/vendor/deps/listen/README.md +490 -0
  206. data/vendor/deps/listen/Rakefile +154 -0
  207. data/vendor/deps/listen/bin/listen +11 -0
  208. data/vendor/deps/listen/lib/listen/adapter/base.rb +129 -0
  209. data/vendor/deps/listen/lib/listen/adapter/bsd.rb +104 -0
  210. data/vendor/deps/listen/lib/listen/adapter/config.rb +31 -0
  211. data/vendor/deps/listen/lib/listen/adapter/darwin.rb +77 -0
  212. data/vendor/deps/listen/lib/listen/adapter/linux.rb +108 -0
  213. data/vendor/deps/listen/lib/listen/adapter/polling.rb +40 -0
  214. data/vendor/deps/listen/lib/listen/adapter/windows.rb +96 -0
  215. data/vendor/deps/listen/lib/listen/adapter.rb +43 -0
  216. data/vendor/deps/listen/lib/listen/backend.rb +40 -0
  217. data/vendor/deps/listen/lib/listen/change.rb +69 -0
  218. data/vendor/deps/listen/lib/listen/cli.rb +65 -0
  219. data/vendor/deps/listen/lib/listen/directory.rb +93 -0
  220. data/vendor/deps/listen/lib/listen/error.rb +11 -0
  221. data/vendor/deps/listen/lib/listen/event/config.rb +39 -0
  222. data/vendor/deps/listen/lib/listen/event/loop.rb +92 -0
  223. data/vendor/deps/listen/lib/listen/event/processor.rb +128 -0
  224. data/vendor/deps/listen/lib/listen/event/queue.rb +52 -0
  225. data/vendor/deps/listen/lib/listen/file.rb +95 -0
  226. data/vendor/deps/listen/lib/listen/fsm.rb +131 -0
  227. data/vendor/deps/listen/lib/listen/listener/config.rb +41 -0
  228. data/vendor/deps/listen/lib/listen/listener.rb +136 -0
  229. data/vendor/deps/listen/lib/listen/logger.rb +65 -0
  230. data/vendor/deps/listen/lib/listen/monotonic_time.rb +27 -0
  231. data/vendor/deps/listen/lib/listen/options.rb +24 -0
  232. data/vendor/deps/listen/lib/listen/queue_optimizer.rb +129 -0
  233. data/vendor/deps/listen/lib/listen/record/entry.rb +66 -0
  234. data/vendor/deps/listen/lib/listen/record/symlink_detector.rb +47 -0
  235. data/vendor/deps/listen/lib/listen/record.rb +122 -0
  236. data/vendor/deps/listen/lib/listen/silencer/controller.rb +50 -0
  237. data/vendor/deps/listen/lib/listen/silencer.rb +106 -0
  238. data/vendor/deps/listen/lib/listen/thread.rb +54 -0
  239. data/vendor/deps/listen/lib/listen/version.rb +5 -0
  240. data/vendor/deps/listen/lib/listen.rb +47 -0
  241. data/vendor/deps/listen/listen.gemspec +40 -0
  242. data/vendor/deps/listen/spec/acceptance/listen_spec.rb +320 -0
  243. data/vendor/deps/listen/spec/lib/listen/adapter/base_spec.rb +101 -0
  244. data/vendor/deps/listen/spec/lib/listen/adapter/bsd_spec.rb +13 -0
  245. data/vendor/deps/listen/spec/lib/listen/adapter/config_spec.rb +122 -0
  246. data/vendor/deps/listen/spec/lib/listen/adapter/darwin_spec.rb +82 -0
  247. data/vendor/deps/listen/spec/lib/listen/adapter/linux_spec.rb +199 -0
  248. data/vendor/deps/listen/spec/lib/listen/adapter/polling_spec.rb +83 -0
  249. data/vendor/deps/listen/spec/lib/listen/adapter/windows_spec.rb +13 -0
  250. data/vendor/deps/listen/spec/lib/listen/adapter_spec.rb +69 -0
  251. data/vendor/deps/listen/spec/lib/listen/backend_spec.rb +82 -0
  252. data/vendor/deps/listen/spec/lib/listen/change_spec.rb +102 -0
  253. data/vendor/deps/listen/spec/lib/listen/cli_spec.rb +116 -0
  254. data/vendor/deps/listen/spec/lib/listen/directory_spec.rb +284 -0
  255. data/vendor/deps/listen/spec/lib/listen/event/config_spec.rb +33 -0
  256. data/vendor/deps/listen/spec/lib/listen/event/loop_spec.rb +118 -0
  257. data/vendor/deps/listen/spec/lib/listen/event/processor_spec.rb +250 -0
  258. data/vendor/deps/listen/spec/lib/listen/event/queue_spec.rb +118 -0
  259. data/vendor/deps/listen/spec/lib/listen/file_spec.rb +254 -0
  260. data/vendor/deps/listen/spec/lib/listen/fsm_spec.rb +147 -0
  261. data/vendor/deps/listen/spec/lib/listen/listener/config_spec.rb +29 -0
  262. data/vendor/deps/listen/spec/lib/listen/listener_spec.rb +321 -0
  263. data/vendor/deps/listen/spec/lib/listen/logger_spec.rb +212 -0
  264. data/vendor/deps/listen/spec/lib/listen/monotonic_time_spec.rb +58 -0
  265. data/vendor/deps/listen/spec/lib/listen/queue_optimizer_spec.rb +111 -0
  266. data/vendor/deps/listen/spec/lib/listen/record_spec.rb +424 -0
  267. data/vendor/deps/listen/spec/lib/listen/silencer/controller_spec.rb +97 -0
  268. data/vendor/deps/listen/spec/lib/listen/silencer_spec.rb +109 -0
  269. data/vendor/deps/listen/spec/lib/listen/thread_spec.rb +133 -0
  270. data/vendor/deps/listen/spec/lib/listen_spec.rb +25 -0
  271. data/vendor/deps/listen/spec/spec_helper.rb +49 -0
  272. data/vendor/deps/listen/spec/support/acceptance_helper.rb +260 -0
  273. data/vendor/deps/listen/spec/support/fixtures_helper.rb +32 -0
  274. data/vendor/deps/listen/spec/support/platform_helper.rb +17 -0
  275. data/vendor/deps/observer/.github/dependabot.yml +6 -0
  276. data/vendor/deps/observer/.github/workflows/test.yml +33 -0
  277. data/vendor/deps/observer/.gitignore +8 -0
  278. data/vendor/deps/observer/BSDL +22 -0
  279. data/vendor/deps/observer/COPYING +56 -0
  280. data/vendor/deps/observer/Gemfile +9 -0
  281. data/vendor/deps/observer/README.md +139 -0
  282. data/vendor/deps/observer/Rakefile +10 -0
  283. data/vendor/deps/observer/bin/console +14 -0
  284. data/vendor/deps/observer/bin/setup +8 -0
  285. data/vendor/deps/observer/lib/observer.rb +229 -0
  286. data/vendor/deps/observer/observer.gemspec +32 -0
  287. data/vendor/deps/observer/test/test_observer.rb +66 -0
  288. data/vendor/deps/webrick/.gitignore +9 -0
  289. data/vendor/deps/webrick/Gemfile +3 -0
  290. data/vendor/deps/webrick/LICENSE.txt +22 -0
  291. data/vendor/deps/webrick/README.md +61 -0
  292. data/vendor/deps/webrick/Rakefile +10 -0
  293. data/vendor/deps/webrick/lib/webrick/accesslog.rb +157 -0
  294. data/vendor/deps/webrick/lib/webrick/cgi.rb +313 -0
  295. data/vendor/deps/webrick/lib/webrick/compat.rb +36 -0
  296. data/vendor/deps/webrick/lib/webrick/config.rb +158 -0
  297. data/vendor/deps/webrick/lib/webrick/cookie.rb +172 -0
  298. data/vendor/deps/webrick/lib/webrick/htmlutils.rb +30 -0
  299. data/vendor/deps/webrick/lib/webrick/httpauth/authenticator.rb +117 -0
  300. data/vendor/deps/webrick/lib/webrick/httpauth/basicauth.rb +116 -0
  301. data/vendor/deps/webrick/lib/webrick/httpauth/digestauth.rb +395 -0
  302. data/vendor/deps/webrick/lib/webrick/httpauth/htdigest.rb +132 -0
  303. data/vendor/deps/webrick/lib/webrick/httpauth/htgroup.rb +97 -0
  304. data/vendor/deps/webrick/lib/webrick/httpauth/htpasswd.rb +158 -0
  305. data/vendor/deps/webrick/lib/webrick/httpauth/userdb.rb +53 -0
  306. data/vendor/deps/webrick/lib/webrick/httpauth.rb +96 -0
  307. data/vendor/deps/webrick/lib/webrick/httpproxy.rb +354 -0
  308. data/vendor/deps/webrick/lib/webrick/httprequest.rb +636 -0
  309. data/vendor/deps/webrick/lib/webrick/httpresponse.rb +564 -0
  310. data/vendor/deps/webrick/lib/webrick/https.rb +152 -0
  311. data/vendor/deps/webrick/lib/webrick/httpserver.rb +294 -0
  312. data/vendor/deps/webrick/lib/webrick/httpservlet/abstract.rb +152 -0
  313. data/vendor/deps/webrick/lib/webrick/httpservlet/cgi_runner.rb +47 -0
  314. data/vendor/deps/webrick/lib/webrick/httpservlet/cgihandler.rb +126 -0
  315. data/vendor/deps/webrick/lib/webrick/httpservlet/erbhandler.rb +88 -0
  316. data/vendor/deps/webrick/lib/webrick/httpservlet/filehandler.rb +552 -0
  317. data/vendor/deps/webrick/lib/webrick/httpservlet/prochandler.rb +47 -0
  318. data/vendor/deps/webrick/lib/webrick/httpservlet.rb +23 -0
  319. data/vendor/deps/webrick/lib/webrick/httpstatus.rb +194 -0
  320. data/vendor/deps/webrick/lib/webrick/httputils.rb +512 -0
  321. data/vendor/deps/webrick/lib/webrick/httpversion.rb +76 -0
  322. data/vendor/deps/webrick/lib/webrick/log.rb +156 -0
  323. data/vendor/deps/webrick/lib/webrick/server.rb +381 -0
  324. data/vendor/deps/webrick/lib/webrick/ssl.rb +215 -0
  325. data/vendor/deps/webrick/lib/webrick/utils.rb +265 -0
  326. data/vendor/deps/webrick/lib/webrick/version.rb +18 -0
  327. data/vendor/deps/webrick/lib/webrick.rb +232 -0
  328. data/vendor/deps/webrick/webrick.gemspec +74 -0
  329. metadata +412 -0
@@ -0,0 +1,194 @@
1
+ # frozen_string_literal: true
2
+ #--
3
+ # httpstatus.rb -- HTTPStatus 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: httpstatus.rb,v 1.11 2003/03/24 20:18:55 gotoyuzo Exp $
11
+
12
+ require_relative 'accesslog'
13
+
14
+ module WEBrick
15
+
16
+ ##
17
+ # This module is used to manager HTTP status codes.
18
+ #
19
+ # See http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html for more
20
+ # information.
21
+ module HTTPStatus
22
+
23
+ ##
24
+ # Root of the HTTP status class hierarchy
25
+ class Status < StandardError
26
+ class << self
27
+ attr_reader :code, :reason_phrase # :nodoc:
28
+ end
29
+
30
+ # Returns the HTTP status code
31
+ def code() self::class::code end
32
+
33
+ # Returns the HTTP status description
34
+ def reason_phrase() self::class::reason_phrase end
35
+
36
+ alias to_i code # :nodoc:
37
+ end
38
+
39
+ # Root of the HTTP info statuses
40
+ class Info < Status; end
41
+ # Root of the HTTP success statuses
42
+ class Success < Status; end
43
+ # Root of the HTTP redirect statuses
44
+ class Redirect < Status; end
45
+ # Root of the HTTP error statuses
46
+ class Error < Status; end
47
+ # Root of the HTTP client error statuses
48
+ class ClientError < Error; end
49
+ # Root of the HTTP server error statuses
50
+ class ServerError < Error; end
51
+
52
+ class EOFError < StandardError; end
53
+
54
+ # HTTP status codes and descriptions
55
+ StatusMessage = { # :nodoc:
56
+ 100 => 'Continue',
57
+ 101 => 'Switching Protocols',
58
+ 200 => 'OK',
59
+ 201 => 'Created',
60
+ 202 => 'Accepted',
61
+ 203 => 'Non-Authoritative Information',
62
+ 204 => 'No Content',
63
+ 205 => 'Reset Content',
64
+ 206 => 'Partial Content',
65
+ 207 => 'Multi-Status',
66
+ 300 => 'Multiple Choices',
67
+ 301 => 'Moved Permanently',
68
+ 302 => 'Found',
69
+ 303 => 'See Other',
70
+ 304 => 'Not Modified',
71
+ 305 => 'Use Proxy',
72
+ 307 => 'Temporary Redirect',
73
+ 400 => 'Bad Request',
74
+ 401 => 'Unauthorized',
75
+ 402 => 'Payment Required',
76
+ 403 => 'Forbidden',
77
+ 404 => 'Not Found',
78
+ 405 => 'Method Not Allowed',
79
+ 406 => 'Not Acceptable',
80
+ 407 => 'Proxy Authentication Required',
81
+ 408 => 'Request Timeout',
82
+ 409 => 'Conflict',
83
+ 410 => 'Gone',
84
+ 411 => 'Length Required',
85
+ 412 => 'Precondition Failed',
86
+ 413 => 'Request Entity Too Large',
87
+ 414 => 'Request-URI Too Large',
88
+ 415 => 'Unsupported Media Type',
89
+ 416 => 'Request Range Not Satisfiable',
90
+ 417 => 'Expectation Failed',
91
+ 422 => 'Unprocessable Entity',
92
+ 423 => 'Locked',
93
+ 424 => 'Failed Dependency',
94
+ 426 => 'Upgrade Required',
95
+ 428 => 'Precondition Required',
96
+ 429 => 'Too Many Requests',
97
+ 431 => 'Request Header Fields Too Large',
98
+ 451 => 'Unavailable For Legal Reasons',
99
+ 500 => 'Internal Server Error',
100
+ 501 => 'Not Implemented',
101
+ 502 => 'Bad Gateway',
102
+ 503 => 'Service Unavailable',
103
+ 504 => 'Gateway Timeout',
104
+ 505 => 'HTTP Version Not Supported',
105
+ 507 => 'Insufficient Storage',
106
+ 511 => 'Network Authentication Required',
107
+ }
108
+
109
+ # Maps a status code to the corresponding Status class
110
+ CodeToError = {} # :nodoc:
111
+
112
+ # Creates a status or error class for each status code and
113
+ # populates the CodeToError map.
114
+ StatusMessage.each{|code, message|
115
+ message.freeze
116
+ var_name = message.gsub(/[ \-]/,'_').upcase
117
+ err_name = message.gsub(/[ \-]/,'')
118
+
119
+ case code
120
+ when 100...200; parent = Info
121
+ when 200...300; parent = Success
122
+ when 300...400; parent = Redirect
123
+ when 400...500; parent = ClientError
124
+ when 500...600; parent = ServerError
125
+ end
126
+
127
+ const_set("RC_#{var_name}", code)
128
+ err_class = Class.new(parent)
129
+ err_class.instance_variable_set(:@code, code)
130
+ err_class.instance_variable_set(:@reason_phrase, message)
131
+ const_set(err_name, err_class)
132
+ CodeToError[code] = err_class
133
+ }
134
+
135
+ ##
136
+ # Returns the description corresponding to the HTTP status +code+
137
+ #
138
+ # WEBrick::HTTPStatus.reason_phrase 404
139
+ # => "Not Found"
140
+ def reason_phrase(code)
141
+ StatusMessage[code.to_i]
142
+ end
143
+
144
+ ##
145
+ # Is +code+ an informational status?
146
+ def info?(code)
147
+ code.to_i >= 100 and code.to_i < 200
148
+ end
149
+
150
+ ##
151
+ # Is +code+ a successful status?
152
+ def success?(code)
153
+ code.to_i >= 200 and code.to_i < 300
154
+ end
155
+
156
+ ##
157
+ # Is +code+ a redirection status?
158
+ def redirect?(code)
159
+ code.to_i >= 300 and code.to_i < 400
160
+ end
161
+
162
+ ##
163
+ # Is +code+ an error status?
164
+ def error?(code)
165
+ code.to_i >= 400 and code.to_i < 600
166
+ end
167
+
168
+ ##
169
+ # Is +code+ a client error status?
170
+ def client_error?(code)
171
+ code.to_i >= 400 and code.to_i < 500
172
+ end
173
+
174
+ ##
175
+ # Is +code+ a server error status?
176
+ def server_error?(code)
177
+ code.to_i >= 500 and code.to_i < 600
178
+ end
179
+
180
+ ##
181
+ # Returns the status class corresponding to +code+
182
+ #
183
+ # WEBrick::HTTPStatus[302]
184
+ # => WEBrick::HTTPStatus::NotFound
185
+ #
186
+ def self.[](code)
187
+ CodeToError[code]
188
+ end
189
+
190
+ module_function :reason_phrase
191
+ module_function :info?, :success?, :redirect?, :error?
192
+ module_function :client_error?, :server_error?
193
+ end
194
+ end
@@ -0,0 +1,512 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # httputils.rb -- HTTPUtils Module
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: httputils.rb,v 1.34 2003/06/05 21:34:08 gotoyuzo Exp $
11
+
12
+ require 'socket'
13
+ require 'tempfile'
14
+
15
+ module WEBrick
16
+ CR = "\x0d" # :nodoc:
17
+ LF = "\x0a" # :nodoc:
18
+ CRLF = "\x0d\x0a" # :nodoc:
19
+
20
+ ##
21
+ # HTTPUtils provides utility methods for working with the HTTP protocol.
22
+ #
23
+ # This module is generally used internally by WEBrick
24
+
25
+ module HTTPUtils
26
+
27
+ ##
28
+ # Normalizes a request path. Raises an exception if the path cannot be
29
+ # normalized.
30
+
31
+ def normalize_path(path)
32
+ raise "abnormal path `#{path}'" if path[0] != ?/
33
+ ret = path.dup
34
+
35
+ ret.gsub!(%r{/+}o, '/') # // => /
36
+ while ret.sub!(%r'/\.(?:/|\Z)', '/'); end # /. => /
37
+ while ret.sub!(%r'/(?!\.\./)[^/]+/\.\.(?:/|\Z)', '/'); end # /foo/.. => /foo
38
+
39
+ raise "abnormal path `#{path}'" if %r{/\.\.(/|\Z)} =~ ret
40
+ ret
41
+ end
42
+ module_function :normalize_path
43
+
44
+ ##
45
+ # Default mime types
46
+
47
+ DefaultMimeTypes = {
48
+ "ai" => "application/postscript",
49
+ "asc" => "text/plain",
50
+ "avi" => "video/x-msvideo",
51
+ "bin" => "application/octet-stream",
52
+ "bmp" => "image/bmp",
53
+ "class" => "application/octet-stream",
54
+ "cer" => "application/pkix-cert",
55
+ "crl" => "application/pkix-crl",
56
+ "crt" => "application/x-x509-ca-cert",
57
+ #"crl" => "application/x-pkcs7-crl",
58
+ "css" => "text/css",
59
+ "dms" => "application/octet-stream",
60
+ "doc" => "application/msword",
61
+ "dvi" => "application/x-dvi",
62
+ "eps" => "application/postscript",
63
+ "etx" => "text/x-setext",
64
+ "exe" => "application/octet-stream",
65
+ "gif" => "image/gif",
66
+ "htm" => "text/html",
67
+ "html" => "text/html",
68
+ "jpe" => "image/jpeg",
69
+ "jpeg" => "image/jpeg",
70
+ "jpg" => "image/jpeg",
71
+ "js" => "application/javascript",
72
+ "json" => "application/json",
73
+ "lha" => "application/octet-stream",
74
+ "lzh" => "application/octet-stream",
75
+ "mjs" => "application/javascript",
76
+ "mov" => "video/quicktime",
77
+ "mpe" => "video/mpeg",
78
+ "mpeg" => "video/mpeg",
79
+ "mpg" => "video/mpeg",
80
+ "pbm" => "image/x-portable-bitmap",
81
+ "pdf" => "application/pdf",
82
+ "pgm" => "image/x-portable-graymap",
83
+ "png" => "image/png",
84
+ "pnm" => "image/x-portable-anymap",
85
+ "ppm" => "image/x-portable-pixmap",
86
+ "ppt" => "application/vnd.ms-powerpoint",
87
+ "ps" => "application/postscript",
88
+ "qt" => "video/quicktime",
89
+ "ras" => "image/x-cmu-raster",
90
+ "rb" => "text/plain",
91
+ "rd" => "text/plain",
92
+ "rtf" => "application/rtf",
93
+ "sgm" => "text/sgml",
94
+ "sgml" => "text/sgml",
95
+ "svg" => "image/svg+xml",
96
+ "tif" => "image/tiff",
97
+ "tiff" => "image/tiff",
98
+ "txt" => "text/plain",
99
+ "wasm" => "application/wasm",
100
+ "xbm" => "image/x-xbitmap",
101
+ "xhtml" => "text/html",
102
+ "xls" => "application/vnd.ms-excel",
103
+ "xml" => "text/xml",
104
+ "xpm" => "image/x-xpixmap",
105
+ "xwd" => "image/x-xwindowdump",
106
+ "zip" => "application/zip",
107
+ }
108
+
109
+ ##
110
+ # Loads Apache-compatible mime.types in +file+.
111
+
112
+ def load_mime_types(file)
113
+ # note: +file+ may be a "| command" for now; some people may
114
+ # rely on this, but currently we do not use this method by default.
115
+ open(file){ |io|
116
+ hash = Hash.new
117
+ io.each{ |line|
118
+ next if /^#/ =~ line
119
+ line.chomp!
120
+ mimetype, ext0 = line.split(/\s+/, 2)
121
+ next unless ext0
122
+ next if ext0.empty?
123
+ ext0.split(/\s+/).each{ |ext| hash[ext] = mimetype }
124
+ }
125
+ hash
126
+ }
127
+ end
128
+ module_function :load_mime_types
129
+
130
+ ##
131
+ # Returns the mime type of +filename+ from the list in +mime_tab+. If no
132
+ # mime type was found application/octet-stream is returned.
133
+
134
+ def mime_type(filename, mime_tab)
135
+ suffix1 = (/\.(\w+)$/ =~ filename && $1.downcase)
136
+ suffix2 = (/\.(\w+)\.[\w\-]+$/ =~ filename && $1.downcase)
137
+ mime_tab[suffix1] || mime_tab[suffix2] || "application/octet-stream"
138
+ end
139
+ module_function :mime_type
140
+
141
+ ##
142
+ # Parses an HTTP header +raw+ into a hash of header fields with an Array
143
+ # of values.
144
+
145
+ def parse_header(raw)
146
+ header = Hash.new([].freeze)
147
+ field = nil
148
+ raw.each_line{|line|
149
+ case line
150
+ when /^([A-Za-z0-9!\#$%&'*+\-.^_`|~]+):\s*(.*?)\s*\z/om
151
+ field, value = $1, $2
152
+ field.downcase!
153
+ header[field] = [] unless header.has_key?(field)
154
+ header[field] << value
155
+ when /^\s+(.*?)\s*\z/om
156
+ value = $1
157
+ unless field
158
+ raise HTTPStatus::BadRequest, "bad header '#{line}'."
159
+ end
160
+ header[field][-1] << " " << value
161
+ else
162
+ raise HTTPStatus::BadRequest, "bad header '#{line}'."
163
+ end
164
+ }
165
+ header.each{|key, values|
166
+ values.each(&:strip!)
167
+ }
168
+ header
169
+ end
170
+ module_function :parse_header
171
+
172
+ ##
173
+ # Splits a header value +str+ according to HTTP specification.
174
+
175
+ def split_header_value(str)
176
+ str.scan(%r'\G((?:"(?:\\.|[^"])+?"|[^",]+)+)
177
+ (?:,\s*|\Z)'xn).flatten
178
+ end
179
+ module_function :split_header_value
180
+
181
+ ##
182
+ # Parses a Range header value +ranges_specifier+
183
+
184
+ def parse_range_header(ranges_specifier)
185
+ if /^bytes=(.*)/ =~ ranges_specifier
186
+ byte_range_set = split_header_value($1)
187
+ byte_range_set.collect{|range_spec|
188
+ case range_spec
189
+ when /^(\d+)-(\d+)/ then $1.to_i .. $2.to_i
190
+ when /^(\d+)-/ then $1.to_i .. -1
191
+ when /^-(\d+)/ then -($1.to_i) .. -1
192
+ else return nil
193
+ end
194
+ }
195
+ end
196
+ end
197
+ module_function :parse_range_header
198
+
199
+ ##
200
+ # Parses q values in +value+ as used in Accept headers.
201
+
202
+ def parse_qvalues(value)
203
+ tmp = []
204
+ if value
205
+ parts = value.split(/,\s*/)
206
+ parts.each {|part|
207
+ if m = %r{^([^\s,]+?)(?:;\s*q=(\d+(?:\.\d+)?))?$}.match(part)
208
+ val = m[1]
209
+ q = (m[2] or 1).to_f
210
+ tmp.push([val, q])
211
+ end
212
+ }
213
+ tmp = tmp.sort_by{|val, q| -q}
214
+ tmp.collect!{|val, q| val}
215
+ end
216
+ return tmp
217
+ end
218
+ module_function :parse_qvalues
219
+
220
+ ##
221
+ # Removes quotes and escapes from +str+
222
+
223
+ def dequote(str)
224
+ ret = (/\A"(.*)"\Z/ =~ str) ? $1 : str.dup
225
+ ret.gsub!(/\\(.)/, "\\1")
226
+ ret
227
+ end
228
+ module_function :dequote
229
+
230
+ ##
231
+ # Quotes and escapes quotes in +str+
232
+
233
+ def quote(str)
234
+ +'"' << str.gsub(/[\\\"]/o, "\\\1") << '"'
235
+ end
236
+ module_function :quote
237
+
238
+ ##
239
+ # Stores multipart form data. FormData objects are created when
240
+ # WEBrick::HTTPUtils.parse_form_data is called.
241
+
242
+ class FormData < String
243
+ EmptyRawHeader = [].freeze # :nodoc:
244
+ EmptyHeader = {}.freeze # :nodoc:
245
+
246
+ ##
247
+ # The name of the form data part
248
+
249
+ attr_accessor :name
250
+
251
+ ##
252
+ # The filename of the form data part
253
+
254
+ attr_accessor :filename
255
+
256
+ attr_accessor :next_data # :nodoc:
257
+ protected :next_data
258
+
259
+ ##
260
+ # Creates a new FormData object.
261
+ #
262
+ # +args+ is an Array of form data entries. One FormData will be created
263
+ # for each entry.
264
+ #
265
+ # This is called by WEBrick::HTTPUtils.parse_form_data for you
266
+
267
+ def initialize(*args)
268
+ @name = @filename = @next_data = nil
269
+ if args.empty?
270
+ @raw_header = []
271
+ @header = nil
272
+ super("")
273
+ else
274
+ @raw_header = EmptyRawHeader
275
+ @header = EmptyHeader
276
+ super(args.shift)
277
+ unless args.empty?
278
+ @next_data = self.class.new(*args)
279
+ end
280
+ end
281
+ end
282
+
283
+ ##
284
+ # Retrieves the header at the first entry in +key+
285
+
286
+ def [](*key)
287
+ begin
288
+ @header[key[0].downcase].join(", ")
289
+ rescue StandardError, NameError
290
+ super
291
+ end
292
+ end
293
+
294
+ ##
295
+ # Adds +str+ to this FormData which may be the body, a header or a
296
+ # header entry.
297
+ #
298
+ # This is called by WEBrick::HTTPUtils.parse_form_data for you
299
+
300
+ def <<(str)
301
+ if @header
302
+ super
303
+ elsif str == CRLF
304
+ @header = HTTPUtils::parse_header(@raw_header.join)
305
+ if cd = self['content-disposition']
306
+ if /\s+name="(.*?)"/ =~ cd then @name = $1 end
307
+ if /\s+filename="(.*?)"/ =~ cd then @filename = $1 end
308
+ end
309
+ else
310
+ @raw_header << str
311
+ end
312
+ self
313
+ end
314
+
315
+ ##
316
+ # Adds +data+ at the end of the chain of entries
317
+ #
318
+ # This is called by WEBrick::HTTPUtils.parse_form_data for you.
319
+
320
+ def append_data(data)
321
+ tmp = self
322
+ while tmp
323
+ unless tmp.next_data
324
+ tmp.next_data = data
325
+ break
326
+ end
327
+ tmp = tmp.next_data
328
+ end
329
+ self
330
+ end
331
+
332
+ ##
333
+ # Yields each entry in this FormData
334
+
335
+ def each_data
336
+ tmp = self
337
+ while tmp
338
+ next_data = tmp.next_data
339
+ yield(tmp)
340
+ tmp = next_data
341
+ end
342
+ end
343
+
344
+ ##
345
+ # Returns all the FormData as an Array
346
+
347
+ def list
348
+ ret = []
349
+ each_data{|data|
350
+ ret << data.to_s
351
+ }
352
+ ret
353
+ end
354
+
355
+ ##
356
+ # A FormData will behave like an Array
357
+
358
+ alias :to_ary :list
359
+
360
+ ##
361
+ # This FormData's body
362
+
363
+ def to_s
364
+ String.new(self)
365
+ end
366
+ end
367
+
368
+ ##
369
+ # Parses the query component of a URI in +str+
370
+
371
+ def parse_query(str)
372
+ query = Hash.new
373
+ if str
374
+ str.split(/[&;]/).each{|x|
375
+ next if x.empty?
376
+ key, val = x.split(/=/,2)
377
+ key = unescape_form(key)
378
+ val = unescape_form(val.to_s)
379
+ val = FormData.new(val)
380
+ val.name = key
381
+ if query.has_key?(key)
382
+ query[key].append_data(val)
383
+ next
384
+ end
385
+ query[key] = val
386
+ }
387
+ end
388
+ query
389
+ end
390
+ module_function :parse_query
391
+
392
+ ##
393
+ # Parses form data in +io+ with the given +boundary+
394
+
395
+ def parse_form_data(io, boundary)
396
+ boundary_regexp = /\A--#{Regexp.quote(boundary)}(--)?#{CRLF}\z/
397
+ form_data = Hash.new
398
+ return form_data unless io
399
+ data = nil
400
+ io.each_line{|line|
401
+ if boundary_regexp =~ line
402
+ if data
403
+ data.chop!
404
+ key = data.name
405
+ if form_data.has_key?(key)
406
+ form_data[key].append_data(data)
407
+ else
408
+ form_data[key] = data
409
+ end
410
+ end
411
+ data = FormData.new
412
+ next
413
+ else
414
+ if data
415
+ data << line
416
+ end
417
+ end
418
+ }
419
+ return form_data
420
+ end
421
+ module_function :parse_form_data
422
+
423
+ #####
424
+
425
+ reserved = ';/?:@&=+$,'
426
+ num = '0123456789'
427
+ lowalpha = 'abcdefghijklmnopqrstuvwxyz'
428
+ upalpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
429
+ mark = '-_.!~*\'()'
430
+ unreserved = num + lowalpha + upalpha + mark
431
+ control = (0x0..0x1f).collect{|c| c.chr }.join + "\x7f"
432
+ space = " "
433
+ delims = '<>#%"'
434
+ unwise = '{}|\\^[]`'
435
+ nonascii = (0x80..0xff).collect{|c| c.chr }.join
436
+
437
+ module_function
438
+
439
+ # :stopdoc:
440
+
441
+ def _make_regex(str) /([#{Regexp.escape(str)}])/n end
442
+ def _make_regex!(str) /([^#{Regexp.escape(str)}])/n end
443
+ def _escape(str, regex)
444
+ str = str.b
445
+ str.gsub!(regex) {"%%%02X" % $1.ord}
446
+ # %-escaped string should contain US-ASCII only
447
+ str.force_encoding(Encoding::US_ASCII)
448
+ end
449
+ def _unescape(str, regex)
450
+ str = str.b
451
+ str.gsub!(regex) {$1.hex.chr}
452
+ # encoding of %-unescaped string is unknown
453
+ str
454
+ end
455
+
456
+ UNESCAPED = _make_regex(control+space+delims+unwise+nonascii)
457
+ UNESCAPED_FORM = _make_regex(reserved+control+delims+unwise+nonascii)
458
+ NONASCII = _make_regex(nonascii)
459
+ ESCAPED = /%([0-9a-fA-F]{2})/
460
+ UNESCAPED_PCHAR = _make_regex!(unreserved+":@&=+$,")
461
+
462
+ # :startdoc:
463
+
464
+ ##
465
+ # Escapes HTTP reserved and unwise characters in +str+
466
+
467
+ def escape(str)
468
+ _escape(str, UNESCAPED)
469
+ end
470
+
471
+ ##
472
+ # Unescapes HTTP reserved and unwise characters in +str+
473
+
474
+ def unescape(str)
475
+ _unescape(str, ESCAPED)
476
+ end
477
+
478
+ ##
479
+ # Escapes form reserved characters in +str+
480
+
481
+ def escape_form(str)
482
+ ret = _escape(str, UNESCAPED_FORM)
483
+ ret.gsub!(/ /, "+")
484
+ ret
485
+ end
486
+
487
+ ##
488
+ # Unescapes form reserved characters in +str+
489
+
490
+ def unescape_form(str)
491
+ _unescape(str.gsub(/\+/, " "), ESCAPED)
492
+ end
493
+
494
+ ##
495
+ # Escapes path +str+
496
+
497
+ def escape_path(str)
498
+ result = +""
499
+ str.scan(%r{/([^/]*)}).each{|i|
500
+ result << "/" << _escape(i[0], UNESCAPED_PCHAR)
501
+ }
502
+ return result
503
+ end
504
+
505
+ ##
506
+ # Escapes 8 bit characters in +str+
507
+
508
+ def escape8bit(str)
509
+ _escape(str, NONASCII)
510
+ end
511
+ end
512
+ end