Class: SockJS::Response

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

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

#bodyObject (readonly)

Returns the value of attribute body.



10
11
12
# File 'lib/sockjs/servers/response.rb', line 10

def body
  @body
end

#headersObject (readonly)

Returns the value of attribute headers.



10
11
12
# File 'lib/sockjs/servers/response.rb', line 10

def headers
  @headers
end

#requestObject (readonly)

Returns the value of attribute request.



10
11
12
# File 'lib/sockjs/servers/response.rb', line 10

def request
  @request
end

#statusObject

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

Returns:

  • (Boolean)


87
88
89
# File 'lib/sockjs/servers/response.rb', line 87

def async?
  true
end

#due_for_alive_checkObject

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

Returns:

  • (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_getObject



129
130
131
132
# File 'lib/sockjs/servers/response.rb', line 129

def set_allow_options_get
  self.set_header("Allow", "OPTIONS, GET")
  self.set_header("Access-Control-Allow-Methods", "OPTIONS, GET")
end

#set_allow_options_postObject



124
125
126
127
# File 'lib/sockjs/servers/response.rb', line 124

def set_allow_options_post
  self.set_header("Allow", "OPTIONS, POST")
  self.set_header("Access-Control-Allow-Methods", "OPTIONS, POST")
end

#set_cache_controlObject



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_requestedObject



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_cacheObject



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