Skip to content

Upgrading rack 1 to 2

Unknown1.6.13 → 2.2.25Security18New1Changed1Fixed2

Fetching 56 releases from GitHub…10 / 56
UnknownUpgrade verdict

DepDelta is still reading the notes for 46 of 56 releases, so breaking changes can't be ruled out yet.

  • DepDelta is still reading the release notes in this range, so it can't rule out breaking changes yet.
  • This page updates as the notes come in.
Top 3 of 18 that need code or config changes

Ruby requirement changed in 2.2.0: >= 0 → >= 2.3.0.

Security18
CVE-2026-26962 Improper unfolding of folded multipart headers preserves CRLF in parsed parameter values.
CVE-2026-34763 Root directory disclosure via unescaped regex interpolation in Rack::Directory.
Rack::DirectoryModerate · CVSS 5.3
CVE-2026-34230 Avoid O(n^2) algorithm in Rack::Utils.select_best_encoding which could lead to denial of service.
Rack::Utils.select_best_encodingHigh · CVSS 7.5
CVE-2026-26961 Raise error for multipart requests with multiple boundary parameters.
Moderate · CVSS 5.3
CVE-2026-34786 Rack::Static header_rules bypass via URL-encoded path mismatch.
Rack::Staticheader_rulesModerate · CVSS 5.3
CVE-2026-34831 Content-Length mismatch in Rack::Files error responses.
Content-LengthRack::FilesModerate · CVSS 4.8
CVE-2026-34826 Multipart byte range processing allows denial of service via excessive overlapping ranges.
Moderate · CVSS 5.3
CVE-2026-34830 Rack::Sendfile header-based X-Accel-Mapping regex injection enables unauthorized X-Accel-Redirect.
Rack::SendfileX-Accel-MappingX-Accel-RedirectModerate · CVSS 5.9
CVE-2026-34785 Rack::Static prefix matching can expose unintended files under the static root.
Rack::StaticHigh · CVSS 7.5
CVE-2026-34829 Multipart parsing without Content-Length header allows unbounded chunked file uploads.
Content-LengthHigh · CVSS 7.5
CVE-2026-25500 XSS injection via malicious filename in Rack::Directory.
Rack::DirectoryModerate · CVSS 5.4
CVE-2026-22860 Directory traversal via root prefix bypass in Rack::Directory.
Rack::DirectoryHigh · CVSS 7.5
CVE-2025-61780 Improper handling of headers in Rack::Sendfile may allow proxy bypass.
Rack::SendfileModerate · CVSS 5.8
CVE-2025-61919 Unbounded read in Rack::Request form parsing can lead to memory exhaustion.
Rack::RequestHigh · CVSS 7.5
CVE-2025-61772 Multipart parser buffers unbounded per-part headers, enabling DoS (memory exhaustion).
High · CVSS 7.5
CVE-2025-61771 Multipart parser buffers large non‑file fields entirely in memory, enabling DoS (memory exhaustion).
High · CVSS 7.5
CVE-2025-61770 Unbounded multipart preamble buffering enables DoS (memory exhaustion).
High · CVSS 7.5
CVE-2025-59830 Unbounded parameter parsing in Rack::QueryParser can lead to memory exhaustion via semicolon-separated parameters.
Rack::QueryParserHigh · CVSS 7.5

