1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 package org.apache.hc.core5.testing.nio;
29
30 import java.io.IOException;
31 import java.util.List;
32
33 import org.apache.hc.core5.http.Header;
34 import org.apache.hc.core5.http.HttpConnection;
35 import org.apache.hc.core5.http2.frame.FramePrinter;
36 import org.apache.hc.core5.http2.frame.RawFrame;
37 import org.apache.hc.core5.http2.impl.nio.H2StreamListener;
38 import org.apache.hc.core5.testing.classic.LoggingSupport;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
41
42 public class LoggingH2StreamListener implements H2StreamListener {
43
44 public final static LoggingH2StreamListenerStreamListener.html#LoggingH2StreamListener">LoggingH2StreamListener INSTANCE = new LoggingH2StreamListener();
45
46 private final Logger headerLog;
47 private final Logger frameLog;
48 private final Logger framePayloadLog;
49 private final Logger flowCtrlLog;
50 private final FramePrinter framePrinter;
51
52 private LoggingH2StreamListener() {
53 this.framePrinter = new FramePrinter();
54 this.headerLog = LoggerFactory.getLogger("org.apache.hc.core5.http.headers");
55 this.frameLog = LoggerFactory.getLogger("org.apache.hc.core5.http2.frame");
56 this.framePayloadLog = LoggerFactory.getLogger("org.apache.hc.core5.http2.frame.payload");
57 this.flowCtrlLog = LoggerFactory.getLogger("org.apache.hc.core5.http2.flow");
58 }
59
60 private void logFrameInfo(final String prefix, final RawFrame frame) {
61 try {
62 final LogAppendableppendable.html#LogAppendable">LogAppendable logAppendable = new LogAppendable(frameLog, prefix);
63 framePrinter.printFrameInfo(frame, logAppendable);
64 logAppendable.flush();
65 } catch (final IOException ignore) {
66
67 }
68 }
69
70 private void logFramePayload(final String prefix, final RawFrame frame) {
71 try {
72 final LogAppendableppendable.html#LogAppendable">LogAppendable logAppendable = new LogAppendable(framePayloadLog, prefix);
73 framePrinter.printPayload(frame, logAppendable);
74 logAppendable.flush();
75 } catch (final IOException ignore) {
76
77 }
78 }
79
80 private void logFlowControl(final String prefix, final int streamId, final int delta, final int actualSize) {
81 flowCtrlLog.debug("{} stream {} flow control {} -> {}", prefix, streamId, delta, actualSize);
82 }
83
84 @Override
85 public void onHeaderInput(final HttpConnection connection, final int streamId, final List<? extends Header> headers) {
86 if (headerLog.isDebugEnabled()) {
87 final String prefix = LoggingSupport.getId(connection);
88 for (int i = 0; i < headers.size(); i++) {
89 headerLog.debug("{} << {}", prefix, headers.get(i));
90 }
91 }
92 }
93
94 @Override
95 public void onHeaderOutput(final HttpConnection connection, final int streamId, final List<? extends Header> headers) {
96 if (headerLog.isDebugEnabled()) {
97 final String prefix = LoggingSupport.getId(connection);
98 for (int i = 0; i < headers.size(); i++) {
99 headerLog.debug("{} >> {}", prefix, headers.get(i));
100 }
101 }
102 }
103
104 @Override
105 public void onFrameInput(final HttpConnection connection, final int streamId, final RawFrame frame) {
106 if (frameLog.isDebugEnabled()) {
107 logFrameInfo(LoggingSupport.getId(connection) + " <<", frame);
108 }
109 if (framePayloadLog.isDebugEnabled()) {
110 logFramePayload(LoggingSupport.getId(connection) + " <<", frame);
111 }
112 }
113
114 @Override
115 public void onFrameOutput(final HttpConnection connection, final int streamId, final RawFrame frame) {
116 if (frameLog.isDebugEnabled()) {
117 logFrameInfo(LoggingSupport.getId(connection) + " >>", frame);
118 }
119 if (framePayloadLog.isDebugEnabled()) {
120 logFramePayload(LoggingSupport.getId(connection) + " >>", frame);
121 }
122 }
123
124 @Override
125 public void onInputFlowControl(final HttpConnection connection, final int streamId, final int delta, final int actualSize) {
126 if (flowCtrlLog.isDebugEnabled()) {
127 logFlowControl(LoggingSupport.getId(connection) + " in", streamId, delta, actualSize);
128 }
129 }
130
131 @Override
132 public void onOutputFlowControl(final HttpConnection connection, final int streamId, final int delta, final int actualSize) {
133 if (flowCtrlLog.isDebugEnabled()) {
134 logFlowControl(LoggingSupport.getId(connection) + " out", streamId, delta, actualSize);
135 }
136 }
137
138 }