module Webmachine::Decision::Helpers

Methods that assist the Decision {Flow}.

Public Instance Methods

accept_helper() click to toggle source

Assists in receiving request bodies

# File lib/webmachine/decision/helpers.rb, line 61
def accept_helper
  content_type = MediaType.parse(request.content_type || 'application/octet-stream')
  acceptable = resource.content_types_accepted.find { |ct, _| content_type.match?(ct) }
  if acceptable
    resource.send(acceptable.last)
  else
    415
  end
end
add_caching_headers() click to toggle source

Adds caching-related headers to the response.

# File lib/webmachine/decision/helpers.rb, line 82
def add_caching_headers
  if etag = resource.generate_etag
    response.headers['ETag'] = ETag.new(etag).to_s
  end
  if expires = resource.expires
    response.headers['Expires'] = expires.httpdate
  end
  if modified = resource.last_modified
    response.headers['Last-Modified'] = modified.httpdate
  end
end
body_is_fixed_length?() click to toggle source

Determines whether the response is of a fixed lenghth, i.e. it is a String or IO with known size.

# File lib/webmachine/decision/helpers.rb, line 96
def body_is_fixed_length?
  response.body.respond_to?(:bytesize) &&
    Integer === response.body.bytesize
end
encode_body() click to toggle source

Encodes the body in the selected charset and encoding.

# File lib/webmachine/decision/helpers.rb, line 30
def encode_body
  body = response.body
  chosen_charset = metadata[CHARSET]
  chosen_encoding = metadata[CONTENT_ENCODING]
  charsetter = resource.charsets_provided&.find { |c, _| c == chosen_charset }&.last || :charset_nop
  encoder = resource.encodings_provided[chosen_encoding]
  response.body = case body
  when String # 1.8 treats Strings as Enumerable
    resource.send(encoder, resource.send(charsetter, body))
  when IO, StringIO
    IOEncoder.new(resource, encoder, charsetter, body)
  when Fiber
    FiberEncoder.new(resource, encoder, charsetter, body)
  when Enumerable
    EnumerableEncoder.new(resource, encoder, charsetter, body)
  else
    if body.respond_to?(:call)
      CallableEncoder.new(resource, encoder, charsetter, body)
    else
      resource.send(encoder, resource.send(charsetter, body))
    end
  end
  if body_is_fixed_length?
    ensure_content_length(response)
  else
    response.headers.delete CONTENT_LENGTH
    response.headers[TRANSFER_ENCODING] = 'chunked'
  end
end
encode_body_if_set() click to toggle source

If the response body exists, encode it. @see encode_body

# File lib/webmachine/decision/helpers.rb, line 25
def encode_body_if_set
  encode_body if has_response_body?
end
has_response_body?() click to toggle source

Determines if the response has a body/entity set.

# File lib/webmachine/decision/helpers.rb, line 19
def has_response_body?
  !response.body.nil? && !response.body.empty?
end
variances() click to toggle source

Computes the entries for the ‘Vary’ response header

# File lib/webmachine/decision/helpers.rb, line 72
def variances
  resource.variances.tap do |v|
    v.unshift 'Accept-Language' if resource.languages_provided.size > 1
    v.unshift 'Accept-Charset' if resource.charsets_provided && resource.charsets_provided.size > 1
    v.unshift 'Accept-Encoding' if resource.encodings_provided.size > 1
    v.unshift 'Accept' if resource.content_types_provided.size > 1
  end
end