package com.prateekj.snooper.okhttp; import android.util.Log; import com.prateekj.snooper.AndroidSnooper; import com.prateekj.snooper.networksnooper.model.HttpCall; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import okhttp3.Headers; import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; import okio.Buffer; import static okhttp3.ResponseBody.create; public class SnooperInterceptor implements Interceptor{ public static final String TAG = SnooperInterceptor.class.getSimpleName(); @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); Response response = chain.proceed(request); String responseBody = response.body().string(); HttpCall httpCall = new HttpCall.Builder() .withUrl(request.url().toString()) .withPayload(getRequestBody(request)) .withMethod(request.method()) .withResponseBody(responseBody) .withStatusCode(response.code()) .withStatusText(response.message()) .withRequestHeaders(headers(request.headers())) .withResponseHeaders(headers(response.headers())) .build(); AndroidSnooper.getInstance().record(httpCall); return response.newBuilder().body(create(response.body().contentType(), responseBody)).build(); } private Map<String, List<String>> headers(Headers headers) { HashMap<String, List<String>> extractedHeaders = new HashMap<>(); for (String headerName : headers.names()) { extractedHeaders.put(headerName, headers.values(headerName)); } return extractedHeaders; } private String getRequestBody(Request request) { try { final Request copy = request.newBuilder().build(); final Buffer buffer = new Buffer(); if(copy.body() == null) { return ""; } copy.body().writeTo(buffer); return buffer.readUtf8(); } catch (final IOException e) { Log.d(TAG, "couldn't retrieve request body", e); return ""; } } }