Generated by DepDelta from published Ruby source. Not mixed with prose notes.

  • removed: const URI.TBLDECWWWCOMP_
  • removed: const URI.TBLENCWWWCOMP_
  • removed: const URI.WFKV_
  • removed: module URI
  • removed: static method URI.decode_www_form(_, _ = …)
  • removed: static method URI.decode_www_form_component(_, _ = …)
  • removed: static method URI.encode_www_form_component(_)
  • added: const Rack.DELETE
  • added: const Rack.ETAG
  • added: const Rack.EXPIRES
  • added: const Rack.File
  • added: const Rack.HTTPS
  • added: const Rack.HTTP_COOKIE
  • added: const Rack.HTTP_HOST
  • added: const Rack.HTTP_PORT
  • added: const Rack.HTTP_VERSION
  • added: const Rack.LINK
  • added: const Rack.OPTIONS
  • added: const Rack.PATCH
  • added: const Rack.POST
  • added: const Rack.PUT
  • added: const Rack.RACK_ERRORS
  • added: const Rack.RACK_HIJACK
  • added: const Rack.RACK_HIJACK_IO
  • added: const Rack.RACK_INPUT
  • added: const Rack.RACK_IS_HIJACK
  • added: const Rack.RACK_LOGGER
  • added: const Rack.RACK_METHODOVERRIDE_ORIGINAL_METHOD
  • added: const Rack.RACK_MULTIPART_BUFFER_SIZE
  • added: const Rack.RACK_MULTIPART_TEMPFILE_FACTORY
  • added: const Rack.RACK_MULTIPROCESS
  • added: const Rack.RACK_MULTITHREAD
  • added: const Rack.RACK_RECURSIVE_INCLUDE
  • added: const Rack.RACK_REQUEST_COOKIE_HASH
  • added: const Rack.RACK_REQUEST_COOKIE_STRING
  • added: const Rack.RACK_REQUEST_FORM_HASH
  • added: const Rack.RACK_REQUEST_FORM_INPUT
  • added: const Rack.RACK_REQUEST_FORM_VARS
  • added: const Rack.RACK_REQUEST_QUERY_HASH
  • added: const Rack.RACK_REQUEST_QUERY_STRING
  • added: const Rack.RACK_RUNONCE
  • added: const Rack.RACK_SESSION
  • added: const Rack.RACK_SESSION_OPTIONS
  • added: const Rack.RACK_SESSION_UNPACKED_COOKIE_DATA
  • added: const Rack.RACK_SHOWSTATUS_DETAIL
  • added: const Rack.RACK_TEMPFILES
  • added: const Rack.RACK_URL_SCHEME
  • added: const Rack.RACK_VERSION
  • added: const Rack.RELEASE
  • added: const Rack.REQUEST_PATH
  • added: const Rack.SERVER_NAME
  • added: const Rack.SERVER_PORT
  • added: const Rack.SERVER_PROTOCOL
  • added: const Rack.SET_COOKIE
  • added: const Rack.TRACE
  • added: const Rack.TRANSFER_ENCODING
  • added: const Rack.UNLINK
  • removed: class File
  • removed: const Directory.DIR_PAGE
  • removed: const Directory.F
  • removed: const File.ALLOWED_VERBS
  • removed: const File.ALLOW_HEADER
  • removed: const File.F
  • removed: const Lock.FLAG
  • removed: const Multipart.BROKEN_QUOTED
  • removed: const Multipart.BROKEN_UNQUOTED
  • removed: const Request.DEFAULT_PORTS
  • removed: const Request.FORM_DATA_MEDIA_TYPES
  • removed: const Request.PARSEABLE_DATA_MEDIA_TYPES
  • removed: const Response.TRANSFER_ENCODING
  • removed: const Sendfile.F
  • removed: const ShowExceptions.TEMPLATE
  • removed: const URLMap.INFINITY
  • removed: const URLMap.NEGATIVE_INFINITY
  • removed: constructor File(_, _ = …, _ = …)
  • removed: method BodyProxy.each(*)
  • removed: method BodyProxy.respond_to?(*)
  • removed: method Directory._call(_)
  • removed: method Directory.each()
  • removed: method File._call(_)
  • removed: method File.call(_)
  • removed: method File.each()
  • removed: method File.serving(_)
  • removed: method Request.GET()
  • removed: method Request.POST()
  • removed: method Request.[](_)
  • removed: method Request.[]=(_, _)
  • removed: method Request.accept_encoding()
  • removed: method Request.accept_language()
  • removed: method Request.base_url()
  • removed: method Request.body()
  • removed: method Request.content_charset()
  • removed: method Request.content_length()
  • removed: method Request.content_type()
  • removed: method Request.cookies()
  • removed: method Request.delete?()
  • removed: method Request.form_data?()
  • removed: method Request.fullpath()
  • removed: method Request.get?()
  • removed: method Request.head?()
  • removed: method Request.host()
  • removed: method Request.host_with_port()
  • removed: method Request.ip()
  • removed: method Request.link?()
  • removed: method Request.logger()
  • removed: method Request.media_type()
  • removed: method Request.media_type_params()
  • removed: method Request.options?()
  • removed: method Request.parseable_data?()
  • removed: method Request.patch?()
  • removed: method Request.path()
  • removed: method Request.path_info()
  • removed: method Request.port()
  • removed: method Request.post?()
  • removed: method Request.put?()
  • removed: method Request.query_string()
  • removed: method Request.referer()
  • removed: method Request.referrer()
  • removed: method Request.request_method()
  • removed: method Request.scheme()
  • removed: method Request.script_name()
  • removed: method Request.session()
  • removed: method Request.session_options()
  • removed: method Request.ssl?()
  • removed: method Request.trace?()
  • removed: method Request.trusted_proxy?(_)
  • removed: method Request.unlink?()
  • removed: method Request.url()
  • removed: method Request.user_agent()
  • removed: method Request.values_at(*)
  • removed: method Request.xhr?()
  • removed: method Response.[]=(_, _)
  • removed: method Response.delete_cookie(_, _ = …)
  • removed: method Response.set_cookie(_, _)
  • removed: method Response.to_ary()
  • removed: method Utils.normalize_params(_, _, _ = …, _ = …)
  • removed: property Directory.files: reader
  • removed: property Directory.path: accessor
  • removed: property File.cache_control: accessor
  • removed: property File.path: accessor
  • removed: property File.root: accessor
  • removed: property File.to_path: accessor
  • removed: property Request.env: reader
  • removed: protected method Request.parse_http_accept_header(_)
  • removed: protected method Request.parse_multipart(_)
  • removed: protected method Request.parse_query(_)
  • removed: protected method Request.reject_trusted_ip_addresses(_)
  • removed: protected method Request.split_ip_addresses(_)
  • removed: set Request.path_info(_)
  • removed: set Request.script_name(_)
  • removed: static method Handler._const_get(_, _ = …)
  • removed: static method MockRequest.env_with_encoding(_, _, _)
  • removed: static property Utils.key_space_limit: accessor
  • removed: static property Utils.param_depth_limit: accessor
  • changed: method Directory.check_forbidden() → method Directory.check_forbidden(_)
  • changed: method Directory.entity_not_found() → method Directory.entity_not_found(_)
  • changed: method Directory.list_directory() → method Directory.list_directory(_, _, _)
  • changed: method Directory.list_path() → method Directory.list_path(_, _, _, _)
  • changed: method Directory.stat(_, _ = …) → method Directory.stat(_)
  • changed: method Response.[](_) → static method Response.[](_, _, _)
  • changed: property Directory.root: accessor → property Directory.root: reader
  • changed: static method Handler.default(_ = …) → static method Handler.default()
  • changed: static method Multipart.parse_multipart(_) → static method Multipart.parse_multipart(_, _ = …)
  • added: class Events
  • added: class Files
  • added: class MediaType
  • added: class QueryParser
  • added: const Builder.UTF_8_BOM
  • added: const Directory.DIR_PAGE_FOOTER
  • added: const Directory.DIR_PAGE_HEADER
  • added: const Files.ALLOWED_VERBS
  • added: const Files.ALLOW_HEADER
  • added: const Files.MULTIPART_BOUNDARY
  • added: const MediaType.SPLIT_PATTERN
  • added: const MockResponse.Cookie
  • added: const Multipart.ATTRIBUTE
  • added: const Multipart.ATTRIBUTE_CHAR
  • added: const Multipart.BROKEN
  • added: const Multipart.EXTENDED_INITIAL_NAME
  • added: const Multipart.EXTENDED_INITIAL_PARAMETER
  • added: const Multipart.EXTENDED_INITIAL_VALUE
  • added: const Multipart.EXTENDED_OTHER_NAME
  • added: const Multipart.EXTENDED_OTHER_PARAMETER
  • added: const Multipart.EXTENDED_OTHER_VALUE
  • added: const Multipart.EXTENDED_PARAMETER
  • added: const Multipart.REGULAR_PARAMETER
  • added: const Multipart.REGULAR_PARAMETER_NAME
  • added: const Multipart.SECTION
  • added: const Multipart.VALUE
  • added: const QueryParser.COMMON_SEP
  • added: const QueryParser.DEFAULT_SEP
  • added: const QueryParser.ParamsTooDeepError
  • added: const Request.ALLOWED_SCHEMES
  • added: const Response.STATUS_WITH_NO_ENTITY_BODY
  • added: const Runtime.HEADER_NAME
  • added: const Session.Memcache
  • added: const Utils.COMMON_SEP
  • added: const Utils.ESCAPE_HTML
  • added: const Utils.ESCAPE_HTML_PATTERN
  • added: const Utils.HTTP_STATUS_CODES
  • added: const Utils.InvalidParameterError
  • added: const Utils.KeySpaceConstrainedParams
  • added: const Utils.NULL_BYTE
  • added: const Utils.PATH_SEPS
  • added: const Utils.ParameterTypeError
  • added: const Utils.RFC2396_PARSER
  • added: const Utils.RFC2822_DAY_NAME
  • added: const Utils.RFC2822_MONTH_NAME
  • added: const Utils.STATUS_WITH_NO_ENTITY_BODY
  • added: const Utils.SYMBOL_TO_STATUS_CODE
  • added: constructor Events(_, _)
  • added: constructor Files(_, _ = …, _ = …)
  • added: constructor QueryParser(_, _, _, bytesize_limit: …, params_limit: …)
  • added: method Builder.freeze_app()
  • added: method Directory.check_bad_request(_)
  • added: method Directory.get(_)
  • added: method Events.call(_)
  • added: method Files.call(_)
  • added: method Files.get(_)
  • added: method Files.serving(_, _)
  • added: method MockResponse.cookie(_)
  • added: method QueryParser.normalize_params(_, _, _, _)
  • added: method QueryParser.parse_nested_query(_, _ = …)
  • added: method QueryParser.parse_query(_, _ = …)
  • added: method Response.chunked?()
  • added: method Response.delete_header(_)
  • added: method Response.get_header(_)
  • added: method Response.has_header?(_)
  • added: method Response.set_header(_, _)
  • added: method ShowExceptions.template()
  • added: method Static.add_index_root?(_)
  • added: module RegexpExtensions
  • added: property Files.root: reader
  • added: property MockResponse.cookies: reader
  • added: property QueryParser.bytesize_limit: reader
  • added: property QueryParser.key_space_limit: reader
  • added: property QueryParser.param_depth_limit: reader
  • added: static method Builder.load_file(_, _ = …)
  • added: static method MediaType.params(_)
  • added: static method MediaType.type(_)
  • added: static method Multipart.extract_multipart(_, _ = …)
  • added: static method QueryParser.make_default(_, _, **)
  • added: static method Utils.add_cookie_to_header(_, _, _)
  • added: static method Utils.add_remove_cookie_to_header(_, _, _ = …)
  • added: static method Utils.best_q_match(_, _)
  • added: static method Utils.build_nested_query(_, _ = …)
  • added: static method Utils.build_query(_)
  • added: static method Utils.byte_ranges(_, _, max_ranges: …)
  • added: static method Utils.clean_path_info(_)
  • added: static method Utils.clock_time()
  • added: static method Utils.delete_cookie_header!(_, _, _ = …)
  • added: static method Utils.escape_html(_)
  • added: static method Utils.get_byte_ranges(_, _, max_ranges: …)
  • added: static method Utils.key_space_limit()
  • added: static method Utils.make_delete_cookie_header(_, _, _)
  • added: static method Utils.param_depth_limit()
  • added: static method Utils.parse_cookies(_)
  • added: static method Utils.parse_cookies_header(_)
  • added: static method Utils.q_values(_)
  • added: static method Utils.rfc2109(_)
  • added: static method Utils.rfc2822(_)
  • added: static method Utils.secure_compare(_, _)
  • added: static method Utils.select_best_encoding(_, _)
  • added: static method Utils.set_cookie_header!(_, _, _)
  • added: static method Utils.status_code(_)
  • added: static method Utils.unescape_path(_)
  • added: static method Utils.valid_path?(_)
  • added: static property Request.ip_filter: accessor
  • added: static property Utils.default_query_parser: accessor
  • added: static property Utils.multipart_file_limit: accessor
  • added: static property Utils.multipart_part_limit=: accessor
  • added: static property Utils.multipart_total_part_limit: accessor
  • added: static set Utils.key_space_limit(_)
  • added: static set Utils.param_depth_limit(_)
  • added: method AbstractRequest.valid?()
  • added: class TrailerBody < Body
  • removed: class DeflateStream
  • removed: const DeflateStream.DEFLATE_ARGS
  • removed: constructor DeflateStream(_)
  • removed: method DeflateStream.close()
  • removed: method DeflateStream.each()
  • changed: constructor GzipStream(_, _) → constructor GzipStream(_, _, _)
  • added: class DirectoryBody < Struct.new(:root, :path, :files)
  • added: method DirectoryBody.each()
  • added: class BufferedResponse < Rack::Response::Raw
  • added: class EventedBodyProxy < Rack::BodyProxy
  • added: constructor BufferedResponse(_, _, _)
  • added: constructor EventedBodyProxy(_, _, _, _)
  • added: method Abstract.on_commit(_, _)
  • added: method Abstract.on_error(_, _, _)
  • added: method Abstract.on_finish(_, _)
  • added: method Abstract.on_send(_, _)
  • added: method Abstract.on_start(_, _)
  • added: method BufferedResponse.to_a()
  • added: method EventedBodyProxy.each()
  • added: module Abstract
  • added: property BufferedResponse.body: reader
  • added: property EventedBodyProxy.request: reader
  • added: property EventedBodyProxy.response: reader
  • added: class BaseIterator
  • added: class Iterator < BaseIterator
  • added: constructor BaseIterator(_, _, _)
  • added: method BaseIterator.bytesize()
  • added: method BaseIterator.close()
  • added: method BaseIterator.each()
  • added: method Iterator.to_path()
  • added: property BaseIterator.options: reader
  • added: property BaseIterator.path: reader
  • added: property BaseIterator.ranges: reader
  • removed: class EventedMongrel < Handler::Mongrel
  • removed: class Mongrel < ::Mongrel::HttpHandler
  • removed: class SwiftipliedMongrel < Handler::Mongrel
  • removed: constructor Mongrel(_)
  • removed: method Mongrel.process(_, _)
  • removed: static method Mongrel.run(_, _ = …)
  • removed: static method Mongrel.valid_options()
  • changed: static method CGI.run(_, _ = …) → static method CGI.run(_, **)
  • changed: static method FastCGI.run(_, _ = …) → static method FastCGI.run(_, **)
  • changed: static method LSWS.run(_, _ = …) → static method LSWS.run(_, **)
  • changed: static method SCGI.run(_, _ = …) → static method SCGI.run(_, **)
  • changed: static method Thin.run(_, _ = …) → static method Thin.run(_, **)
  • changed: static method WEBrick.run(_, _ = …) → static method WEBrick.run(_, **)
  • added: class Cookie
  • added: constructor Cookie(_)
  • added: property Cookie.domain: reader
  • added: property Cookie.expires: reader
  • added: property Cookie.name: reader
  • added: property Cookie.path: reader
  • added: property Cookie.secure: reader
  • added: property Cookie.value: reader
  • removed: static method Parser.create(_)
  • changed: constructor Parser(_, _, _, _, _, _) → constructor Parser(_, _, _, _)
  • changed: constructor UploadedFile(_, _ = …, _ = …) → constructor UploadedFile(_ = …, _ = …, _ = …, path: …, content_type: …, binary: …, filename: …, io: …)
  • changed: method Parser.parse() → static method Parser.parse(_, _, _, _, _, _)
  • added: class MultipartTotalPartLimitError < StandardError
  • added: const Parser.BOUNDARY_REGEX
  • added: const Parser.TEMPFILE_FACTORY
  • added: method Parser.on_read(_)
  • added: method Parser.result()
  • added: property Parser.state: reader
  • added: static method Parser.parse_boundary(_)
  • removed: class DUMMY < Struct.new(:parse)
  • added: class BoundedIO
  • added: class Collector
  • added: class EMPTY < MultipartInfo.new(nil, [])
  • added: class MultipartInfo < Struct.new
  • added: constructor BoundedIO(_, _)
  • added: constructor Collector(_)
  • added: method BoundedIO.read(_, _ = …)
  • added: method BoundedIO.rewind()
  • added: method Collector.each()
  • added: method Collector.on_mime_body(_, _)
  • added: method Collector.on_mime_finish(_)
  • added: method Collector.on_mime_head(_, _, _, _, _)
  • added: class BufferPart < MimePart
  • added: class MimePart < Struct.new(:body, :head, :filename, :content_type, :name)
  • added: class TempfilePart < MimePart
  • added: method BufferPart.close()
  • added: method BufferPart.file?()
  • added: method MimePart.get_data()
  • added: method TempfilePart.close()
  • added: method TempfilePart.file?()
  • added: class InvalidParameterError < ArgumentError
  • added: class ParameterTypeError < TypeError
  • added: class QueryLimitError < RangeError
  • added: const Helpers.DEFAULT_PORTS
  • added: const Helpers.FORM_DATA_MEDIA_TYPES
  • added: const Helpers.HTTP_X_FORWARDED_FOR
  • added: const Helpers.HTTP_X_FORWARDED_HOST
  • added: const Helpers.HTTP_X_FORWARDED_PORT
  • added: const Helpers.HTTP_X_FORWARDED_PROTO
  • added: const Helpers.HTTP_X_FORWARDED_SCHEME
  • added: const Helpers.HTTP_X_FORWARDED_SSL
  • added: const Helpers.PARSEABLE_DATA_MEDIA_TYPES
  • added: constructor Env(_)
  • added: method Env.add_header(_, _)
  • added: method Env.delete_header(_)
  • added: method Env.each_header()
  • added: method Env.fetch_header(_)
  • added: method Env.get_header(_)
  • added: method Env.has_header?(_)
  • added: method Env.set_header(_, _)
  • added: method Helpers.GET()
  • added: method Helpers.POST()
  • added: method Helpers.[](_)
  • added: method Helpers.[]=(_, _)
  • added: method Helpers.accept_encoding()
  • added: method Helpers.accept_language()
  • added: method Helpers.authority()
  • added: method Helpers.base_url()
  • added: method Helpers.body()
  • added: method Helpers.content_charset()
  • added: method Helpers.content_length()
  • added: method Helpers.content_type()
  • added: method Helpers.cookies()
  • added: method Helpers.delete?()
  • added: method Helpers.delete_param(_)
  • added: method Helpers.form_data?()
  • added: method Helpers.forwarded_authority()
  • added: method Helpers.forwarded_for()
  • added: method Helpers.forwarded_port()
  • added: method Helpers.fullpath()
  • added: method Helpers.get?()
  • added: method Helpers.head?()
  • added: method Helpers.host()
  • added: method Helpers.host_authority()
  • added: method Helpers.host_with_port(_ = …)
  • added: method Helpers.hostname()
  • added: method Helpers.ip()
  • added: method Helpers.link?()
  • added: method Helpers.logger()
  • added: method Helpers.media_type()
  • added: method Helpers.media_type_params()
  • added: method Helpers.multithread?()
  • added: method Helpers.options?()
  • added: method Helpers.params()
  • added: method Helpers.parseable_data?()
  • added: method Helpers.patch?()
  • added: method Helpers.path()
  • added: method Helpers.path_info()
  • added: method Helpers.port()
  • added: method Helpers.post?()
  • added: method Helpers.put?()
  • added: method Helpers.query_string()
  • added: method Helpers.referer()
  • added: method Helpers.referrer()
  • added: method Helpers.request_method()
  • added: method Helpers.scheme()
  • added: method Helpers.script_name()
  • added: method Helpers.server_authority()
  • added: method Helpers.server_name()
  • added: method Helpers.server_port()
  • added: method Helpers.session()
  • added: method Helpers.session_options()
  • added: method Helpers.ssl?()
  • added: method Helpers.trace?()
  • added: method Helpers.trusted_proxy?(_)
  • added: method Helpers.unlink?()
  • added: method Helpers.update_param(_, _)
  • added: method Helpers.url()
  • added: method Helpers.user_agent()
  • added: method Helpers.values_at(*)
  • added: method Helpers.xhr?()
  • added: module Env
  • added: module Helpers
  • added: property Env.env: reader
  • added: set Helpers.path_info(_)
  • added: set Helpers.script_name(_)
  • removed: method Helpers.i_m_a_teapot?()
  • removed: property Helpers.headers: reader
  • removed: property Helpers.original_headers: reader
  • added: class Raw
  • added: constructor Raw(_, _)
  • added: method Helpers.add_header(_, _)
  • added: method Helpers.cache!(_ = …, directive: …)
  • added: method Helpers.cache_control()
  • added: method Helpers.delete_cookie(_, _ = …)
  • added: method Helpers.do_not_cache!()
  • added: method Helpers.etag()
  • added: method Helpers.media_type()
  • added: method Helpers.media_type_params()
  • added: method Helpers.moved_permanently?()
  • added: method Helpers.no_content?()
  • added: method Helpers.precondition_failed?()
  • added: method Helpers.set_cookie(_, _)
  • added: method Helpers.set_cookie_header()
  • added: method Raw.delete_header(_)
  • added: method Raw.get_header(_)
  • added: method Raw.has_header?(_)
  • added: method Raw.set_header(_, _)
  • added: property Raw.headers: reader
  • added: property Raw.status: accessor
  • added: protected method Helpers.append(_)
  • added: protected method Helpers.buffered_body!()
  • added: set Helpers.cache_control(_)
  • added: set Helpers.content_type(_)
  • added: set Helpers.etag(_)
  • added: set Helpers.location(_)
  • added: set Helpers.set_cookie_header(_)
  • removed: class Tempfile < ::Tempfile
  • removed: method Tempfile._close()
  • removed: class Memcache < Abstract::PersistedSecure
  • removed: const Abstract.ENV_SESSION_KEY
  • removed: const Abstract.ENV_SESSION_OPTIONS_KEY
  • removed: const Memcache.DEFAULT_OPTIONS
  • removed: constructor Memcache(_, _ = …)
  • removed: method Memcache.destroy_session(_, _, _)
  • removed: method Memcache.generate_sid()
  • removed: method Memcache.get_session(_, _)
  • removed: method Memcache.set_session(_, _, _, _)
  • removed: method Memcache.with_lock(_)
  • removed: method Pool.destroy_session(_, _, _)
  • removed: method Pool.get_session(_, _)
  • removed: method Pool.set_session(_, _, _, _)
  • removed: property Memcache.mutex: reader
  • removed: property Memcache.pool: reader
  • added: method Pool.delete_session(_, _, _)
  • added: method Pool.find_session(_, _)
  • added: method Pool.write_session(_, _, _, _)
  • added: method ID.delete_session(_, _, _)
  • added: method ID.find_session(_, _)
  • added: method ID.write_session(_, _, _, _)
  • added: method Persisted.commit_session(_, _)
  • added: method SessionHash.dig(_, *)
  • added: method SessionHash.fetch(_, _ = …)
  • added: property Persisted.sid_secure: reader
  • added: class Unspecified < Object.new
  • added: class TEMPLATE < ERB.new(<<-'HTML'.gsub(/^ /, ''))
  • removed: class InvalidParameterError < ArgumentError
  • removed: class ParameterTypeError < TypeError
  • removed: const OkJson.Spc
  • removed: const OkJson.Unesc
  • removed: const OkJson.Upstream
  • removed: const OkJson.Usurr1
  • removed: const OkJson.Usurr2
  • removed: const OkJson.Usurr3
  • removed: const OkJson.Usurrself
  • removed: method OkJson.decode(_)
  • removed: method OkJson.encode(_)
  • removed: method OkJson.valenc(_)
  • removed: module OkJson
  • added: class Context
  • added: class HeaderHash < Hash
  • added: constructor Context(_, _)
  • added: constructor HeaderHash(_ = …)
  • added: method Context.call(_)
  • added: method Context.context(_, _ = …)
  • added: method Context.recontext(_)
  • added: method HeaderHash.[](_)
  • added: method HeaderHash.[]=(_, _)
  • added: method HeaderHash.clear()
  • added: method HeaderHash.delete(_)
  • added: method HeaderHash.each()
  • added: method HeaderHash.has_key?(_)
  • added: method HeaderHash.include?(_)
  • added: method HeaderHash.key?(_)
  • added: method HeaderHash.member?(_)
  • added: method HeaderHash.merge!(_)
  • added: method HeaderHash.merge(_)
  • added: method HeaderHash.replace(_)
  • added: method HeaderHash.to_hash()
  • added: property Context.app: reader
  • added: property Context.for: reader
  • added: protected method HeaderHash.names()
  • added: static method HeaderHash.[](_)