@Test
  public void testInterceptWithConfiguration() throws Exception {
    prepareExecution("http://localhost:8080", "TestResponse", "markdown");

    ClientHttpRequestExecution configureExecution = Mockito.mock(ClientHttpRequestExecution.class);

    when(configureExecution.execute(any(HttpRequest.class), any(byte[].class)))
        .thenAnswer(
            new Answer<ClientHttpResponse>() {
              @Override
              public ClientHttpResponse answer(InvocationOnMock invocation) throws Throwable {
                interceptor.intercept(
                    (HttpRequest) invocation.getArguments()[0],
                    (byte[]) invocation.getArguments()[1],
                    execution);

                return response;
              }
            });

    CitrusRestDocsSupport.restDocsConfigurer(restDocumentation)
        .snippets()
        .withTemplateFormat(TemplateFormats.markdown())
        .intercept(request, "TestMessage".getBytes(), configureExecution);

    assertExpectedSnippetFilesExist(
        "markdown", "http-request.md", "http-response.md", "curl-request.md");
  }
 @Override
 public ClientHttpResponse intercept(
     HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
   if (logger.isDebugEnabled()) {
     if (body.length > 0) {
       String tmp = IOUtils.toString(body, "UTF-8");
       if (StringUtils.hasText(tmp)) {
         logger.debug(
             "request uri : {} , param : {} ",
             request.getURI().toString(),
             tmp.substring(0, Math.min(tmp.length(), 1024)));
       } else {
         logger.debug("request uri : {}", request.getURI().toString());
       }
     } else {
       logger.debug("request uri : {}", request.getURI().toString());
     }
   }
   try {
     if (Util.getRequest() != null) {
       request.getHeaders().add("principal", Util.getPrincipal());
       request.getHeaders().add("admin", Util.isAdmin() + "");
       request.getHeaders().add("loginIp", Util.getLoginIp());
     }
   } catch (Exception e) {
     logger.error("", e);
   }
   return execution.execute(request, body);
 }
  /** {@inheritDoc} */
  public ClientHttpResponse intercept(
      HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
    handleRequest(getRequestContent(request, new String(body)));

    ClientHttpResponse response = execution.execute(request, body);
    CachingClientHttpResponseWrapper bufferedResponse =
        new CachingClientHttpResponseWrapper(response);
    handleResponse(getResponseContent(bufferedResponse));

    return bufferedResponse;
  }
  private void prepareExecution(
      String uri, String responseBody, String identifier, Snippet... snippets) throws IOException {
    when(execution.execute(any(HttpRequest.class), any(byte[].class))).thenReturn(response);
    when(request.getURI()).thenReturn(URI.create(uri));
    when(request.getMethod()).thenReturn(HttpMethod.GET);
    when(request.getHeaders()).thenReturn(new HttpHeaders());

    when(response.getHeaders()).thenReturn(new HttpHeaders());
    when(response.getStatusCode()).thenReturn(HttpStatus.OK);
    when(response.getBody()).thenReturn(new ByteArrayInputStream(responseBody.getBytes()));

    this.interceptor = CitrusRestDocsSupport.restDocsInterceptor(identifier, snippets);
  }
 /* Method to intercept Request and response call.
  * @see org.springframework.http.client.ClientHttpRequestInterceptor#intercept(org.springframework.http.HttpRequest, byte[], org.springframework.http.client.ClientHttpRequestExecution)
  */
 @Override
 public ClientHttpResponse intercept(
     HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
   logRequest(request);
   LOGGER.debug("Body of the request message is: {}", body);
   LOGGER.info("Unique ID for this service call is: {}", UUID.randomUUID());
   long starTime = new Date().getTime();
   ClientHttpResponse response = execution.execute(request, body);
   LOGGER.debug(
       "Total time taken for the service call is: {}ms", (new Date().getTime() - starTime));
   logResponse(response);
   return response;
 }
  @Override
  public synchronized ClientHttpResponse intercept(
      HttpRequest request, byte[] byteArray, ClientHttpRequestExecution execution)
      throws IOException {
    List<String> setCookies = request.getHeaders().get(COOKIE);

    // If the header doesn't exist and we have stored cookies, add any existing, saved cookies.
    if (setCookies == null && hasCookies()) {
      for (String cookie : cookies) {
        request.getHeaders().add(COOKIE, cookie);
      }
    }

    // Execute the request.
    ClientHttpResponse response = execution.execute(request, byteArray);
    // Pull any cookies off and store them.
    cookies = response.getHeaders().get(SET_COOKIE);

    return response;
  }
 @Override
 public ClientHttpResponse intercept(
     HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
   request.getHeaders().setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
   return execution.execute(request, body);
 }
 @Override
 public ClientHttpResponse intercept(
     HttpRequest request, byte[] data, ClientHttpRequestExecution execution) throws IOException {
   return execution.execute(request, data);
 }