Module: Roda::RodaPlugins::SinatraHelpers::ResponseMethods

Defined in:
lib/roda/plugins/sinatra_helpers.rb

Instance Method Summary collapse

Instance Method Details

#attachment(filename = nil, disposition = 'attachment') ⇒ Object

Set the Content-Disposition to “attachment” with the specified filename, instructing the user agents to prompt to save.



445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
# File 'lib/roda/plugins/sinatra_helpers.rb', line 445

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

#body(value = (yield); nil), &block) ⇒ Object

Set or retrieve the response body. When a block is given, evaluation is deferred until the body is needed.



395
396
397
398
399
400
401
# File 'lib/roda/plugins/sinatra_helpers.rb', line 395

def body(value = (return @body unless defined?(yield); nil), &block)
  if block
    @body = DelayedBody.new(&block)
  else
    self.body = value
  end
end

#body=(body) ⇒ Object

Set the body to the given value.



404
405
406
# File 'lib/roda/plugins/sinatra_helpers.rb', line 404

def body=(body)
  @body = DelayedBody.new{body}
end

#client_error?Boolean

Whether or not the status is set to 4xx. Returns nil if status not yet set.

Returns:

  • (Boolean)


492
493
494
# File 'lib/roda/plugins/sinatra_helpers.rb', line 492

def client_error?
  @status.between?(400, 499) if @status
end

#content_type(type = nil || (return @headers[RodaResponseHeaders::CONTENT_TYPE]), opts = OPTS) ⇒ Object

Set the Content-Type of the response body given a media type or file extension. See plugin documentation for options.



427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
# File 'lib/roda/plugins/sinatra_helpers.rb', line 427

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

#finishObject

If the body is a DelayedBody, set the appropriate length for it.



409
410
411
412
# File 'lib/roda/plugins/sinatra_helpers.rb', line 409

def finish
  @length = @body.length if @body.is_a?(DelayedBody) && !@headers[RodaResponseHeaders::CONTENT_LENGTH]
  super
end

#headers(hash = nil || (return @headers)) ⇒ Object

Set multiple response headers with Hash, or return the headers if no argument is given.



416
417
418
# File 'lib/roda/plugins/sinatra_helpers.rb', line 416

def headers(hash = nil || (return @headers))
  @headers.merge!(hash)
end

#informational?Boolean

Whether or not the status is set to 1xx. Returns nil if status not yet set.

Returns:

  • (Boolean)


477
478
479
# File 'lib/roda/plugins/sinatra_helpers.rb', line 477

def informational?
  @status.between?(100, 199) if @status
end

#mime_type(type) ⇒ Object

Look up a media type by file extension in Rack’s mime registry.



421
422
423
# File 'lib/roda/plugins/sinatra_helpers.rb', line 421

def mime_type(type)
  roda_class.mime_type(type)
end

#not_found?Boolean

Whether or not the status is set to 404. Returns nil if status not yet set.

Returns:

  • (Boolean)


502
503
504
# File 'lib/roda/plugins/sinatra_helpers.rb', line 502

def not_found?
  @status == 404 if @status
end

#redirect?Boolean

Whether or not the status is set to 3xx. Returns nil if status not yet set.

Returns:

  • (Boolean)


487
488
489
# File 'lib/roda/plugins/sinatra_helpers.rb', line 487

def redirect?
  @status.between?(300, 399) if @status
end

#server_error?Boolean

Whether or not the status is set to 5xx. Returns nil if status not yet set.

Returns:

  • (Boolean)


497
498
499
# File 'lib/roda/plugins/sinatra_helpers.rb', line 497

def server_error?
  @status.between?(500, 599) if @status
end

#status(value = nil || (return @status)) ⇒ Object

Set or retrieve the response status code.



389
390
391
# File 'lib/roda/plugins/sinatra_helpers.rb', line 389

def status(value = nil || (return @status))
  @status = value
end

#success?Boolean

Whether or not the status is set to 2xx. Returns nil if status not yet set.

Returns:

  • (Boolean)


482
483
484
# File 'lib/roda/plugins/sinatra_helpers.rb', line 482

def success?
  @status.between?(200, 299) if @status
end