1818import ch .qos .logback .classic .Level ;
1919import ch .qos .logback .classic .Logger ;
2020import ch .qos .logback .classic .spi .ILoggingEvent ;
21- import ch .qos .logback .core .AppenderBase ;
2221import ch .qos .logback .core .read .ListAppender ;
2322import io .netty .buffer .ByteBuf ;
2423import io .netty .channel .Channel ;
5352import reactor .netty .BaseHttpTest ;
5453import reactor .netty .ByteBufFlux ;
5554import reactor .netty .Connection ;
55+ import reactor .netty .LogTracker ;
5656import reactor .netty .NettyPipeline ;
5757import reactor .netty .http .client .HttpClient ;
5858import reactor .netty .http .client .HttpClientConfig ;
7575import java .util .List ;
7676import java .util .concurrent .CountDownLatch ;
7777import java .util .concurrent .TimeUnit ;
78- import java .util .concurrent .atomic .AtomicReference ;
7978import java .util .concurrent .atomic .AtomicBoolean ;
8079import java .util .concurrent .atomic .AtomicLong ;
8180import java .util .function .Function ;
@@ -366,33 +365,24 @@ void testAccessLog(HttpServer server, HttpClient client) throws Exception {
366365 .accessLog (true )
367366 .bindNow ();
368367
369- AccessLogAppender accessLogAppender = new AccessLogAppender ();
370- accessLogAppender .start ();
371- Logger accessLogger = (Logger ) LoggerFactory .getLogger ("reactor.netty.http.server.AccessLog" );
372- AtomicReference <String > protocol = new AtomicReference <>();
373- try {
374- accessLogger .addAppender (accessLogAppender );
375-
368+ HttpProtocol [] serverProtocols = server .configuration ().protocols ();
369+ HttpProtocol [] clientProtocols = client .configuration ().protocols ();
370+ boolean isHttp11 = (serverProtocols .length == 1 && serverProtocols [0 ] == HttpProtocol .HTTP11 ) ||
371+ (clientProtocols .length == 1 && clientProtocols [0 ] == HttpProtocol .HTTP11 );
372+ String expectedLogRecord = "GET / HTTP/" + (isHttp11 ? "1.1" : "2.0" ) + "\" 200" ;
373+ try (LogTracker logTracker = new LogTracker ("reactor.netty.http.server.AccessLog" , expectedLogRecord )) {
376374 client .port (disposableServer .port ())
377375 .get ()
378376 .uri ("/" )
379377 .responseSingle ((res , bytes ) -> {
380- protocol .set (res .responseHeaders ().get ("x-http2-stream-id" ) != null ? "2.0" : "1.1" );
381378 return Mono .just (res .responseHeaders ().get (NettyPipeline .AccessLogHandler ));
382379 })
383380 .as (StepVerifier ::create )
384381 .expectNext ("FOUND" )
385382 .expectComplete ()
386383 .verify (Duration .ofSeconds (5 ));
387384
388- assertThat (accessLogAppender .latch .await (5 , TimeUnit .SECONDS )).isTrue ();
389-
390- assertThat (accessLogAppender .list ).hasSize (1 );
391- assertThat (accessLogAppender .list .get (0 ).getFormattedMessage ()).contains ("GET / HTTP/" + protocol .get () + "\" 200" );
392- }
393- finally {
394- accessLogger .detachAppender (accessLogAppender );
395- accessLogAppender .stop ();
385+ assertThat (logTracker .latch .await (5 , TimeUnit .SECONDS )).isTrue ();
396386 }
397387 }
398388
@@ -417,12 +407,8 @@ void testAccessLogWithForwardedHeader(HttpServer server, HttpClient client) thro
417407 args .connectionInformation ().scheme ()))
418408 .bindNow ();
419409
420- AccessLogAppender accessLogAppender = new AccessLogAppender ();
421- accessLogAppender .start ();
422- Logger accessLogger = (Logger ) LoggerFactory .getLogger ("reactor.netty.http.server.AccessLog" );
423- try {
424- accessLogger .addAppender (accessLogAppender );
425-
410+ String expectedLogRecord = "192.0.2.60 203.0.113.43 http" ;
411+ try (LogTracker logTracker = new LogTracker ("reactor.netty.http.server.AccessLog" , expectedLogRecord )) {
426412 client .port (disposableServer .port ())
427413 .doOnRequest ((req , cnx ) -> req .addHeader ("Forwarded" ,
428414 "for=192.0.2.60;proto=http;host=203.0.113.43" ))
@@ -434,14 +420,7 @@ void testAccessLogWithForwardedHeader(HttpServer server, HttpClient client) thro
434420 .expectComplete ()
435421 .verify (Duration .ofSeconds (5 ));
436422
437- assertThat (accessLogAppender .latch .await (5 , TimeUnit .SECONDS )).isTrue ();
438-
439- assertThat (accessLogAppender .list ).hasSize (1 );
440- assertThat (accessLogAppender .list .get (0 ).getFormattedMessage ()).isEqualTo ("192.0.2.60 203.0.113.43 http" );
441- }
442- finally {
443- accessLogger .detachAppender (accessLogAppender );
444- accessLogAppender .stop ();
423+ assertThat (logTracker .latch .await (5 , TimeUnit .SECONDS )).isTrue ();
445424 }
446425 }
447426
@@ -761,18 +740,6 @@ else if (clientProtocols.length == 2 && clientProtocols[1] == HttpProtocol.H2C)
761740 }
762741 }
763742
764- static final class AccessLogAppender extends AppenderBase <ILoggingEvent > {
765-
766- final CountDownLatch latch = new CountDownLatch (1 );
767- final List <ILoggingEvent > list = new ArrayList <>();
768-
769- @ Override
770- protected void append (ILoggingEvent eventObject ) {
771- list .add (eventObject );
772- latch .countDown ();
773- }
774- }
775-
776743 static final class IdleTimeoutTestChannelInboundHandler extends ChannelInboundHandlerAdapter {
777744
778745 final CountDownLatch latch = new CountDownLatch (1 );
0 commit comments