From 3a2a5589ee368313f489de8544a473a1373ab8a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6ren=20Jensen?= Date: Sat, 26 Mar 2022 11:13:40 +0100 Subject: [PATCH 1/3] Fix; allow header block larger than --- lib/Client.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/Client.php b/lib/Client.php index 8cefaaa..ee31fa4 100644 --- a/lib/Client.php +++ b/lib/Client.php @@ -177,7 +177,11 @@ function ($key, $value) { $this->write($header); // Get server response header (terminated with double CR+LF). - $response = stream_get_line($this->socket, 1024, "\r\n\r\n"); + $response = ''; + do { + $buffer = stream_get_line($this->socket, 1024, "\r\n\r\n"); + $response .= $buffer; + } while (strlen($buffer) == 1024); // Validate response. if (!preg_match('#Sec-WebSocket-Accept:\s(.*)$#mUi', $response, $matches)) { From 249b22c0ce058984325103b289f0a7ec3e807e31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6ren=20Jensen?= Date: Sat, 26 Mar 2022 11:25:26 +0100 Subject: [PATCH 2/3] CS --- lib/Client.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Client.php b/lib/Client.php index ee31fa4..8db1ad1 100644 --- a/lib/Client.php +++ b/lib/Client.php @@ -179,8 +179,8 @@ function ($key, $value) { // Get server response header (terminated with double CR+LF). $response = ''; do { - $buffer = stream_get_line($this->socket, 1024, "\r\n\r\n"); - $response .= $buffer; + $buffer = stream_get_line($this->socket, 1024, "\r\n\r\n"); + $response .= $buffer; } while (strlen($buffer) == 1024); // Validate response. From 5ae666e63f49f5d2abbdaf09702ab8520a2deedc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6ren?= Date: Mon, 28 Mar 2022 11:22:30 +0200 Subject: [PATCH 3/3] Fixup --- lib/Client.php | 4 ++-- tests/mock/mock-socket.php | 5 +++++ tests/scripts/client.connect-authed.json | 7 +++---- tests/scripts/client.connect-context.json | 7 +++---- tests/scripts/client.connect-extended.json | 7 +++---- tests/scripts/client.connect-headers.json | 16 ++++++++++++---- tests/scripts/client.connect-invalid-key.json | 7 +++---- .../scripts/client.connect-invalid-upgrade.json | 7 +++---- tests/scripts/client.connect-persistent.json | 7 +++---- tests/scripts/client.connect-timeout.json | 7 +++---- tests/scripts/client.connect.json | 7 +++---- tests/scripts/client.reconnect.json | 7 +++---- 12 files changed, 46 insertions(+), 42 deletions(-) diff --git a/lib/Client.php b/lib/Client.php index 8db1ad1..89e7810 100644 --- a/lib/Client.php +++ b/lib/Client.php @@ -179,9 +179,9 @@ function ($key, $value) { // Get server response header (terminated with double CR+LF). $response = ''; do { - $buffer = stream_get_line($this->socket, 1024, "\r\n\r\n"); + $buffer = fgets($this->socket, 1024); $response .= $buffer; - } while (strlen($buffer) == 1024); + } while (substr_count($response, "\r\n\r\n") == 0); // Validate response. if (!preg_match('#Sec-WebSocket-Accept:\s(.*)$#mUi', $response, $matches)) { diff --git a/tests/mock/mock-socket.php b/tests/mock/mock-socket.php index 1d6889a..a038933 100644 --- a/tests/mock/mock-socket.php +++ b/tests/mock/mock-socket.php @@ -56,6 +56,11 @@ function fread() $args = func_get_args(); return MockSocket::handle('fread', $args); } +function fgets() +{ + $args = func_get_args(); + return MockSocket::handle('fgets', $args); +} function stream_context_create() { $args = func_get_args(); diff --git a/tests/scripts/client.connect-authed.json b/tests/scripts/client.connect-authed.json index 6f75b6b..b89ca53 100644 --- a/tests/scripts/client.connect-authed.json +++ b/tests/scripts/client.connect-authed.json @@ -40,14 +40,13 @@ "return": 248 }, { - "function": "stream_get_line", + "function": "fgets", "params": [ "@mock-stream", - 1024, - "\r\n\r\n" + 1024 ], "return-op": "key-respond", - "return": "HTTP\/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: {key}" + "return": "HTTP\/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: {key}\r\n\r\n" }, { "function": "fwrite", diff --git a/tests/scripts/client.connect-context.json b/tests/scripts/client.connect-context.json index 0fcc279..02ad443 100644 --- a/tests/scripts/client.connect-context.json +++ b/tests/scripts/client.connect-context.json @@ -40,14 +40,13 @@ "return": 199 }, { - "function": "stream_get_line", + "function": "fgets", "params": [ "@mock-stream", - 1024, - "\r\n\r\n" + 1024 ], "return-op": "key-respond", - "return": "HTTP\/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: {key}" + "return": "HTTP\/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: {key}\r\n\r\n" }, { "function": "fwrite", diff --git a/tests/scripts/client.connect-extended.json b/tests/scripts/client.connect-extended.json index 4659e3e..7ae225b 100644 --- a/tests/scripts/client.connect-extended.json +++ b/tests/scripts/client.connect-extended.json @@ -40,14 +40,13 @@ "return": 224 }, { - "function": "stream_get_line", + "function": "fgets", "params": [ "@mock-stream", - 1024, - "\r\n\r\n" + 1024 ], "return-op": "key-respond", - "return": "HTTP\/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: {key}" + "return": "HTTP\/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: {key}\r\n\r\n" }, { "function": "fwrite", diff --git a/tests/scripts/client.connect-headers.json b/tests/scripts/client.connect-headers.json index 69808ce..5657c43 100644 --- a/tests/scripts/client.connect-headers.json +++ b/tests/scripts/client.connect-headers.json @@ -40,14 +40,22 @@ "return": 255 }, { - "function": "stream_get_line", + "function": "fgets", "params": [ "@mock-stream", - 1024, - "\r\n\r\n" + 1024 ], "return-op": "key-respond", - "return": "HTTP\/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: {key}" + "return": "HTTP\/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: {key}\r\nX-Very-Long_Header: This is added to provoke split reads of headers in client 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456\r\n" + }, + { + "function": "fgets", + "params": [ + "@mock-stream", + 1024 + ], + "return-op": "key-respond", + "return": "Next234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\r\n\r\n" }, { "function": "fwrite", diff --git a/tests/scripts/client.connect-invalid-key.json b/tests/scripts/client.connect-invalid-key.json index 6472317..4f71a32 100644 --- a/tests/scripts/client.connect-invalid-key.json +++ b/tests/scripts/client.connect-invalid-key.json @@ -39,12 +39,11 @@ "return": 199 }, { - "function": "stream_get_line", + "function": "fgets", "params": [ "@mock-stream", - 1024, - "\r\n\r\n" + 1024 ], - "return": "HTTP\/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: BAD" + "return": "HTTP\/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: BAD\r\n\r\n" } ] \ No newline at end of file diff --git a/tests/scripts/client.connect-invalid-upgrade.json b/tests/scripts/client.connect-invalid-upgrade.json index 28cbc7e..a2b8455 100644 --- a/tests/scripts/client.connect-invalid-upgrade.json +++ b/tests/scripts/client.connect-invalid-upgrade.json @@ -39,12 +39,11 @@ "return": 199 }, { - "function": "stream_get_line", + "function": "fgets", "params": [ "@mock-stream", - 1024, - "\r\n\r\n" + 1024 ], - "return": "Invalid upgrade response" + "return": "Invalid upgrade response\r\n\r\n" } ] \ No newline at end of file diff --git a/tests/scripts/client.connect-persistent.json b/tests/scripts/client.connect-persistent.json index d95af01..61a7af9 100644 --- a/tests/scripts/client.connect-persistent.json +++ b/tests/scripts/client.connect-persistent.json @@ -54,14 +54,13 @@ "return": 248 }, { - "function": "stream_get_line", + "function": "fgets", "params": [ "@mock-stream", - 1024, - "\r\n\r\n" + 1024 ], "return-op": "key-respond", - "return": "HTTP\/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: {key}" + "return": "HTTP\/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: {key}\r\n\r\n" }, { "function": "fwrite", diff --git a/tests/scripts/client.connect-timeout.json b/tests/scripts/client.connect-timeout.json index c1ae6b5..9a2c38a 100644 --- a/tests/scripts/client.connect-timeout.json +++ b/tests/scripts/client.connect-timeout.json @@ -40,14 +40,13 @@ "return": 199 }, { - "function": "stream_get_line", + "function": "fgets", "params": [ "@mock-stream", - 1024, - "\r\n\r\n" + 1024 ], "return-op": "key-respond", - "return": "HTTP\/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: {key}" + "return": "HTTP\/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: {key}\r\n\r\n" }, { "function": "fwrite", diff --git a/tests/scripts/client.connect.json b/tests/scripts/client.connect.json index eb7ecd2..1cfd487 100644 --- a/tests/scripts/client.connect.json +++ b/tests/scripts/client.connect.json @@ -40,14 +40,13 @@ "return": 199 }, { - "function": "stream_get_line", + "function": "fgets", "params": [ "@mock-stream", - 1024, - "\r\n\r\n" + 1024 ], "return-op": "key-respond", - "return": "HTTP\/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: {key}" + "return": "HTTP\/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: {key}\r\n\r\n" }, { "function": "fwrite", diff --git a/tests/scripts/client.reconnect.json b/tests/scripts/client.reconnect.json index 9d505fe..9344d55 100644 --- a/tests/scripts/client.reconnect.json +++ b/tests/scripts/client.reconnect.json @@ -54,14 +54,13 @@ "return": 199 }, { - "function": "stream_get_line", + "function": "fgets", "params": [ "@mock-stream", - 1024, - "\r\n\r\n" + 1024 ], "return-op": "key-respond", - "return": "HTTP\/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: {key}" + "return": "HTTP\/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: {key}\r\n\r\n" }, { "function": "fread",