Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:97168 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 84393 invoked from network); 25 Nov 2016 05:41:03 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 25 Nov 2016 05:41:03 -0000 Authentication-Results: pb1.pair.com header.from=axot@axot.org; sender-id=unknown Authentication-Results: pb1.pair.com smtp.mail=axot@axot.org; spf=permerror; sender-id=unknown Received-SPF: error (pb1.pair.com: domain axot.org from 74.125.83.47 cause and error) X-PHP-List-Original-Sender: axot@axot.org X-Host-Fingerprint: 74.125.83.47 mail-pg0-f47.google.com Received: from [74.125.83.47] ([74.125.83.47:34315] helo=mail-pg0-f47.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 7D/BD-21589-EEEC7385 for ; Fri, 25 Nov 2016 00:41:02 -0500 Received: by mail-pg0-f47.google.com with SMTP id x23so25940545pgx.1 for ; Thu, 24 Nov 2016 21:41:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=axot-org.20150623.gappssmtp.com; s=20150623; h=from:content-transfer-encoding:mime-version:subject:message-id:date :to; bh=xcRCQnEmpDKwdZroMbTmTYtj0HMIBE/EeMbmOlLmwnw=; b=hI3RS9xKfbYaDDdZLjbYpWWqHJGXGxyWr9BY0jIZ9GqA4J0Ds73vYi3S3BsoSKEr48 VPyDuHESL59mLF20VttiZXg/uDvI4S8EVTfdzbSYLCs5H8bPCqBrQ+hqA2/GN2XR9cXc czDjcGyiBp/6Ea1gx7VKL9McWQGUBzQIHFOJ7g6aObjStgvdDsEnkvAg/JOMVGtLIPf9 d3AUQ1Af+i7hiAPGFvyltm82Ht2gd59ByWXbFdijxyTEMx7drKH11a/tFIzDAiLq5qty WZdWBDajZ2CzBdLjnU6DvG9ZwY4UEFC4zJR8kqCbHReA5w11O5NpqhcXjUzwZ5YXExmI eqdA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:content-transfer-encoding:mime-version :subject:message-id:date:to; bh=xcRCQnEmpDKwdZroMbTmTYtj0HMIBE/EeMbmOlLmwnw=; b=Cw1GRw5wyCopKBmd+/yO1sd6z4E0+VhJfIZ901OzVdnEPH+V48a79gUedk2UB/Myu8 WRMgUAU0GMDkl05jWV3qCXUI+SyFeo+XcvztCttLSrdMgVmmA4n7HGanoMLC3YQaYHNf 7NOIgdR5FK9T6cxKgUDBlx1F5U+dVU2UgwUOtciFda9/7QkkLc8FTS2fTNYvA+7YojaU +6PvK2OblfmFYkqLZ65EMsI0Gxnzsb+ttLiv9m0UFmaZX10lJQh0gsRmDXhlVBZJsbT2 Vy/7yEUvEIi4OOwN1HvSulm8BhrCRUmYbp8f/lxxi7gZvhNxn3cATJZSZt7wn0VGNJYO VI5A== X-Gm-Message-State: AKaTC03aOyczVfuyl9WNZSfeRqsQsZNpCbPfE/8We5S+suDEHxtqQBeVVILBeVZx+o4Adw== X-Received: by 10.84.146.140 with SMTP id g12mr13385740pla.62.1480052459023; Thu, 24 Nov 2016 21:40:59 -0800 (PST) Received: from [172.24.82.247] (124x35x23x26.ap124.ftth.ucom.ne.jp. [124.35.23.26]) by smtp.gmail.com with ESMTPSA id q12sm64151969pfj.18.2016.11.24.21.40.57 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 24 Nov 2016 21:40:58 -0800 (PST) Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable Mime-Version: 1.0 (Mac OS X Mail 10.1 \(3251\)) Message-ID: Date: Fri, 25 Nov 2016 14:40:56 +0900 To: internals@lists.php.net X-Mailer: Apple Mail (2.3251) Subject: How to handle error in sapi From: axot@axot.org (Zheng Shao) Hi, I'm working on fix this bug (https://bugs.php.net/bug.php?id=3D61471) = both on PHP-7 and PHP-5.6. The problem is `ap_get_brigade` will return an error when connection = timeout happened. in `sapi/apache2handler/sapi_apache2.c`: static int php_apache_sapi_read_post(char *buf, uint count_bytes TSRMLS_DC) { apr_size_t len, tlen=3D0; php_struct *ctx =3D SG(server_context); request_rec *r; apr_bucket_brigade *brigade; + apr_status_t ret; + int error; r =3D ctx->r; brigade =3D ctx->brigade; len =3D count_bytes; /* * This loop is needed because ap_get_brigade() can return us = partial data * which would cause premature termination of request read. = Therefor we * need to make sure that if data is available we fill the = buffer completely. */ - while (ap_get_brigade(r->input_filters, brigade, = AP_MODE_READBYTES, APR_BLOCK_READ, len) =3D=3D APR_SUCCESS) { + while ((ret=3Dap_get_brigade(r->input_filters, brigade, = AP_MODE_READBYTES, APR_BLOCK_READ, len)) =3D=3D APR_SUCCESS) { apr_brigade_flatten(brigade, buf, &len); apr_brigade_cleanup(brigade); tlen +=3D len; if (tlen =3D=3D count_bytes || !len) { break; } buf +=3D len; len =3D count_bytes - tlen; } + if (ret !=3D APR_SUCCESS){ + if (APR_STATUS_IS_TIMEUP(ret)) { + error =3D ap_map_http_request_error(ret, = HTTP_REQUEST_TIME_OUT); + } else { + error =3D ap_map_http_request_error(ret, = HTTP_BAD_REQUEST); + } + // HOW TO HANDLE ERROR HERE, should I throw a = zend_throw_exception? + // zend_throw_exception(NULL, "Read POST data error", = error); + } return tlen; } @@ -616,6 +625,7 @@ zend_first_try { ctx->brigade =3D brigade; if (php_apache_request_ctor(r, ctx TSRMLS_CC)!=3DSUCCESS) = { + // HANDLE zend_throw_exception TIMEOUT HERE ? zend_bailout(); } } else { @@ -627,6 +637,7 @@ zend_first_try { strcmp(parent_req->handler, = PHP_SOURCE_MAGIC_TYPE) && strcmp(parent_req->handler, PHP_SCRIPT)) = { if (php_apache_request_ctor(r, ctx = TSRMLS_CC)!=3DSUCCESS) { + // HANDLE zend_throw_exception TIMEOUT = HERE ? zend_bailout(); } } I'm confused by how to handle an error inside php_apache_sapi_read_post, = shoud I throw a zend_throw_exception or use a global flag for error = handling? Thank you --=20 Zheng SHAO axot@axot.org=