SPDY: avoid creating flush frames.

Previously, an empty frame object was created for an output chain that contains
only sync or flush empty buffers.  But since 39d7eef2e332 every DATA frame has
the flush flag set on its last buffer, so there's no need any more in additional
flush buffers in the output queue and they can be skipped.

Note that such flush frames caused an incorrect $body_bytes_sent value.
This commit is contained in:
Valentin Bartenev 2014-04-07 23:35:33 +04:00
parent a547f4ac15
commit 5cf11ab2e0

View File

@ -625,6 +625,20 @@ ngx_http_spdy_send_chain(ngx_connection_t *fc, ngx_chain_t *in, off_t limit)
r = fc->data; r = fc->data;
stream = r->spdy_stream; stream = r->spdy_stream;
#if (NGX_SUPPRESS_WARN)
size = 0;
#endif
while (in) {
size = ngx_buf_size(in->buf);
if (size || in->buf->last_buf) {
break;
}
in = in->next;
}
if (in == NULL) { if (in == NULL) {
if (stream->queued) { if (stream->queued) {
@ -638,8 +652,6 @@ ngx_http_spdy_send_chain(ngx_connection_t *fc, ngx_chain_t *in, off_t limit)
sc = stream->connection; sc = stream->connection;
size = ngx_buf_size(in->buf);
if (size && ngx_http_spdy_flow_control(sc, stream) == NGX_DECLINED) { if (size && ngx_http_spdy_flow_control(sc, stream) == NGX_DECLINED) {
fc->write->delayed = 1; fc->write->delayed = 1;
return in; return in;
@ -850,8 +862,6 @@ ngx_http_spdy_filter_get_data_frame(ngx_http_spdy_stream_t *stream,
"spdy:%ui create DATA frame %p: len:%uz flags:%ui", "spdy:%ui create DATA frame %p: len:%uz flags:%ui",
stream->id, frame, len, flags); stream->id, frame, len, flags);
if (len || flags) {
cl = ngx_chain_get_free_buf(stream->request->pool, cl = ngx_chain_get_free_buf(stream->request->pool,
&stream->free_data_headers); &stream->free_data_headers);
if (cl == NULL) { if (cl == NULL) {
@ -891,7 +901,6 @@ ngx_http_spdy_filter_get_data_frame(ngx_http_spdy_stream_t *stream,
first = cl; first = cl;
last->buf->flush = 1; last->buf->flush = 1;
}
frame->first = first; frame->first = first;
frame->last = last; frame->last = last;