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.



437
438
439
440
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
# File 'lib/roda/plugins/sinatra_helpers.rb', line 437

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.



387
388
389
390
391
392
393
# File 'lib/roda/plugins/sinatra_helpers.rb', line 387

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.



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

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)


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

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.



419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
# File 'lib/roda/plugins/sinatra_helpers.rb', line 419

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.



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

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.



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

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)


469
470
471
# File 'lib/roda/plugins/sinatra_helpers.rb', line 469

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.



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

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)


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

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)


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

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)


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

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

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

Set or retrieve the response status code.



381
382
383
# File 'lib/roda/plugins/sinatra_helpers.rb', line 381

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)


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

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