Class: LibWebSocket::Request
- Defined in:
- lib/libwebsocket/request.rb
Overview
Construct or parse a WebSocket request.
Instance Attribute Summary collapse
-
#cookies ⇒ Object
Returns the value of attribute cookies.
-
#resource_name ⇒ Object
Returns the value of attribute resource_name.
Attributes inherited from Message
#challenge, #checksum, #error, #fields, #host, #origin, #subprotocol, #version
Attributes included from Stateful
Instance Method Summary collapse
-
#connection ⇒ Object
A shortcut for self.field(‘Connection’).
-
#key1 ⇒ Object
Draft 76 Sec-WebSocket-Key1 reader.
-
#key1=(val) ⇒ Object
Draft 76 Sec-WebSocket-Key1 writter.
-
#key2 ⇒ Object
Draft 76 Sec-WebSocket-Key2 reader.
-
#key2=(val) ⇒ Object
Draft 76 Sec-WebSocket-Key2 writter.
-
#number1 ⇒ Object
Draft 76 number 1 reader.
-
#number1=(val) ⇒ Object
Draft 76 number 1 writter.
-
#number2 ⇒ Object
Draft 76 number 2 reader.
-
#number2=(val) ⇒ Object
Draft 76 number 2 writter.
-
#parse(opts) ⇒ Object
Parse a WebSocket request.
-
#parse_rack_env(env) ⇒ Object
Parse a WebSocket request.
-
#to_s ⇒ Object
Construct a WebSocket request.
-
#upgrade ⇒ Object
A shortcut for self.field(‘Upgrade’).
Methods inherited from Message
Methods included from Stateful
Constructor Details
This class inherits a constructor from LibWebSocket::Message
Instance Attribute Details
#cookies ⇒ Object
Returns the value of attribute cookies.
5 6 7 |
# File 'lib/libwebsocket/request.rb', line 5 def @cookies end |
#resource_name ⇒ Object
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
#connection ⇒ Object
A shortcut for self.field(‘Connection’)
70 71 72 |
# File 'lib/libwebsocket/request.rb', line 70 def connection self.field('Connection') end |
#key1 ⇒ Object
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 |
#key2 ⇒ Object
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 |
#number1 ⇒ Object
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 |
#number2 ⇒ Object
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.
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.
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_s ⇒ Object
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 |
#upgrade ⇒ Object
A shortcut for self.field(‘Upgrade’)
66 67 68 |
# File 'lib/libwebsocket/request.rb', line 66 def upgrade self.field('Upgrade') end |