You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by ic...@apache.org on 2015/12/11 13:57:33 UTC
svn commit: r1719403 - in /httpd/httpd/trunk: CHANGES
modules/http2/h2_conn.c modules/http2/h2_h2.c modules/http2/h2_io.c
modules/http2/h2_io.h modules/http2/h2_mplx.c modules/http2/h2_stream.c
modules/http2/h2_task.h modules/http2/h2_task_input.c
Author: icing
Date: Fri Dec 11 12:57:32 2015
New Revision: 1719403
URL: http://svn.apache.org/viewvc?rev=1719403&view=rev
Log:
fixed window update on chunked uploads, moved handling of chunking to later stage
Modified:
httpd/httpd/trunk/CHANGES
httpd/httpd/trunk/modules/http2/h2_conn.c
httpd/httpd/trunk/modules/http2/h2_h2.c
httpd/httpd/trunk/modules/http2/h2_io.c
httpd/httpd/trunk/modules/http2/h2_io.h
httpd/httpd/trunk/modules/http2/h2_mplx.c
httpd/httpd/trunk/modules/http2/h2_stream.c
httpd/httpd/trunk/modules/http2/h2_task.h
httpd/httpd/trunk/modules/http2/h2_task_input.c
Modified: httpd/httpd/trunk/CHANGES
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/CHANGES?rev=1719403&r1=1719402&r2=1719403&view=diff
==============================================================================
--- httpd/httpd/trunk/CHANGES [utf-8] (original)
+++ httpd/httpd/trunk/CHANGES [utf-8] Fri Dec 11 12:57:32 2015
@@ -1,8 +1,8 @@
-*- coding: utf-8 -*-
Changes with Apache 2.5.0
- *) mod_ssl: for all ssl_engine_vars.c lookups, fall back to master connection
- if conn_rec itself holds no valid SSLConnRec*. Fixes PR58666.
+ *) mod_http2: fixed bug in input window size calculation by moving chunked
+ request body encoding into later stage of processing.
[Stefan Eissing]
*) mod_proxy_fdpass: Fix AH01153 error when using the default configuration.
Modified: httpd/httpd/trunk/modules/http2/h2_conn.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_conn.c?rev=1719403&r1=1719402&r2=1719403&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/http2/h2_conn.c (original)
+++ httpd/httpd/trunk/modules/http2/h2_conn.c Fri Dec 11 12:57:32 2015
@@ -163,6 +163,9 @@ apr_status_t h2_conn_process(conn_rec *c
NGHTTP2_INADEQUATE_SECURITY, NULL, 0);
}
+ /* What do install instead? */
+ ap_remove_input_filter_byhandle(c->input_filters, "reqtimeout");
+
ap_update_child_status_from_conn(c->sbh, SERVER_BUSY_READ, c);
status = h2_session_start(session, &rv);
Modified: httpd/httpd/trunk/modules/http2/h2_h2.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_h2.c?rev=1719403&r1=1719402&r2=1719403&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/http2/h2_h2.c (original)
+++ httpd/httpd/trunk/modules/http2/h2_h2.c Fri Dec 11 12:57:32 2015
@@ -33,6 +33,8 @@
#include "h2_config.h"
#include "h2_ctx.h"
#include "h2_conn.h"
+#include "h2_session.h"
+#include "h2_util.h"
#include "h2_h2.h"
const char *h2_tls_protos[] = {
@@ -436,7 +438,6 @@ static int cipher_is_blacklisted(const c
* - process_conn take over connection in case of h2
*/
static int h2_h2_process_conn(conn_rec* c);
-static int h2_h2_remove_timeout(conn_rec* c);
static int h2_h2_post_read_req(request_rec *r);
@@ -553,7 +554,6 @@ int h2_allows_h2_upgrade(conn_rec *c)
/*******************************************************************************
* Register various hooks
*/
-static const char *const mod_reqtimeout[] = { "reqtimeout.c", NULL};
static const char* const mod_ssl[] = {"mod_ssl.c", NULL};
void h2_h2_register_hooks(void)
@@ -564,11 +564,6 @@ void h2_h2_register_hooks(void)
ap_hook_process_connection(h2_h2_process_conn,
mod_ssl, NULL, APR_HOOK_MIDDLE);
- /* Perform connection cleanup before the actual processing happens.
- */
- ap_hook_process_connection(h2_h2_remove_timeout,
- mod_reqtimeout, NULL, APR_HOOK_LAST);
-
/* With "H2SerializeHeaders On", we install the filter in this hook
* that parses the response. This needs to happen before any other post
* read function terminates the request with an error. Otherwise we will
@@ -577,18 +572,6 @@ void h2_h2_register_hooks(void)
ap_hook_post_read_request(h2_h2_post_read_req, NULL, NULL, APR_HOOK_REALLY_FIRST);
}
-static int h2_h2_remove_timeout(conn_rec* c)
-{
- h2_ctx *ctx = h2_ctx_get(c);
-
- if (h2_ctx_is_active(ctx) && !h2_ctx_is_task(ctx)) {
- /* cleanup on master h2 connections */
- ap_remove_input_filter_byhandle(c->input_filters, "reqtimeout");
- }
-
- return DECLINED;
-}
-
int h2_h2_process_conn(conn_rec* c)
{
h2_ctx *ctx = h2_ctx_get(c);
@@ -660,28 +643,32 @@ int h2_h2_process_conn(conn_rec* c)
static int h2_h2_post_read_req(request_rec *r)
{
- h2_ctx *ctx = h2_ctx_rget(r);
- struct h2_task *task = h2_ctx_get_task(ctx);
- if (task) {
- /* FIXME: sometimes, this hook gets called twice for a single request.
- * This should not be, right? */
- /* h2_task connection for a stream, not for h2c */
- ap_log_rerror(APLOG_MARK, APLOG_TRACE3, 0, r,
- "adding h1_to_h2_resp output filter");
- if (task->serialize_headers) {
- ap_remove_output_filter_byhandle(r->output_filters, "H1_TO_H2_RESP");
- ap_add_output_filter("H1_TO_H2_RESP", task, r, r->connection);
- }
- else {
- /* replace the core http filter that formats response headers
- * in HTTP/1 with our own that collects status and headers */
- ap_remove_output_filter_byhandle(r->output_filters, "HTTP_HEADER");
- ap_remove_output_filter_byhandle(r->output_filters, "H2_RESPONSE");
- ap_add_output_filter("H2_RESPONSE", task, r, r->connection);
+ /* slave connection? */
+ if (r->connection->master) {
+ h2_ctx *ctx = h2_ctx_rget(r);
+ struct h2_task *task = h2_ctx_get_task(ctx);
+ /* This hook will get called twice on internal redirects. Take care
+ * that we manipulate filters only once. */
+ /* our slave connection? */
+ if (task && !task->filters_set) {
+ /* setup the correct output filters to process the response
+ * on the proper mod_http2 way. */
+ ap_log_rerror(APLOG_MARK, APLOG_TRACE3, 0, r, "adding task output filter");
+ if (task->serialize_headers) {
+ ap_add_output_filter("H1_TO_H2_RESP", task, r, r->connection);
+ }
+ else {
+ /* replace the core http filter that formats response headers
+ * in HTTP/1 with our own that collects status and headers */
+ ap_remove_output_filter_byhandle(r->output_filters, "HTTP_HEADER");
+ ap_add_output_filter("H2_RESPONSE", task, r, r->connection);
+ }
+ ap_add_output_filter("H2_TRAILERS", task, r, r->connection);
+ task->filters_set = 1;
}
- ap_add_output_filter("H2_TRAILERS", task, r, r->connection);
}
return DECLINED;
}
+
Modified: httpd/httpd/trunk/modules/http2/h2_io.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_io.c?rev=1719403&r1=1719402&r2=1719403&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/http2/h2_io.c (original)
+++ httpd/httpd/trunk/modules/http2/h2_io.c Fri Dec 11 12:57:32 2015
@@ -23,6 +23,7 @@
#include "h2_private.h"
#include "h2_io.h"
#include "h2_response.h"
+#include "h2_request.h"
#include "h2_task.h"
#include "h2_util.h"
@@ -33,8 +34,6 @@ h2_io *h2_io_create(int id, apr_pool_t *
io->id = id;
io->pool = pool;
io->bucket_alloc = bucket_alloc;
- io->bbin = NULL;
- io->bbout = NULL;
}
return io;
}
@@ -96,11 +95,39 @@ apr_status_t h2_io_in_shutdown(h2_io *io
return h2_io_in_close(io);
}
+static int add_trailer(void *ctx, const char *key, const char *value)
+{
+ apr_bucket_brigade *bb = ctx;
+ apr_status_t status;
+
+ status = apr_brigade_printf(bb, NULL, NULL, "%s: %s\r\n",
+ key, value);
+ return (status == APR_SUCCESS);
+}
+
+static apr_status_t append_eos(h2_io *io, apr_bucket_brigade *bb)
+{
+ apr_status_t status = APR_SUCCESS;
+
+ if (io->request->chunked) {
+ apr_table_t *trailers = io->request->trailers;
+ if (trailers && !apr_is_empty_table(trailers)) {
+ status = apr_brigade_puts(bb, NULL, NULL, "0\r\n");
+ apr_table_do(add_trailer, bb, trailers, NULL);
+ status = apr_brigade_puts(bb, NULL, NULL, "\r\n");
+ }
+ else {
+ status = apr_brigade_puts(bb, NULL, NULL, "0\r\n\r\n");
+ }
+ }
+ APR_BRIGADE_INSERT_TAIL(bb, apr_bucket_eos_create(io->bbin->bucket_alloc));
+ return status;
+}
+
apr_status_t h2_io_in_read(h2_io *io, apr_bucket_brigade *bb,
apr_size_t maxlen)
{
apr_off_t start_len = 0;
- apr_bucket *last;
apr_status_t status;
if (io->rst_error) {
@@ -108,21 +135,56 @@ apr_status_t h2_io_in_read(h2_io *io, ap
}
if (!io->bbin || APR_BRIGADE_EMPTY(io->bbin)) {
- return io->eos_in? APR_EOF : APR_EAGAIN;
+ if (io->eos_in) {
+ if (!io->eos_in_written) {
+ status = append_eos(io, bb);
+ io->eos_in_written = 1;
+ return status;
+ }
+ return APR_EOF;
+ }
+ return APR_EAGAIN;
}
- apr_brigade_length(bb, 1, &start_len);
- last = APR_BRIGADE_LAST(bb);
- status = h2_util_move(bb, io->bbin, maxlen, NULL, "h2_io_in_read");
- if (status == APR_SUCCESS) {
- apr_bucket *nlast = APR_BRIGADE_LAST(bb);
- apr_off_t end_len = 0;
- apr_brigade_length(bb, 1, &end_len);
- if (last == nlast) {
- return APR_EAGAIN;
+ if (io->request->chunked) {
+ /* the reader expects HTTP/1.1 chunked encoding */
+ if (!io->tmp) {
+ io->tmp = apr_brigade_create(io->pool, io->bucket_alloc);
+ }
+ apr_brigade_cleanup(io->tmp);
+
+ status = h2_util_move(io->tmp, io->bbin, maxlen, NULL, "h2_io_in_read_chunk");
+ if (status == APR_SUCCESS) {
+ apr_off_t tmp_len = 0;
+
+ apr_brigade_length(io->tmp, 1, &tmp_len);
+ if (tmp_len > 0) {
+ io->input_consumed += tmp_len;
+ status = apr_brigade_printf(bb, NULL, NULL, "%lx\r\n",
+ (unsigned long)tmp_len);
+ if (status == APR_SUCCESS) {
+ status = h2_util_move(bb, io->tmp, -1, NULL, "h2_io_in_read_tmp1");
+ if (status == APR_SUCCESS) {
+ status = apr_brigade_puts(bb, NULL, NULL, "\r\n");
+ }
+ }
+ }
+ else {
+ status = h2_util_move(bb, io->tmp, -1, NULL, "h2_io_in_read_tmp2");
+ }
}
- io->input_consumed += (end_len - start_len);
}
+ else {
+ apr_brigade_length(bb, 1, &start_len);
+
+ status = h2_util_move(bb, io->bbin, maxlen, NULL, "h2_io_in_read");
+ if (status == APR_SUCCESS) {
+ apr_off_t end_len = 0;
+ apr_brigade_length(bb, 1, &end_len);
+ io->input_consumed += (end_len - start_len);
+ }
+ }
+
return status;
}
@@ -151,10 +213,6 @@ apr_status_t h2_io_in_close(h2_io *io)
return APR_ECONNABORTED;
}
- if (io->bbin) {
- APR_BRIGADE_INSERT_TAIL(io->bbin,
- apr_bucket_eos_create(io->bbin->bucket_alloc));
- }
io->eos_in = 1;
return APR_SUCCESS;
}
Modified: httpd/httpd/trunk/modules/http2/h2_io.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_io.h?rev=1719403&r1=1719402&r2=1719403&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/http2/h2_io.h (original)
+++ httpd/httpd/trunk/modules/http2/h2_io.h Fri Dec 11 12:57:32 2015
@@ -40,6 +40,7 @@ struct h2_io {
int rst_error;
int eos_in;
+ int eos_in_written;
apr_bucket_brigade *bbin; /* input data for stream */
struct apr_thread_cond_t *input_arrived; /* block on reading */
apr_size_t input_consumed; /* how many bytes have been read */
@@ -50,6 +51,7 @@ struct h2_io {
struct apr_thread_cond_t *output_drained; /* block on writing */
int files_handles_owned;
+ apr_bucket_brigade *tmp; /* temporary data for chunking */
};
/*******************************************************************************
Modified: httpd/httpd/trunk/modules/http2/h2_mplx.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_mplx.c?rev=1719403&r1=1719402&r2=1719403&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/http2/h2_mplx.c (original)
+++ httpd/httpd/trunk/modules/http2/h2_mplx.c Fri Dec 11 12:57:32 2015
@@ -357,6 +357,9 @@ apr_status_t h2_mplx_in_read(h2_mplx *m,
while (APR_STATUS_IS_EAGAIN(status)
&& !is_aborted(m, &status)
&& block == APR_BLOCK_READ) {
+ ap_log_cerror(APLOG_MARK, APLOG_TRACE2, status, m->c,
+ "h2_mplx(%ld-%d): wait on in data (BLOCK_READ)",
+ m->id, stream_id);
apr_thread_cond_wait(io->input_arrived, m->lock);
status = h2_io_in_read(io, bb, -1);
}
Modified: httpd/httpd/trunk/modules/http2/h2_stream.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_stream.c?rev=1719403&r1=1719402&r2=1719403&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/http2/h2_stream.c (original)
+++ httpd/httpd/trunk/modules/http2/h2_stream.c Fri Dec 11 12:57:32 2015
@@ -351,40 +351,9 @@ static apr_status_t input_flush(apr_buck
}
static apr_status_t input_add_data(h2_stream *stream,
- const char *data, size_t len, int chunked)
+ const char *data, size_t len)
{
- apr_status_t status = APR_SUCCESS;
-
- if (chunked) {
- status = apr_brigade_printf(stream->bbin, input_flush, stream,
- "%lx\r\n", (unsigned long)len);
- if (status == APR_SUCCESS) {
- status = apr_brigade_write(stream->bbin, input_flush, stream, data, len);
- if (status == APR_SUCCESS) {
- status = apr_brigade_puts(stream->bbin, input_flush, stream, "\r\n");
- }
- }
- }
- else {
- status = apr_brigade_write(stream->bbin, input_flush, stream, data, len);
- }
- return status;
-}
-
-static int input_add_header(void *str, const char *key, const char *value)
-{
- h2_stream *stream = str;
- apr_status_t status = input_add_data(stream, key, strlen(key), 0);
- if (status == APR_SUCCESS) {
- status = input_add_data(stream, ": ", 2, 0);
- if (status == APR_SUCCESS) {
- status = input_add_data(stream, value, strlen(value), 0);
- if (status == APR_SUCCESS) {
- status = input_add_data(stream, "\r\n", 2, 0);
- }
- }
- }
- return (status == APR_SUCCESS);
+ return apr_brigade_write(stream->bbin, input_flush, stream, data, len);
}
apr_status_t h2_stream_close_input(h2_stream *stream)
@@ -402,21 +371,7 @@ apr_status_t h2_stream_close_input(h2_st
H2_STREAM_IN(APLOG_TRACE2, stream, "close_pre");
if (close_input(stream) && stream->bbin) {
- if (stream->request->chunked) {
- apr_table_t *trailers = stream->request->trailers;
- if (trailers && !apr_is_empty_table(trailers)) {
- status = input_add_data(stream, "0\r\n", 3, 0);
- apr_table_do(input_add_header, stream, trailers, NULL);
- status = input_add_data(stream, "\r\n", 2, 0);
- }
- else {
- status = input_add_data(stream, "0\r\n\r\n", 5, 0);
- }
- }
-
- if (status == APR_SUCCESS) {
- status = h2_stream_input_flush(stream);
- }
+ status = h2_stream_input_flush(stream);
if (status == APR_SUCCESS) {
status = h2_mplx_in_close(stream->session->mplx, stream->id);
}
@@ -444,13 +399,7 @@ apr_status_t h2_stream_write_data(h2_str
stream->session->id, stream->id, (long)len);
H2_STREAM_IN(APLOG_TRACE2, stream, "write_data_pre");
- if (stream->request->chunked) {
- /* if input may have a body and we have not seen any
- * content-length header, we need to chunk the input data.
- */
- status = input_add_data(stream, data, len, 1);
- }
- else {
+ if (!stream->request->chunked) {
stream->input_remaining -= len;
if (stream->input_remaining < 0) {
ap_log_cerror(APLOG_MARK, APLOG_WARNING, 0, stream->session->c,
@@ -463,8 +412,9 @@ apr_status_t h2_stream_write_data(h2_str
h2_stream_rst(stream, H2_ERR_PROTOCOL_ERROR);
return APR_ECONNABORTED;
}
- status = input_add_data(stream, data, len, 0);
}
+
+ status = input_add_data(stream, data, len);
if (status == APR_SUCCESS) {
status = h2_stream_input_flush(stream);
}
Modified: httpd/httpd/trunk/modules/http2/h2_task.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_task.h?rev=1719403&r1=1719402&r2=1719403&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/http2/h2_task.h (original)
+++ httpd/httpd/trunk/modules/http2/h2_task.h Fri Dec 11 12:57:32 2015
@@ -51,13 +51,13 @@ struct h2_task {
struct h2_mplx *mplx;
const struct h2_request *request;
+ int filters_set;
int input_eos;
int serialize_headers;
-
+
struct conn_rec *c;
-
- apr_pool_t *pool; /* pool for task lifetime things */
+ apr_pool_t *pool;
apr_bucket_alloc_t *bucket_alloc;
struct h2_task_input *input;
struct h2_task_output *output;
Modified: httpd/httpd/trunk/modules/http2/h2_task_input.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_task_input.c?rev=1719403&r1=1719402&r2=1719403&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/http2/h2_task_input.c (original)
+++ httpd/httpd/trunk/modules/http2/h2_task_input.c Fri Dec 11 12:57:32 2015
@@ -115,6 +115,8 @@ apr_status_t h2_task_input_read(h2_task_
}
if ((bblen == 0) && input->task->input_eos) {
+ ap_log_cerror(APLOG_MARK, APLOG_TRACE1, 0, f->c,
+ "h2_task_input(%s): eos", input->task->id);
return APR_EOF;
}
@@ -161,17 +163,17 @@ apr_status_t h2_task_input_read(h2_task_
if (!APR_BRIGADE_EMPTY(input->bb)) {
if (mode == AP_MODE_EXHAUSTIVE) {
/* return all we have */
- return h2_util_move(bb, input->bb, readbytes, NULL,
- "task_input_read(exhaustive)");
+ status = h2_util_move(bb, input->bb, readbytes, NULL,
+ "task_input_read(exhaustive)");
}
else if (mode == AP_MODE_READBYTES) {
- return h2_util_move(bb, input->bb, readbytes, NULL,
- "task_input_read(readbytes)");
+ status = h2_util_move(bb, input->bb, readbytes, NULL,
+ "task_input_read(readbytes)");
}
else if (mode == AP_MODE_SPECULATIVE) {
/* return not more than was asked for */
- return h2_util_copy(bb, input->bb, readbytes,
- "task_input_read(speculative)");
+ status = h2_util_copy(bb, input->bb, readbytes,
+ "task_input_read(speculative)");
}
else if (mode == AP_MODE_GETLINE) {
/* we are reading a single LF line, e.g. the HTTP headers */
@@ -186,7 +188,6 @@ apr_status_t h2_task_input_read(h2_task_
"h2_task_input(%s): getline: %s",
input->task->id, buffer);
}
- return status;
}
else {
/* Hmm, well. There is mode AP_MODE_EATCRLF, but we chose not
@@ -194,14 +195,25 @@ apr_status_t h2_task_input_read(h2_task_
ap_log_cerror(APLOG_MARK, APLOG_ERR, APR_ENOTIMPL, f->c,
APLOGNO(02942)
"h2_task_input, unsupported READ mode %d", mode);
- return APR_ENOTIMPL;
+ status = APR_ENOTIMPL;
+ }
+
+ if (APLOGctrace1(f->c)) {
+ apr_brigade_length(bb, 0, &bblen);
+ ap_log_cerror(APLOG_MARK, APLOG_TRACE1, status, f->c,
+ "h2_task_input(%s): return %ld data bytes",
+ input->task->id, (long)bblen);
}
+ return status;
}
if (is_aborted(f)) {
return APR_ECONNABORTED;
}
- return (block == APR_NONBLOCK_READ)? APR_EAGAIN : APR_EOF;
+ status = (block == APR_NONBLOCK_READ)? APR_EAGAIN : APR_EOF;
+ ap_log_cerror(APLOG_MARK, APLOG_TRACE1, status, f->c,
+ "h2_task_input(%s): no data", input->task->id);
+ return status;
}
Re: svn commit: r1719403 - in /httpd/httpd/trunk: CHANGES
modules/http2/h2_conn.c modules/http2/h2_h2.c modules/http2/h2_io.c
modules/http2/h2_io.h modules/http2/h2_mplx.c modules/http2/h2_stream.c
modules/http2/h2_task.h modules/http2/h2_task_input.c
Posted by Yann Ylavic <yl...@gmail.com>.
On Fri, Dec 11, 2015 at 2:57 PM, Stefan Eissing
<st...@greenbytes.de> wrote:
>
>> Am 11.12.2015 um 14:55 schrieb Yann Ylavic <yl...@gmail.com>:
>>
>> Hi Stefan,
>>
>> On Fri, Dec 11, 2015 at 1:57 PM, <ic...@apache.org> wrote:
>>> Author: icing
>>> Date: Fri Dec 11 12:57:32 2015
>>> New Revision: 1719403
>>>
>>> URL: http://svn.apache.org/viewvc?rev=1719403&view=rev
>>> Log:
>>> fixed window update on chunked uploads, moved handling of chunking to later stage
>>
>> Is that a showstopper?
>
> If something else comes up, I'd include it. But I would not stop the release for it.
OK, fine with me, thanks.
Re: svn commit: r1719403 - in /httpd/httpd/trunk: CHANGES modules/http2/h2_conn.c modules/http2/h2_h2.c modules/http2/h2_io.c modules/http2/h2_io.h modules/http2/h2_mplx.c modules/http2/h2_stream.c modules/http2/h2_task.h modules/http2/h2_task_input.c
Posted by Stefan Eissing <st...@greenbytes.de>.
> Am 11.12.2015 um 14:55 schrieb Yann Ylavic <yl...@gmail.com>:
>
> Hi Stefan,
>
> On Fri, Dec 11, 2015 at 1:57 PM, <ic...@apache.org> wrote:
>> Author: icing
>> Date: Fri Dec 11 12:57:32 2015
>> New Revision: 1719403
>>
>> URL: http://svn.apache.org/viewvc?rev=1719403&view=rev
>> Log:
>> fixed window update on chunked uploads, moved handling of chunking to later stage
>
> Is that a showstopper?
If something else comes up, I'd include it. But I would not stop the release for it.
//Stefan
Re: svn commit: r1719403 - in /httpd/httpd/trunk: CHANGES
modules/http2/h2_conn.c modules/http2/h2_h2.c modules/http2/h2_io.c
modules/http2/h2_io.h modules/http2/h2_mplx.c modules/http2/h2_stream.c
modules/http2/h2_task.h modules/http2/h2_task_input.c
Posted by Yann Ylavic <yl...@gmail.com>.
Hi Stefan,
On Fri, Dec 11, 2015 at 1:57 PM, <ic...@apache.org> wrote:
> Author: icing
> Date: Fri Dec 11 12:57:32 2015
> New Revision: 1719403
>
> URL: http://svn.apache.org/viewvc?rev=1719403&view=rev
> Log:
> fixed window update on chunked uploads, moved handling of chunking to later stage
Is that a showstopper?