From: Arnaud Le Blanc Date: Tue, 4 Nov 2008 17:05:17 +0000 (+0000) Subject: Fixed stream_get_line() to behave as documented on non-blocking streams X-Git-Tag: BEFORE_HEAD_NS_CHANGE~90 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2e32876eaadde2f96294d62f7905b03043fa729c;p=php Fixed stream_get_line() to behave as documented on non-blocking streams --- diff --git a/ext/standard/tests/streams/stream_get_line_nb.phpt b/ext/standard/tests/streams/stream_get_line_nb.phpt new file mode 100644 index 0000000000..3e3848f54a --- /dev/null +++ b/ext/standard/tests/streams/stream_get_line_nb.phpt @@ -0,0 +1,66 @@ +--TEST-- +stream_get_line() on non-blocking stream +--SKIPIF-- + +--FILE-- +'; + +fwrite($sockets[0], b"line start"); +var_dump(stream_get_line($sockets[1], 8192, $eol)); // Does not returns incomplete line (EOL not found) +var_dump(stream_get_line($sockets[1], 8192, $eol)); +fwrite($sockets[0], b", line end"); +fwrite($sockets[0], b", $eol"); +var_dump(stream_get_line($sockets[1], 8192, $eol)); // Returns full line (EOL found) +var_dump(stream_get_line($sockets[1], 8192, $eol)); // Nothing to read +var_dump(stream_get_line($sockets[1], 8192, $eol)); + +fwrite($sockets[0], b"incomplete line"); +var_dump(stream_get_line($sockets[1], strlen(b"incomplete line"), $eol)); // EOL not found but $length has been read, return incomplete line + +fwrite($sockets[0], b"incomplete line"); +var_dump(stream_get_line($sockets[1], 8192, $eol)); // Does not returns incomplete line (EOL not found) +var_dump(fread($sockets[1], strlen(b"incomplete line"))); // Returns buffer readden by stream_get_line + +fwrite($sockets[0], b"end of file"); +var_dump(stream_get_line($sockets[1], 8192, $eol)); // Does not returns incomplete line (EOL not found) + +fclose($sockets[0]); +var_dump(stream_get_line($sockets[1], 8192, $eol)); // Returns incomplete line (End of file) + +fclose($sockets[1]); + +?> +--EXPECTF-- +array(2) { + [0]=> + resource(%d) of type (stream) + [1]=> + resource(%d) of type (stream) +} +bool(false) +bool(false) +string(22) "line start, line end, " +bool(false) +bool(false) +string(15) "incomplete line" +bool(false) +string(15) "incomplete line" +bool(false) +string(11) "end of file" diff --git a/main/streams/streams.c b/main/streams/streams.c index 15b3994788..6f9a4eef1b 100755 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -1136,6 +1136,9 @@ PHPAPI char *php_stream_get_record(php_stream *stream, size_t maxlen, size_t *re } if (!e) { + if (seek_len < maxlen && !stream->eof) { + return NULL; + } toread = maxlen; } else { toread = e - stream->readbuf.s - stream->readpos;