rack 2.1.0 → 3.1.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.

Potentially problematic release.


This version of rack might be problematic. Click here for more details.

Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +377 -16
  3. data/CONTRIBUTING.md +144 -0
  4. data/MIT-LICENSE +1 -1
  5. data/README.md +328 -0
  6. data/SPEC.rdoc +365 -0
  7. data/lib/rack/auth/abstract/handler.rb +3 -1
  8. data/lib/rack/auth/abstract/request.rb +2 -2
  9. data/lib/rack/auth/basic.rb +4 -7
  10. data/lib/rack/bad_request.rb +8 -0
  11. data/lib/rack/body_proxy.rb +34 -12
  12. data/lib/rack/builder.rb +162 -59
  13. data/lib/rack/cascade.rb +24 -10
  14. data/lib/rack/common_logger.rb +43 -28
  15. data/lib/rack/conditional_get.rb +30 -25
  16. data/lib/rack/constants.rb +66 -0
  17. data/lib/rack/content_length.rb +10 -16
  18. data/lib/rack/content_type.rb +9 -7
  19. data/lib/rack/deflater.rb +78 -50
  20. data/lib/rack/directory.rb +86 -63
  21. data/lib/rack/etag.rb +14 -22
  22. data/lib/rack/events.rb +18 -17
  23. data/lib/rack/files.rb +99 -61
  24. data/lib/rack/head.rb +8 -9
  25. data/lib/rack/headers.rb +238 -0
  26. data/lib/rack/lint.rb +868 -642
  27. data/lib/rack/lock.rb +2 -6
  28. data/lib/rack/logger.rb +3 -0
  29. data/lib/rack/media_type.rb +9 -4
  30. data/lib/rack/method_override.rb +6 -2
  31. data/lib/rack/mime.rb +14 -5
  32. data/lib/rack/mock.rb +1 -253
  33. data/lib/rack/mock_request.rb +171 -0
  34. data/lib/rack/mock_response.rb +124 -0
  35. data/lib/rack/multipart/generator.rb +15 -8
  36. data/lib/rack/multipart/parser.rb +238 -107
  37. data/lib/rack/multipart/uploaded_file.rb +17 -7
  38. data/lib/rack/multipart.rb +54 -42
  39. data/lib/rack/null_logger.rb +9 -0
  40. data/lib/rack/query_parser.rb +87 -105
  41. data/lib/rack/recursive.rb +3 -1
  42. data/lib/rack/reloader.rb +0 -4
  43. data/lib/rack/request.rb +366 -135
  44. data/lib/rack/response.rb +186 -68
  45. data/lib/rack/rewindable_input.rb +24 -6
  46. data/lib/rack/runtime.rb +8 -7
  47. data/lib/rack/sendfile.rb +29 -27
  48. data/lib/rack/show_exceptions.rb +27 -12
  49. data/lib/rack/show_status.rb +21 -13
  50. data/lib/rack/static.rb +19 -12
  51. data/lib/rack/tempfile_reaper.rb +14 -5
  52. data/lib/rack/urlmap.rb +5 -6
  53. data/lib/rack/utils.rb +274 -260
  54. data/lib/rack/version.rb +21 -0
  55. data/lib/rack.rb +18 -103
  56. metadata +25 -52
  57. data/README.rdoc +0 -262
  58. data/Rakefile +0 -123
  59. data/SPEC +0 -263
  60. data/bin/rackup +0 -5
  61. data/contrib/rack.png +0 -0
  62. data/contrib/rack.svg +0 -150
  63. data/contrib/rack_logo.svg +0 -164
  64. data/contrib/rdoc.css +0 -412
  65. data/example/lobster.ru +0 -6
  66. data/example/protectedlobster.rb +0 -16
  67. data/example/protectedlobster.ru +0 -10
  68. data/lib/rack/auth/digest/md5.rb +0 -131
  69. data/lib/rack/auth/digest/nonce.rb +0 -54
  70. data/lib/rack/auth/digest/params.rb +0 -54
  71. data/lib/rack/auth/digest/request.rb +0 -43
  72. data/lib/rack/chunked.rb +0 -92
  73. data/lib/rack/core_ext/regexp.rb +0 -14
  74. data/lib/rack/file.rb +0 -8
  75. data/lib/rack/handler/cgi.rb +0 -62
  76. data/lib/rack/handler/fastcgi.rb +0 -102
  77. data/lib/rack/handler/lsws.rb +0 -63
  78. data/lib/rack/handler/scgi.rb +0 -73
  79. data/lib/rack/handler/thin.rb +0 -38
  80. data/lib/rack/handler/webrick.rb +0 -122
  81. data/lib/rack/handler.rb +0 -104
  82. data/lib/rack/lobster.rb +0 -72
  83. data/lib/rack/server.rb +0 -467
  84. data/lib/rack/session/abstract/id.rb +0 -528
  85. data/lib/rack/session/cookie.rb +0 -205
  86. data/lib/rack/session/memcache.rb +0 -10
  87. data/lib/rack/session/pool.rb +0 -85
  88. data/rack.gemspec +0 -44
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "thin"
4
- require "thin/server"
5
- require "thin/logging"
6
- require "thin/backends/tcp_server"
7
- require "rack/content_length"
8
- require "rack/chunked"
9
-
10
- module Rack
11
- module Handler
12
- class Thin
13
- def self.run(app, options = {})
14
- environment = ENV['RACK_ENV'] || 'development'
15
- default_host = environment == 'development' ? 'localhost' : '0.0.0.0'
16
-
17
- host = options.delete(:Host) || default_host
18
- port = options.delete(:Port) || 8080
19
- args = [host, port, app, options]
20
- # Thin versions below 0.8.0 do not support additional options
21
- args.pop if ::Thin::VERSION::MAJOR < 1 && ::Thin::VERSION::MINOR < 8
22
- server = ::Thin::Server.new(*args)
23
- yield server if block_given?
24
- server.start
25
- end
26
-
27
- def self.valid_options
28
- environment = ENV['RACK_ENV'] || 'development'
29
- default_host = environment == 'development' ? 'localhost' : '0.0.0.0'
30
-
31
- {
32
- "Host=HOST" => "Hostname to listen on (default: #{default_host})",
33
- "Port=PORT" => "Port to listen on (default: 8080)",
34
- }
35
- end
36
- end
37
- end
38
- end
@@ -1,122 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'webrick'
4
- require 'stringio'
5
- require 'rack/content_length'
6
-
7
- # This monkey patch allows for applications to perform their own chunking
8
- # through WEBrick::HTTPResponse if rack is set to true.
9
- class WEBrick::HTTPResponse
10
- attr_accessor :rack
11
-
12
- alias _rack_setup_header setup_header
13
- def setup_header
14
- app_chunking = rack && @header['transfer-encoding'] == 'chunked'
15
-
16
- @chunked = app_chunking if app_chunking
17
-
18
- _rack_setup_header
19
-
20
- @chunked = false if app_chunking
21
- end
22
- end
23
-
24
- module Rack
25
- module Handler
26
- class WEBrick < ::WEBrick::HTTPServlet::AbstractServlet
27
- def self.run(app, options = {})
28
- environment = ENV['RACK_ENV'] || 'development'
29
- default_host = environment == 'development' ? 'localhost' : nil
30
-
31
- options[:BindAddress] = options.delete(:Host) || default_host
32
- options[:Port] ||= 8080
33
- @server = ::WEBrick::HTTPServer.new(options)
34
- @server.mount "/", Rack::Handler::WEBrick, app
35
- yield @server if block_given?
36
- @server.start
37
- end
38
-
39
- def self.valid_options
40
- environment = ENV['RACK_ENV'] || 'development'
41
- default_host = environment == 'development' ? 'localhost' : '0.0.0.0'
42
-
43
- {
44
- "Host=HOST" => "Hostname to listen on (default: #{default_host})",
45
- "Port=PORT" => "Port to listen on (default: 8080)",
46
- }
47
- end
48
-
49
- def self.shutdown
50
- @server.shutdown
51
- @server = nil
52
- end
53
-
54
- def initialize(server, app)
55
- super server
56
- @app = app
57
- end
58
-
59
- def service(req, res)
60
- res.rack = true
61
- env = req.meta_vars
62
- env.delete_if { |k, v| v.nil? }
63
-
64
- rack_input = StringIO.new(req.body.to_s)
65
- rack_input.set_encoding(Encoding::BINARY)
66
-
67
- env.update(
68
- RACK_VERSION => Rack::VERSION,
69
- RACK_INPUT => rack_input,
70
- RACK_ERRORS => $stderr,
71
- RACK_MULTITHREAD => true,
72
- RACK_MULTIPROCESS => false,
73
- RACK_RUNONCE => false,
74
- RACK_URL_SCHEME => ["yes", "on", "1"].include?(env[HTTPS]) ? "https" : "http",
75
- RACK_IS_HIJACK => true,
76
- RACK_HIJACK => lambda { raise NotImplementedError, "only partial hijack is supported."},
77
- RACK_HIJACK_IO => nil
78
- )
79
-
80
- env[HTTP_VERSION] ||= env[SERVER_PROTOCOL]
81
- env[QUERY_STRING] ||= ""
82
- unless env[PATH_INFO] == ""
83
- path, n = req.request_uri.path, env[SCRIPT_NAME].length
84
- env[PATH_INFO] = path[n, path.length - n]
85
- end
86
- env[REQUEST_PATH] ||= [env[SCRIPT_NAME], env[PATH_INFO]].join
87
-
88
- status, headers, body = @app.call(env)
89
- begin
90
- res.status = status.to_i
91
- io_lambda = nil
92
- headers.each { |k, vs|
93
- if k == RACK_HIJACK
94
- io_lambda = vs
95
- elsif k.downcase == "set-cookie"
96
- res.cookies.concat vs.split("\n")
97
- else
98
- # Since WEBrick won't accept repeated headers,
99
- # merge the values per RFC 1945 section 4.2.
100
- res[k] = vs.split("\n").join(", ")
101
- end
102
- }
103
-
104
- if io_lambda
105
- rd, wr = IO.pipe
106
- res.body = rd
107
- res.chunked = true
108
- io_lambda.call wr
109
- elsif body.respond_to?(:to_path)
110
- res.body = ::File.open(body.to_path, 'rb')
111
- else
112
- body.each { |part|
113
- res.body << part
114
- }
115
- end
116
- ensure
117
- body.close if body.respond_to? :close
118
- end
119
- end
120
- end
121
- end
122
- end
data/lib/rack/handler.rb DELETED
@@ -1,104 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Rack
4
- # *Handlers* connect web servers with Rack.
5
- #
6
- # Rack includes Handlers for Thin, WEBrick, FastCGI, CGI, SCGI
7
- # and LiteSpeed.
8
- #
9
- # Handlers usually are activated by calling <tt>MyHandler.run(myapp)</tt>.
10
- # A second optional hash can be passed to include server-specific
11
- # configuration.
12
- module Handler
13
- def self.get(server)
14
- return unless server
15
- server = server.to_s
16
-
17
- unless @handlers.include? server
18
- load_error = try_require('rack/handler', server)
19
- end
20
-
21
- if klass = @handlers[server]
22
- const_get(klass)
23
- else
24
- const_get(server, false)
25
- end
26
-
27
- rescue NameError => name_error
28
- raise load_error || name_error
29
- end
30
-
31
- # Select first available Rack handler given an `Array` of server names.
32
- # Raises `LoadError` if no handler was found.
33
- #
34
- # > pick ['thin', 'webrick']
35
- # => Rack::Handler::WEBrick
36
- def self.pick(server_names)
37
- server_names = Array(server_names)
38
- server_names.each do |server_name|
39
- begin
40
- return get(server_name.to_s)
41
- rescue LoadError, NameError
42
- end
43
- end
44
-
45
- raise LoadError, "Couldn't find handler for: #{server_names.join(', ')}."
46
- end
47
-
48
- SERVER_NAMES = %w(puma thin falcon webrick).freeze
49
- private_constant :SERVER_NAMES
50
-
51
- def self.default
52
- # Guess.
53
- if ENV.include?("PHP_FCGI_CHILDREN")
54
- Rack::Handler::FastCGI
55
- elsif ENV.include?(REQUEST_METHOD)
56
- Rack::Handler::CGI
57
- elsif ENV.include?("RACK_HANDLER")
58
- self.get(ENV["RACK_HANDLER"])
59
- else
60
- pick SERVER_NAMES
61
- end
62
- end
63
-
64
- # Transforms server-name constants to their canonical form as filenames,
65
- # then tries to require them but silences the LoadError if not found
66
- #
67
- # Naming convention:
68
- #
69
- # Foo # => 'foo'
70
- # FooBar # => 'foo_bar.rb'
71
- # FooBAR # => 'foobar.rb'
72
- # FOObar # => 'foobar.rb'
73
- # FOOBAR # => 'foobar.rb'
74
- # FooBarBaz # => 'foo_bar_baz.rb'
75
- def self.try_require(prefix, const_name)
76
- file = const_name.gsub(/^[A-Z]+/) { |pre| pre.downcase }.
77
- gsub(/[A-Z]+[^A-Z]/, '_\&').downcase
78
-
79
- require(::File.join(prefix, file))
80
- nil
81
- rescue LoadError => error
82
- error
83
- end
84
-
85
- def self.register(server, klass)
86
- @handlers ||= {}
87
- @handlers[server.to_s] = klass.to_s
88
- end
89
-
90
- autoload :CGI, "rack/handler/cgi"
91
- autoload :FastCGI, "rack/handler/fastcgi"
92
- autoload :WEBrick, "rack/handler/webrick"
93
- autoload :LSWS, "rack/handler/lsws"
94
- autoload :SCGI, "rack/handler/scgi"
95
- autoload :Thin, "rack/handler/thin"
96
-
97
- register 'cgi', 'Rack::Handler::CGI'
98
- register 'fastcgi', 'Rack::Handler::FastCGI'
99
- register 'webrick', 'Rack::Handler::WEBrick'
100
- register 'lsws', 'Rack::Handler::LSWS'
101
- register 'scgi', 'Rack::Handler::SCGI'
102
- register 'thin', 'Rack::Handler::Thin'
103
- end
104
- end
data/lib/rack/lobster.rb DELETED
@@ -1,72 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'zlib'
4
-
5
- require 'rack/request'
6
- require 'rack/response'
7
-
8
- module Rack
9
- # Paste has a Pony, Rack has a Lobster!
10
- class Lobster
11
- LobsterString = Zlib::Inflate.inflate("eJx9kEEOwyAMBO99xd7MAcytUhPlJyj2
12
- P6jy9i4k9EQyGAnBarEXeCBqSkntNXsi/ZCvC48zGQoZKikGrFMZvgS5ZHd+aGWVuWwhVF0
13
- t1drVmiR42HcWNz5w3QanT+2gIvTVCiE1lm1Y0eU4JGmIIbaKwextKn8rvW+p5PIwFl8ZWJ
14
- I8jyiTlhTcYXkekJAzTyYN6E08A+dk8voBkAVTJQ==".delete("\n ").unpack("m*")[0])
15
-
16
- LambdaLobster = lambda { |env|
17
- if env[QUERY_STRING].include?("flip")
18
- lobster = LobsterString.split("\n").
19
- map { |line| line.ljust(42).reverse }.
20
- join("\n")
21
- href = "?"
22
- else
23
- lobster = LobsterString
24
- href = "?flip"
25
- end
26
-
27
- content = ["<title>Lobstericious!</title>",
28
- "<pre>", lobster, "</pre>",
29
- "<a href='#{href}'>flip!</a>"]
30
- length = content.inject(0) { |a, e| a + e.size }.to_s
31
- [200, { CONTENT_TYPE => "text/html", CONTENT_LENGTH => length }, content]
32
- }
33
-
34
- def call(env)
35
- req = Request.new(env)
36
- if req.GET["flip"] == "left"
37
- lobster = LobsterString.split("\n").map do |line|
38
- line.ljust(42).reverse.
39
- gsub('\\', 'TEMP').
40
- gsub('/', '\\').
41
- gsub('TEMP', '/').
42
- gsub('{', '}').
43
- gsub('(', ')')
44
- end.join("\n")
45
- href = "?flip=right"
46
- elsif req.GET["flip"] == "crash"
47
- raise "Lobster crashed"
48
- else
49
- lobster = LobsterString
50
- href = "?flip=left"
51
- end
52
-
53
- res = Response.new
54
- res.write "<title>Lobstericious!</title>"
55
- res.write "<pre>"
56
- res.write lobster
57
- res.write "</pre>"
58
- res.write "<p><a href='#{href}'>flip!</a></p>"
59
- res.write "<p><a href='?flip=crash'>crash!</a></p>"
60
- res.finish
61
- end
62
-
63
- end
64
- end
65
-
66
- if $0 == __FILE__
67
- require 'rack'
68
- require 'rack/show_exceptions'
69
- Rack::Server.start(
70
- app: Rack::ShowExceptions.new(Rack::Lint.new(Rack::Lobster.new)), Port: 9292
71
- )
72
- end