0
# Raised when an incoming request is not valid
0
@@ -7,15 +8,18 @@ module Thin
0
# A request sent by the client to the server.
0
- MAX_HEADER = 1024 * (80 + 32)
0
- MAX_HEADER_MSG = 'Header longer than allowed'.freeze
0
+ # Maximum request body size before it is moved out of memory
0
+ # and into a tempfile for reading.
0
+ MAX_BODY = 1024 * (80 + 32)
0
+ BODY_TMPFILE = 'thin-body'.freeze
0
+ # Freeze some HTTP header names
0
SERVER_SOFTWARE = 'SERVER_SOFTWARE'.freeze
0
REMOTE_ADDR = 'REMOTE_ADDR'.freeze
0
FORWARDED_FOR = 'HTTP_X_FORWARDED_FOR'.freeze
0
CONTENT_LENGTH = 'CONTENT_LENGTH'.freeze
0
+ # Freeze some Rack header names
0
RACK_INPUT = 'rack.input'.freeze
0
RACK_VERSION = 'rack.version'.freeze
0
RACK_ERRORS = 'rack.errors'.freeze
0
@@ -23,7 +27,14 @@ module Thin
0
RACK_MULTIPROCESS = 'rack.multiprocess'.freeze
0
RACK_RUN_ONCE = 'rack.run_once'.freeze
0
- attr_reader :env, :data, :body
0
+ # CGI-like request environment variables
0
+ # Unparsed data of the request
0
@parser = HttpParser.new
0
@@ -45,28 +56,45 @@ module Thin
0
+ # Parse a chunk of data into the request environment
0
+ # Raises a +InvalidRequest+ if invalid.
0
+ # Returns +true+ if the parsing is complete.
0
if @parser.finished? # Header finished, can only be some more body
0
- elsif @data.size > MAX_HEADER # Oho! very big header, must be a mean person
0
- raise InvalidRequest, MAX_HEADER_MSG
0
else # Parse more header using the super parser
0
@nparsed = @parser.execute(@env, @data, @nparsed)
0
+ # Transfert to a tempfile if body is very big
0
+ move_body_to_tempfile if @parser.finished? && content_length > MAX_BODY
0
# Check if header and body are complete
0
- if @parser.finished? && body.size >= content_length
0
+ if @parser.finished? && @body.size >= content_length
0
return true # Request is fully parsed
0
false # Not finished, need more data
0
+ # Expected size of the body
0
@env[CONTENT_LENGTH].to_i
0
+ @body.close if @body === Tempfile
0
+ def move_body_to_tempfile
0
+ @body = Tempfile.new(BODY_TMPFILE)
0
+ @body << current_body unless current_body.size.zero?
0
+ @env[RACK_INPUT] = @body
0
\ No newline at end of file
Comments
No one has commented yet.