rubysl-webrick 1.0.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|