Skip to content

Commit ef34a41

Browse files
amirlivnehswankjesse
authored andcommitted
Add a LoggingEventListener and use it in okcurl (#4353)
* Add LoggingEventListener and use it in okcurl * Fix tests failing in IP6 environment * Make less assumptions about test environment * Disable retry in test to make test sequence more predictable * Fix javadoc compilation There seems to be inconsistency between javdoc parsing between 'mvn verify' and Travis CI. Before the change, 'mvn clean verify' passes but Travis CI fails due to missing import of okhttp3.OkHttpClient. Just adding the missing import, causes 'mvn verify' to fail die to unused import. Changing the line wrapping seems to appease 'mvn verify'. * Address comments * Remove unused imports
1 parent 8a01554 commit ef34a41

5 files changed

Lines changed: 430 additions & 1 deletion

File tree

okcurl/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@
1818
<artifactId>okhttp</artifactId>
1919
<version>${project.version}</version>
2020
</dependency>
21+
<dependency>
22+
<groupId>${project.groupId}</groupId>
23+
<artifactId>logging-interceptor</artifactId>
24+
<version>${project.version}</version>
25+
</dependency>
2126
<dependency>
2227
<groupId>${project.groupId}</groupId>
2328
<artifactId>okhttp-testing-support</artifactId>

okcurl/src/main/java/okhttp3/curl/Main.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@
4848
import okhttp3.internal.http.StatusLine;
4949
import okhttp3.internal.http2.Http2;
5050
import okhttp3.internal.platform.Platform;
51+
import okhttp3.logging.HttpLoggingInterceptor;
52+
import okhttp3.logging.LoggingEventListener;
5153
import okio.BufferedSource;
5254
import okio.Okio;
5355
import okio.Sink;
@@ -121,6 +123,11 @@ private static String protocols() {
121123
@Option(name = {"-V", "--version"}, description = "Show version number and quit")
122124
public boolean version;
123125

126+
@Option(
127+
name = {"-v", "--verbose"},
128+
description = "Makes " + NAME + " verbose during the operation")
129+
public boolean verbose;
130+
124131
@Arguments(title = "url", description = "Remote resource URL")
125132
public String url;
126133

@@ -184,6 +191,16 @@ private OkHttpClient createClient() {
184191
builder.sslSocketFactory(sslSocketFactory, trustManager);
185192
builder.hostnameVerifier(createInsecureHostnameVerifier());
186193
}
194+
if (verbose) {
195+
HttpLoggingInterceptor.Logger logger =
196+
new HttpLoggingInterceptor.Logger() {
197+
@Override
198+
public void log(String message) {
199+
System.out.println(message);
200+
}
201+
};
202+
builder.eventListenerFactory(new LoggingEventListener.Factory(logger));
203+
}
187204
return builder.build();
188205
}
189206

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
/*
2+
* Copyright (C) 2018 Square, Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package okhttp3.logging;
17+
18+
import java.io.IOException;
19+
import java.net.InetAddress;
20+
import java.net.InetSocketAddress;
21+
import java.net.Proxy;
22+
import java.util.List;
23+
import java.util.concurrent.TimeUnit;
24+
import javax.annotation.Nullable;
25+
import okhttp3.Call;
26+
import okhttp3.Connection;
27+
import okhttp3.EventListener;
28+
import okhttp3.Handshake;
29+
import okhttp3.OkHttpClient;
30+
import okhttp3.Protocol;
31+
import okhttp3.Request;
32+
import okhttp3.Response;
33+
34+
/**
35+
* An OkHttp EventListener, which logs call events. Can be applied as an
36+
* {@linkplain OkHttpClient#eventListenerFactory() event listener factory}.
37+
*
38+
* <p>The format of the logs created by this class should not be considered stable and may change
39+
* slightly between releases. If you need a stable logging format, use your own event listener.
40+
*/
41+
public final class LoggingEventListener extends EventListener {
42+
private final HttpLoggingInterceptor.Logger logger;
43+
private long startNs;
44+
45+
private LoggingEventListener(HttpLoggingInterceptor.Logger logger) {
46+
this.logger = logger;
47+
}
48+
49+
@Override
50+
public void callStart(Call call) {
51+
startNs = System.nanoTime();
52+
53+
logWithTime("callStart: " + call.request());
54+
}
55+
56+
@Override
57+
public void dnsStart(Call call, String domainName) {
58+
logWithTime("dnsStart: " + domainName);
59+
}
60+
61+
@Override
62+
public void dnsEnd(Call call, String domainName, List<InetAddress> inetAddressList) {
63+
logWithTime("dnsEnd: " + inetAddressList);
64+
}
65+
66+
@Override
67+
public void connectStart(Call call, InetSocketAddress inetSocketAddress, Proxy proxy) {
68+
logWithTime("connectStart: " + inetSocketAddress + " " + proxy);
69+
}
70+
71+
@Override
72+
public void secureConnectStart(Call call) {
73+
logWithTime("secureConnectStart");
74+
}
75+
76+
@Override
77+
public void secureConnectEnd(Call call, @Nullable Handshake handshake) {
78+
logWithTime("secureConnectEnd");
79+
}
80+
81+
@Override
82+
public void connectEnd(
83+
Call call, InetSocketAddress inetSocketAddress, Proxy proxy, @Nullable Protocol protocol) {
84+
logWithTime("connectEnd: " + protocol);
85+
}
86+
87+
@Override
88+
public void connectFailed(
89+
Call call,
90+
InetSocketAddress inetSocketAddress,
91+
Proxy proxy,
92+
@Nullable Protocol protocol,
93+
IOException ioe) {
94+
logWithTime("connectFailed: " + protocol + " " + ioe);
95+
}
96+
97+
@Override
98+
public void connectionAcquired(Call call, Connection connection) {
99+
logWithTime("connectionAcquired: " + connection);
100+
}
101+
102+
@Override
103+
public void connectionReleased(Call call, Connection connection) {
104+
logWithTime("connectionReleased");
105+
}
106+
107+
@Override
108+
public void requestHeadersStart(Call call) {
109+
logWithTime("requestHeadersStart");
110+
}
111+
112+
@Override
113+
public void requestHeadersEnd(Call call, Request request) {
114+
logWithTime("requestHeadersEnd");
115+
}
116+
117+
@Override
118+
public void requestBodyStart(Call call) {
119+
logWithTime("requestBodyStart");
120+
}
121+
122+
@Override
123+
public void requestBodyEnd(Call call, long byteCount) {
124+
logWithTime("requestBodyEnd: byteCount=" + byteCount);
125+
}
126+
127+
@Override
128+
public void responseHeadersStart(Call call) {
129+
logWithTime("responseHeadersStart");
130+
}
131+
132+
@Override
133+
public void responseHeadersEnd(Call call, Response response) {
134+
logWithTime("responseHeadersEnd: " + response);
135+
}
136+
137+
@Override
138+
public void responseBodyStart(Call call) {
139+
logWithTime("responseBodyStart");
140+
}
141+
142+
@Override
143+
public void responseBodyEnd(Call call, long byteCount) {
144+
logWithTime("responseBodyEnd: byteCount=" + byteCount);
145+
}
146+
147+
@Override
148+
public void callEnd(Call call) {
149+
logWithTime("callEnd");
150+
}
151+
152+
@Override
153+
public void callFailed(Call call, IOException ioe) {
154+
logWithTime("callFailed: " + ioe);
155+
}
156+
157+
private void logWithTime(String message) {
158+
long timeMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs);
159+
logger.log("[" + timeMs + " ms] " + message);
160+
}
161+
162+
public static class Factory implements EventListener.Factory {
163+
private final HttpLoggingInterceptor.Logger logger;
164+
165+
public Factory() {
166+
this(HttpLoggingInterceptor.Logger.DEFAULT);
167+
}
168+
169+
public Factory(HttpLoggingInterceptor.Logger logger) {
170+
this.logger = logger;
171+
}
172+
173+
@Override
174+
public EventListener create(Call call) {
175+
return new LoggingEventListener(logger);
176+
}
177+
}
178+
}

okhttp-logging-interceptor/src/test/java/okhttp3/logging/HttpLoggingInterceptorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -807,7 +807,7 @@ private Request.Builder request() {
807807
return new Request.Builder().url(url);
808808
}
809809

810-
private static class LogRecorder implements HttpLoggingInterceptor.Logger {
810+
static class LogRecorder implements HttpLoggingInterceptor.Logger {
811811
private final List<String> logs = new ArrayList<>();
812812
private int index;
813813

0 commit comments

Comments
 (0)