Class: SockJS::Response
- Inherits:
-
Object
- Object
- SockJS::Response
- Extended by:
- Forwardable
- Defined in:
- lib/sockjs/servers/response.rb
Overview
Adapter for Thin Rack responses. It’s a TODO feature to support other webservers and compatibility layers
Instance Attribute Summary collapse
-
#body ⇒ Object
readonly
Returns the value of attribute body.
-
#headers ⇒ Object
readonly
Returns the value of attribute headers.
-
#request ⇒ Object
readonly
Returns the value of attribute request.
-
#status ⇒ Object
Returns the value of attribute status.
Instance Method Summary collapse
- #async? ⇒ Boolean
-
#due_for_alive_check ⇒ Object
Time.now.to_i shows time in seconds.
- #finish(data = nil, &block) ⇒ Object
- #head_written? ⇒ Boolean
-
#initialize(request, status = nil, headers = nil, &block) ⇒ Response
constructor
A new instance of Response.
- #session=(session) ⇒ Object
-
#set_access_control(origin) ⇒ Object
Helpers === #.
- #set_allow_options_get ⇒ Object
- #set_allow_options_post ⇒ Object
- #set_cache_control ⇒ Object
- #set_connection_keep_alive_if_requested ⇒ Object
- #set_content_length(body) ⇒ Object
- #set_content_type(symbol) ⇒ Object
- #set_header(key, value) ⇒ Object
- #set_no_cache ⇒ Object
- #set_session_id(session_id) ⇒ Object
- #set_status(status) ⇒ Object
- #turn_chunking_on(headers) ⇒ Object
- #write(data) ⇒ Object
- #write_head(status = nil, headers = nil) ⇒ Object
Constructor Details
#initialize(request, status = nil, headers = nil, &block) ⇒ Response
Returns a new instance of Response.
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# File 'lib/sockjs/servers/response.rb', line 13 def initialize(request, status = nil, headers = nil, &block) # request.env["async.close"] # ["rack.input"].closed? # it's a stream @request, @status, @headers = request, status, headers || {} if request.http_1_0? SockJS.debug "Request is in HTTP/1.0, responding with HTTP/1.0" @body = DelayedResponseBody.new else @body = DelayedResponseChunkedBody.new end @body.callback do @request.succeed end @body.errback do @request.fail end block.call(self) if block set_connection_keep_alive_if_requested end |
Instance Attribute Details
#body ⇒ Object (readonly)
Returns the value of attribute body.
10 11 12 |
# File 'lib/sockjs/servers/response.rb', line 10 def body @body end |
#headers ⇒ Object (readonly)
Returns the value of attribute headers.
10 11 12 |
# File 'lib/sockjs/servers/response.rb', line 10 def headers @headers end |
#request ⇒ Object (readonly)
Returns the value of attribute request.
10 11 12 |
# File 'lib/sockjs/servers/response.rb', line 10 def request @request end |
#status ⇒ Object
Returns the value of attribute status.
10 11 12 |
# File 'lib/sockjs/servers/response.rb', line 10 def status @status end |
Instance Method Details
#async? ⇒ Boolean
87 88 89 |
# File 'lib/sockjs/servers/response.rb', line 87 def async? true end |
#due_for_alive_check ⇒ Object
Time.now.to_i shows time in seconds.
92 93 94 |
# File 'lib/sockjs/servers/response.rb', line 92 def due_for_alive_check Time.now.to_i != @last_written_at end |
#finish(data = nil, &block) ⇒ Object
77 78 79 80 81 82 83 84 85 |
# File 'lib/sockjs/servers/response.rb', line 77 def finish(data = nil, &block) if data self.write(data) else self.write_head unless self.head_written? end @body.finish end |
#head_written? ⇒ Boolean
65 66 67 |
# File 'lib/sockjs/servers/response.rb', line 65 def head_written? !! @head_written end |
#session=(session) ⇒ Object
38 39 40 |
# File 'lib/sockjs/servers/response.rb', line 38 def session=(session) @body.session = session end |
#set_access_control(origin) ⇒ Object
Helpers === #
109 110 111 112 113 |
# File 'lib/sockjs/servers/response.rb', line 109 def set_access_control(origin) self.set_header("Access-Control-Allow-Origin", origin) self.set_header("Access-Control-Allow-Credentials", "true") self.set_header("Access-Control-Allow-Headers", "Content-Type Origin Accept X-Requested-With X-CSRF-Token If-Modified-Since If-None-Match Auth-User-Token Authorization Connection Cookie User-Agent") end |
#set_allow_options_get ⇒ Object
129 130 131 132 |
# File 'lib/sockjs/servers/response.rb', line 129 def self.set_header("Allow", "OPTIONS, GET") self.set_header("Access-Control-Allow-Methods", "OPTIONS, GET") end |
#set_allow_options_post ⇒ Object
124 125 126 127 |
# File 'lib/sockjs/servers/response.rb', line 124 def self.set_header("Allow", "OPTIONS, POST") self.set_header("Access-Control-Allow-Methods", "OPTIONS, POST") end |
#set_cache_control ⇒ Object
115 116 117 118 119 120 121 122 |
# File 'lib/sockjs/servers/response.rb', line 115 def set_cache_control year = 31536000 time = Time.now + year self.set_header("Cache-Control", "public, max-age=#{year}") self.set_header("Expires", time.gmtime.to_s) self.set_header("Access-Control-Max-Age", "1000001") end |
#set_connection_keep_alive_if_requested ⇒ Object
160 161 162 163 164 165 166 167 168 |
# File 'lib/sockjs/servers/response.rb', line 160 def set_connection_keep_alive_if_requested if @request.env["HTTP_CONNECTION"] && @request.env["HTTP_CONNECTION"].downcase == "keep-alive" if @request.http_1_0? self.set_header("Connection", "Close") else self.set_header("Connection", "Keep-Alive") end end end |
#set_content_length(body) ⇒ Object
146 147 148 149 150 |
# File 'lib/sockjs/servers/response.rb', line 146 def set_content_length(body) if body && body.respond_to?(:bytesize) self.headers["Content-Length"] = body.bytesize.to_s end end |
#set_content_type(symbol) ⇒ Object
152 153 154 155 156 157 158 |
# File 'lib/sockjs/servers/response.rb', line 152 def set_content_type(symbol) if string = CONTENT_TYPES[symbol] self.set_header("Content-Type", string) else raise "No such content type: #{symbol}" end end |
#set_header(key, value) ⇒ Object
100 101 102 |
# File 'lib/sockjs/servers/response.rb', line 100 def set_header(key, value) @headers[key] = value end |
#set_no_cache ⇒ Object
134 135 136 |
# File 'lib/sockjs/servers/response.rb', line 134 def set_no_cache self.set_header("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0") end |
#set_session_id(session_id) ⇒ Object
104 105 106 |
# File 'lib/sockjs/servers/response.rb', line 104 def set_session_id(session_id) self.headers["Set-Cookie"] = "JSESSIONID=#{session_id}; path=/" end |
#set_status(status) ⇒ Object
96 97 98 |
# File 'lib/sockjs/servers/response.rb', line 96 def set_status(status) @status = status end |
#turn_chunking_on(headers) ⇒ Object
42 43 44 |
# File 'lib/sockjs/servers/response.rb', line 42 def turn_chunking_on(headers) headers["Transfer-Encoding"] = "chunked" end |
#write(data) ⇒ Object
69 70 71 72 73 74 75 |
# File 'lib/sockjs/servers/response.rb', line 69 def write(data) self.write_head unless self.head_written? @last_written_at = Time.now.to_i @body.write(data) end |
#write_head(status = nil, headers = nil) ⇒ Object
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/sockjs/servers/response.rb', line 47 def write_head(status = nil, headers = nil) @status = status || @status || raise("Please set the status!") @headers = headers || @headers if @headers["Content-Length"] raise "You can't use Content-Length with chunking!" end unless @request.http_1_0? || @status == 204 turn_chunking_on(@headers) end SockJS.debug "Writing headers: #{@status.inspect}/#{@headers.inspect}" @request.async_callback.call([@status, @headers, @body]) @head_written = true end |