Hi Stefan,
>
> Added: httpd/httpd/trunk/modules/http2/mod_h2/h2_conn_io.c
> URL:
> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/mod_h2/h2_conn_io.c?rev=1688474&view=auto
> ==============================================================================
> --- httpd/httpd/trunk/modules/http2/mod_h2/h2_conn_io.c (added)
> +++ httpd/httpd/trunk/modules/http2/mod_h2/h2_conn_io.c Tue Jun 30 15:26:16
> 2015
> @@ -0,0 +1,285 @@
[]
> +
> +apr_status_t h2_conn_io_write(h2_conn_io *io,
> + const char *buf, size_t length)
> +{
> + apr_status_t status = APR_SUCCESS;
> + io->unflushed = 1;
> +
> + if (io->buffer_output) {
[...]
> + }
> + else {
> + status = apr_brigade_write(io->output, flush_out, io, buf, length);
> + if (status == APR_SUCCESS
> + || APR_STATUS_IS_ECONNABORTED(status)
> + || APR_STATUS_IS_EPIPE(status)) {
> + /* These are all fine and no reason for concern. Everything else
> + * is interesting. */
> + status = APR_SUCCESS;
Why ECONNABORTED and EPIPE are not errors here?
> + }
> + else {
> + ap_log_cerror(APLOG_MARK, APLOG_DEBUG, status, io->connection,
> + "h2_conn_io: write error");
> + }
> + }
> +
> + return status;
> +}
[...]
> +
> +apr_status_t h2_conn_io_flush(h2_conn_io *io)
> +{
> + if (io->unflushed) {
[...]
> +
> + /* Send it out through installed filters (TLS) to the client */
> + apr_status_t status = flush_out(io->output, io);
> +
> + if (status == APR_SUCCESS
> + || APR_STATUS_IS_ECONNABORTED(status)
> + || APR_STATUS_IS_EPIPE(status)) {
> + /* These are all fine and no reason for concern. Everything else
> + * is interesting. */
> + io->unflushed = 0;
Likewise?
> + }
> + else {
> + ap_log_cerror(APLOG_MARK, APLOG_DEBUG, status, io->connection,
> + "h2_conn_io: flush error");
> + }
> +
> + return status;
> + }
> + return APR_SUCCESS;
> +}
It also seems that h2_session sometimes (ab)uses APR_TIMEUP as EAGAIN,
the former is generally a reason to stop processing though. Why not
use APR_EGAIN for those cases?
Regards,
Yann.