Skip to content

Commit b911f38

Browse files
committed
Fix hooked stream socket shutdown results
Translate the coroutine socket's boolean shutdown result into PHP's transport return convention so successful shutdowns report true and failed repeats report false. Add a loopback regression that verifies the write-half return values alongside payload delivery and peer EOF, with strict diagnostic reporting enabled.
1 parent 0407dd0 commit b911f38

2 files changed

Lines changed: 59 additions & 1 deletion

File tree

ext-src/swoole_runtime.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1057,7 +1057,7 @@ static inline int socket_xport_api(php_stream *stream, SocketImpl *sock, php_str
10571057
}
10581058
break;
10591059
case STREAM_XPORT_OP_SHUTDOWN:
1060-
xparam->outputs.returncode = sock->shutdown(shutdown_how[xparam->how]);
1060+
xparam->outputs.returncode = sock->shutdown(shutdown_how[xparam->how]) ? 0 : -1;
10611061
break;
10621062
default:
10631063
#ifdef SW_DEBUG
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
--TEST--
2+
swoole_runtime: stream_socket_shutdown return values
3+
--SKIPIF--
4+
<?php
5+
require __DIR__ . '/../include/skipif.inc';
6+
?>
7+
--INI--
8+
error_reporting=E_ALL
9+
display_errors=1
10+
--FILE--
11+
<?php
12+
require __DIR__ . '/../include/bootstrap.php';
13+
14+
$server = null;
15+
$sender = null;
16+
$receiver = null;
17+
18+
Co\run(function () use (&$server, &$sender, &$receiver): void {
19+
try {
20+
$server = stream_socket_server('tcp://127.0.0.1:0');
21+
22+
if ($server === false) {
23+
throw new RuntimeException('Failed to create the loopback server.');
24+
}
25+
26+
$address = stream_socket_get_name($server, false);
27+
28+
if (!is_string($address)) {
29+
throw new RuntimeException('Failed to resolve the loopback server address.');
30+
}
31+
32+
$sender = stream_socket_client("tcp://{$address}");
33+
$receiver = stream_socket_accept($server, 1);
34+
35+
if ($sender === false || $receiver === false) {
36+
throw new RuntimeException('Failed to create the loopback connection.');
37+
}
38+
39+
fwrite($sender, 'payload');
40+
41+
var_dump(stream_socket_shutdown($sender, STREAM_SHUT_WR));
42+
var_dump(stream_get_contents($receiver));
43+
var_dump(feof($receiver));
44+
var_dump(stream_socket_shutdown($sender, STREAM_SHUT_WR));
45+
} finally {
46+
foreach ([$sender, $receiver, $server] as $stream) {
47+
if (is_resource($stream)) {
48+
fclose($stream);
49+
}
50+
}
51+
}
52+
});
53+
?>
54+
--EXPECT--
55+
bool(true)
56+
string(7) "payload"
57+
bool(true)
58+
bool(false)

0 commit comments

Comments
 (0)