One tip, if you call "pytest -vvv -k test_h2_202_03b", it will run just that 
test and raise LogLevel for several "interesting" modules.

The error log in test/gen/apache/logs/error_log will then show just that one 
test case. It's a convenient way to get more information without meddling with 
the test case configs.

The list of modules for which the log level is raised on "-vvv" is found in 
test/modules/http2/env.py:73

        self.add_httpd_log_modules(["http2", "proxy_http2", "h2test", "proxy", 
"proxy_http"])

we can add "cgi" or others if those are of interest.

> Am 08.03.2023 um 22:44 schrieb Rainer Jung <rainer.j...@kippdata.de>:
> 
> Hi there,
> 
> I currently get three consistent pytest failures:
> 
> 
> A) FAILED modules/http2/test_202_trailer.py::TestTrailers::test_h2_202_03b
> 
> Response code is 500 and trace 8 server log shows:
> 
> - we see the right request
> 
> [Wed Mar 08 22:03:35.699234 2023] [aptest:info] [pid 4606:tid 
> 140645737559808] [remote 127.0.0.1:50490] test[test_h2_202_03b]: POST 
> //echohd.py?name=X HTTP/2.0
> [Wed Mar 08 22:03:35.699247 2023] [http:trace4] [pid 4606:tid 
> 140645737559808] http_request.c(436): [remote 127.0.0.1:50490] Headers 
> received from client:
> [Wed Mar 08 22:03:35.699254 2023] [http:trace4] [pid 4606:tid 
> 140645737559808] http_request.c(440): [remote 127.0.0.1:50490]   Accept: */*
> [Wed Mar 08 22:03:35.699259 2023] [http:trace4] [pid 4606:tid 
> 140645737559808] http_request.c(440): [remote 127.0.0.1:50490] 
> Accept-Encoding: gzip, deflate
> [Wed Mar 08 22:03:35.699264 2023] [http:trace4] [pid 4606:tid 
> 140645737559808] http_request.c(440): [remote 127.0.0.1:50490] User-Agent: 
> nghttp2/1.52.0
> [Wed Mar 08 22:03:35.699268 2023] [http:trace4] [pid 4606:tid 
> 140645737559808] http_request.c(440): [remote 127.0.0.1:50490] 
> Content-Length: 119
> [Wed Mar 08 22:03:35.699273 2023] [http:trace4] [pid 4606:tid 
> 140645737559808] http_request.c(440): [remote 127.0.0.1:50490]   Host: 
> 127.0.0.1:5001
> [Wed Mar 08 22:03:35.699277 2023] [http:trace4] [pid 4606:tid 
> 140645737559808] http_request.c(440): [remote 127.0.0.1:50490] Ap-Test-Name: 
> test_h2_202_03b
> [Wed Mar 08 22:03:35.699282 2023] [http:trace4] [pid 4606:tid 
> 140645737559808] http_request.c(440): [remote 127.0.0.1:50490]   X: 3b
> 
> [Wed Mar 08 22:03:35.699425 2023] [authz_core:debug] [pid 4606:tid 
> 140645737559808] mod_authz_core.c(818): [remote 127.0.0.1:50490] AH01626: 
> authorization result of Require all granted: granted
> [Wed Mar 08 22:03:35.699440 2023] [authz_core:debug] [pid 4606:tid 
> 140645737559808] mod_authz_core.c(818): [remote 127.0.0.1:50490] AH01626: 
> authorization result of <RequireAny>: granted
> [Wed Mar 08 22:03:35.699446 2023] [core:trace3] [pid 4606:tid 
> 140645737559808] request.c(362): [remote 127.0.0.1:50490] request authorized 
> without authentication by access_checker_ex hook: /echohd.py
> 
> We get the right response from the python CGI script:
> 
> [Wed Mar 08 22:03:35.784148 2023] [cgid:trace4] [pid 4606:tid 
> 140645737559808] util_script.c(576): [remote 127.0.0.1:50490] Headers from 
> script 'echohd.py':
> [Wed Mar 08 22:03:35.784206 2023] [cgid:trace4] [pid 4606:tid 
> 140645737559808] util_script.c(577): [remote 127.0.0.1:50490]   Status: 200
> [Wed Mar 08 22:03:35.784219 2023] [cgid:trace1] [pid 4606:tid 
> 140645737559808] util_script.c(658): [remote 127.0.0.1:50490] Status line 
> from script 'echohd.py': 200
> [Wed Mar 08 22:03:35.784234 2023] [cgid:trace4] [pid 4606:tid 
> 140645737559808] util_script.c(577): [remote 127.0.0.1:50490] Content-Type: 
> text/plain
> [Wed Mar 08 22:03:35.784255 2023] [filter:trace4] [pid 4606:tid 
> 140645737559808] mod_filter.c(169): [remote 127.0.0.1:50490] Content-Type 
> 'text/plain' ...
> [Wed Mar 08 22:03:35.784268 2023] [filter:trace4] [pid 4606:tid 
> 140645737559808] mod_filter.c(181): [remote 127.0.0.1:50490] ... did not 
> match 'text/html'
> [Wed Mar 08 22:03:35.784278 2023] [filter:trace4] [pid 4606:tid 
> 140645737559808] mod_filter.c(175): [remote 127.0.0.1:50490] ... matched 
> 'text/plain'
> 
> deflate compression wants to kick in (no idea whether that's part of the 
> problem)
> 
> [Wed Mar 08 22:03:35.784288 2023] [filter:trace2] [pid 4606:tid 
> 140645737559808] mod_filter.c(188): [remote 127.0.0.1:50490] Content-Type 
> condition for 'deflate' matched
> 
> and now a connection reset!
> 
> [Wed Mar 08 22:03:35.788364 2023] [cgid:trace1] [pid 4606:tid 
> 140645737559808] mod_cgid.c(1686): (104)Connection reset by peer: [remote 
> 127.0.0.1:50490] Failed to flush CGI output to client
> 
> and another request for that URL comes in:
> 
> [Wed Mar 08 22:03:35.788486 2023] [ssl:debug] [pid 4606:tid 140645737559808] 
> ssl_engine_kernel.c(422): [remote 127.0.0.1:50490] AH02034: Subsequent (No.2) 
> HTTPS request received for child 0 (server cgi.tests.httpd.apache.org:443)
> [Wed Mar 08 22:03:35.788500 2023] [aptest:info] [pid 4606:tid 
> 140645737559808] [remote 127.0.0.1:50490] test[test_h2_202_03b]: POST 
> //echohd.py?name=X HTTP/2.0
> 
> And now we send the 500 code, probably due to the connection reset
> 
> [Wed Mar 08 22:03:35.788676 2023] [http2:debug] [pid 4606:tid 
> 140645720774400] h2_stream.c(1537): [client 127.0.0.1:50490] AH03073: 
> h2_stream(4606-0-13,HALF_CLOSED_REMOTE): submit response 500
> 
> The access log also shows two of these requests:
> 
> 127.0.0.1 - - [08/Mar/2023:22:03:35 +0100] "POST //echohd.py?name=X HTTP/2.0" 
> 500 678 "-" "nghttp2/1.52.0" 1
> 127.0.0.1 - - [08/Mar/2023:22:03:35 +0100] "POST //echohd.py?name=X HTTP/2.0" 
> 200 0 "-" "nghttp2/1.52.0" 1
> 
> And in the trace 8 error log except for the "Subsequent (No.2) HTTPS request 
> received" I don't see where this would get a code 200 as indicated in the 
> access log.
> 
> Client side log:
> 
> execute: nghttp --header=host: cgi.tests.httpd.apache.org:5001 -v 
> --header=AP-Test-Name: test_h2_202_03b --header X: 3b 
> --data=/tmp/esupport-testdir/pytest-event-111/gen/nghttp.req.body 
> https://127.0.0.1:5001//echohd.py?name=X
> send frame SETTINGS on stream 0
> send frame PRIORITY on stream 3
> send frame PRIORITY on stream 5
> send frame PRIORITY on stream 7
> send frame PRIORITY on stream 9
> send frame PRIORITY on stream 11
> send frame HEADERS on stream 13
> send frame DATA on stream 13
> recv frame SETTINGS on stream 0
> recv frame WINDOW_UPDATE on stream 0
> recv frame SETTINGS on stream 0
> send frame SETTINGS on stream 0
> stream 13 header :status: 500
> stream 13 header content-length: 531
> stream 13 header content-type: text/html;
> stream 13 header date: Wed,
> stream 13 header server: Apache/2.4.56
> stream 13: recv 5 header
> stream 13: 531 DATA bytes added
> send frame GOAWAY on stream 0
> 
> 
> B) FAILED modules/http2/test_202_trailer.py::TestTrailers::test_h2_202_04
> 
> Again status code 500.
> 
> Server side same situation in error log:
> 
> [Wed Mar 08 22:17:50.869360 2023] [aptest:info] [pid 16578:tid 
> 140549696104192] [remote 127.0.0.1:32936] test[test_h2_202_04]: POST 
> //echohd.py?name=X HTTP/2.0
> [Wed Mar 08 22:17:50.869375 2023] [http:trace4] [pid 16578:tid 
> 140549696104192] http_request.c(436): [remote 127.0.0.1:32936] Headers 
> received from client:
> [Wed Mar 08 22:17:50.869382 2023] [http:trace4] [pid 16578:tid 
> 140549696104192] http_request.c(440): [remote 127.0.0.1:32936]   Accept: */*
> [Wed Mar 08 22:17:50.869387 2023] [http:trace4] [pid 16578:tid 
> 140549696104192] http_request.c(440): [remote 127.0.0.1:32936] 
> Accept-Encoding: gzip, deflate
> [Wed Mar 08 22:17:50.869392 2023] [http:trace4] [pid 16578:tid 
> 140549696104192] http_request.c(440): [remote 127.0.0.1:32936] User-Agent: 
> nghttp2/1.52.0
> [Wed Mar 08 22:17:50.869396 2023] [http:trace4] [pid 16578:tid 
> 140549696104192] http_request.c(440): [remote 127.0.0.1:32936] 
> Content-Length: 119
> [Wed Mar 08 22:17:50.869401 2023] [http:trace4] [pid 16578:tid 
> 140549696104192] http_request.c(440): [remote 127.0.0.1:32936]   Host: 
> 127.0.0.1:5001
> [Wed Mar 08 22:17:50.869405 2023] [http:trace4] [pid 16578:tid 
> 140549696104192] http_request.c(440): [remote 127.0.0.1:32936] Ap-Test-Name: 
> test_h2_202_04
> [Wed Mar 08 22:17:50.869410 2023] [http:trace4] [pid 16578:tid 
> 140549696104192] http_request.c(440): [remote 127.0.0.1:32936]   X: 4a
> [Wed Mar 08 22:17:50.869414 2023] [http:trace4] [pid 16578:tid 
> 140549696104192] http_request.c(440): [remote 127.0.0.1:32936]   Trailer: x
> [Wed Mar 08 22:17:50.869527 2023] [authz_core:debug] [pid 16578:tid 
> 140549696104192] mod_authz_core.c(818): [remote 127.0.0.1:32936] AH01626: 
> authorization result of Require all granted: granted
> [Wed Mar 08 22:17:50.869540 2023] [authz_core:debug] [pid 16578:tid 
> 140549696104192] mod_authz_core.c(818): [remote 127.0.0.1:32936] AH01626: 
> authorization result of <RequireAny>: granted
> [Wed Mar 08 22:17:50.869546 2023] [core:trace3] [pid 16578:tid 
> 140549696104192] request.c(362): [remote 127.0.0.1:32936] request authorized 
> without authentication by access_checker_ex hook: /echohd.py
> [Wed Mar 08 22:17:50.949661 2023] [cgid:trace4] [pid 16578:tid 
> 140549696104192] util_script.c(576): [remote 127.0.0.1:32936] Headers from 
> script 'echohd.py':
> [Wed Mar 08 22:17:50.949710 2023] [cgid:trace4] [pid 16578:tid 
> 140549696104192] util_script.c(577): [remote 127.0.0.1:32936]   Status: 200
> [Wed Mar 08 22:17:50.949718 2023] [cgid:trace1] [pid 16578:tid 
> 140549696104192] util_script.c(658): [remote 127.0.0.1:32936] Status line 
> from script 'echohd.py': 200
> [Wed Mar 08 22:17:50.949735 2023] [cgid:trace4] [pid 16578:tid 
> 140549696104192] util_script.c(577): [remote 127.0.0.1:32936] Content-Type: 
> text/plain
> [Wed Mar 08 22:17:50.949749 2023] [filter:trace4] [pid 16578:tid 
> 140549696104192] mod_filter.c(169): [remote 127.0.0.1:32936] Content-Type 
> 'text/plain' ...
> [Wed Mar 08 22:17:50.949755 2023] [filter:trace4] [pid 16578:tid 
> 140549696104192] mod_filter.c(181): [remote 127.0.0.1:32936] ... did not 
> match 'text/html'
> [Wed Mar 08 22:17:50.949760 2023] [filter:trace4] [pid 16578:tid 
> 140549696104192] mod_filter.c(175): [remote 127.0.0.1:32936] ... matched 
> 'text/plain'
> [Wed Mar 08 22:17:50.949765 2023] [filter:trace2] [pid 16578:tid 
> 140549696104192] mod_filter.c(188): [remote 127.0.0.1:32936] Content-Type 
> condition for 'deflate' matched
> [Wed Mar 08 22:17:50.952509 2023] [cgid:trace1] [pid 16578:tid 
> 140549696104192] mod_cgid.c(1686): (104)Connection reset by peer: [remote 
> 127.0.0.1:32936] Failed to flush CGI output to client
> [Wed Mar 08 22:17:50.952620 2023] [ssl:debug] [pid 16578:tid 140549696104192] 
> ssl_engine_kernel.c(422): [remote 127.0.0.1:32936] AH02034: Subsequent (No.2) 
> HTTPS request received for child 1792 (server cgi.tests.httpd.apache.org:443)
> [Wed Mar 08 22:17:50.952634 2023] [aptest:info] [pid 16578:tid 
> 140549696104192] [remote 127.0.0.1:32936] test[test_h2_202_04]: POST 
> //echohd.py?name=X HTTP/2.0
> [Wed Mar 08 22:17:50.952816 2023] [http2:debug] [pid 16578:tid 
> 140549549963008] h2_stream.c(1537): [client 127.0.0.1:32936] AH03073: 
> h2_stream(16578-0-13,HALF_CLOSED_REMOTE): submit response 500
> 
> Access log again shows two requests:
> 
> 127.0.0.1 - - [08/Mar/2023:22:17:50 +0100] "POST //echohd.py?name=X HTTP/2.0" 
> 500 678 "-" "nghttp2/1.52.0" 1
> 127.0.0.1 - - [08/Mar/2023:22:17:50 +0100] "POST //echohd.py?name=X HTTP/2.0" 
> 200 0 "-" "nghttp2/1.52.0" 1
> 
> 
> Client side log:
> 
> execute: nghttp --header=host: cgi.tests.httpd.apache.org:5001 -v 
> --header=AP-Test-Name: test_h2_202_04 --header X: 4a --trailer X: 4b 
> --data=/tmp/esupport-testdir/pytest-event-111/gen/nghttp.req.body 
> https://127.0.0.1:5001//echohd.py?name=X
> send frame SETTINGS on stream 0
> send frame PRIORITY on stream 3
> send frame PRIORITY on stream 5
> send frame PRIORITY on stream 7
> send frame PRIORITY on stream 9
> send frame PRIORITY on stream 11
> send frame HEADERS on stream 13
> send frame DATA on stream 13
> send frame HEADERS on stream 13
> recv frame SETTINGS on stream 0
> recv frame WINDOW_UPDATE on stream 0
> recv frame SETTINGS on stream 0
> send frame SETTINGS on stream 0
> stream 13 header :status: 500
> stream 13 header content-length: 531
> stream 13 header content-type: text/html;
> stream 13 header date: Wed,
> stream 13 header server: Apache/2.4.56
> stream 13: recv 5 header
> stream 13: 531 DATA bytes added
> send frame GOAWAY on stream 0
> 
> 
> C) FAILED modules/http2/test_600_h2proxy.py::TestH2Proxy::test_h2_600_05[on]
> This one does not fail always but almost always
> 
> >       assert int(r.json["port"]) == exp_port
> E       AssertionError: assert 5004 == 5002
> E        +  where 5004 = int('5004')
> 
> Here I think the problem is, that the two requests running sequentially in 
> this test hit different httpd child processes, which do not share a common 
> proxy connection pool. Thus reusing connections isn't reliably testable. It 
> would need to somehow use the same curl instance for both requests (and hope 
> curl itself reuses its connection) to hit the same httpd child.
> 
> I see, that in env.py there is already a function curl_raw which can take an 
> array of urls, but it seems it only returns the last result.
> 
> Maybe one could have a variant with a url array and a callback paraeter, 
> which it calls for each result together with the array index, so that the 
> callback can do whatever check it likes?
> 
> So C) at least is IMHO understandable, but I don' understand A) and B), which 
> seem to have the same odd behavior.
> 
> Thanks and regards,
> 
> Rainer

Reply via email to