Module: Webmachine::Decision::Helpers

Includes:
QuotedString, Streaming
Included in:
FSM
Defined in:
lib/webmachine/decision/helpers.rb

Overview

Methods that assist the Decision Flow.

Constant Summary

Constants included from QuotedString

QuotedString::QS_ANCHORED, QuotedString::QUOTED_STRING

Instance Method Summary collapse

Methods included from QuotedString

#escape_quotes, #quote, #unescape_quotes, #unquote

Instance Method Details

#accept_helperObject

Assists in receiving request bodies



57
58
59
60
61
62
63
64
65
# File 'lib/webmachine/decision/helpers.rb', line 57

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_headersObject

Adds caching-related headers to the response.



78
79
80
81
82
83
84
85
86
87
88
# File 'lib/webmachine/decision/helpers.rb', line 78

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?Boolean

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

Returns:

  • (Boolean)


116
117
118
119
# File 'lib/webmachine/decision/helpers.rb', line 116

def body_is_fixed_length?
  response.body.respond_to?(:bytesize) &&
    Fixnum === response.body.bytesize
end

#encode_bodyObject

Encodes the body in the selected charset and encoding.



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/webmachine/decision/helpers.rb', line 26

def encode_body
  body = response.body
  chosen_charset = ['Charset']
  chosen_encoding = ['Content-Encoding']
  charsetter = resource.charsets_provided && 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?
    set_content_length
  else
    response.headers.delete 'Content-Length'
    response.headers['Transfer-Encoding'] = 'chunked'
  end
end

#encode_body_if_setObject

If the response body exists, encode it.

See Also:



21
22
23
# File 'lib/webmachine/decision/helpers.rb', line 21

def encode_body_if_set
  encode_body if has_response_body?
end

#ensure_content_lengthObject

Ensures that responses have an appropriate Content-Length header



92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/webmachine/decision/helpers.rb', line 92

def ensure_content_length
  case
  when response.headers['Transfer-Encoding']
    return
  when [204, 205, 304].include?(response.code)
    response.headers.delete 'Content-Length'
  when has_response_body?
    set_content_length
  else
    response.headers['Content-Length'] = '0'
  end
end

#has_response_body?Boolean

Determines if the response has a body/entity set.

Returns:

  • (Boolean)


15
16
17
# File 'lib/webmachine/decision/helpers.rb', line 15

def has_response_body?
  !response.body.nil? && !response.body.empty?
end

#set_content_lengthObject

Sets the Content-Length header on the response



106
107
108
109
110
111
112
# File 'lib/webmachine/decision/helpers.rb', line 106

def set_content_length
  if response.body.respond_to?(:bytesize)
    response.headers['Content-Length'] = response.body.bytesize.to_s
  else
    response.headers['Content-Length'] = response.body.length.to_s
  end
end

#variancesObject

Computes the entries for the ‘Vary’ response header



68
69
70
71
72
73
74
75
# File 'lib/webmachine/decision/helpers.rb', line 68

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