rubysl-webrick 1.0.0 → 2.0.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 +14 -6
- data/.travis.yml +5 -6
- data/lib/rubysl/webrick/version.rb +1 -1
- data/lib/rubysl/webrick/webrick.rb +199 -2
- data/lib/webrick/accesslog.rb +96 -5
- data/lib/webrick/cgi.rb +80 -29
- data/lib/webrick/compat.rb +20 -0
- data/lib/webrick/config.rb +59 -5
- data/lib/webrick/cookie.rb +66 -5
- data/lib/webrick/htmlutils.rb +4 -1
- data/lib/webrick/httpauth.rb +53 -3
- data/lib/webrick/httpauth/authenticator.rb +53 -16
- data/lib/webrick/httpauth/basicauth.rb +45 -2
- data/lib/webrick/httpauth/digestauth.rb +82 -17
- data/lib/webrick/httpauth/htdigest.rb +38 -1
- data/lib/webrick/httpauth/htgroup.rb +32 -0
- data/lib/webrick/httpauth/htpasswd.rb +40 -2
- data/lib/webrick/httpauth/userdb.rb +27 -4
- data/lib/webrick/httpproxy.rb +197 -112
- data/lib/webrick/httprequest.rb +268 -50
- data/lib/webrick/httpresponse.rb +170 -33
- data/lib/webrick/https.rb +26 -3
- data/lib/webrick/httpserver.rb +75 -7
- data/lib/webrick/httpservlet/abstract.rb +88 -6
- data/lib/webrick/httpservlet/cgi_runner.rb +5 -4
- data/lib/webrick/httpservlet/cgihandler.rb +37 -18
- data/lib/webrick/httpservlet/erbhandler.rb +40 -7
- data/lib/webrick/httpservlet/filehandler.rb +116 -28
- data/lib/webrick/httpservlet/prochandler.rb +17 -4
- data/lib/webrick/httpstatus.rb +86 -18
- data/lib/webrick/httputils.rb +131 -23
- data/lib/webrick/httpversion.rb +28 -2
- data/lib/webrick/log.rb +72 -5
- data/lib/webrick/server.rb +158 -33
- data/lib/webrick/ssl.rb +78 -9
- data/lib/webrick/utils.rb +151 -5
- data/lib/webrick/version.rb +5 -1
- data/rubysl-webrick.gemspec +0 -1
- metadata +12 -24
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NTkyOGI2NzczYTNjMTlmYjI2YTdjNmM2ZDRlYjc4ODZhZTY5NTUwMg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NGViN2JmMzdiZDNiMjM5OTM5Mzg4YzY2OWJlZjg4NmUzYmMzOTJkOA==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
NWM4MmVkNzFiM2RiNDVkNTY2MjBjNzkxYzNhZDNkOGVjOWViNTkxNjg5YmU1
|
10
|
+
NjVlOTViNDk0M2RhMDMwYjJiZTY5YWJjM2Y4OWI3NWQ4ODExMzlmOTYxZjYx
|
11
|
+
OGFkNTE3YjM1MDU4YTdmOWFjYjFmNDkwMjJkMTI3OTM1MmE0OGM=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
YTNkNjVlZDA0YTQxOTUyMWJlNmQwMWY4NTA1NzI4ZTA5MjY2N2RmY2QyN2Vl
|
14
|
+
YTAyODUwYjliYjliNjYwOWVlMTQyNWZmZDI3NzhmZTE2NDViYTZkYjM2ODZm
|
15
|
+
ZTgwMzdmMTc1ODEyZDRkMTMzMmEzMjA5MGIzMGExNmYxZmM4NDk=
|
data/.travis.yml
CHANGED
@@ -1,13 +1,210 @@
|
|
1
|
+
##
|
2
|
+
# = WEB server toolkit.
|
1
3
|
#
|
2
|
-
# WEBrick
|
4
|
+
# WEBrick is an HTTP server toolkit that can be configured as an HTTPS server,
|
5
|
+
# a proxy server, and a virtual-host server. WEBrick features complete
|
6
|
+
# logging of both server operations and HTTP access. WEBrick supports both
|
7
|
+
# basic and digest authentication in addition to algorithms not in RFC 2617.
|
8
|
+
#
|
9
|
+
# A WEBrick server can be composed of multiple WEBrick servers or servlets to
|
10
|
+
# provide differing behavior on a per-host or per-path basis. WEBrick
|
11
|
+
# includes servlets for handling CGI scripts, ERb pages, ruby blocks and
|
12
|
+
# directory listings.
|
13
|
+
#
|
14
|
+
# WEBrick also includes tools for daemonizing a process and starting a process
|
15
|
+
# at a higher privilege level and dropping permissions.
|
16
|
+
#
|
17
|
+
# == Starting an HTTP server
|
18
|
+
#
|
19
|
+
# To create a new WEBrick::HTTPServer that will listen to connections on port
|
20
|
+
# 8000 and serve documents from the current user's public_html folder:
|
21
|
+
#
|
22
|
+
# require 'webrick'
|
23
|
+
#
|
24
|
+
# root = File.expand_path '~/public_html'
|
25
|
+
# server = WEBrick::HTTPServer.new :Port => 8000, :DocumentRoot => root
|
26
|
+
#
|
27
|
+
# To run the server you will need to provide a suitable shutdown hook as
|
28
|
+
# starting the server blocks the current thread:
|
29
|
+
#
|
30
|
+
# trap 'INT' do server.shutdown end
|
31
|
+
#
|
32
|
+
# server.start
|
33
|
+
#
|
34
|
+
# == Custom Behavior
|
35
|
+
#
|
36
|
+
# The easiest way to have a server perform custom operations is through
|
37
|
+
# WEBrick::HTTPServer#mount_proc. The block given will be called with a
|
38
|
+
# WEBrick::HTTPRequest with request info and a WEBrick::HTTPResponse which
|
39
|
+
# must be filled in appropriately:
|
40
|
+
#
|
41
|
+
# server.mount_proc '/' do |req, res|
|
42
|
+
# res.body = 'Hello, world!'
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
# Remember that <tt>server.mount_proc</tt> must <tt>server.start</tt>.
|
46
|
+
#
|
47
|
+
# == Servlets
|
48
|
+
#
|
49
|
+
# Advanced custom behavior can be obtained through mounting a subclass of
|
50
|
+
# WEBrick::HTTPServlet::AbstractServlet. Servlets provide more modularity
|
51
|
+
# when writing an HTTP server than mount_proc allows. Here is a simple
|
52
|
+
# servlet:
|
53
|
+
#
|
54
|
+
# class Simple < WEBrick::HTTPServlet::AbstractServlet
|
55
|
+
# def do_GET request, response
|
56
|
+
# status, content_type, body = do_stuff_with request
|
57
|
+
#
|
58
|
+
# response.status = 200
|
59
|
+
# response['Content-Type'] = 'text/plain'
|
60
|
+
# response.body = 'Hello, World!'
|
61
|
+
# end
|
62
|
+
# end
|
63
|
+
#
|
64
|
+
# To initialize the servlet you mount it on the server:
|
65
|
+
#
|
66
|
+
# server.mount '/simple', Simple
|
67
|
+
#
|
68
|
+
# See WEBrick::HTTPServlet::AbstractServlet for more details.
|
69
|
+
#
|
70
|
+
# == Virtual Hosts
|
71
|
+
#
|
72
|
+
# A server can act as a virtual host for multiple host names. After creating
|
73
|
+
# the listening host, additional hosts that do not listen can be created and
|
74
|
+
# attached as virtual hosts:
|
75
|
+
#
|
76
|
+
# server = WEBrick::HTTPServer.new # ...
|
77
|
+
#
|
78
|
+
# vhost = WEBrick::HTTPServer.new :ServerName => 'vhost.example',
|
79
|
+
# :DoNotListen => true, # ...
|
80
|
+
# vhost.mount '/', ...
|
81
|
+
#
|
82
|
+
# server.virtual_host vhost
|
83
|
+
#
|
84
|
+
# If no +:DocumentRoot+ is provided and no servlets or procs are mounted on the
|
85
|
+
# main server it will return 404 for all URLs.
|
86
|
+
#
|
87
|
+
# == HTTPS
|
88
|
+
#
|
89
|
+
# To create an HTTPS server you only need to enable SSL and provide an SSL
|
90
|
+
# certificate name:
|
91
|
+
#
|
92
|
+
# require 'webrick'
|
93
|
+
# require 'webrick/https'
|
94
|
+
#
|
95
|
+
# cert_name = [
|
96
|
+
# %w[CN localhost],
|
97
|
+
# ]
|
98
|
+
#
|
99
|
+
# server = WEBrick::HTTPServer.new(:Port => 8000,
|
100
|
+
# :SSLEnable => true,
|
101
|
+
# :SSLCertName => cert_name)
|
102
|
+
#
|
103
|
+
# This will start the server with a self-generated self-signed certificate.
|
104
|
+
# The certificate will be changed every time the server is restarted.
|
105
|
+
#
|
106
|
+
# To create a server with a pre-determined key and certificate you can provide
|
107
|
+
# them:
|
108
|
+
#
|
109
|
+
# require 'webrick'
|
110
|
+
# require 'webrick/https'
|
111
|
+
# require 'openssl'
|
112
|
+
#
|
113
|
+
# cert = OpenSSL::X509::Certificate.new File.read '/path/to/cert.pem'
|
114
|
+
# pkey = OpenSSL::PKey::RSA.new File.read '/path/to/pkey.pem'
|
115
|
+
#
|
116
|
+
# server = WEBrick::HTTPServer.new(:Port => 8000,
|
117
|
+
# :SSLEnable => true,
|
118
|
+
# :SSLCertificate => cert,
|
119
|
+
# :SSLPrivateKey => pkey)
|
120
|
+
#
|
121
|
+
# == Proxy Server
|
122
|
+
#
|
123
|
+
# WEBrick can act as a proxy server:
|
124
|
+
#
|
125
|
+
# require 'webrick'
|
126
|
+
# require 'webrick/httpproxy'
|
127
|
+
#
|
128
|
+
# proxy = WEBrick::HTTPProxyServer.new :Port => 8000
|
129
|
+
#
|
130
|
+
# trap 'INT' do proxy.shutdown end
|
131
|
+
#
|
132
|
+
# See WEBrick::HTTPProxy for further details including modifying proxied
|
133
|
+
# responses.
|
134
|
+
#
|
135
|
+
# == Basic and Digest authentication
|
136
|
+
#
|
137
|
+
# WEBrick provides both Basic and Digest authentication for regular and proxy
|
138
|
+
# servers. See WEBrick::HTTPAuth, WEBrick::HTTPAuth::BasicAuth and
|
139
|
+
# WEBrick::HTTPAuth::DigestAuth.
|
140
|
+
#
|
141
|
+
# == WEBrick as a Production Web Server
|
142
|
+
#
|
143
|
+
# WEBrick can be run as a production server for small loads.
|
144
|
+
#
|
145
|
+
# === Daemonizing
|
146
|
+
#
|
147
|
+
# To start a WEBrick server as a daemon simple run WEBrick::Daemon.start
|
148
|
+
# before starting the server.
|
149
|
+
#
|
150
|
+
# === Dropping Permissions
|
151
|
+
#
|
152
|
+
# WEBrick can be started as one user to gain permission to bind to port 80 or
|
153
|
+
# 443 for serving HTTP or HTTPS traffic then can drop these permissions for
|
154
|
+
# regular operation. To listen on all interfaces for HTTP traffic:
|
155
|
+
#
|
156
|
+
# sockets = WEBrick::Utils.create_listeners nil, 80
|
157
|
+
#
|
158
|
+
# Then drop privileges:
|
159
|
+
#
|
160
|
+
# WEBrick::Utils.su 'www'
|
161
|
+
#
|
162
|
+
# Then create a server that does not listen by default:
|
163
|
+
#
|
164
|
+
# server = WEBrick::HTTPServer.new :DoNotListen => true, # ...
|
165
|
+
#
|
166
|
+
# Then overwrite the listening sockets with the port 80 sockets:
|
167
|
+
#
|
168
|
+
# server.listeners.replace sockets
|
169
|
+
#
|
170
|
+
# === Logging
|
171
|
+
#
|
172
|
+
# WEBrick can separately log server operations and end-user access. For
|
173
|
+
# server operations:
|
174
|
+
#
|
175
|
+
# log_file = File.open '/var/log/webrick.log', 'a+'
|
176
|
+
# log = WEBrick::Log.new log_file
|
177
|
+
#
|
178
|
+
# For user access logging:
|
179
|
+
#
|
180
|
+
# access_log = [
|
181
|
+
# [log_file, WEBrick::AccessLog::COMBINED_LOG_FORMAT],
|
182
|
+
# ]
|
183
|
+
#
|
184
|
+
# server = WEBrick::HTTPServer.new :Logger => log, :AccessLog => access_log
|
185
|
+
#
|
186
|
+
# See WEBrick::AccessLog for further log formats.
|
187
|
+
#
|
188
|
+
# === Log Rotation
|
189
|
+
#
|
190
|
+
# To rotate logs in WEBrick on a HUP signal (like syslogd can send), open the
|
191
|
+
# log file in 'a+' mode (as above) and trap 'HUP' to reopen the log file:
|
192
|
+
#
|
193
|
+
# trap 'HUP' do log_file.reopen '/path/to/webrick.log', 'a+'
|
194
|
+
#
|
195
|
+
# == Copyright
|
3
196
|
#
|
4
197
|
# Author: IPR -- Internet Programming with Ruby -- writers
|
198
|
+
#
|
5
199
|
# Copyright (c) 2000 TAKAHASHI Masayoshi, GOTOU YUUZOU
|
6
200
|
# Copyright (c) 2002 Internet Programming with Ruby writers. All rights
|
7
201
|
# reserved.
|
8
|
-
|
202
|
+
#--
|
9
203
|
# $IPR: webrick.rb,v 1.12 2002/10/01 17:16:31 gotoyuzo Exp $
|
10
204
|
|
205
|
+
module WEBrick
|
206
|
+
end
|
207
|
+
|
11
208
|
require 'webrick/compat.rb'
|
12
209
|
|
13
210
|
require 'webrick/version.rb'
|
data/lib/webrick/accesslog.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
#--
|
2
2
|
# accesslog.rb -- Access log handling utilities
|
3
3
|
#
|
4
4
|
# Author: IPR -- Internet Programming with Ruby -- writers
|
@@ -8,20 +8,89 @@
|
|
8
8
|
# $IPR: accesslog.rb,v 1.1 2002/10/01 17:16:32 gotoyuzo Exp $
|
9
9
|
|
10
10
|
module WEBrick
|
11
|
+
|
12
|
+
##
|
13
|
+
# AccessLog provides logging to various files in various formats.
|
14
|
+
#
|
15
|
+
# Multiple logs may be written to at the same time:
|
16
|
+
#
|
17
|
+
# access_log = [
|
18
|
+
# [$stderr, WEBrick::AccessLog::COMMON_LOG_FORMAT],
|
19
|
+
# [$stderr, WEBrick::AccessLog::REFERER_LOG_FORMAT],
|
20
|
+
# ]
|
21
|
+
#
|
22
|
+
# server = WEBrick::HTTPServer.new :AccessLog => access_log
|
23
|
+
#
|
24
|
+
# Custom log formats may be defined. WEBrick::AccessLog provides a subset
|
25
|
+
# of the formatting from Apache's mod_log_config
|
26
|
+
# http://httpd.apache.org/docs/mod/mod_log_config.html#formats. See
|
27
|
+
# AccessLog::setup_params for a list of supported options
|
28
|
+
|
11
29
|
module AccessLog
|
30
|
+
|
31
|
+
##
|
32
|
+
# Raised if a parameter such as %e, %i, %o or %n is used without fetching
|
33
|
+
# a specific field.
|
34
|
+
|
12
35
|
class AccessLogError < StandardError; end
|
13
36
|
|
37
|
+
##
|
38
|
+
# The Common Log Format's time format
|
39
|
+
|
14
40
|
CLF_TIME_FORMAT = "[%d/%b/%Y:%H:%M:%S %Z]"
|
41
|
+
|
42
|
+
##
|
43
|
+
# Common Log Format
|
44
|
+
|
15
45
|
COMMON_LOG_FORMAT = "%h %l %u %t \"%r\" %s %b"
|
46
|
+
|
47
|
+
##
|
48
|
+
# Short alias for Common Log Format
|
49
|
+
|
16
50
|
CLF = COMMON_LOG_FORMAT
|
51
|
+
|
52
|
+
##
|
53
|
+
# Referer Log Format
|
54
|
+
|
17
55
|
REFERER_LOG_FORMAT = "%{Referer}i -> %U"
|
56
|
+
|
57
|
+
##
|
58
|
+
# User-Agent Log Format
|
59
|
+
|
18
60
|
AGENT_LOG_FORMAT = "%{User-Agent}i"
|
61
|
+
|
62
|
+
##
|
63
|
+
# Combined Log Format
|
64
|
+
|
19
65
|
COMBINED_LOG_FORMAT = "#{CLF} \"%{Referer}i\" \"%{User-agent}i\""
|
20
66
|
|
21
67
|
module_function
|
22
68
|
|
23
|
-
# This format specification is a subset of mod_log_config of Apache
|
24
|
-
#
|
69
|
+
# This format specification is a subset of mod_log_config of Apache:
|
70
|
+
#
|
71
|
+
# %a:: Remote IP address
|
72
|
+
# %b:: Total response size
|
73
|
+
# %e{variable}:: Given variable in ENV
|
74
|
+
# %f:: Response filename
|
75
|
+
# %h:: Remote host name
|
76
|
+
# %{header}i:: Given request header
|
77
|
+
# %l:: Remote logname, always "-"
|
78
|
+
# %m:: Request method
|
79
|
+
# %{attr}n:: Given request attribute from <tt>req.attributes</tt>
|
80
|
+
# %{header}o:: Given response header
|
81
|
+
# %p:: Server's request port
|
82
|
+
# %{format}p:: The canonical port of the server serving the request or the
|
83
|
+
# actual port or the client's actual port. Valid formats are
|
84
|
+
# canonical, local or remote.
|
85
|
+
# %q:: Request query string
|
86
|
+
# %r:: First line of the request
|
87
|
+
# %s:: Request status
|
88
|
+
# %t:: Time the request was recieved
|
89
|
+
# %T:: Time taken to process the request
|
90
|
+
# %u:: Remote user from auth
|
91
|
+
# %U:: Unparsed URI
|
92
|
+
# %%:: Literal %
|
93
|
+
|
25
94
|
def setup_params(config, req, res)
|
26
95
|
params = Hash.new("")
|
27
96
|
params["a"] = req.peeraddr[3]
|
@@ -46,6 +115,10 @@ module WEBrick
|
|
46
115
|
params
|
47
116
|
end
|
48
117
|
|
118
|
+
##
|
119
|
+
# Formats +params+ according to +format_string+ which is described in
|
120
|
+
# setup_params.
|
121
|
+
|
49
122
|
def format(format_string, params)
|
50
123
|
format_string.gsub(/\%(?:\{(.*?)\})?>?([a-zA-Z%])/){
|
51
124
|
param, spec = $1, $2
|
@@ -53,15 +126,33 @@ module WEBrick
|
|
53
126
|
when ?e, ?i, ?n, ?o
|
54
127
|
raise AccessLogError,
|
55
128
|
"parameter is required for \"#{spec}\"" unless param
|
56
|
-
params[spec][param]
|
129
|
+
(param = params[spec][param]) ? escape(param) : "-"
|
57
130
|
when ?t
|
58
131
|
params[spec].strftime(param || CLF_TIME_FORMAT)
|
132
|
+
when ?p
|
133
|
+
case param
|
134
|
+
when 'remote'
|
135
|
+
escape(params["i"].peeraddr[1].to_s)
|
136
|
+
else
|
137
|
+
escape(params["p"].to_s)
|
138
|
+
end
|
59
139
|
when ?%
|
60
140
|
"%"
|
61
141
|
else
|
62
|
-
params[spec]
|
142
|
+
escape(params[spec].to_s)
|
63
143
|
end
|
64
144
|
}
|
65
145
|
end
|
146
|
+
|
147
|
+
##
|
148
|
+
# Escapes control characters in +data+
|
149
|
+
|
150
|
+
def escape(data)
|
151
|
+
if data.tainted?
|
152
|
+
data.gsub(/[[:cntrl:]\\]+/) {$&.dump[1...-1]}.untaint
|
153
|
+
else
|
154
|
+
data
|
155
|
+
end
|
156
|
+
end
|
66
157
|
end
|
67
158
|
end
|
data/lib/webrick/cgi.rb
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
# Copyright (c) 2003 Internet Programming with Ruby writers. All rights
|
6
6
|
# reserved.
|
7
7
|
#
|
8
|
-
# $Id
|
8
|
+
# $Id$
|
9
9
|
|
10
10
|
require "webrick/httprequest"
|
11
11
|
require "webrick/httpresponse"
|
@@ -13,10 +13,44 @@ require "webrick/config"
|
|
13
13
|
require "stringio"
|
14
14
|
|
15
15
|
module WEBrick
|
16
|
+
|
17
|
+
# A CGI library using WEBrick requests and responses.
|
18
|
+
#
|
19
|
+
# Example:
|
20
|
+
#
|
21
|
+
# class MyCGI < WEBrick::CGI
|
22
|
+
# def do_GET req, res
|
23
|
+
# res.body = 'it worked!'
|
24
|
+
# res.status = 200
|
25
|
+
# end
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
# MyCGI.new.start
|
29
|
+
|
16
30
|
class CGI
|
31
|
+
|
32
|
+
# The CGI error exception class
|
33
|
+
|
17
34
|
CGIError = Class.new(StandardError)
|
18
35
|
|
19
|
-
|
36
|
+
##
|
37
|
+
# The CGI configuration. This is based on WEBrick::Config::HTTP
|
38
|
+
|
39
|
+
attr_reader :config
|
40
|
+
|
41
|
+
##
|
42
|
+
# The CGI logger
|
43
|
+
|
44
|
+
attr_reader :logger
|
45
|
+
|
46
|
+
##
|
47
|
+
# Creates a new CGI interface.
|
48
|
+
#
|
49
|
+
# The first argument in +args+ is a configuration hash which would update
|
50
|
+
# WEBrick::Config::HTTP.
|
51
|
+
#
|
52
|
+
# Any remaining arguments are stored in the <code>@options</code> instance
|
53
|
+
# variable for use by a subclass.
|
20
54
|
|
21
55
|
def initialize(*args)
|
22
56
|
if defined?(MOD_RUBY)
|
@@ -41,10 +75,17 @@ module WEBrick
|
|
41
75
|
@options = args
|
42
76
|
end
|
43
77
|
|
78
|
+
##
|
79
|
+
# Reads +key+ from the configuration
|
80
|
+
|
44
81
|
def [](key)
|
45
82
|
@config[key]
|
46
83
|
end
|
47
84
|
|
85
|
+
##
|
86
|
+
# Starts the CGI process with the given environment +env+ and standard
|
87
|
+
# input and output +stdin+ and +stdout+.
|
88
|
+
|
48
89
|
def start(env=ENV, stdin=$stdin, stdout=$stdout)
|
49
90
|
sock = WEBrick::CGI::Socket.new(@config, env, stdin, stdout)
|
50
91
|
req = HTTPRequest.new(@config)
|
@@ -77,7 +118,7 @@ module WEBrick
|
|
77
118
|
res.set_error(ex)
|
78
119
|
rescue HTTPStatus::Status => ex
|
79
120
|
res.status = ex.code
|
80
|
-
rescue Exception => ex
|
121
|
+
rescue Exception => ex
|
81
122
|
@logger.error(ex)
|
82
123
|
res.set_error(ex, true)
|
83
124
|
ensure
|
@@ -108,6 +149,10 @@ module WEBrick
|
|
108
149
|
end
|
109
150
|
end
|
110
151
|
|
152
|
+
##
|
153
|
+
# Services the request +req+ which will fill in the response +res+. See
|
154
|
+
# WEBrick::HTTPServlet::AbstractServlet#service for details.
|
155
|
+
|
111
156
|
def service(req, res)
|
112
157
|
method_name = "do_" + req.request_method.gsub(/-/, "_")
|
113
158
|
if respond_to?(method_name)
|
@@ -118,11 +163,14 @@ module WEBrick
|
|
118
163
|
end
|
119
164
|
end
|
120
165
|
|
121
|
-
|
166
|
+
##
|
167
|
+
# Provides HTTP socket emulation from the CGI environment
|
168
|
+
|
169
|
+
class Socket # :nodoc:
|
122
170
|
include Enumerable
|
123
171
|
|
124
172
|
private
|
125
|
-
|
173
|
+
|
126
174
|
def initialize(config, env, stdin, stdout)
|
127
175
|
@config = config
|
128
176
|
@env = env
|
@@ -130,7 +178,7 @@ module WEBrick
|
|
130
178
|
@body_part = stdin
|
131
179
|
@out_port = stdout
|
132
180
|
@out_port.binmode
|
133
|
-
|
181
|
+
|
134
182
|
@server_addr = @env["SERVER_ADDR"] || "0.0.0.0"
|
135
183
|
@server_name = @env["SERVER_NAME"]
|
136
184
|
@server_port = @env["SERVER_PORT"]
|
@@ -143,7 +191,7 @@ module WEBrick
|
|
143
191
|
setup_header
|
144
192
|
@header_part << CRLF
|
145
193
|
@header_part.rewind
|
146
|
-
rescue Exception
|
194
|
+
rescue Exception
|
147
195
|
raise CGIError, "invalid CGI environment"
|
148
196
|
end
|
149
197
|
end
|
@@ -164,43 +212,42 @@ module WEBrick
|
|
164
212
|
httpv = @config[:HTTPVersion]
|
165
213
|
return "#{meth} #{url} HTTP/#{httpv}"
|
166
214
|
end
|
167
|
-
|
215
|
+
|
168
216
|
def setup_header
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
217
|
+
@env.each{|key, value|
|
218
|
+
case key
|
219
|
+
when "CONTENT_TYPE", "CONTENT_LENGTH"
|
220
|
+
add_header(key.gsub(/_/, "-"), value)
|
221
|
+
when /^HTTP_(.*)/
|
222
|
+
add_header($1.gsub(/_/, "-"), value)
|
174
223
|
end
|
175
224
|
}
|
176
225
|
end
|
177
|
-
|
178
|
-
def add_header(
|
179
|
-
|
180
|
-
|
181
|
-
@header_part << hdrname << ": " << value << CRLF
|
182
|
-
end
|
226
|
+
|
227
|
+
def add_header(hdrname, value)
|
228
|
+
unless value.empty?
|
229
|
+
@header_part << hdrname << ": " << value << CRLF
|
183
230
|
end
|
184
231
|
end
|
185
232
|
|
186
233
|
def input
|
187
234
|
@header_part.eof? ? @body_part : @header_part
|
188
235
|
end
|
189
|
-
|
236
|
+
|
190
237
|
public
|
191
|
-
|
238
|
+
|
192
239
|
def peeraddr
|
193
240
|
[nil, @remote_port, @remote_host, @remote_addr]
|
194
241
|
end
|
195
|
-
|
242
|
+
|
196
243
|
def addr
|
197
244
|
[nil, @server_port, @server_name, @server_addr]
|
198
245
|
end
|
199
|
-
|
200
|
-
def gets(eol=LF)
|
201
|
-
input.gets(eol)
|
246
|
+
|
247
|
+
def gets(eol=LF, size=nil)
|
248
|
+
input.gets(eol, size)
|
202
249
|
end
|
203
|
-
|
250
|
+
|
204
251
|
def read(size=nil)
|
205
252
|
input.read(size)
|
206
253
|
end
|
@@ -208,7 +255,11 @@ module WEBrick
|
|
208
255
|
def each
|
209
256
|
input.each{|line| yield(line) }
|
210
257
|
end
|
211
|
-
|
258
|
+
|
259
|
+
def eof?
|
260
|
+
input.eof?
|
261
|
+
end
|
262
|
+
|
212
263
|
def <<(data)
|
213
264
|
@out_port << data
|
214
265
|
end
|
@@ -253,5 +304,5 @@ module WEBrick
|
|
253
304
|
end
|
254
305
|
end
|
255
306
|
end
|
256
|
-
end
|
257
|
-
end
|
307
|
+
end
|
308
|
+
end
|