class OkHttpStack extends AbstractHttpStack {

    @Override
    public NetworkResponse performRequest(Request<?> request, Headers
            additionalHeaders, ByteArrayPool byteArrayPool) throws IOException {

        //clone to be able to set timeouts per call
        OkHttpClient.Builder clientBuilder = this.client.newBuilder();
        if (request.getRetryPolicy() != null) {
            clientBuilder
                    .connectTimeout(request.getRetryPolicy().getCurrentConnectTimeout(),
                            TimeUnit.MILLISECONDS)
                    .readTimeout(request.getRetryPolicy().getCurrentReadTimeout(),
                            TimeUnit.MILLISECONDS);
        }
        if (markerInterceptorFactory != null) {
            clientBuilder.addNetworkInterceptor(markerInterceptorFactory.create(request));
        }

        OkHttpClient client = clientBuilder.build();
        okhttp3.Request okRequest = new okhttp3.Request.Builder()
                .url(request.getUrlString())
                .headers(JusOk.okHeaders(request.getHeaders(), additionalHeaders))
                .tag(request.getTag())
                .method(request.getMethod(), JusOk.okBody(request.getNetworkRequest()))
                .build();

        long requestStart = System.nanoTime();

        Response response = client.newCall(okRequest).execute();

        byte[] data = null;
        if (NetworkDispatcher.hasResponseBody(request.getMethod(), response.code())) {
            data = getContentBytes(response.body().source(),
                    byteArrayPool, (int) response.body().contentLength());
        } else {
            // Add 0 byte response as a way of honestly representing a
            // no-content request.
            data = new byte[0];
        }
        return new NetworkResponse.Builder()
                .setHeaders(JusOk.jusHeaders(response.headers()))
                .setStatusCode(response.code())
                .setBody(data)
                .setNetworkTimeNs(System.nanoTime() - requestStart)
                .build();
    }

    public  OkHttpStack();
    public  OkHttpStack(MarkerInterceptorFactory markerInterceptorFactory);
    public  OkHttpStack(OkHttpClient client, MarkerInterceptorFactory markerInterceptorFactory);

}