shopify-cli 1.3.1 → 1.7.0

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 (301) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CODEOWNERS +2 -2
  3. data/.github/CONTRIBUTING.md +9 -1
  4. data/.github/PULL_REQUEST_TEMPLATE.md +10 -1
  5. data/.github/workflows/release.yml +61 -0
  6. data/.github/workflows/triage.yml +22 -0
  7. data/.gitignore +0 -1
  8. data/.rubocop.yml +61 -8
  9. data/.rubocop_todo.yml +11 -0
  10. data/.travis.yml +1 -0
  11. data/CHANGELOG.md +30 -0
  12. data/Gemfile +12 -11
  13. data/Gemfile.lock +39 -37
  14. data/README.md +39 -7
  15. data/RELEASING.md +19 -29
  16. data/Rakefile +32 -28
  17. data/bin/load_shopify.rb +6 -6
  18. data/bin/shopify +2 -2
  19. data/dev.yml +2 -2
  20. data/docs/_config.yml +1 -18
  21. data/docs/app/node/commands/index.md +2 -80
  22. data/docs/app/node/index.md +2 -33
  23. data/docs/app/rails/commands/index.md +2 -78
  24. data/docs/app/rails/index.md +2 -34
  25. data/docs/core/index.md +2 -84
  26. data/docs/getting-started/index.md +2 -25
  27. data/docs/getting-started/install/index.md +1 -118
  28. data/docs/getting-started/migrate/index.md +2 -94
  29. data/docs/getting-started/uninstall/index.md +2 -35
  30. data/docs/getting-started/upgrade/index.md +2 -39
  31. data/docs/help/start-app/index.md +2 -4
  32. data/docs/index.md +2 -24
  33. data/ext/shopify-cli/extconf.rb +7 -7
  34. data/install.sh +1 -1
  35. data/lib/docgen/markdown.rb +11 -11
  36. data/lib/{project_types/extension/graphql → graphql}/get_app_by_api_key.graphql +0 -0
  37. data/lib/project_types/extension/cli.rb +64 -47
  38. data/lib/project_types/extension/commands/build.rb +3 -3
  39. data/lib/project_types/extension/commands/create.rb +16 -9
  40. data/lib/project_types/extension/commands/extension_command.rb +8 -5
  41. data/lib/project_types/extension/commands/push.rb +8 -8
  42. data/lib/project_types/extension/commands/register.rb +19 -30
  43. data/lib/project_types/extension/commands/serve.rb +2 -2
  44. data/lib/project_types/extension/commands/tunnel.rb +12 -12
  45. data/lib/project_types/extension/extension_project.rb +4 -4
  46. data/lib/project_types/extension/extension_project_keys.rb +4 -4
  47. data/lib/project_types/extension/features/argo.rb +117 -0
  48. data/lib/project_types/extension/features/argo_config.rb +5 -5
  49. data/lib/project_types/extension/features/argo_dependencies.rb +5 -5
  50. data/lib/project_types/extension/features/argo_setup.rb +2 -2
  51. data/lib/project_types/extension/features/argo_setup_steps.rb +4 -4
  52. data/lib/project_types/extension/forms/create.rb +28 -34
  53. data/lib/project_types/extension/forms/questions/ask_app.rb +53 -0
  54. data/lib/project_types/extension/forms/questions/ask_name.rb +40 -0
  55. data/lib/project_types/extension/forms/questions/ask_type.rb +36 -0
  56. data/lib/project_types/extension/messages/messages.rb +53 -52
  57. data/lib/project_types/extension/models/lazy_specification_handler.rb +12 -0
  58. data/lib/project_types/extension/models/specification.rb +35 -0
  59. data/lib/project_types/extension/models/specification_handlers/checkout_post_purchase.rb +19 -0
  60. data/lib/project_types/extension/models/specification_handlers/default.rb +67 -0
  61. data/lib/project_types/extension/models/specifications.rb +77 -0
  62. data/lib/project_types/extension/tasks/configure_features.rb +52 -0
  63. data/lib/project_types/extension/tasks/converters/app_converter.rb +6 -6
  64. data/lib/project_types/extension/tasks/converters/registration_converter.rb +6 -6
  65. data/lib/project_types/extension/tasks/converters/validation_error_converter.rb +4 -4
  66. data/lib/project_types/extension/tasks/converters/version_converter.rb +7 -7
  67. data/lib/project_types/extension/tasks/create_extension.rb +4 -4
  68. data/lib/project_types/extension/tasks/fetch_specifications.rb +38 -0
  69. data/lib/project_types/extension/tasks/get_app.rb +4 -4
  70. data/lib/project_types/extension/tasks/get_apps.rb +3 -3
  71. data/lib/project_types/extension/tasks/update_draft.rb +4 -4
  72. data/lib/project_types/extension/tasks/user_errors.rb +4 -4
  73. data/lib/project_types/node/cli.rb +19 -16
  74. data/lib/project_types/node/commands/connect.rb +15 -0
  75. data/lib/project_types/node/commands/create.rb +46 -38
  76. data/lib/project_types/node/commands/deploy.rb +4 -4
  77. data/lib/project_types/node/commands/deploy/heroku.rb +24 -24
  78. data/lib/project_types/node/commands/generate.rb +9 -18
  79. data/lib/project_types/node/commands/open.rb +2 -2
  80. data/lib/project_types/node/commands/populate.rb +6 -6
  81. data/lib/project_types/node/commands/populate/customer.rb +5 -5
  82. data/lib/project_types/node/commands/populate/draft_order.rb +5 -5
  83. data/lib/project_types/node/commands/populate/product.rb +5 -5
  84. data/lib/project_types/node/commands/serve.rb +9 -9
  85. data/lib/project_types/node/commands/tunnel.rb +7 -7
  86. data/lib/project_types/node/forms/create.rb +7 -7
  87. data/lib/project_types/node/messages/messages.rb +19 -53
  88. data/lib/project_types/rails/cli.rb +21 -18
  89. data/lib/project_types/rails/commands/connect.rb +15 -0
  90. data/lib/project_types/rails/commands/create.rb +60 -54
  91. data/lib/project_types/rails/commands/deploy.rb +4 -4
  92. data/lib/project_types/rails/commands/deploy/heroku.rb +30 -30
  93. data/lib/project_types/rails/commands/generate.rb +7 -7
  94. data/lib/project_types/rails/commands/generate/webhook.rb +6 -6
  95. data/lib/project_types/rails/commands/open.rb +2 -2
  96. data/lib/project_types/rails/commands/populate.rb +6 -6
  97. data/lib/project_types/rails/commands/populate/customer.rb +5 -5
  98. data/lib/project_types/rails/commands/populate/draft_order.rb +5 -5
  99. data/lib/project_types/rails/commands/populate/product.rb +5 -5
  100. data/lib/project_types/rails/commands/serve.rb +11 -11
  101. data/lib/project_types/rails/commands/tunnel.rb +7 -7
  102. data/lib/project_types/rails/forms/create.rb +24 -24
  103. data/lib/project_types/rails/gem.rb +24 -24
  104. data/lib/project_types/rails/messages/messages.rb +12 -9
  105. data/lib/project_types/rails/ruby.rb +2 -2
  106. data/lib/project_types/script/cli.rb +42 -38
  107. data/lib/project_types/script/commands/create.rb +13 -10
  108. data/lib/project_types/script/commands/disable.rb +3 -3
  109. data/lib/project_types/script/commands/enable.rb +19 -9
  110. data/lib/project_types/script/commands/push.rb +10 -17
  111. data/lib/project_types/script/config/extension_points.yml +17 -12
  112. data/lib/project_types/script/errors.rb +38 -0
  113. data/lib/project_types/script/forms/create.rb +29 -5
  114. data/lib/project_types/script/graphql/app_script_update_or_create.graphql +12 -1
  115. data/lib/project_types/script/layers/application/build_script.rb +18 -19
  116. data/lib/project_types/script/layers/application/create_script.rb +13 -11
  117. data/lib/project_types/script/layers/application/disable_script.rb +2 -2
  118. data/lib/project_types/script/layers/application/enable_script.rb +2 -2
  119. data/lib/project_types/script/layers/application/extension_points.rb +24 -0
  120. data/lib/project_types/script/layers/application/project_dependencies.rb +4 -4
  121. data/lib/project_types/script/layers/application/push_script.rb +12 -18
  122. data/lib/project_types/script/layers/domain/errors.rb +7 -0
  123. data/lib/project_types/script/layers/domain/extension_point.rb +62 -7
  124. data/lib/project_types/script/layers/domain/metadata.rb +55 -0
  125. data/lib/project_types/script/layers/domain/push_package.rb +29 -6
  126. data/lib/project_types/script/layers/infrastructure/assemblyscript_project_creator.rb +19 -54
  127. data/lib/project_types/script/layers/infrastructure/assemblyscript_task_runner.rb +49 -18
  128. data/lib/project_types/script/layers/infrastructure/errors.rb +17 -1
  129. data/lib/project_types/script/layers/infrastructure/extension_point_repository.rb +12 -6
  130. data/lib/project_types/script/layers/infrastructure/project_creator.rb +2 -1
  131. data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +20 -13
  132. data/lib/project_types/script/layers/infrastructure/rust_project_creator.rb +72 -0
  133. data/lib/project_types/script/layers/infrastructure/rust_task_runner.rb +59 -0
  134. data/lib/project_types/script/layers/infrastructure/script_service.rb +26 -16
  135. data/lib/project_types/script/layers/infrastructure/task_runner.rb +4 -3
  136. data/lib/project_types/script/messages/messages.rb +67 -10
  137. data/lib/project_types/script/script_project.rb +47 -16
  138. data/lib/project_types/script/ui/error_handler.rb +115 -45
  139. data/lib/project_types/script/ui/printing_spinner.rb +1 -1
  140. data/lib/project_types/script/ui/strict_spinner.rb +1 -1
  141. data/lib/project_types/theme/cli.rb +40 -0
  142. data/lib/project_types/theme/commands/connect.rb +54 -0
  143. data/lib/project_types/theme/commands/create.rb +48 -0
  144. data/lib/project_types/theme/commands/deploy.rb +38 -0
  145. data/lib/project_types/theme/commands/generate.rb +20 -0
  146. data/lib/project_types/theme/commands/generate/env.rb +79 -0
  147. data/lib/project_types/theme/commands/push.rb +55 -0
  148. data/lib/project_types/theme/commands/serve.rb +31 -0
  149. data/lib/project_types/theme/forms/connect.rb +34 -0
  150. data/lib/project_types/theme/forms/create.rb +22 -0
  151. data/lib/project_types/theme/messages/messages.rb +147 -0
  152. data/lib/project_types/theme/tasks/ensure_themekit_installed.rb +78 -0
  153. data/lib/project_types/theme/themekit.rb +113 -0
  154. data/lib/rubygems_plugin.rb +3 -3
  155. data/lib/shopify-cli/admin_api.rb +52 -12
  156. data/lib/shopify-cli/admin_api/populate_resource_command.rb +17 -17
  157. data/lib/shopify-cli/admin_api/schema.rb +3 -3
  158. data/lib/shopify-cli/api.rb +38 -37
  159. data/lib/shopify-cli/command.rb +1 -1
  160. data/lib/shopify-cli/commands.rb +9 -9
  161. data/lib/shopify-cli/commands/config.rb +28 -28
  162. data/lib/shopify-cli/commands/connect.rb +35 -18
  163. data/lib/shopify-cli/commands/create.rb +5 -5
  164. data/lib/shopify-cli/commands/help.rb +6 -6
  165. data/lib/shopify-cli/commands/logout.rb +3 -3
  166. data/lib/shopify-cli/commands/system.rb +40 -31
  167. data/lib/shopify-cli/commands/version.rb +2 -2
  168. data/lib/shopify-cli/context.rb +43 -22
  169. data/lib/shopify-cli/core.rb +4 -4
  170. data/lib/shopify-cli/core/entry_point.rb +6 -6
  171. data/lib/shopify-cli/core/executor.rb +1 -1
  172. data/lib/shopify-cli/core/help_resolver.rb +2 -2
  173. data/lib/shopify-cli/core/monorail.rb +21 -19
  174. data/lib/shopify-cli/db.rb +2 -2
  175. data/lib/shopify-cli/feature.rb +1 -3
  176. data/lib/shopify-cli/form.rb +1 -1
  177. data/lib/shopify-cli/git.rb +17 -17
  178. data/lib/shopify-cli/helpers.rb +1 -1
  179. data/lib/shopify-cli/helpers/haikunator.rb +1 -1
  180. data/lib/shopify-cli/heroku.rb +28 -28
  181. data/lib/shopify-cli/http_request.rb +27 -0
  182. data/lib/shopify-cli/js_deps.rb +13 -13
  183. data/lib/shopify-cli/js_system.rb +5 -5
  184. data/lib/shopify-cli/lazy_delegator.rb +55 -0
  185. data/lib/shopify-cli/messages/messages.rb +24 -10
  186. data/lib/shopify-cli/method_object.rb +104 -0
  187. data/lib/shopify-cli/oauth.rb +25 -25
  188. data/lib/shopify-cli/oauth/servlet.rb +9 -9
  189. data/lib/shopify-cli/options.rb +3 -3
  190. data/lib/shopify-cli/packager.rb +24 -24
  191. data/lib/shopify-cli/partners_api.rb +38 -16
  192. data/lib/shopify-cli/partners_api/organizations.rb +10 -10
  193. data/lib/shopify-cli/process_supervision.rb +8 -8
  194. data/lib/shopify-cli/project.rb +27 -23
  195. data/lib/shopify-cli/project_type.rb +21 -5
  196. data/lib/shopify-cli/resolve_constant.rb +25 -0
  197. data/lib/shopify-cli/resources.rb +1 -1
  198. data/lib/shopify-cli/resources/env_file.rb +9 -9
  199. data/lib/shopify-cli/result.rb +432 -0
  200. data/lib/shopify-cli/shopifolk.rb +84 -0
  201. data/lib/shopify-cli/sub_command.rb +1 -1
  202. data/lib/shopify-cli/task.rb +9 -1
  203. data/lib/shopify-cli/tasks.rb +7 -7
  204. data/lib/shopify-cli/tasks/create_api_client.rb +17 -6
  205. data/lib/shopify-cli/tasks/ensure_dev_store.rb +11 -11
  206. data/lib/shopify-cli/tasks/ensure_env.rb +18 -15
  207. data/lib/shopify-cli/tasks/ensure_loopback_url.rb +4 -4
  208. data/lib/shopify-cli/tasks/select_org_and_shop.rb +29 -24
  209. data/lib/shopify-cli/tasks/update_dashboard_urls.rb +10 -10
  210. data/lib/shopify-cli/transform_data_structure.rb +86 -0
  211. data/lib/shopify-cli/tunnel.rb +36 -30
  212. data/lib/shopify-cli/version.rb +1 -1
  213. data/lib/shopify_cli.rb +57 -51
  214. data/shopify-cli.gemspec +6 -6
  215. data/shopify.fish +1 -1
  216. data/shopify.sh +1 -1
  217. data/vendor/deps/cli-kit/REVISION +1 -1
  218. data/vendor/deps/cli-kit/lib/cli/kit/logger.rb +2 -2
  219. data/vendor/deps/cli-kit/lib/cli/kit/system.rb +3 -3
  220. data/vendor/deps/cli-ui/REVISION +1 -1
  221. data/vendor/deps/cli-ui/lib/cli/ui.rb +26 -22
  222. data/vendor/deps/cli-ui/lib/cli/ui/ansi.rb +4 -6
  223. data/vendor/deps/cli-ui/lib/cli/ui/frame.rb +3 -3
  224. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_stack.rb +8 -9
  225. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style.rb +1 -1
  226. data/vendor/deps/cli-ui/lib/cli/ui/glyph.rb +1 -0
  227. data/vendor/deps/cli-ui/lib/cli/ui/printer.rb +15 -3
  228. data/vendor/deps/cli-ui/lib/cli/ui/prompt/interactive_options.rb +4 -11
  229. data/vendor/deps/cli-ui/lib/cli/ui/spinner.rb +3 -5
  230. data/vendor/deps/cli-ui/lib/cli/ui/terminal.rb +10 -10
  231. data/vendor/deps/cli-ui/lib/cli/ui/version.rb +1 -1
  232. data/vendor/deps/cli-ui/lib/cli/ui/wrap.rb +56 -0
  233. data/vendor/deps/webrick/.gitignore +9 -0
  234. data/vendor/deps/webrick/Gemfile +3 -0
  235. data/vendor/deps/webrick/LICENSE.txt +22 -0
  236. data/vendor/deps/webrick/README.md +61 -0
  237. data/vendor/deps/webrick/Rakefile +10 -0
  238. data/vendor/deps/webrick/lib/webrick.rb +232 -0
  239. data/vendor/deps/webrick/lib/webrick/accesslog.rb +157 -0
  240. data/vendor/deps/webrick/lib/webrick/cgi.rb +313 -0
  241. data/vendor/deps/webrick/lib/webrick/compat.rb +36 -0
  242. data/vendor/deps/webrick/lib/webrick/config.rb +158 -0
  243. data/vendor/deps/webrick/lib/webrick/cookie.rb +172 -0
  244. data/vendor/deps/webrick/lib/webrick/htmlutils.rb +30 -0
  245. data/vendor/deps/webrick/lib/webrick/httpauth.rb +96 -0
  246. data/vendor/deps/webrick/lib/webrick/httpauth/authenticator.rb +117 -0
  247. data/vendor/deps/webrick/lib/webrick/httpauth/basicauth.rb +116 -0
  248. data/vendor/deps/webrick/lib/webrick/httpauth/digestauth.rb +395 -0
  249. data/vendor/deps/webrick/lib/webrick/httpauth/htdigest.rb +132 -0
  250. data/vendor/deps/webrick/lib/webrick/httpauth/htgroup.rb +97 -0
  251. data/vendor/deps/webrick/lib/webrick/httpauth/htpasswd.rb +158 -0
  252. data/vendor/deps/webrick/lib/webrick/httpauth/userdb.rb +53 -0
  253. data/vendor/deps/webrick/lib/webrick/httpproxy.rb +354 -0
  254. data/vendor/deps/webrick/lib/webrick/httprequest.rb +636 -0
  255. data/vendor/deps/webrick/lib/webrick/httpresponse.rb +564 -0
  256. data/vendor/deps/webrick/lib/webrick/https.rb +152 -0
  257. data/vendor/deps/webrick/lib/webrick/httpserver.rb +294 -0
  258. data/vendor/deps/webrick/lib/webrick/httpservlet.rb +23 -0
  259. data/vendor/deps/webrick/lib/webrick/httpservlet/abstract.rb +152 -0
  260. data/vendor/deps/webrick/lib/webrick/httpservlet/cgi_runner.rb +47 -0
  261. data/vendor/deps/webrick/lib/webrick/httpservlet/cgihandler.rb +126 -0
  262. data/vendor/deps/webrick/lib/webrick/httpservlet/erbhandler.rb +88 -0
  263. data/vendor/deps/webrick/lib/webrick/httpservlet/filehandler.rb +552 -0
  264. data/vendor/deps/webrick/lib/webrick/httpservlet/prochandler.rb +47 -0
  265. data/vendor/deps/webrick/lib/webrick/httpstatus.rb +194 -0
  266. data/vendor/deps/webrick/lib/webrick/httputils.rb +512 -0
  267. data/vendor/deps/webrick/lib/webrick/httpversion.rb +76 -0
  268. data/vendor/deps/webrick/lib/webrick/log.rb +156 -0
  269. data/vendor/deps/webrick/lib/webrick/server.rb +381 -0
  270. data/vendor/deps/webrick/lib/webrick/ssl.rb +215 -0
  271. data/vendor/deps/webrick/lib/webrick/utils.rb +265 -0
  272. data/vendor/deps/webrick/lib/webrick/version.rb +18 -0
  273. data/vendor/deps/webrick/webrick.gemspec +74 -0
  274. data/vendor/gen/template/bin/update-deps +9 -9
  275. metadata +84 -29
  276. data/docs/Gemfile +0 -5
  277. data/docs/Gemfile.lock +0 -258
  278. data/docs/_data/nav.yml +0 -35
  279. data/docs/_includes/footer.html +0 -15
  280. data/docs/_includes/head.html +0 -19
  281. data/docs/_includes/sidebar_nav.html +0 -22
  282. data/docs/_includes/toc.html +0 -112
  283. data/docs/_layouts/default.html +0 -79
  284. data/docs/css/docs.css +0 -157
  285. data/docs/images/header.png +0 -0
  286. data/docs/installing-ruby.md +0 -28
  287. data/lib/project_types/extension/features/argo/admin.rb +0 -20
  288. data/lib/project_types/extension/features/argo/base.rb +0 -129
  289. data/lib/project_types/extension/features/argo/checkout.rb +0 -20
  290. data/lib/project_types/extension/forms/register.rb +0 -47
  291. data/lib/project_types/extension/models/type.rb +0 -81
  292. data/lib/project_types/extension/models/types/checkout_post_purchase.rb +0 -23
  293. data/lib/project_types/extension/models/types/product_subscription.rb +0 -24
  294. data/lib/project_types/node/commands/generate/billing.rb +0 -39
  295. data/lib/project_types/node/commands/generate/page.rb +0 -59
  296. data/lib/project_types/node/commands/generate/webhook.rb +0 -37
  297. data/lib/project_types/script/layers/domain/script.rb +0 -18
  298. data/lib/project_types/script/layers/infrastructure/assemblyscript_tsconfig.rb +0 -38
  299. data/lib/project_types/script/layers/infrastructure/script_repository.rb +0 -59
  300. data/lib/project_types/script/templates/ts/as-pect.config.js +0 -27
  301. data/lib/project_types/script/templates/ts/as-pect.d.ts +0 -1
