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.



441
442
443
444
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
# File 'lib/roda/plugins/sinatra_helpers.rb', line 441

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.



391
392
393
394
395
396
397
# File 'lib/roda/plugins/sinatra_helpers.rb', line 391

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.



400
401
402
# File 'lib/roda/plugins/sinatra_helpers.rb', line 400

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)


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

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.



423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
# File 'lib/roda/plugins/sinatra_helpers.rb', line 423

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.



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

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.



412
413
414
# File 'lib/roda/plugins/sinatra_helpers.rb', line 412

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)


473
474
475
# File 'lib/roda/plugins/sinatra_helpers.rb', line 473

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.



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

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)


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

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)


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

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)


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

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

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

Set or retrieve the response status code.



385
386
387
# File 'lib/roda/plugins/sinatra_helpers.rb', line 385

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)


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

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