Class: SockJS::Request

Inherits:
Object
  • Object
show all
Defined in:
lib/sockjs/servers/request.rb

Overview

This is the SockJS wrapper for a Rack env hash-like. Currently it requires that we’re running under Thin - someday we may break this out such that can adapt to other webservers or compatiblity layers. For now: do your SockJS stuff in Thin.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(env) ⇒ Request

Returns a new instance of Request.



13
14
15
# File 'lib/sockjs/servers/request.rb', line 13

def initialize(env)
  @env = env
end

Instance Attribute Details

#envObject (readonly)

Returns the value of attribute env.



12
13
14
# File 'lib/sockjs/servers/request.rb', line 12

def env
  @env
end

Instance Method Details

#async_callbackObject



29
30
31
# File 'lib/sockjs/servers/request.rb', line 29

def async_callback
  env["async.callback"]
end

#async_closeObject



33
34
35
# File 'lib/sockjs/servers/request.rb', line 33

def async_close
  env["async.close"]
end

#callbackObject



119
120
121
122
# File 'lib/sockjs/servers/request.rb', line 119

def callback
  callback = self.query_string["callback"] || self.query_string["c"]
  URI.unescape(callback) if callback
end

#content_typeObject



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

def content_type
  self.headers["content-type"]
end

#cookiesObject

request.cookies

> “123sd”



91
92
93
94
95
96
# File 'lib/sockjs/servers/request.rb', line 91

def cookies
  @cookies ||=
    begin
      ::Rack::Request.new(@env).cookies
    end
end

#dataObject

request.data.read

> “message”



101
102
103
# File 'lib/sockjs/servers/request.rb', line 101

def data
  @env["rack.input"]
end

#failObject



46
47
48
# File 'lib/sockjs/servers/request.rb', line 46

def fail
  async_close.fail
end

#fresh?(etag) ⇒ Boolean

Returns:

  • (Boolean)


132
133
134
# File 'lib/sockjs/servers/request.rb', line 132

def fresh?(etag)
  self.headers["if-none-match"] == etag
end

#headersObject



62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/sockjs/servers/request.rb', line 62

def headers
  @headers ||=
    begin
      permitted_keys = /^(CONTENT_(LENGTH|TYPE))$/

      @env.reduce(Hash.new) do |headers, (key, value)|
        if key.match(/^HTTP_(.+)$/) || key.match(permitted_keys)
          headers[$1.downcase.tr("_", "-")] = value
        end

        headers
      end
    end
end

#http_1_0?Boolean

Returns:

  • (Boolean)


107
108
109
# File 'lib/sockjs/servers/request.rb', line 107

def http_1_0?
  self.headers[HTTP_VERSION] == HTTP_1_0
end

#http_methodObject

request.http_method

> “GET”



25
26
27
# File 'lib/sockjs/servers/request.rb', line 25

def http_method
  env["REQUEST_METHOD"]
end

#inspectObject

Somehow, default inspect pulls in the whole app…



51
52
53
54
55
56
57
58
# File 'lib/sockjs/servers/request.rb', line 51

def inspect
  position = data.pos
  data.rewind
  body = data.read
  "<<#{self.class.name}: #{http_method}/#{path_info} #{body.inspect}>>"
ensure
  data.pos = position
end

#keep_alive?Boolean

Returns:

  • (Boolean)


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

def keep_alive?
  headers["connection"].downcase == "keep-alive"
end

#on_close(&block) ⇒ Object



37
38
39
40
# File 'lib/sockjs/servers/request.rb', line 37

def on_close(&block)
  async_close.callback( &block)
  async_close.errback(  &block)
end

#originObject



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

def origin
  self.headers["origin"] || "*"
end

#path_infoObject

request.path_info

> /echo/abc



19
20
21
# File 'lib/sockjs/servers/request.rb', line 19

def path_info
  env["PATH_INFO"]
end

#query_stringObject

request.query_string

> “myFn”



79
80
81
82
83
84
85
86
# File 'lib/sockjs/servers/request.rb', line 79

def query_string
  @query_string ||=
    begin
      @env["QUERY_STRING"].split("=").each_slice(2).each_with_object({}) do |pair, buffer|
        buffer[pair.first] = pair.last
      end
    end
end

#session_idObject



128
129
130
# File 'lib/sockjs/servers/request.rb', line 128

def session_id
  self.cookies["JSESSIONID"] || "dummy"
end

#succeedObject



42
43
44
# File 'lib/sockjs/servers/request.rb', line 42

def succeed
  async_close.succeed
end