Error occurs when both padding and continuation are enabled

Hi,

Another error I met recently. It occurred when both padding and
continuation are enabled.

A normal HEADERS frame was divided as follows:
HEADERS ===> HEADERS(PADDED_FLAG) + CONTINUATION + CONTINUATION

After sending these frames, I got an error. In the debug log file, I
found
“client sent inappropriate frame while CONTINUATION was expected while
processing HTTP/2 connection”. Then I read the source code (v 1.9.9),
and
located the function “ngx_http_v2_handle_continuation” (ngx_http_v2.c,
line
1749). It seems NGINX does not skip the “padding part”, but tries to
read
“type” field in the next CONTINUATION frame directly.

However, when testing padding and continuation frame separately, NGINX
can
handle both cases well. I don’t know whether I did something wrong or
this
is a bug in NGINX. I also sent the same frames to other servers (nghttp,
h2o, GWS), and got the responses successfully.

Thanks!

Shengtuo Hu

On Tuesday 26 January 2016 16:00:08 Shengtuo Hu wrote:

processing HTTP/2 connection". Then I read the source code (v 1.9.9), and
located the function “ngx_http_v2_handle_continuation” (ngx_http_v2.c, line
1749). It seems NGINX does not skip the “padding part”, but tries to read
“type” field in the next CONTINUATION frame directly.

[…]

Yes, you’re right. It isn’t able to skip padding between HEADERS and
CONTINUATION frames.

wbr, Valentin V. Bartenev

On Tuesday 26 January 2016 14:54:56 Valentin V. Bartenev wrote:

“client sent inappropriate frame while CONTINUATION was expected while
processing HTTP/2 connection”. Then I read the source code (v 1.9.9), and
located the function “ngx_http_v2_handle_continuation” (ngx_http_v2.c, line
1749). It seems NGINX does not skip the “padding part”, but tries to read
“type” field in the next CONTINUATION frame directly.

[…]

Yes, you’re right. It isn’t able to skip padding between HEADERS and
CONTINUATION frames.

That has been fixed: http://hg.nginx.org/nginx/rev/0e0e2e522fa2

Thanks for the report.

wbr, Valentin V. Bartenev