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.



451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
# File 'lib/roda/plugins/sinatra_helpers.rb', line 451

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["Content-Type"]
      ext = File.extname(filename)
      unless ext.empty?
        content_type(ext)
      end
    end
  end
  @headers["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.



401
402
403
404
405
406
407
# File 'lib/roda/plugins/sinatra_helpers.rb', line 401

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.



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

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)


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

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

#content_type(type = nil || (return @headers["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.



433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
# File 'lib/roda/plugins/sinatra_helpers.rb', line 433

def content_type(type = nil || (return @headers["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["Content-Type"] = mime_type
end

#finishObject

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



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

def finish
  @length = @body.length if @body.is_a?(DelayedBody) && !@headers["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.



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

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)


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

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.



427
428
429
# File 'lib/roda/plugins/sinatra_helpers.rb', line 427

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)


508
509
510
# File 'lib/roda/plugins/sinatra_helpers.rb', line 508

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)


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

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)


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

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

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

Set or retrieve the response status code.



395
396
397
# File 'lib/roda/plugins/sinatra_helpers.rb', line 395

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)


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

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