summaryrefslogtreecommitdiffstats
path: root/source/n/php/CVE-2023-0662.patch
diff options
context:
space:
mode:
author Patrick J Volkerding <volkerdi@slackware.com>2023-03-08 20:26:54 +0000
committer Eric Hameleers <alien@slackware.com>2023-03-08 22:40:50 +0100
commita24031248459c107553c13f30fd4bd94a44758e1 (patch)
tree50bd7142faec4cea4f3389d1bc2ef1003801345e /source/n/php/CVE-2023-0662.patch
parent95095a0e2499322212eec0e9ac228095540ede4b (diff)
downloadcurrent-a24031248459c107553c13f30fd4bd94a44758e1.tar.gz
current-a24031248459c107553c13f30fd4bd94a44758e1.tar.xz
Wed Mar 8 20:26:54 UTC 202320230308202654
Hey folks, just some more updates on the road to an eventual beta. :-) At this point nothing remains linked with openssl-1.1.1 except for python2 and modules, and vsftpd. I think nobody cares about trying to force python2 to use openssl3... it's EOL but still a zombie, unfortunately. I have seen some patches for vsftpd and intend to take a look at them. We've bumped PHP to 8.2 and just gone ahead and killed 8.0 and 8.1. Like 7.4, 8.0 is not compatible with openssl3 and it doesn't seem worthwhile to try to patch it. And with 8.2 already out for several revisions, 8.1 does not seem particularly valuable. If you make use of PHP you should be used to it being a moving target by now. Enjoy, and let me know if anything isn't working right. Cheers! a/aaa_libraries-15.1-x86_64-19.txz: Rebuilt. Recompiled against openssl-3.0.8: libcups.so.2, libcurl.so.4.8.0, libldap.so.2.0.200, libssh2.so.1.0.1. a/cryptsetup-2.6.1-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. a/kmod-30-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. a/openssl-solibs-3.0.8-x86_64-1.txz: Upgraded. Shared library .so-version bump. a/openssl11-solibs-1.1.1t-x86_64-1.txz: Added. ap/cups-2.4.2-x86_64-4.txz: Rebuilt. Recompiled against openssl-3.0.8. ap/hplip-3.20.5-x86_64-7.txz: Rebuilt. Recompiled against openssl-3.0.8. ap/lxc-4.0.12-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. ap/mariadb-10.6.12-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. ap/qpdf-11.3.0-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. ap/sudo-1.9.13p3-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. d/cargo-vendor-filterer-0.5.7-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. d/cvs-1.11.23-x86_64-9.txz: Rebuilt. Recompiled against openssl-3.0.8. d/git-2.39.2-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. d/perl-5.36.0-x86_64-5.txz: Rebuilt. Recompiled against openssl-3.0.8. d/python3-3.9.16-x86_64-3.txz: Rebuilt. Recompiled against openssl-3.0.8. d/ruby-3.2.1-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. d/rust-1.66.1-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. d/scons-4.5.1-x86_64-1.txz: Upgraded. kde/falkon-22.12.3-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. kde/kitinerary-22.12.3-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. l/M2Crypto-0.38.0-x86_64-4.txz: Rebuilt. Recompiled against openssl-3.0.8. l/SDL2-2.26.4-x86_64-1.txz: Upgraded. l/gst-plugins-bad-free-1.22.1-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. l/libarchive-3.6.2-x86_64-3.txz: Rebuilt. Recompiled against openssl-3.0.8. l/libevent-2.1.12-x86_64-4.txz: Rebuilt. Recompiled against openssl-3.0.8. l/libimobiledevice-20211124_2c6121d-x86_64-3.txz: Rebuilt. Recompiled against openssl-3.0.8. l/libssh2-1.10.0-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. l/libvncserver-0.9.14-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. l/mlt-7.14.0-x86_64-1.txz: Upgraded. l/neon-0.32.5-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. l/nodejs-19.7.0-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. l/opusfile-0.12-x86_64-4.txz: Rebuilt. Recompiled against openssl-3.0.8. l/pipewire-0.3.66-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. l/pulseaudio-16.1-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. l/pycurl-7.44.1-x86_64-4.txz: Rebuilt. Recompiled against openssl-3.0.8. l/qca-2.3.5-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. l/qt5-5.15.8_20230304_d8b881f0-x86_64-1.txz: Upgraded. Compiled against openssl-3.0.8. l/serf-1.3.9-x86_64-8.txz: Rebuilt. Recompiled against openssl-3.0.8. n/alpine-2.26-x86_64-3.txz: Rebuilt. Recompiled against openssl-3.0.8. n/bind-9.18.12-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. n/curl-7.88.1-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. n/cyrus-sasl-2.1.28-x86_64-3.txz: Rebuilt. Recompiled against openssl-3.0.8. n/dovecot-2.3.20-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. n/epic5-2.1.12-x86_64-4.txz: Rebuilt. Recompiled against openssl-3.0.8. n/fetchmail-6.4.37-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. n/htdig-3.2.0b6-x86_64-9.txz: Rebuilt. Recompiled against openssl-3.0.8. n/httpd-2.4.56-x86_64-1.txz: Upgraded. This update fixes two security issues: HTTP Response Smuggling vulnerability via mod_proxy_uwsgi. HTTP Request Smuggling attack via mod_rewrite and mod_proxy. For more information, see: https://downloads.apache.org/httpd/CHANGES_2.4.56 https://www.cve.org/CVERecord?id=CVE-2023-27522 https://www.cve.org/CVERecord?id=CVE-2023-25690 (* Security fix *) NOTE: This package is compiled against openssl-3.0.8. n/irssi-1.4.3-x86_64-3.txz: Rebuilt. Recompiled against openssl-3.0.8. n/krb5-1.20.1-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. n/lftp-4.9.2-x86_64-4.txz: Rebuilt. Recompiled against openssl-3.0.8. n/links-2.28-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. n/lynx-2.9.0dev.10-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. n/mutt-2.2.9-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. n/net-snmp-5.9.3-x86_64-3.txz: Rebuilt. Recompiled against openssl-3.0.8. n/netatalk-3.1.14-x86_64-3.txz: Rebuilt. Recompiled against openssl-3.0.8. n/nmap-7.93-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. n/ntp-4.2.8p15-x86_64-12.txz: Rebuilt. Recompiled against openssl-3.0.8. n/openldap-2.6.4-x86_64-3.txz: Rebuilt. Recompiled against openssl-3.0.8. n/openssh-9.2p1-x86_64-3.txz: Rebuilt. Recompiled against openssl-3.0.8. n/openssl-3.0.8-x86_64-1.txz: Upgraded. Shared library .so-version bump. n/openssl11-1.1.1t-x86_64-1.txz: Added. n/openvpn-2.6.0-x86_64-3.txz: Rebuilt. Recompiled against openssl-3.0.8. n/php-8.2.3-x86_64-1.txz: Upgraded. Compiled against openssl-3.0.8. n/pidentd-3.0.19-x86_64-7.txz: Rebuilt. Recompiled against openssl-3.0.8. n/popa3d-1.0.3-x86_64-7.txz: Rebuilt. Recompiled against openssl-3.0.8. n/postfix-3.7.4-x86_64-3.txz: Rebuilt. Recompiled against openssl-3.0.8. n/ppp-2.4.9-x86_64-4.txz: Rebuilt. Recompiled against openssl-3.0.8. n/proftpd-1.3.8-x86_64-3.txz: Rebuilt. Recompiled against openssl-3.0.8. n/rsync-3.2.7-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. n/s-nail-14.9.24-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. n/samba-4.18.0-x86_64-1.txz: Upgraded. Build with the bundled Heimdal instead of the system MIT Kerberos. Thanks again to rpenny. n/slrn-1.0.3a-x86_64-4.txz: Rebuilt. Recompiled against openssl-3.0.8. n/snownews-1.9-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. n/socat-1.7.4.4-x86_64-3.txz: Rebuilt. Recompiled against openssl-3.0.8. n/stunnel-5.69-x86_64-3.txz: Rebuilt. Recompiled against openssl-3.0.8. n/tcpdump-4.99.3-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. n/wget-1.21.3-x86_64-3.txz: Rebuilt. Recompiled against openssl-3.0.8. n/wpa_supplicant-2.10-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. xap/freerdp-2.10.0-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. xap/gftp-2.9.1b-x86_64-3.txz: Rebuilt. Recompiled against openssl-3.0.8. xap/gkrellm-2.3.11-x86_64-4.txz: Rebuilt. Recompiled against openssl-3.0.8. xap/hexchat-2.16.1-x86_64-3.txz: Rebuilt. Recompiled against openssl-3.0.8. xap/sane-1.0.32-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. xap/x3270-4.0ga14-x86_64-3.txz: Rebuilt. Recompiled against openssl-3.0.8. xap/xine-lib-1.2.13-x86_64-4.txz: Rebuilt. Recompiled against openssl-3.0.8. y/bsd-games-2.17-x86_64-4.txz: Rebuilt. Recompiled against openssl-3.0.8. extra/php80/php80-8.0.28-x86_64-1.txz: Removed. extra/php81/php81-8.1.16-x86_64-1.txz: Removed. extra/rust-for-mozilla/rust-1.60.0-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. extra/sendmail/sendmail-8.17.1-x86_64-7.txz: Rebuilt. Recompiled against openssl-3.0.8. extra/sendmail/sendmail-cf-8.17.1-noarch-7.txz: Rebuilt. testing/packages/rust-1.67.1-x86_64-2.txz: Rebuilt. Recompiled against openssl-3.0.8. testing/packages/samba-4.17.5-x86_64-2.txz: Removed.
Diffstat (limited to 'source/n/php/CVE-2023-0662.patch')
-rw-r--r--source/n/php/CVE-2023-0662.patch411
1 files changed, 0 insertions, 411 deletions
diff --git a/source/n/php/CVE-2023-0662.patch b/source/n/php/CVE-2023-0662.patch
deleted file mode 100644
index e9cada2c9..000000000
--- a/source/n/php/CVE-2023-0662.patch
+++ /dev/null
@@ -1,411 +0,0 @@
-From 716de0cff539f46294ef70fe75d548cd66766370 Mon Sep 17 00:00:00 2001
-From: Jakub Zelenka <bukka@php.net>
-Date: Thu, 19 Jan 2023 14:31:25 +0000
-Subject: [PATCH] Introduce max_multipart_body_parts INI
-
-This fixes GHSA-54hq-v5wp-fqgv DOS vulnerabality by limitting number of
-parsed multipart body parts as currently all parts were always parsed.
----
- main/main.c | 1 +
- main/rfc1867.c | 11 ++
- ...-54hq-v5wp-fqgv-max-body-parts-custom.phpt | 53 +++++++++
- ...54hq-v5wp-fqgv-max-body-parts-default.phpt | 54 +++++++++
- .../ghsa-54hq-v5wp-fqgv-max-file-uploads.phpt | 52 +++++++++
- sapi/fpm/tests/tester.inc | 106 +++++++++++++++---
- 6 files changed, 262 insertions(+), 15 deletions(-)
- create mode 100644 sapi/fpm/tests/ghsa-54hq-v5wp-fqgv-max-body-parts-custom.phpt
- create mode 100644 sapi/fpm/tests/ghsa-54hq-v5wp-fqgv-max-body-parts-default.phpt
- create mode 100644 sapi/fpm/tests/ghsa-54hq-v5wp-fqgv-max-file-uploads.phpt
-
-diff --git a/main/main.c b/main/main.c
-index 40684f32dc14..c58ea58bf5ac 100644
---- a/main/main.c
-+++ b/main/main.c
-@@ -751,6 +751,7 @@ PHP_INI_BEGIN()
- PHP_INI_ENTRY("disable_functions", "", PHP_INI_SYSTEM, NULL)
- PHP_INI_ENTRY("disable_classes", "", PHP_INI_SYSTEM, NULL)
- PHP_INI_ENTRY("max_file_uploads", "20", PHP_INI_SYSTEM|PHP_INI_PERDIR, NULL)
-+ PHP_INI_ENTRY("max_multipart_body_parts", "-1", PHP_INI_SYSTEM|PHP_INI_PERDIR, NULL)
-
- STD_PHP_INI_BOOLEAN("allow_url_fopen", "1", PHP_INI_SYSTEM, OnUpdateBool, allow_url_fopen, php_core_globals, core_globals)
- STD_PHP_INI_BOOLEAN("allow_url_include", "0", PHP_INI_SYSTEM, OnUpdateBool, allow_url_include, php_core_globals, core_globals)
-diff --git a/main/rfc1867.c b/main/rfc1867.c
-index b43cfae5a1e2..3086e8da3dbe 100644
---- a/main/rfc1867.c
-+++ b/main/rfc1867.c
-@@ -687,6 +687,7 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) /* {{{ */
- void *event_extra_data = NULL;
- unsigned int llen = 0;
- int upload_cnt = INI_INT("max_file_uploads");
-+ int body_parts_cnt = INI_INT("max_multipart_body_parts");
- const zend_encoding *internal_encoding = zend_multibyte_get_internal_encoding();
- php_rfc1867_getword_t getword;
- php_rfc1867_getword_conf_t getword_conf;
-@@ -708,6 +709,11 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) /* {{{ */
- return;
- }
-
-+ if (body_parts_cnt < 0) {
-+ body_parts_cnt = PG(max_input_vars) + upload_cnt;
-+ }
-+ int body_parts_limit = body_parts_cnt;
-+
- /* Get the boundary */
- boundary = strstr(content_type_dup, "boundary");
- if (!boundary) {
-@@ -792,6 +798,11 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) /* {{{ */
- char *pair = NULL;
- int end = 0;
-
-+ if (--body_parts_cnt < 0) {
-+ php_error_docref(NULL, E_WARNING, "Multipart body parts limit exceeded %d. To increase the limit change max_multipart_body_parts in php.ini.", body_parts_limit);
-+ goto fileupload_done;
-+ }
-+
- while (isspace(*cd)) {
- ++cd;
- }
-#diff --git a/sapi/fpm/tests/ghsa-54hq-v5wp-fqgv-max-body-parts-custom.phpt b/sapi/fpm/tests/ghsa-54hq-v5wp-fqgv-max-body-parts-custom.phpt
-#new file mode 100644
-#index 000000000000..d2239ac3c410
-#--- /dev/null
-#+++ b/sapi/fpm/tests/ghsa-54hq-v5wp-fqgv-max-body-parts-custom.phpt
-#@@ -0,0 +1,53 @@
-#+--TEST--
-#+FPM: GHSA-54hq-v5wp-fqgv - max_multipart_body_parts ini custom value
-#+--SKIPIF--
-#+<?php include "skipif.inc"; ?>
-#+--FILE--
-#+<?php
-#+
-#+require_once "tester.inc";
-#+
-#+$cfg = <<<EOT
-#+[global]
-#+error_log = {{FILE:LOG}}
-#+[unconfined]
-#+listen = {{ADDR}}
-#+pm = dynamic
-#+pm.max_children = 5
-#+pm.start_servers = 1
-#+pm.min_spare_servers = 1
-#+pm.max_spare_servers = 3
-#+php_admin_value[html_errors] = false
-#+php_admin_value[max_input_vars] = 20
-#+php_admin_value[max_file_uploads] = 5
-#+php_admin_value[max_multipart_body_parts] = 10
-#+php_flag[display_errors] = On
-#+EOT;
-#+
-#+$code = <<<EOT
-#+<?php
-#+var_dump(count(\$_POST));
-#+EOT;
-#+
-#+$tester = new FPM\Tester($cfg, $code);
-#+$tester->start();
-#+$tester->expectLogStartNotices();
-#+echo $tester
-#+ ->request(stdin: [
-#+ 'parts' => [
-#+ 'count' => 30,
-#+ ]
-#+ ])
-#+ ->getBody();
-#+$tester->terminate();
-#+$tester->close();
-#+
-#+?>
-#+--EXPECT--
-#+Warning: Unknown: Multipart body parts limit exceeded 10. To increase the limit change max_multipart_body_parts in php.ini. in Unknown on line 0
-#+int(10)
-#+--CLEAN--
-#+<?php
-#+require_once "tester.inc";
-#+FPM\Tester::clean();
-#+?>
-#diff --git a/sapi/fpm/tests/ghsa-54hq-v5wp-fqgv-max-body-parts-default.phpt b/sapi/fpm/tests/ghsa-54hq-v5wp-fqgv-max-body-parts-default.phpt
-#new file mode 100644
-#index 000000000000..42b5afbf9ee7
-#--- /dev/null
-#+++ b/sapi/fpm/tests/ghsa-54hq-v5wp-fqgv-max-body-parts-default.phpt
-#@@ -0,0 +1,54 @@
-#+--TEST--
-#+FPM: GHSA-54hq-v5wp-fqgv - max_multipart_body_parts ini default
-#+--SKIPIF--
-#+<?php include "skipif.inc"; ?>
-#+--FILE--
-#+<?php
-#+
-#+require_once "tester.inc";
-#+
-#+$cfg = <<<EOT
-#+[global]
-#+error_log = {{FILE:LOG}}
-#+[unconfined]
-#+listen = {{ADDR}}
-#+pm = dynamic
-#+pm.max_children = 5
-#+pm.start_servers = 1
-#+pm.min_spare_servers = 1
-#+pm.max_spare_servers = 3
-#+php_admin_value[html_errors] = false
-#+php_admin_value[max_input_vars] = 20
-#+php_admin_value[max_file_uploads] = 5
-#+php_flag[display_errors] = On
-#+EOT;
-#+
-#+$code = <<<EOT
-#+<?php
-#+var_dump(count(\$_POST));
-#+EOT;
-#+
-#+$tester = new FPM\Tester($cfg, $code);
-#+$tester->start();
-#+$tester->expectLogStartNotices();
-#+echo $tester
-#+ ->request(stdin: [
-#+ 'parts' => [
-#+ 'count' => 30,
-#+ ]
-#+ ])
-#+ ->getBody();
-#+$tester->terminate();
-#+$tester->close();
-#+
-#+?>
-#+--EXPECT--
-#+Warning: Unknown: Input variables exceeded 20. To increase the limit change max_input_vars in php.ini. in Unknown on line 0
-#+
-#+Warning: Unknown: Multipart body parts limit exceeded 25. To increase the limit change max_multipart_body_parts in php.ini. in Unknown on line 0
-#+int(20)
-#+--CLEAN--
-#+<?php
-#+require_once "tester.inc";
-#+FPM\Tester::clean();
-#+?>
-#diff --git a/sapi/fpm/tests/ghsa-54hq-v5wp-fqgv-max-file-uploads.phpt b/sapi/fpm/tests/ghsa-54hq-v5wp-fqgv-max-file-uploads.phpt
-#new file mode 100644
-#index 000000000000..da81174c7280
-#--- /dev/null
-#+++ b/sapi/fpm/tests/ghsa-54hq-v5wp-fqgv-max-file-uploads.phpt
-#@@ -0,0 +1,52 @@
-#+--TEST--
-#+FPM: GHSA-54hq-v5wp-fqgv - exceeding max_file_uploads
-#+--SKIPIF--
-#+<?php include "skipif.inc"; ?>
-#+--FILE--
-#+<?php
-#+
-#+require_once "tester.inc";
-#+
-#+$cfg = <<<EOT
-#+[global]
-#+error_log = {{FILE:LOG}}
-#+[unconfined]
-#+listen = {{ADDR}}
-#+pm = dynamic
-#+pm.max_children = 5
-#+pm.start_servers = 1
-#+pm.min_spare_servers = 1
-#+pm.max_spare_servers = 3
-#+php_admin_value[html_errors] = false
-#+php_admin_value[max_file_uploads] = 5
-#+php_flag[display_errors] = On
-#+EOT;
-#+
-#+$code = <<<EOT
-#+<?php
-#+var_dump(count(\$_FILES));
-#+EOT;
-#+
-#+$tester = new FPM\Tester($cfg, $code);
-#+$tester->start();
-#+$tester->expectLogStartNotices();
-#+echo $tester
-#+ ->request(stdin: [
-#+ 'parts' => [
-#+ 'count' => 10,
-#+ 'param' => 'filename'
-#+ ]
-#+ ])
-#+ ->getBody();
-#+$tester->terminate();
-#+$tester->close();
-#+
-#+?>
-#+--EXPECT--
-#+Warning: Maximum number of allowable file uploads has been exceeded in Unknown on line 0
-#+int(5)
-#+--CLEAN--
-#+<?php
-#+require_once "tester.inc";
-#+FPM\Tester::clean();
-#+?>
-##diff --git a/sapi/fpm/tests/tester.inc b/sapi/fpm/tests/tester.inc
-##index 6197cdba53f5..e51aa0f69143 100644
-##--- a/sapi/fpm/tests/tester.inc
-##+++ b/sapi/fpm/tests/tester.inc
-#@@ -567,13 +567,17 @@ class Tester
-# * @param string $query
-# * @param array $headers
-# * @param string|null $uri
-#+ * @param string|null $scriptFilename
-#+ * @param string|null $stdin
-# *
-# * @return array
-# */
-# private function getRequestParams(
-# string $query = '',
-# array $headers = [],
-#- string $uri = null
-#+ string $uri = null,
-#+ string $scriptFilename = null,
-#+ ?string $stdin = null
-# ): array {
-# if (is_null($uri)) {
-# $uri = $this->makeSourceFile();
-3@@ -582,8 +586,8 @@ class Tester
-# $params = array_merge(
-# [
-# 'GATEWAY_INTERFACE' => 'FastCGI/1.0',
-#- 'REQUEST_METHOD' => 'GET',
-#- 'SCRIPT_FILENAME' => $uri,
-#+ 'REQUEST_METHOD' => is_null($stdin) ? 'GET' : 'POST',
-#+ 'SCRIPT_FILENAME' => $scriptFilename ?: $uri,
-# 'SCRIPT_NAME' => $uri,
-# 'QUERY_STRING' => $query,
-# 'REQUEST_URI' => $uri . ($query ? '?' . $query : ""),
-#@@ -597,7 +601,7 @@ class Tester
-# 'SERVER_PROTOCOL' => 'HTTP/1.1',
-# 'DOCUMENT_ROOT' => __DIR__,
-# 'CONTENT_TYPE' => '',
-#- 'CONTENT_LENGTH' => 0
-#+ 'CONTENT_LENGTH' => strlen($stdin ?? "") // Default to 0
-# ],
-# $headers
-# );
-#@@ -607,20 +611,86 @@ class Tester
-# });
-# }
-#
-#+ /**
-#+ * Parse stdin and generate data for multipart config.
-#+ *
-#+ * @param array $stdin
-#+ * @param array $headers
-#+ *
-#+ * @return void
-#+ * @throws \Exception
-#+ */
-#+ private function parseStdin(array $stdin, array &$headers)
-#+ {
-#+ $parts = $stdin['parts'] ?? null;
-#+ if (empty($parts)) {
-#+ throw new \Exception('The stdin array needs to contain parts');
-#+ }
-#+ $boundary = $stdin['boundary'] ?? 'AaB03x';
-#+ if ( ! isset($headers['CONTENT_TYPE'])) {
-#+ $headers['CONTENT_TYPE'] = 'multipart/form-data; boundary=' . $boundary;
-#+ }
-#+ $count = $parts['count'] ?? null;
-#+ if ( ! is_null($count)) {
-#+ $dispositionType = $parts['disposition'] ?? 'form-data';
-#+ $dispositionParam = $parts['param'] ?? 'name';
-#+ $namePrefix = $parts['prefix'] ?? 'f';
-#+ $nameSuffix = $parts['suffix'] ?? '';
-#+ $value = $parts['value'] ?? 'test';
-#+ $parts = [];
-#+ for ($i = 0; $i < $count; $i++) {
-#+ $parts[] = [
-#+ 'disposition' => $dispositionType,
-#+ 'param' => $dispositionParam,
-#+ 'name' => "$namePrefix$i$nameSuffix",
-#+ 'value' => $value
-#+ ];
-#+ }
-#+ }
-#+ $out = '';
-#+ $nl = "\r\n";
-#+ foreach ($parts as $part) {
-#+ if (!is_array($part)) {
-#+ $part = ['name' => $part];
-#+ } elseif ( ! isset($part['name'])) {
-#+ throw new \Exception('Each part has to have a name');
-#+ }
-#+ $name = $part['name'];
-#+ $dispositionType = $part['disposition'] ?? 'form-data';
-#+ $dispositionParam = $part['param'] ?? 'name';
-#+ $value = $part['value'] ?? 'test';
-#+ $partHeaders = $part['headers'] ?? [];
-#+
-#+ $out .= "--$boundary$nl";
-#+ $out .= "Content-disposition: $dispositionType; $dispositionParam=\"$name\"$nl";
-#+ foreach ($partHeaders as $headerName => $headerValue) {
-#+ $out .= "$headerName: $headerValue$nl";
-#+ }
-#+ $out .= $nl;
-#+ $out .= "$value$nl";
-#+ }
-#+ $out .= "--$boundary--$nl";
-#+
-#+ return $out;
-#+ }
-#+
-# /**
-# * Execute request.
-# *
-#- * @param string $query
-#- * @param array $headers
-#- * @param string|null $uri
-#- * @param string|null $address
-#- * @param string|null $successMessage
-#- * @param string|null $errorMessage
-#- * @param bool $connKeepAlive
-#- * @param bool $expectError
-#- * @param int $readLimit
-#+ * @param string $query
-#+ * @param array $headers
-#+ * @param string|null $uri
-#+ * @param string|null $address
-#+ * @param string|null $successMessage
-#+ * @param string|null $errorMessage
-#+ * @param bool $connKeepAlive
-#+ * @param string|null $scriptFilename = null
-#+ * @param string|array|null $stdin = null
-#+ * @param bool $expectError
-#+ * @param int $readLimit
-# *
-# * @return Response
-#+ * @throws \Exception
-# */
-# public function request(
-# string $query = '',
-#@@ -630,6 +700,8 @@ class Tester
-# string $successMessage = null,
-# string $errorMessage = null,
-# bool $connKeepAlive = false,
-#+ string $scriptFilename = null,
-#+ string|array $stdin = null,
-# bool $expectError = false,
-# int $readLimit = -1,
-# ): Response {
-#@@ -637,12 +709,16 @@ class Tester
-# return new Response(null, true);
-# }
-#
-#- $params = $this->getRequestParams($query, $headers, $uri);
-#+ if (is_array($stdin)) {
-#+ $stdin = $this->parseStdin($stdin, $headers);
-#+ }
-#+
-#+ $params = $this->getRequestParams($query, $headers, $uri, $scriptFilename, $stdin);
-# $this->trace('Request params', $params);
-#
-# try {
-# $this->response = new Response(
-#- $this->getClient($address, $connKeepAlive)->request_data($params, false, $readLimit)
-#+ $this->getClient($address, $connKeepAlive)->request_data($params, $stdin, $readLimit)
-# );
-# if ($expectError) {
-# $this->error('Expected request error but the request was successful');