in libraries/bot-connector/src/main/java/com/microsoft/bot/restclient/interceptors/LoggingInterceptor.java [59:191]
public Response intercept(Chain chain) throws IOException {
// get logger
Request request = chain.request();
String context = request.header(LOGGING_HEADER);
String bodyLoggingHeader = request.header(BODY_LOGGING);
boolean bodyLogging = bodyLoggingHeader == null || Boolean.parseBoolean(bodyLoggingHeader);
if (context == null) {
context = "";
}
Logger logger = LoggerFactory.getLogger(context);
// log URL
if (logLevel != LogLevel.NONE) {
log(logger, String.format("--> %s %s", request.method(), request.url()));
}
// log headers
if (logLevel == LogLevel.HEADERS || logLevel == LogLevel.BODY_AND_HEADERS) {
for (String header : request.headers().names()) {
if (!LOGGING_HEADER.equals(header)) {
log(logger, String.format("%s: %s", header, Joiner.on(", ").join(request.headers(header))));
}
}
}
// log body
if (bodyLogging
&& (logLevel == LogLevel.BODY || logLevel == LogLevel.BODY_AND_HEADERS)
&& request.body() != null) {
Buffer buffer = new Buffer();
request.body().writeTo(buffer);
Charset charset = StandardCharsets.UTF_8;
MediaType contentType = request.body().contentType();
if (contentType != null) {
charset = contentType.charset(charset);
}
if (isPlaintext(buffer)) {
String content = buffer.clone().readString(charset);
if (logLevel.isPrettyJson()) {
try {
content = MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(
MAPPER.readValue(content, JsonNode.class));
} catch (Exception ignore) { //NOPMD
// swallow, keep original content
}
}
log(logger, String.format("%s-byte body:\n%s", request.body().contentLength(), content));
log(logger, "--> END " + request.method());
} else {
log(logger, "--> END " + request.method() + " (binary "
+ request.body().contentLength() + "-byte body omitted)");
}
}
long startNs = System.nanoTime();
Response response;
try {
response = chain.proceed(request);
} catch (Exception e) {
if (logLevel != LogLevel.NONE) {
log(logger, "<-- HTTP FAILED: " + e);
}
throw e;
}
long tookMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs);
ResponseBody responseBody = response.body();
long contentLength = responseBody.contentLength();
String bodySize = contentLength != -1 ? contentLength + "-byte" : "unknown-length";
// log URL
if (logLevel != LogLevel.NONE) {
log(logger, String.format("<-- %s %s %s (%s ms, %s body)",
response.code(), response.message(), response.request().url(), tookMs, bodySize));
}
// log headers
if (logLevel == LogLevel.HEADERS || logLevel == LogLevel.BODY_AND_HEADERS) {
for (String header : response.headers().names()) {
log(logger, String.format("%s: %s", header, Joiner.on(", ").join(response.headers(header))));
}
}
// log body
if (bodyLogging
&& (logLevel == LogLevel.BODY || logLevel == LogLevel.BODY_AND_HEADERS)
&& response.body() != null) {
BufferedSource source = responseBody.source();
source.request(Long.MAX_VALUE); // Buffer the entire body.
Buffer buffer = source.buffer();
Charset charset = StandardCharsets.UTF_8;
MediaType contentType = responseBody.contentType();
if (contentType != null) {
try {
charset = contentType.charset(charset);
} catch (UnsupportedCharsetException e) {
log(logger, "Couldn't decode the response body; charset is likely malformed.");
log(logger, "<-- END HTTP");
return response;
}
}
boolean gzipped = response.header("content-encoding") != null
&& StringUtils.containsIgnoreCase(response.header("content-encoding"), "gzip");
if (!isPlaintext(buffer) && !gzipped) {
log(logger, "<-- END HTTP (binary " + buffer.size() + "-byte body omitted)");
return response;
}
String content;
if (gzipped) {
content = CharStreams.toString(
new InputStreamReader(new GZIPInputStream(buffer.clone().inputStream())));
} else {
content = buffer.clone().readString(charset);
}
if (logLevel.isPrettyJson()) {
try {
content = MAPPER.writerWithDefaultPrettyPrinter()
.writeValueAsString(MAPPER.readValue(content, JsonNode.class));
} catch (Exception ignore) { //NOPMD
// swallow, keep original content
}
}
log(logger, String.format("%s-byte body:\n%s", buffer.size(), content));
log(logger, "<-- END HTTP");
}
return response;
}