webrick 1.8.0 → 1.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/Rakefile +0 -7
- data/lib/webrick/httprequest.rb +37 -9
- data/lib/webrick/httpresponse.rb +2 -2
- data/lib/webrick/httputils.rb +32 -12
- data/lib/webrick/version.rb +1 -1
- metadata +3 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 963bdfcf1a0e919027a92007be283a146cd054be3a60e539e9f3cbce5c0a908f
|
4
|
+
data.tar.gz: 2ed0bd918c3c5dbb908a59350c9e3691afe88c63a4a5c0a2b5085de7c30aeab5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2433fb9da7e7e7f10495059ac90de49238758fc0581fb8d0dfed28f08d47c9b21329fc4a03a7ade064cea71097f86e29a74003ca6369d3d9e58c401979871a0e
|
7
|
+
data.tar.gz: b0bd6929f6d49967215825cce3c7ad5c7e6b1b45fcda8fd97c898f377df2453934d62ff0cc0a941b2d4a374487b901a207674f76229d45a899938d40516c9271
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -7,11 +7,4 @@ Rake::TestTask.new(:test) do |t|
|
|
7
7
|
t.test_files = FileList["test/**/test_*.rb"]
|
8
8
|
end
|
9
9
|
|
10
|
-
task :sync_tool do
|
11
|
-
require 'fileutils'
|
12
|
-
FileUtils.cp "../ruby/tool/lib/core_assertions.rb", "./test/lib"
|
13
|
-
FileUtils.cp "../ruby/tool/lib/envutil.rb", "./test/lib"
|
14
|
-
FileUtils.cp "../ruby/tool/lib/find_executable.rb", "./test/lib"
|
15
|
-
end
|
16
|
-
|
17
10
|
task :default => :test
|
data/lib/webrick/httprequest.rb
CHANGED
@@ -318,7 +318,7 @@ module WEBrick
|
|
318
318
|
def [](header_name)
|
319
319
|
if @header
|
320
320
|
value = @header[header_name.downcase]
|
321
|
-
value.empty? ? nil : value.join
|
321
|
+
value.empty? ? nil : value.join
|
322
322
|
end
|
323
323
|
end
|
324
324
|
|
@@ -329,7 +329,7 @@ module WEBrick
|
|
329
329
|
if @header
|
330
330
|
@header.each{|k, v|
|
331
331
|
value = @header[k]
|
332
|
-
yield(k, value.empty? ? nil : value.join
|
332
|
+
yield(k, value.empty? ? nil : value.join)
|
333
333
|
}
|
334
334
|
end
|
335
335
|
end
|
@@ -402,7 +402,7 @@ module WEBrick
|
|
402
402
|
# This method provides the metavariables defined by the revision 3
|
403
403
|
# of "The WWW Common Gateway Interface Version 1.1"
|
404
404
|
# To browse the current document of CGI Version 1.1, see below:
|
405
|
-
#
|
405
|
+
# https://www.rfc-editor.org/rfc/rfc3875
|
406
406
|
|
407
407
|
def meta_vars
|
408
408
|
meta = Hash.new
|
@@ -458,7 +458,7 @@ module WEBrick
|
|
458
458
|
end
|
459
459
|
|
460
460
|
@request_time = Time.now
|
461
|
-
if /^(\S+)
|
461
|
+
if /^(\S+) (\S++)(?: HTTP\/(\d+\.\d+))?\r\n/mo =~ @request_line
|
462
462
|
@request_method = $1
|
463
463
|
@unparsed_uri = $2
|
464
464
|
@http_version = HTTPVersion.new($3 ? $3 : "0.9")
|
@@ -470,15 +470,34 @@ module WEBrick
|
|
470
470
|
|
471
471
|
def read_header(socket)
|
472
472
|
if socket
|
473
|
+
end_of_headers = false
|
474
|
+
|
473
475
|
while line = read_line(socket)
|
474
|
-
|
476
|
+
if line == CRLF
|
477
|
+
end_of_headers = true
|
478
|
+
break
|
479
|
+
end
|
475
480
|
if (@request_bytes += line.bytesize) > MAX_HEADER_LENGTH
|
476
481
|
raise HTTPStatus::RequestEntityTooLarge, 'headers too large'
|
477
482
|
end
|
483
|
+
if line.include?("\x00")
|
484
|
+
raise HTTPStatus::BadRequest, 'null byte in header'
|
485
|
+
end
|
478
486
|
@raw_header << line
|
479
487
|
end
|
488
|
+
|
489
|
+
# Allow if @header already set to support chunked trailers
|
490
|
+
raise HTTPStatus::EOFError unless end_of_headers || @header
|
480
491
|
end
|
481
492
|
@header = HTTPUtils::parse_header(@raw_header.join)
|
493
|
+
|
494
|
+
if (content_length = @header['content-length']) && content_length.length != 0
|
495
|
+
if content_length.length > 1
|
496
|
+
raise HTTPStatus::BadRequest, "multiple content-length request headers"
|
497
|
+
elsif !/\A\d+\z/.match?(content_length[0])
|
498
|
+
raise HTTPStatus::BadRequest, "invalid content-length request header"
|
499
|
+
end
|
500
|
+
end
|
482
501
|
end
|
483
502
|
|
484
503
|
def parse_uri(str, scheme="http")
|
@@ -503,14 +522,19 @@ module WEBrick
|
|
503
522
|
return URI::parse(uri.to_s)
|
504
523
|
end
|
505
524
|
|
525
|
+
host_pattern = URI::RFC2396_Parser.new.pattern.fetch(:HOST)
|
526
|
+
HOST_PATTERN = /\A(#{host_pattern})(?::(\d+))?\z/n
|
506
527
|
def parse_host_request_line(host)
|
507
|
-
|
508
|
-
host.scan(pattern)[0]
|
528
|
+
host.scan(HOST_PATTERN)[0]
|
509
529
|
end
|
510
530
|
|
511
531
|
def read_body(socket, block)
|
512
532
|
return unless socket
|
513
533
|
if tc = self['transfer-encoding']
|
534
|
+
if self['content-length']
|
535
|
+
raise HTTPStatus::BadRequest, "request with both transfer-encoding and content-length, possible request smuggling"
|
536
|
+
end
|
537
|
+
|
514
538
|
case tc
|
515
539
|
when /\Achunked\z/io then read_chunked(socket, block)
|
516
540
|
else raise HTTPStatus::NotImplemented, "Transfer-Encoding: #{tc}."
|
@@ -534,7 +558,7 @@ module WEBrick
|
|
534
558
|
|
535
559
|
def read_chunk_size(socket)
|
536
560
|
line = read_line(socket)
|
537
|
-
if
|
561
|
+
if /\A([0-9a-fA-F]+)(?:;(\S+(?:=\S+)?))?\r\n\z/ =~ line
|
538
562
|
chunk_size = $1.hex
|
539
563
|
chunk_ext = $2
|
540
564
|
[ chunk_size, chunk_ext ]
|
@@ -555,7 +579,11 @@ module WEBrick
|
|
555
579
|
block.call(data)
|
556
580
|
end while (chunk_size -= sz) > 0
|
557
581
|
|
558
|
-
read_line(socket)
|
582
|
+
line = read_line(socket) # skip CRLF
|
583
|
+
unless line == "\r\n"
|
584
|
+
raise HTTPStatus::BadRequest, "extra data after chunk `#{line}'."
|
585
|
+
end
|
586
|
+
|
559
587
|
chunk_size, = read_chunk_size(socket)
|
560
588
|
end
|
561
589
|
read_header(socket) # trailer + CRLF
|
data/lib/webrick/httpresponse.rb
CHANGED
@@ -122,7 +122,7 @@ module WEBrick
|
|
122
122
|
@status = HTTPStatus::RC_OK
|
123
123
|
@reason_phrase = nil
|
124
124
|
@http_version = HTTPVersion::convert(@config[:HTTPVersion])
|
125
|
-
@body =
|
125
|
+
@body = +""
|
126
126
|
@keep_alive = true
|
127
127
|
@cookies = []
|
128
128
|
@request_method = nil
|
@@ -441,7 +441,7 @@ module WEBrick
|
|
441
441
|
# :stopdoc:
|
442
442
|
|
443
443
|
def error_body(backtrace, ex, host, port)
|
444
|
-
@body = +
|
444
|
+
@body = +""
|
445
445
|
@body << <<-_end_of_html_
|
446
446
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
|
447
447
|
<HTML>
|
data/lib/webrick/httputils.rb
CHANGED
@@ -55,7 +55,6 @@ module WEBrick
|
|
55
55
|
"cer" => "application/pkix-cert",
|
56
56
|
"crl" => "application/pkix-crl",
|
57
57
|
"crt" => "application/x-x509-ca-cert",
|
58
|
-
#"crl" => "application/x-pkcs7-crl",
|
59
58
|
"css" => "text/css",
|
60
59
|
"dms" => "application/octet-stream",
|
61
60
|
"doc" => "application/msword",
|
@@ -153,28 +152,49 @@ module WEBrick
|
|
153
152
|
# Parses an HTTP header +raw+ into a hash of header fields with an Array
|
154
153
|
# of values.
|
155
154
|
|
155
|
+
class SplitHeader < Array
|
156
|
+
def join(separator = ", ")
|
157
|
+
super
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
class CookieHeader < Array
|
162
|
+
def join(separator = "; ")
|
163
|
+
super
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
HEADER_CLASSES = Hash.new(SplitHeader).update({
|
168
|
+
"cookie" => CookieHeader,
|
169
|
+
})
|
170
|
+
|
156
171
|
def parse_header(raw)
|
157
172
|
header = Hash.new([].freeze)
|
158
173
|
field = nil
|
159
174
|
raw.each_line{|line|
|
160
175
|
case line
|
161
|
-
when /^([A-Za-z0-9!\#$%&'*+\-.^_`|~]+)
|
176
|
+
when /^([A-Za-z0-9!\#$%&'*+\-.^_`|~]+):([^\r\n\0]*?)\r\n\z/om
|
162
177
|
field, value = $1, $2
|
163
178
|
field.downcase!
|
164
|
-
header[field] = [] unless header.has_key?(field)
|
179
|
+
header[field] = HEADER_CLASSES[field].new unless header.has_key?(field)
|
165
180
|
header[field] << value
|
166
|
-
when
|
167
|
-
value = $1
|
181
|
+
when /^[ \t]+([^\r\n\0]*?)\r\n/om
|
168
182
|
unless field
|
169
183
|
raise HTTPStatus::BadRequest, "bad header '#{line}'."
|
170
184
|
end
|
185
|
+
value = line
|
186
|
+
value.gsub!(/\A[ \t]+/, '')
|
187
|
+
value.slice!(-2..-1)
|
171
188
|
header[field][-1] << " " << value
|
172
189
|
else
|
173
190
|
raise HTTPStatus::BadRequest, "bad header '#{line}'."
|
174
191
|
end
|
175
192
|
}
|
176
193
|
header.each{|key, values|
|
177
|
-
values.each
|
194
|
+
values.each{|value|
|
195
|
+
value.gsub!(/\A[ \t]+/, '')
|
196
|
+
value.gsub!(/[ \t]+\z/, '')
|
197
|
+
}
|
178
198
|
}
|
179
199
|
header
|
180
200
|
end
|
@@ -184,8 +204,8 @@ module WEBrick
|
|
184
204
|
# Splits a header value +str+ according to HTTP specification.
|
185
205
|
|
186
206
|
def split_header_value(str)
|
187
|
-
str.scan(%r'\G((?:"(?:\\.|[^"])+?"|[^",]
|
188
|
-
(
|
207
|
+
str.scan(%r'\G((?:"(?:\\.|[^"])+?"|[^",]++)+)
|
208
|
+
(?:,[ \t]*|\Z)'xn).flatten
|
189
209
|
end
|
190
210
|
module_function :split_header_value
|
191
211
|
|
@@ -213,9 +233,9 @@ module WEBrick
|
|
213
233
|
def parse_qvalues(value)
|
214
234
|
tmp = []
|
215
235
|
if value
|
216
|
-
parts = value.split(
|
236
|
+
parts = value.split(/,[ \t]*/)
|
217
237
|
parts.each {|part|
|
218
|
-
if m = %r{^([
|
238
|
+
if m = %r{^([^ \t,]+?)(?:;[ \t]*q=(\d+(?:\.\d+)?))?$}.match(part)
|
219
239
|
val = m[1]
|
220
240
|
q = (m[2] or 1).to_f
|
221
241
|
tmp.push([val, q])
|
@@ -314,8 +334,8 @@ module WEBrick
|
|
314
334
|
elsif str == CRLF
|
315
335
|
@header = HTTPUtils::parse_header(@raw_header.join)
|
316
336
|
if cd = self['content-disposition']
|
317
|
-
if
|
318
|
-
if
|
337
|
+
if /[ \t]+name="(.*?)"/ =~ cd then @name = $1 end
|
338
|
+
if /[ \t]+filename="(.*?)"/ =~ cd then @filename = $1 end
|
319
339
|
end
|
320
340
|
else
|
321
341
|
@raw_header << str
|
data/lib/webrick/version.rb
CHANGED
metadata
CHANGED
@@ -1,16 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: webrick
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.8.
|
4
|
+
version: 1.8.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- TAKAHASHI Masayoshi
|
8
8
|
- GOTOU YUUZOU
|
9
9
|
- Eric Wong
|
10
|
-
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date:
|
12
|
+
date: 2024-09-24 00:00:00.000000000 Z
|
14
13
|
dependencies: []
|
15
14
|
description: WEBrick is an HTTP server toolkit that can be configured as an HTTPS
|
16
15
|
server, a proxy server, and a virtual-host server.
|
@@ -68,7 +67,6 @@ licenses:
|
|
68
67
|
- BSD-2-Clause
|
69
68
|
metadata:
|
70
69
|
bug_tracker_uri: https://github.com/ruby/webrick/issues
|
71
|
-
post_install_message:
|
72
70
|
rdoc_options: []
|
73
71
|
require_paths:
|
74
72
|
- lib
|
@@ -83,8 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
83
81
|
- !ruby/object:Gem::Version
|
84
82
|
version: '0'
|
85
83
|
requirements: []
|
86
|
-
rubygems_version: 3.
|
87
|
-
signing_key:
|
84
|
+
rubygems_version: 3.6.0.dev
|
88
85
|
specification_version: 4
|
89
86
|
summary: HTTP server toolkit
|
90
87
|
test_files: []
|