[PATCH] Tests: HTTP/2 tests with error_page and return
Maxim Dounin
mdounin at mdounin.ru
Thu May 18 16:09:54 UTC 2023
Hello!
On Thu, May 11, 2023 at 03:31:25PM +0400, Sergey Kandaurov wrote:
>
> > On 3 May 2023, at 01:45, Maxim Dounin <mdounin at mdounin.ru> wrote:
> >
> > Hello!
> >
> > On Tue, May 02, 2023 at 05:10:55PM +0400, Sergey Kandaurov wrote:
> >
> >>> On 2 May 2023, at 00:59, Maxim Dounin <mdounin at mdounin.ru> wrote:
> >>>
> >>> On Mon, May 01, 2023 at 06:46:25PM +0400, Sergey Kandaurov wrote:
> >>>
> >>>> # HG changeset patch
> >>>> # User Sergey Kandaurov <pluknet at nginx.com>
> >>>> # Date 1682952238 -14400
> >>>> # Mon May 01 18:43:58 2023 +0400
> >>>> # Node ID 90aaa942972884dcd67b6744fde39a154fec5d13
> >>>> # Parent 36a4563f7f005184547575f5ac4f22ef53a59c72
> >>>> Tests: HTTP/2 tests with error_page and return.
> >>>>
> >>>> diff --git a/h2_error_page.t b/h2_error_page.t
> >>>> new file mode 100644
> >>>> --- /dev/null
> >>>> +++ b/h2_error_page.t
> >>>> @@ -0,0 +1,88 @@
> >>>> +#!/usr/bin/perl
> >>>> +
> >>>> +# (C) Sergey Kandaurov
> >>>> +# (C) Nginx, Inc.
> >>>> +
> >>>> +# Tests for HTTP/2 protocol with error_page directive.
> >>>> +
> >>>> +###############################################################################
> >>>> +
> >>>> +use warnings;
> >>>> +use strict;
> >>>> +
> >>>> +use Test::More;
> >>>> +
> >>>> +BEGIN { use FindBin; chdir($FindBin::Bin); }
> >>>> +
> >>>> +use lib 'lib';
> >>>> +use Test::Nginx;
> >>>> +use Test::Nginx::HTTP2;
> >>>> +
> >>>> +###############################################################################
> >>>> +
> >>>> +select STDERR; $| = 1;
> >>>> +select STDOUT; $| = 1;
> >>>> +
> >>>> +my $t = Test::Nginx->new()->has(qw/http http_v2 rewrite/)->plan(2)
> >>>> + ->write_file_expand('nginx.conf', <<'EOF');
> >>>> +
> >>>> +%%TEST_GLOBALS%%
> >>>> +
> >>>> +daemon off;
> >>>> +
> >>>> +events {
> >>>> +}
> >>>> +
> >>>> +http {
> >>>> + %%TEST_GLOBALS_HTTP%%
> >>>> +
> >>>> + server {
> >>>> + listen 127.0.0.1:8080 http2;
> >>>> + server_name localhost;
> >>>> +
> >>>> + lingering_close off;
> >>>> +
> >>>> + error_page 400 = /close;
> >>>> +
> >>>> + location / { }
> >>>> +
> >>>> + location /close {
> >>>> + return 444;
> >>>> + }
> >>>> + }
> >>>> +}
> >>>> +
> >>>> +EOF
> >>>> +
> >>>> +$t->run();
> >>>> +
> >>>> +###############################################################################
> >>>> +
> >>>> +my ($sid, $frames, $frame);
> >>>> +
> >>>> +# tests for socket leak with "return 444" in error_page
> >>>> +
> >>>> +# ticket #274
> >>>> +
> >>>> +my $s1 = Test::Nginx::HTTP2->new();
> >>>> +$sid = $s1->new_stream({ headers => [
> >>>> + { name => ':method', value => 'GET' },
> >>>> + { name => ':path', value => '/' },
> >>>> + { name => ':authority', value => 'localhost' }]});
> >>>> +$frames = $s1->read(all => [{ type => 'RST_STREAM' }]);
> >>>> +
> >>>> +($frame) = grep { $_->{type} eq "RST_STREAM" } @$frames;
> >>>> +is($frame->{sid}, $sid, 'error 400 return 444 - missing header');
> >>>
> >>> This clearly needs details about the header being missed, as well
> >>> as expected and observed behaviour, not just the ticket number.
> >>
> >> The description is provided in associated commit logs, a proper
> >> source to seek for details, tagged with appropriate ticket numbers.
> >> A brief description what happens here is given above.
> >
> > Even assuming commits are readily available (they are not in
> > most cases), commit logs and even the code changes are not enough
> > to see what actually missed here: that is, it worth to mention
> > lack of mandatory ":scheme" pseudo-header.
>
> Sure, I don't mind to add extra comments
> if that provides further explanation.
>
> >
> > Also, it might be important to mention why the test is expected to
> > fail without the fix (and if it's expected to fail), and why it
> > succeeds with the fix. Note that the tickets in question are
> > about connection being left open, and not about RST_STREAM not
> > being sent.
>
> Well, the connection is expected to be kept.
Well, not really.
You are testing a configuration with "return 444;", and this
implies that the _connection_ is to be closed, not just a
particular request or a stream. Further, the connection is
expected to be reset when using reset_timedout_connection
(https://nginx.org/r/reset_timedout_connection).
This does not seem to happen now for HTTP/2 connections for some
reason though (but used to happen at least with SPDY, see
https://trac.nginx.org/nginx/ticket/590).
This probably needs to be looked into and fixed.
[...]
--
Maxim Dounin
http://mdounin.ru/
More information about the nginx-devel
mailing list