module Roda::RodaPlugins::SinatraHelpers::ResponseMethods
def attachment(filename = nil, disposition='attachment')
Set the Content-Disposition to "attachment" with the specified filename,
def attachment(filename = nil, disposition='attachment') if filename param_filename = File.basename(filename) encoding = param_filename.encoding needs_encoding = param_filename.gsub!(/[^ 0-9a-zA-Z!\#$&\+\.\^_`\|~]+/, '-') params = "; filename=#{param_filename.inspect}" if needs_encoding && (encoding == UTF8_ENCODING || encoding == ISO88591_ENCODING) # File name contains non attr-char characters from RFC 5987 Section 3.2.1 encoded_filename = File.basename(filename).force_encoding(BINARY_ENCODING) # Similar regexp as above, but treat each byte separately, and encode # space characters, since those aren't allowed in attr-char encoded_filename.gsub!(/[^0-9a-zA-Z!\#$&\+\.\^_`\|~]/) do |c| "%%%X" % c.ord end encoded_params = "; filename*=#{encoding.to_s}''#{encoded_filename}" end unless @headers[RodaResponseHeaders::CONTENT_TYPE] ext = File.extname(filename) unless ext.empty? content_type(ext) end end end @headers[RodaResponseHeaders::CONTENT_DISPOSITION] = "#{disposition}#{params}#{encoded_params}" end
def body(value = (return @body unless defined?(yield); nil), &block)
Set or retrieve the response body. When a block is given,
def body(value = (return @body unless defined?(yield); nil), &block) if block @body = DelayedBody.new(&block) else self.body = value end end
def body=(body)
def body=(body) @body = DelayedBody.new{body} end
def client_error?
def client_error? @status.between?(400, 499) if @status end
def content_type(type = nil || (return @headers[RodaResponseHeaders::CONTENT_TYPE]), opts = OPTS)
Set the Content-Type of the response body given a media type or file
def content_type(type = nil || (return @headers[RodaResponseHeaders::CONTENT_TYPE]), opts = OPTS) unless (mime_type = mime_type(type) || opts[:default]) raise RodaError, "Unknown media type: #{type}" end unless opts.empty? opts.each do |key, val| next if key == :default || (key == :charset && mime_type.include?('charset')) val = val.inspect if val =~ /[";,]/ mime_type += "#{mime_type.include?(';') ? ', ' : ';'}#{key}=#{val}" end end @headers[RodaResponseHeaders::CONTENT_TYPE] = mime_type end
def finish
def finish @length = @body.length if @body.is_a?(DelayedBody) && !@headers[RodaResponseHeaders::CONTENT_LENGTH] super end
def headers(hash = nil || (return @headers))
Set multiple response headers with Hash, or return the headers if no
def headers(hash = nil || (return @headers)) @headers.merge!(hash) end
def informational?
def informational? @status.between?(100, 199) if @status end
def mime_type(type)
def mime_type(type) roda_class.mime_type(type) end
def not_found?
def not_found? @status == 404 if @status end
def redirect?
def redirect? @status.between?(300, 399) if @status end
def server_error?
def server_error? @status.between?(500, 599) if @status end
def status(value = nil || (return @status))
def status(value = nil || (return @status)) @status = value end
def success?
def success? @status.between?(200, 299) if @status end