Class: LibWebSocket::Request

Inherits:
Message
  • Object
show all
Defined in:
lib/libwebsocket/request.rb

Overview

Construct or parse a WebSocket request.

Instance Attribute Summary collapse

Attributes inherited from Message

#challenge, #checksum, #error, #fields, #host, #origin, #subprotocol, #version

Attributes included from Stateful

#state

Instance Method Summary collapse

Methods inherited from Message

#field, #initialize

Methods included from Stateful

#done, #done?, #state?

Constructor Details

This class inherits a constructor from LibWebSocket::Message

Instance Attribute Details

#cookiesObject

Returns the value of attribute cookies.



5
6
7
# File 'lib/libwebsocket/request.rb', line 5

def cookies
  @cookies
end

#resource_nameObject

Returns the value of attribute resource_name.



5
6
7
# File 'lib/libwebsocket/request.rb', line 5

def resource_name
  @resource_name
end

Instance Method Details

#connectionObject

A shortcut for self.field(‘Connection’)



70
71
72
# File 'lib/libwebsocket/request.rb', line 70

def connection
  self.field('Connection')
end

#key1Object

Draft 76 Sec-WebSocket-Key1 reader



91
92
93
# File 'lib/libwebsocket/request.rb', line 91

def key1
  self.key('key1')
end

#key1=(val) ⇒ Object

Draft 76 Sec-WebSocket-Key1 writter



95
96
97
# File 'lib/libwebsocket/request.rb', line 95

def key1=(val)
  self.key('key1',val)
end

#key2Object

Draft 76 Sec-WebSocket-Key2 reader



99
100
101
# File 'lib/libwebsocket/request.rb', line 99

def key2
  self.key('key2')
end

#key2=(val) ⇒ Object

Draft 76 Sec-WebSocket-Key2 writter



103
104
105
# File 'lib/libwebsocket/request.rb', line 103

def key2=(val)
  self.key('key2',val)
end

#number1Object

Draft 76 number 1 reader



75
76
77
# File 'lib/libwebsocket/request.rb', line 75

def number1
  self.number('number1','key1')
end

#number1=(val) ⇒ Object

Draft 76 number 1 writter



79
80
81
# File 'lib/libwebsocket/request.rb', line 79

def number1=(val)
  self.number('number1','key1',val)
end

#number2Object

Draft 76 number 2 reader



83
84
85
# File 'lib/libwebsocket/request.rb', line 83

def number2
  self.number('number2','key2')
end

#number2=(val) ⇒ Object

Draft 76 number 2 writter



87
88
89
# File 'lib/libwebsocket/request.rb', line 87

def number2=(val)
  self.number('number2','key2',val)
end

#parse(opts) ⇒ Object

Parse a WebSocket request.

Examples:

Parser

req = LibWebSocket::Request.new
req.parse("GET /demo HTTP/1.1\x0d\x0a")
req.parse("Upgrade: WebSocket\x0d\x0a")
req.parse("Connection: Upgrade\x0d\x0a")
req.parse("Host: example.com\x0d\x0a")
req.parse("Origin: http://example.com\x0d\x0a")
req.parse("Sec-WebSocket-Key1: 18x 6]8vM;54 *(5:  {   U1]8  z [  8\x0d\x0a")
req.parse("Sec-WebSocket-Key2: 1_ tx7X d  <  nw  334J702) 7]o}` 0\x0d\x0a")
req.parse("\x0d\x0aTm[K T2u")

Parameters:

  • opts (String)

    parse string

  • opts (Hash)

    parse rack env hash

See Also:



21
22
23
24
25
26
# File 'lib/libwebsocket/request.rb', line 21

def parse(opts)
  case opts
  when String then super
  when Hash then parse_rack_env(opts)
  end
end

#parse_rack_env(env) ⇒ Object

Parse a WebSocket request.

Examples:

Parser

req = LibWebSocket::Request.new
req.parse(env)

Parameters:

  • env (Hash)

    parse rack env hash



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/libwebsocket/request.rb', line 33

def parse_rack_env(env)
  method = env['REQUEST_METHOD']
  unless method == 'GET'
    self.error = 'Wrong request method'
    return false
  end

  self.resource_name = env['REQUEST_URI']

  env.keys.select { |v| v =~ /\AHTTP\_/ }.each do |key|
    self.field(key.gsub(/\AHTTP\_/, "").gsub('_','-'), env[key])
  end

  body = env['rack.input']
  # Is compatible with rack.input spec?
  unless body.respond_to?(:rewind) and body.respond_to?(:read)
    self.error = "Invalid rack input"
    return false
  end

  body.rewind
  @buffer = body.read

  rv = self.parse_body
  return unless rv

  # Need more data
  return rv unless rv != true

  return self.done
end

#to_sObject

Construct a WebSocket request.

# Constructor
my $req = Protocol::WebSocket::Request.new(
    host          => 'example.com',
    resource_name => '/demo'
);
$req.to_s # GET /demo HTTP/1.1
          # Upgrade: WebSocket
          # Connection: Upgrade
          # Host: example.com
          # Origin: http://example.com
          # Sec-WebSocket-Key1: 32 0  3lD& 24+<    i u4  8! -6/4
          # Sec-WebSocket-Key2: 2q 4  2  54 09064
          #
          # x#####


122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/libwebsocket/request.rb', line 122

def to_s
  string = ''

  raise 'resource_name is required' unless self.resource_name
  string += "GET " + self.resource_name + " HTTP/1.1\x0d\x0a"

  string += "Upgrade: WebSocket\x0d\x0a"
  string += "Connection: Upgrade\x0d\x0a"

  raise 'Host is required' unless self.host
  string += "Host: " + self.host + "\x0d\x0a"

  origin = self.origin || 'http://' + self.host
  string += "Origin: " + origin + "\x0d\x0a"

  if self.version > 75
    self.generate_keys

    string += 'Sec-WebSocket-Protocol: ' + self.subprotocol + "\x0d\x0a" if self.subprotocol

    string += 'Sec-WebSocket-Key1: ' + self.key1 + "\x0d\x0a"
    string += 'Sec-WebSocket-Key2: ' + self.key2 + "\x0d\x0a"

    string += 'Content-Length: ' + self.challenge.length.to_s + "\x0d\x0a"
  else
    string += 'WebSocket-Protocol: ' + self.subprotocol + "\x0d\x0a" if self.subprotocol
  end

  # TODO cookies

  string += "\x0d\x0a"

  string += self.challenge if self.version > 75

  return string
end

#upgradeObject

A shortcut for self.field(‘Upgrade’)



66
67
68
# File 'lib/libwebsocket/request.rb', line 66

def upgrade
  self.field('Upgrade')
end