shopify-cli 1.3.0 → 1.6.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.
- checksums.yaml +4 -4
- data/.github/CODEOWNERS +2 -2
- data/.github/CONTRIBUTING.md +9 -1
- data/.github/PULL_REQUEST_TEMPLATE.md +10 -1
- data/.github/workflows/release.yml +61 -0
- data/.github/workflows/triage.yml +22 -0
- data/.gitignore +0 -1
- data/.rubocop.yml +61 -8
- data/.rubocop_todo.yml +11 -0
- data/.travis.yml +1 -0
- data/CHANGELOG.md +30 -0
- data/Gemfile +3 -2
- data/Gemfile.lock +39 -37
- data/README.md +39 -7
- data/RELEASING.md +19 -29
- data/Rakefile +2 -0
- data/dev.yml +2 -2
- data/docs/_config.yml +1 -18
- data/docs/app/node/commands/index.md +2 -80
- data/docs/app/node/index.md +2 -33
- data/docs/app/rails/commands/index.md +2 -78
- data/docs/app/rails/index.md +2 -34
- data/docs/core/index.md +2 -84
- data/docs/getting-started/index.md +2 -25
- data/docs/getting-started/install/index.md +1 -118
- data/docs/getting-started/migrate/index.md +2 -94
- data/docs/getting-started/uninstall/index.md +2 -35
- data/docs/getting-started/upgrade/index.md +2 -39
- data/docs/help/start-app/index.md +2 -4
- data/docs/index.md +2 -24
- data/install.sh +1 -1
- data/lib/project_types/extension/cli.rb +21 -11
- data/lib/project_types/extension/commands/extension_command.rb +2 -2
- data/lib/project_types/extension/features/argo.rb +117 -0
- data/lib/project_types/extension/forms/create.rb +2 -2
- data/lib/project_types/extension/models/specification.rb +35 -0
- data/lib/project_types/extension/models/specification_handlers/checkout_post_purchase.rb +19 -0
- data/lib/project_types/extension/models/specification_handlers/default.rb +67 -0
- data/lib/project_types/extension/models/specifications.rb +77 -0
- data/lib/project_types/extension/tasks/configure_features.rb +52 -0
- data/lib/project_types/extension/tasks/fetch_specifications.rb +38 -0
- data/lib/project_types/node/cli.rb +4 -1
- data/lib/project_types/node/commands/connect.rb +15 -0
- data/lib/project_types/node/commands/create.rb +10 -4
- data/lib/project_types/node/commands/generate.rb +2 -11
- data/lib/project_types/node/messages/messages.rb +16 -50
- data/lib/project_types/rails/cli.rb +4 -1
- data/lib/project_types/rails/commands/connect.rb +15 -0
- data/lib/project_types/rails/commands/create.rb +15 -12
- data/lib/project_types/rails/forms/create.rb +1 -1
- data/lib/project_types/rails/gem.rb +1 -1
- data/lib/project_types/rails/messages/messages.rb +8 -5
- data/lib/project_types/script/cli.rb +9 -5
- data/lib/project_types/script/commands/create.rb +6 -4
- data/lib/project_types/script/commands/enable.rb +12 -4
- data/lib/project_types/script/commands/push.rb +5 -13
- data/lib/project_types/script/config/extension_points.yml +17 -12
- data/lib/project_types/script/errors.rb +21 -0
- data/lib/project_types/script/forms/create.rb +26 -2
- data/lib/project_types/script/graphql/app_script_update_or_create.graphql +10 -1
- data/lib/project_types/script/layers/application/build_script.rb +18 -17
- data/lib/project_types/script/layers/application/create_script.rb +12 -10
- data/lib/project_types/script/layers/application/extension_points.rb +24 -0
- data/lib/project_types/script/layers/application/push_script.rb +18 -16
- data/lib/project_types/script/layers/domain/errors.rb +7 -0
- data/lib/project_types/script/layers/domain/extension_point.rb +62 -7
- data/lib/project_types/script/layers/domain/metadata.rb +55 -0
- data/lib/project_types/script/layers/domain/push_package.rb +25 -6
- data/lib/project_types/script/layers/infrastructure/assemblyscript_project_creator.rb +17 -52
- data/lib/project_types/script/layers/infrastructure/assemblyscript_task_runner.rb +42 -11
- data/lib/project_types/script/layers/infrastructure/errors.rb +16 -0
- data/lib/project_types/script/layers/infrastructure/extension_point_repository.rb +10 -4
- data/lib/project_types/script/layers/infrastructure/project_creator.rb +2 -1
- data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +25 -13
- data/lib/project_types/script/layers/infrastructure/rust_project_creator.rb +72 -0
- data/lib/project_types/script/layers/infrastructure/rust_task_runner.rb +59 -0
- data/lib/project_types/script/layers/infrastructure/script_service.rb +9 -1
- data/lib/project_types/script/layers/infrastructure/task_runner.rb +4 -3
- data/lib/project_types/script/messages/messages.rb +55 -4
- data/lib/project_types/script/script_project.rb +25 -16
- data/lib/project_types/script/ui/error_handler.rb +59 -1
- data/lib/project_types/theme/cli.rb +40 -0
- data/lib/project_types/theme/commands/connect.rb +54 -0
- data/lib/project_types/theme/commands/create.rb +48 -0
- data/lib/project_types/theme/commands/deploy.rb +38 -0
- data/lib/project_types/theme/commands/generate.rb +20 -0
- data/lib/project_types/theme/commands/generate/env.rb +79 -0
- data/lib/project_types/theme/commands/push.rb +55 -0
- data/lib/project_types/theme/commands/serve.rb +31 -0
- data/lib/project_types/theme/forms/connect.rb +34 -0
- data/lib/project_types/theme/forms/create.rb +22 -0
- data/lib/project_types/theme/messages/messages.rb +147 -0
- data/lib/project_types/theme/tasks/ensure_themekit_installed.rb +78 -0
- data/lib/project_types/theme/themekit.rb +113 -0
- data/lib/shopify-cli/admin_api.rb +42 -2
- data/lib/shopify-cli/api.rb +34 -33
- data/lib/shopify-cli/commands/config.rb +24 -0
- data/lib/shopify-cli/commands/connect.rb +32 -15
- data/lib/shopify-cli/commands/system.rb +10 -1
- data/lib/shopify-cli/context.rb +23 -2
- data/lib/shopify-cli/core/entry_point.rb +1 -1
- data/lib/shopify-cli/core/monorail.rb +6 -4
- data/lib/shopify-cli/feature.rb +0 -2
- data/lib/shopify-cli/http_request.rb +27 -0
- data/lib/shopify-cli/js_deps.rb +1 -1
- data/lib/shopify-cli/messages/messages.rb +31 -7
- data/lib/shopify-cli/method_object.rb +104 -0
- data/lib/shopify-cli/partners_api.rb +25 -3
- data/lib/shopify-cli/process_supervision.rb +1 -1
- data/lib/shopify-cli/project.rb +12 -8
- data/lib/shopify-cli/project_type.rb +18 -2
- data/lib/shopify-cli/resolve_constant.rb +25 -0
- data/lib/shopify-cli/result.rb +432 -0
- data/lib/shopify-cli/shopifolk.rb +87 -0
- data/lib/shopify-cli/task.rb +8 -0
- data/lib/shopify-cli/tasks/create_api_client.rb +13 -2
- data/lib/shopify-cli/tasks/ensure_env.rb +3 -0
- data/lib/shopify-cli/tasks/select_org_and_shop.rb +10 -5
- data/lib/shopify-cli/tunnel.rb +8 -2
- data/lib/shopify-cli/version.rb +1 -1
- data/lib/shopify_cli.rb +5 -1
- data/shopify.fish +1 -1
- data/shopify.sh +1 -1
- data/vendor/deps/cli-kit/REVISION +1 -1
- data/vendor/deps/cli-kit/lib/cli/kit/logger.rb +2 -2
- data/vendor/deps/cli-kit/lib/cli/kit/system.rb +3 -3
- data/vendor/deps/cli-ui/REVISION +1 -1
- data/vendor/deps/cli-ui/lib/cli/ui.rb +26 -22
- data/vendor/deps/cli-ui/lib/cli/ui/ansi.rb +4 -6
- data/vendor/deps/cli-ui/lib/cli/ui/frame.rb +3 -3
- data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_stack.rb +8 -9
- data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style.rb +1 -1
- data/vendor/deps/cli-ui/lib/cli/ui/glyph.rb +1 -0
- data/vendor/deps/cli-ui/lib/cli/ui/printer.rb +15 -3
- data/vendor/deps/cli-ui/lib/cli/ui/prompt/interactive_options.rb +4 -11
- data/vendor/deps/cli-ui/lib/cli/ui/spinner.rb +3 -5
- data/vendor/deps/cli-ui/lib/cli/ui/terminal.rb +10 -10
- data/vendor/deps/cli-ui/lib/cli/ui/version.rb +1 -1
- data/vendor/deps/cli-ui/lib/cli/ui/wrap.rb +56 -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.rb +232 -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.rb +96 -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/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.rb +23 -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/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/webrick.gemspec +74 -0
- metadata +77 -27
- data/docs/Gemfile +0 -5
- data/docs/Gemfile.lock +0 -258
- data/docs/_data/nav.yml +0 -35
- data/docs/_includes/footer.html +0 -15
- data/docs/_includes/head.html +0 -19
- data/docs/_includes/sidebar_nav.html +0 -22
- data/docs/_includes/toc.html +0 -112
- data/docs/_layouts/default.html +0 -79
- data/docs/css/docs.css +0 -157
- data/docs/images/header.png +0 -0
- data/docs/installing-ruby.md +0 -28
- data/lib/project_types/extension/features/argo/admin.rb +0 -20
- data/lib/project_types/extension/features/argo/base.rb +0 -129
- data/lib/project_types/extension/features/argo/checkout.rb +0 -20
- data/lib/project_types/extension/models/type.rb +0 -81
- data/lib/project_types/extension/models/types/checkout_post_purchase.rb +0 -23
- data/lib/project_types/extension/models/types/product_subscription.rb +0 -24
- data/lib/project_types/node/commands/generate/billing.rb +0 -39
- data/lib/project_types/node/commands/generate/page.rb +0 -59
- data/lib/project_types/node/commands/generate/webhook.rb +0 -37
- data/lib/project_types/script/layers/domain/script.rb +0 -18
- data/lib/project_types/script/layers/infrastructure/assemblyscript_tsconfig.rb +0 -38
- data/lib/project_types/script/layers/infrastructure/script_repository.rb +0 -59
- data/lib/project_types/script/templates/ts/as-pect.config.js +0 -27
- 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
|