Module: Webmachine::Decision::Helpers
Overview
Methods that assist the Decision Flow.
Constant Summary
Constants included from QuotedString
QuotedString::QS_ANCHORED, QuotedString::QUOTED_STRING
Instance Method Summary collapse
-
#accept_helper ⇒ Object
Assists in receiving request bodies.
-
#add_caching_headers ⇒ Object
Adds caching-related headers to the response.
-
#body_is_fixed_length? ⇒ Boolean
Determines whether the response is of a fixed lenghth, i.e.
-
#encode_body ⇒ Object
Encodes the body in the selected charset and encoding.
-
#encode_body_if_set ⇒ Object
If the response body exists, encode it.
-
#ensure_content_length ⇒ Object
Ensures that responses have an appropriate Content-Length header.
-
#has_response_body? ⇒ Boolean
Determines if the response has a body/entity set.
-
#set_content_length ⇒ Object
Sets the Content-Length header on the response.
-
#variances ⇒ Object
Computes the entries for the ‘Vary’ response header.
Methods included from QuotedString
#escape_quotes, #quote, #unescape_quotes, #unquote
Instance Method Details
#accept_helper ⇒ Object
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_headers ⇒ Object
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.
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_body ⇒ Object
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_set ⇒ Object
If the response body exists, encode it.
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_length ⇒ Object
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.
15 16 17 |
# File 'lib/webmachine/decision/helpers.rb', line 15 def has_response_body? !response.body.nil? && !response.body.empty? end |
#set_content_length ⇒ Object
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 |
#variances ⇒ Object
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 |