/*
* Copyright 2014 Ranjan Kumar
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.restfiddle.handler.http;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.restfiddle.dto.AssertionDTO;
import com.restfiddle.dto.RfHeaderDTO;
import com.restfiddle.dto.RfRequestDTO;
import com.restfiddle.dto.RfResponseDTO;
import com.restfiddle.handler.http.builder.RfHttpClientBuilder;
import com.restfiddle.handler.http.builder.RfRequestBuilder;
@Component
public class GenericHandler {
Logger logger = LoggerFactory.getLogger(GenericHandler.class);
@Autowired
RfRequestBuilder rfRequestBuilder;
@Autowired
RfHttpClientBuilder rfHttpClientBuilder;
/**
* This method will be used for API processing and the method below this will be deprecated.
*/
public RfResponseDTO processHttpRequest(RfRequestDTO rfRequestDTO) {
HttpUriRequest httpUriRequest = rfRequestBuilder.build(rfRequestDTO);
CloseableHttpClient httpClient = rfHttpClientBuilder.build(rfRequestDTO, httpUriRequest);
RfResponseDTO responseDTO = null;
try {
long startTime = System.currentTimeMillis();
CloseableHttpResponse httpResponse = httpClient.execute(httpUriRequest);
long endTime = System.currentTimeMillis();
long duration = endTime - startTime;
responseDTO = buildRfResponse(httpResponse, duration, rfRequestDTO);
} catch (ClientProtocolException e) {
logger.error(e.getMessage(), e);
} catch (IOException e) {
logger.error(e.getMessage(), e);
} finally {
try {
if (httpClient != null) {
httpClient.close();
}
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
return responseDTO;
}
private RfResponseDTO buildRfResponse(CloseableHttpResponse httpResponse, long duration, RfRequestDTO rfRequestDTO) throws IOException {
RfResponseDTO responseDTO = buildRfResponse(httpResponse);
AssertionDTO assertionDTO = rfRequestDTO.getAssertionDTO() != null ? rfRequestDTO.getAssertionDTO() : new AssertionDTO();
assertionDTO.setResponseTime((int) duration);
HttpEntity entity = httpResponse.getEntity();
assertionDTO.setBodyContentType(entity.getContentType() != null ? entity.getContentType().getValue() : null);
assertionDTO.setResponseSize(responseDTO.getBody().length());
assertionDTO.setStatusCode(httpResponse.getStatusLine().getStatusCode());
responseDTO.setAssertionDTO(assertionDTO);
return responseDTO;
}
public RfResponseDTO processHttpRequest(HttpRequestBase baseRequest, CloseableHttpClient httpclient) throws IOException {
Header[] requestHeaders = baseRequest.getAllHeaders();
logger.info("request headers length : " + requestHeaders.length);
for (Header requestHeader : requestHeaders) {
logger.info("request header - name : " + requestHeader.getName() + " value : " + requestHeader.getValue());
}
CloseableHttpResponse httpResponse = httpclient.execute(baseRequest);
RfResponseDTO responseDTO = buildRfResponse(httpResponse);
return responseDTO;
}
private RfResponseDTO buildRfResponse(CloseableHttpResponse httpResponse) throws IOException {
RfResponseDTO responseDTO = new RfResponseDTO();
String responseBody = "";
List<RfHeaderDTO> headers = new ArrayList<RfHeaderDTO>();
try {
logger.info("response status : " + httpResponse.getStatusLine());
responseDTO.setStatus(httpResponse.getStatusLine().getStatusCode() + " " + httpResponse.getStatusLine().getReasonPhrase());
HttpEntity responseEntity = httpResponse.getEntity();
Header[] responseHeaders = httpResponse.getAllHeaders();
RfHeaderDTO headerDTO = null;
for (Header responseHeader : responseHeaders) {
// logger.info("response header - name : " + responseHeader.getName() + " value : " + responseHeader.getValue());
headerDTO = new RfHeaderDTO();
headerDTO.setHeaderName(responseHeader.getName());
headerDTO.setHeaderValue(responseHeader.getValue());
headers.add(headerDTO);
}
Header contentType = responseEntity.getContentType();
logger.info("response contentType : " + contentType);
// logger.info("content : " + EntityUtils.toString(responseEntity));
responseBody = EntityUtils.toString(responseEntity);
EntityUtils.consume(responseEntity);
} finally {
httpResponse.close();
}
responseDTO.setBody(responseBody);
responseDTO.setHeaders(headers);
return responseDTO;
}
public RfResponseDTO process(RfRequestDTO rfRequestDTO) throws IOException {
return null;
}
}