Skip to content
This repository was archived by the owner on Aug 25, 2022. It is now read-only.

Commit e08dfbf

Browse files
authored
Merge pull request #145 from neanton/feature-sticky-sessions
Cookie-based sticky sessions support for handshake and upgrade transport
2 parents ceb607d + 7db4f71 commit e08dfbf

File tree

3 files changed

+35
-2
lines changed

3 files changed

+35
-2
lines changed

‎src/Engine/AbstractSocketIO.php‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ abstract class AbstractSocketIO implements EngineInterface
3434
/** @var string[] Parse url result */
3535
protected $url;
3636

37+
/** @var array cookies received during handshake */
38+
protected $cookies = [];
39+
3740
/** @var string[] Session information */
3841
protected $session;
3942

‎src/Engine/SocketIO/Version0X.php‎

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ public function close()
8787
fclose($this->stream);
8888
$this->stream = null;
8989
$this->session = null;
90+
$this->cookies = [];
9091
}
9192

9293
/** {@inheritDoc} */
@@ -176,6 +177,14 @@ protected function handshake()
176177
throw new UnsupportedTransportException('websocket');
177178
}
178179

180+
$cookies = [];
181+
foreach ($http_response_header as $header) {
182+
if (preg_match('/^Set-Cookie:\s*([^;]*)/i', $header, $matches)) {
183+
$cookies[] = $matches[1];
184+
}
185+
}
186+
$this->cookies = $cookies;
187+
179188
$this->session = new Session($decoded['sid'], $decoded['pingInterval'], $decoded['pingTimeout'], $decoded['upgrades']);
180189
}
181190

@@ -211,7 +220,13 @@ private function upgradeTransport()
211220
. "Connection: Upgrade\r\n"
212221
. "Sec-WebSocket-Key: {$key}\r\n"
213222
. "Sec-WebSocket-Version: 13\r\n"
214-
. "Origin: {$origin}\r\n\r\n";
223+
. "Origin: {$origin}\r\n";
224+
225+
if (!empty($this->cookies)) {
226+
$request .= "Cookie: " . implode('; ', $this->cookies) . "\r\n";
227+
}
228+
229+
$request .= "\r\n";
215230

216231
fwrite($this->stream, $request);
217232
$result = fread($this->stream, 12);

‎src/Engine/SocketIO/Version1X.php‎

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ public function close()
7777
fclose($this->stream);
7878
$this->stream = null;
7979
$this->session = null;
80+
$this->cookies = [];
8081
}
8182

8283
/** {@inheritDoc} */
@@ -172,6 +173,14 @@ protected function handshake()
172173
throw new UnsupportedTransportException('websocket');
173174
}
174175

176+
$cookies = [];
177+
foreach ($http_response_header as $header) {
178+
if (preg_match('/^Set-Cookie:\s*([^;]*)/i', $header, $matches)) {
179+
$cookies[] = $matches[1];
180+
}
181+
}
182+
$this->cookies = $cookies;
183+
175184
$this->session = new Session($decoded['sid'], $decoded['pingInterval'], $decoded['pingTimeout'], $decoded['upgrades']);
176185
}
177186

@@ -204,7 +213,13 @@ private function upgradeTransport()
204213
. "Connection: Upgrade\r\n"
205214
. "Sec-WebSocket-Key: {$key}\r\n"
206215
. "Sec-WebSocket-Version: 13\r\n"
207-
. "Origin: {$origin}\r\n\r\n";
216+
. "Origin: {$origin}\r\n";
217+
218+
if (!empty($this->cookies)) {
219+
$request .= "Cookie: " . implode('; ', $this->cookies) . "\r\n";
220+
}
221+
222+
$request .= "\r\n";
208223

209224
fwrite($this->stream, $request);
210225
$result = fread($this->stream, 12);

0 commit comments

Comments
 (0)