module Middleman::CoreExtensions::Request::InstanceMethods
def call(env)
def call(env) dup.call!(env) end
def call!(env)
-
env
() -- Rack environment
def call!(env) # Store environment, request and response for later self.req = req = ::Rack::Request.new(env) res = ::Rack::Response.new logger.debug "== Request: #{env['PATH_INFO']}" # Catch :halt exceptions and use that response if given catch(:halt) do process_request(env, req, res) res.status = 404 res.finish end end
def current_path
-
(String)
-
def current_path Thread.current[:current_path] end
def current_path=(path)
-
(void)
-
Parameters:
-
path
(String
) -- The new current path
def current_path=(path) Thread.current[:current_path] = path Thread.current[:legacy_request] = ::Thor::CoreExt::HashWithIndifferentAccess.new( path: path, params: req ? ::Thor::CoreExt::HashWithIndifferentAccess.new(req.params) : {} ) end
def halt(response)
-
response
(String
) -- Response value
def halt(response) throw :halt, response end
def mime_type(type, value)
-
(void)
-
Parameters:
-
value
(String
) -- Mime type -
type
(Symbol
) -- File extension
def mime_type(type, value) type = ".#{type}" unless type.to_s[0] == '.' ::Rack::Mime::MIME_TYPES[type] = value end
def not_found(res, path)
def not_found(res, path) res.status = 404 res.write "<html><head></head><body><h1>File Not Found</h1><p>#{path}</p></body></html>" res.finish end
def process_request(env, req, res)
-
res
(Rack::Response
) -- -
req
(Rack::Request
) -- -
env
() --
def process_request(env, req, res) start_time = Time.now current_path = nil request_path = URI.decode(env['PATH_INFO'].dup) if request_path.respond_to? :force_encoding request_path.force_encoding('UTF-8') end request_path = ::Middleman::Util.full_path(request_path, self) # Run before callbacks run_hook :before # Get the resource object for this path resource = sitemap.find_resource_by_destination_path(request_path) # Return 404 if not in sitemap return not_found(res, request_path) unless resource && !resource.ignored? # If this path is a binary file, send it immediately return send_file(resource, env) if resource.binary? current_path = resource.destination_path res['Content-Type'] = resource.content_type || 'text/plain' begin # Write out the contents of the page output = resource.render do self.req = req self.current_path = current_path end res.write output # Valid content is a 200 status res.status = 200 rescue Middleman::CoreExtensions::Rendering::TemplateNotFound => e res.write "Error: #{e.message}" res.status = 500 end # End the request logger.debug "== Finishing Request: #{current_path} (#{(Time.now - start_time).round(2)}s)" halt res.finish end
def req
-
(Rack::Request)
-
def req Thread.current[:req] end
def req=(value)
def req=(value) Thread.current[:req] = value end
def request
def request Thread.current[:legacy_request] end
def send_file(resource, env)
def send_file(resource, env) file = ::Rack::File.new nil file.path = resource.source_file response = file.serving(env) status = response[0] response[1]['Content-Encoding'] = 'gzip' if %w(.svgz .gz).include?(resource.ext) # Do not set Content-Type if status is 1xx, 204, 205 or 304, otherwise # Rack will throw an error (500) if !(100..199).include?(status) && ![204, 205, 304].include?(status) response[1]['Content-Type'] = resource.content_type || 'application/octet-stream' end halt response end