@@ -0,0 +1,152 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # https.rb -- SSL/TLS enhancement for HTTPServer
4
+ #
5
+ # Author: IPR -- Internet Programming with Ruby -- writers
6
+ # Copyright (c) 2001 GOTOU Yuuzou
7
+ # Copyright (c) 2002 Internet Programming with Ruby writers. All rights
8
+ # reserved.
9
+ #
10
+ # $IPR: https.rb,v 1.15 2003/07/22 19:20:42 gotoyuzo Exp $
11
+
12
+ require_relative 'ssl'
13
+ require_relative 'httpserver'
14
+
15
+ module WEBrick
16
+ module Config
17
+ HTTP.update(SSL)
18
+ end
19
+
20
+ ##
21
+ #--
22
+ # Adds SSL functionality to WEBrick::HTTPRequest
23
+
24
+ class HTTPRequest
25
+
26
+ ##
27
+ # HTTP request SSL cipher
28
+
29
+ attr_reader :cipher
30
+
31
+ ##
32
+ # HTTP request server certificate
33
+
34
+ attr_reader :server_cert
35
+
36
+ ##
37
+ # HTTP request client certificate
38
+
39
+ attr_reader :client_cert
40
+
41
+ # :stopdoc:
42
+
43
+ alias orig_parse parse
44
+
45
+ def parse(socket=nil)
46
+ if socket.respond_to?(:cert)
47
+ @server_cert = socket.cert || @config[:SSLCertificate]
48
+ @client_cert = socket.peer_cert
49
+ @client_cert_chain = socket.peer_cert_chain
50
+ @cipher = socket.cipher
51
+ end
52
+ orig_parse(socket)
53
+ end
54
+
55
+ alias orig_parse_uri parse_uri
56
+
57
+ def parse_uri(str, scheme="https")
58
+ if server_cert
59
+ return orig_parse_uri(str, scheme)
60
+ end
61
+ return orig_parse_uri(str)
62
+ end
63
+ private :parse_uri
64
+
65
+ alias orig_meta_vars meta_vars
66
+
67
+ def meta_vars
68
+ meta = orig_meta_vars
69
+ if server_cert
70
+ meta["HTTPS"] = "on"
71
+ meta["SSL_SERVER_CERT"] = @server_cert.to_pem
72
+ meta["SSL_CLIENT_CERT"] = @client_cert ? @client_cert.to_pem : ""
73
+ if @client_cert_chain
74
+ @client_cert_chain.each_with_index{|cert, i|
75
+ meta["SSL_CLIENT_CERT_CHAIN_#{i}"] = cert.to_pem
76
+ }
77
+ end
78
+ meta["SSL_CIPHER"] = @cipher[0]
79
+ meta["SSL_PROTOCOL"] = @cipher[1]
80
+ meta["SSL_CIPHER_USEKEYSIZE"] = @cipher[2].to_s
81
+ meta["SSL_CIPHER_ALGKEYSIZE"] = @cipher[3].to_s
82
+ end
83
+ meta
84
+ end
85
+
86
+ # :startdoc:
87
+ end
88
+
89
+ ##
90
+ #--
91
+ # Fake WEBrick::HTTPRequest for lookup_server
92
+
93
+ class SNIRequest
94
+
95
+ ##
96
+ # The SNI hostname
97
+
98
+ attr_reader :host
99
+
100
+ ##
101
+ # The socket address of the server
102
+
103
+ attr_reader :addr
104
+
105
+ ##
106
+ # The port this request is for
107
+
108
+ attr_reader :port
109
+
110
+ ##
111
+ # Creates a new SNIRequest.
112
+
113
+ def initialize(sslsocket, hostname)
114
+ @host = hostname
115
+ @addr = sslsocket.addr
116
+ @port = @addr[1]
117
+ end
118
+ end
119
+
120
+
121
+ ##
122
+ #--
123
+ # Adds SSL functionality to WEBrick::HTTPServer
124
+
125
+ class HTTPServer < ::WEBrick::GenericServer
126
+ ##
127
+ # ServerNameIndication callback
128
+
129
+ def ssl_servername_callback(sslsocket, hostname = nil)
130
+ req = SNIRequest.new(sslsocket, hostname)
131
+ server = lookup_server(req)
132
+ server ? server.ssl_context : nil
133
+ end
134
+
135
+ # :stopdoc:
136
+
137
+ ##
138
+ # Check whether +server+ is also SSL server.
139
+ # Also +server+'s SSL context will be created.
140
+
141
+ alias orig_virtual_host virtual_host
142
+
143
+ def virtual_host(server)
144
+ if @config[:SSLEnable] && !server.ssl_context
145
+ raise ArgumentError, "virtual host must set SSLEnable to true"
146
+ end
147
+ orig_virtual_host(server)
148
+ end
149
+
150
+ # :startdoc:
151
+ end
152
+ end
@@ -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,23 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # httpservlet.rb -- HTTPServlet Utility File
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: httpservlet.rb,v 1.21 2003/02/23 12:24:46 gotoyuzo Exp $
11
+
12
+ require_relative 'httpservlet/abstract'
13
+ require_relative 'httpservlet/filehandler'
14
+ require_relative 'httpservlet/cgihandler'
15
+ require_relative 'httpservlet/erbhandler'
16
+ require_relative 'httpservlet/prochandler'
17
+
18
+ module WEBrick
19
+ module HTTPServlet
20
+ FileHandler.add_handler("cgi", CGIHandler)
21
+ FileHandler.add_handler("rhtml", ERBHandler)
22
+ end
23
+ end