Class: SockJS::Endpoint

Inherits:
Object
  • Object
show all
Extended by:
ClassMethods
Defined in:
lib/sockjs/transport.rb

Overview

If I had it to do over again, Endpoint wouldn’t have subclasses - we’d subclass Response and instances of Endpoint would know what kind of Response to create for their mount point

Defined Under Namespace

Modules: ClassMethods Classes: MethodMap, MethodNotSupportedApp

Instance Attribute Summary collapse

Attributes included from ClassMethods

#method, #prefix

Instance Method Summary collapse

Methods included from ClassMethods

add_route, add_routes, endpoints, register, route_conditions, routing_prefix

Constructor Details

#initialize(connection, options) ⇒ Endpoint

Returns a new instance of Endpoint.



105
106
107
108
109
# File 'lib/sockjs/transport.rb', line 105

def initialize(connection, options)
  @connection, @options = connection, options
  options[:websocket] = true unless options.has_key?(:websocket)
  options[:cookie_needed] = true unless options.has_key?(:cookie_needed)
end

Instance Attribute Details

#connectionObject (readonly)

Instance methods.



104
105
106
# File 'lib/sockjs/transport.rb', line 104

def connection
  @connection
end

#optionsObject (readonly)

Instance methods.



104
105
106
# File 'lib/sockjs/transport.rb', line 104

def options
  @options
end

Instance Method Details

#build_error_response(request) ⇒ Object



182
183
184
# File 'lib/sockjs/transport.rb', line 182

def build_error_response(request)
  build_response(request)
end

#build_response(request) ⇒ Object



176
177
178
179
180
# File 'lib/sockjs/transport.rb', line 176

def build_response(request)
  response = response_class.new(request)
  setup_response(request, response)
  return response
end

#call(env) ⇒ Object



130
131
132
133
134
135
136
137
# File 'lib/sockjs/transport.rb', line 130

def call(env)
  SockJS.debug "Request for #{self.class}: #{env["REQUEST_METHOD"]}/#{env["PATH_INFO"]}"
  request = ::SockJS::Request.new(env)
  EM.next_tick do
    handle(request)
  end
  return Thin::Connection::AsyncResponse
end

#empty_stringObject

Used for pings.



120
121
122
# File 'lib/sockjs/transport.rb', line 120

def empty_string
  "\n"
end

#error_content_typeObject



162
163
164
# File 'lib/sockjs/transport.rb', line 162

def error_content_type
  :plain
end

#format_frame(session, payload) ⇒ Object

Raises:

  • (TypeError)


124
125
126
127
128
# File 'lib/sockjs/transport.rb', line 124

def format_frame(session, payload)
  raise TypeError.new("Payload must not be nil!") if payload.nil?

  "#{payload}\n"
end

#handle(request) ⇒ Object



139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# File 'lib/sockjs/transport.rb', line 139

def handle(request)
  handle_request(request)
rescue SockJS::HttpError => error
  SockJS.debug "HttpError while handling request: #{([error.inspect] + error.backtrace).join("\n")}"
  handle_http_error(request, error)
rescue Object => error
  SockJS.debug "Error while handling request: #{([error.inspect] + error.backtrace).join("\n")}"
  begin
    response = response_class.new(request, 500)
    response.write(error.message)
    response.finish
    return response
  rescue Object => ex
    SockJS.debug "Error while trying to send error HTTP response: #{ex.inspect}"
  end
end

#handle_http_error(request, error) ⇒ Object



166
167
168
169
170
171
172
173
174
# File 'lib/sockjs/transport.rb', line 166

def handle_http_error(request, error)
  response = build_error_response(request)
  response.status = error.status

  response.set_content_type(error_content_type)
  SockJS::debug "Built error response: #{response.inspect}"
  response.write(error.message)
  response
end

#handle_request(request) ⇒ Object



156
157
158
159
160
# File 'lib/sockjs/transport.rb', line 156

def handle_request(request)
  response = build_response(request)
  response.finish
  return response
end

#inspectObject



111
112
113
# File 'lib/sockjs/transport.rb', line 111

def inspect
  "<<#{self.class.name} #{options.inspect}>>"
end

#response_classObject



115
116
117
# File 'lib/sockjs/transport.rb', line 115

def response_class
  SockJS::Response
end

#setup_response(request, response) ⇒ Object



186
187
188
# File 'lib/sockjs/transport.rb', line 186

def setup_response(request, response)
  response.status = 200
end