diff options
Diffstat (limited to 'lib/rack')
-rw-r--r-- | lib/rack/bad_request.rb | 6 | ||||
-rw-r--r-- | lib/rack/multipart.rb | 3 | ||||
-rw-r--r-- | lib/rack/multipart/parser.rb | 18 | ||||
-rw-r--r-- | lib/rack/query_parser.rb | 14 |
4 files changed, 34 insertions, 7 deletions
diff --git a/lib/rack/bad_request.rb b/lib/rack/bad_request.rb new file mode 100644 index 00000000..9c675126 --- /dev/null +++ b/lib/rack/bad_request.rb @@ -0,0 +1,6 @@ +module Rack + # Represents a 400 Bad Request error when input data fails to meet the + # requirements. + module BadRequest + end +end diff --git a/lib/rack/multipart.rb b/lib/rack/multipart.rb index 76b25a51..165b4db3 100644 --- a/lib/rack/multipart.rb +++ b/lib/rack/multipart.rb @@ -6,6 +6,8 @@ require_relative 'utils' require_relative 'multipart/parser' require_relative 'multipart/generator' +require_relative 'bad_request' + module Rack # A multipart form data parser, adapted from IOWA. # @@ -14,6 +16,7 @@ module Rack MULTIPART_BOUNDARY = "AaB03x" class MissingInputError < StandardError + include BadRequest end class << self diff --git a/lib/rack/multipart/parser.rb b/lib/rack/multipart/parser.rb index ceafbc6b..c49c80e6 100644 --- a/lib/rack/multipart/parser.rb +++ b/lib/rack/multipart/parser.rb @@ -3,18 +3,28 @@ require 'strscan' require_relative '../utils' +require_relative '../bad_request' module Rack module Multipart - class MultipartPartLimitError < Errno::EMFILE; end + class MultipartPartLimitError < Errno::EMFILE + include BadRequest + end # Use specific error class when parsing multipart request # that ends early. - class EmptyContentError < ::EOFError; end + class EmptyContentError < ::EOFError + include BadRequest + end # Base class for multipart exceptions that do not subclass from # other exception classes for backwards compatibility. - class Error < StandardError; end + class BoundaryTooLongError < StandardError + include BadRequest + end + + # Prefer to use the BoundaryTooLongError class or Rack::BadRequest. + Error = BoundaryTooLongError EOL = "\r\n" MULTIPART = %r|\Amultipart/.*boundary=\"?([^\";,]+)\"?|ni @@ -96,7 +106,7 @@ module Rack if boundary.length > 70 # RFC 1521 Section 7.2.1 imposes a 70 character maximum for the boundary. # Most clients use no more than 55 characters. - raise Error, "multipart boundary size too large (#{boundary.length} characters)" + raise BoundaryTooLongError, "multipart boundary size too large (#{boundary.length} characters)" end io = BoundedIO.new(io, content_length) if content_length diff --git a/lib/rack/query_parser.rb b/lib/rack/query_parser.rb index a89c4c7f..7c9621ed 100644 --- a/lib/rack/query_parser.rb +++ b/lib/rack/query_parser.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +require_relative 'bad_request' + module Rack class QueryParser DEFAULT_SEP = /[&] */n @@ -7,16 +9,22 @@ module Rack # ParameterTypeError is the error that is raised when incoming structural # parameters (parsed by parse_nested_query) contain conflicting types. - class ParameterTypeError < TypeError; end + class ParameterTypeError < TypeError + include BadRequest + end # InvalidParameterError is the error that is raised when incoming structural # parameters (parsed by parse_nested_query) contain invalid format or byte # sequence. - class InvalidParameterError < ArgumentError; end + class InvalidParameterError < ArgumentError + include BadRequest + end # ParamsTooDeepError is the error that is raised when params are recursively # nested over the specified limit. - class ParamsTooDeepError < RangeError; end + class ParamsTooDeepError < RangeError + include BadRequest + end def self.make_default(param_depth_limit) new Params, param_depth_limit |