001package org.hl7.fhir.r5.utils.client.network; 002 003import okhttp3.*; 004import okio.Buffer; 005 006import org.hl7.fhir.utilities.ToolingClientLogger; 007 008import javax.annotation.Nonnull; 009import java.io.IOException; 010import java.util.ArrayList; 011import java.util.List; 012import java.util.Map; 013 014public class FhirLoggingInterceptor implements Interceptor { 015 016 private ToolingClientLogger logger; 017 018 public FhirLoggingInterceptor(ToolingClientLogger logger) { 019 this.logger = logger; 020 } 021 022 public FhirLoggingInterceptor setLogger(ToolingClientLogger logger) { 023 this.logger = logger; 024 return this; 025 } 026 027 @Override 028 public Response intercept(@Nonnull Interceptor.Chain chain) throws IOException { 029 // Log Request 030 Request request = chain.request(); 031 List<String> hdrs = new ArrayList<>(); 032 for (String s : request.headers().toString().split("\\n")) { 033 hdrs.add(s.trim()); 034 } 035 byte[] cnt = null; 036 if (request.body() != null) { 037 Buffer buf = new Buffer(); 038 request.body().writeTo(buf); 039 cnt = buf.readByteArray(); 040 } 041 if (logger != null) { 042 logger.logRequest(request.method(), request.url().toString(), hdrs, cnt); 043 } 044 045 // Log Response 046 Response response = null; 047 response = chain.proceed(chain.request()); 048 049 MediaType contentType = null; 050 byte[] bodyBytes = null; 051 if (response.body() != null) { 052 contentType = response.body().contentType(); 053 bodyBytes = response.body().bytes(); 054 } 055 056 // Get Headers as List 057 List<String> headerList = new ArrayList<>(); 058 Map<String, List<String>> headerMap = response.headers().toMultimap(); 059 headerMap.keySet().forEach(key -> headerMap.get(key).forEach(value -> headerList.add(key + ":" + value))); 060 061 if (logger != null) { 062 logger.logResponse(Integer.toString(response.code()), headerList, bodyBytes); 063 } 064 065 // Reading byte[] clears body. Need to recreate. 066 ResponseBody body = ResponseBody.create(bodyBytes, contentType); 067 return response.newBuilder().body(body).build(); 068 } 069}