/** * Generate http request entity from Spring Integration message. * * @param requestMessage * @param method * @return */ private HttpEntity<?> generateRequest(Message<?> requestMessage, HttpMethod method) { HttpHeaders httpHeaders = new HttpHeaders(); headerMapper.fromHeaders(requestMessage.getHeaders(), httpHeaders); Map<String, ?> messageHeaders = requestMessage.getHeaders(); for (Entry<String, ?> header : messageHeaders.entrySet()) { if (!header.getKey().startsWith(CitrusMessageHeaders.PREFIX) && !MessageUtils.isSpringInternalHeader(header.getKey()) && !httpHeaders.containsKey(header.getKey())) { httpHeaders.add(header.getKey(), header.getValue().toString()); } } Object payload = requestMessage.getPayload(); if (httpHeaders.getContentType() == null) { httpHeaders.setContentType( MediaType.parseMediaType( contentType.contains("charset") ? contentType : contentType + ";charset=" + charset)); } if (HttpMethod.POST.equals(method) || HttpMethod.PUT.equals(method)) { return new HttpEntity<Object>(payload, httpHeaders); } return new HttpEntity<Object>(httpHeaders); }
/** * Handles requests with message handler implementation. Previously sets Http request method as * header parameter. * * @param method * @param requestEntity * @return */ private ResponseEntity<String> handleRequestInternal( HttpMethod method, HttpEntity<String> requestEntity) { Map<String, ?> httpRequestHeaders = headerMapper.toHeaders(requestEntity.getHeaders()); Map<String, String> customHeaders = new HashMap<String, String>(); for (Entry<String, List<String>> header : requestEntity.getHeaders().entrySet()) { if (!httpRequestHeaders.containsKey(header.getKey())) { customHeaders.put( header.getKey(), StringUtils.collectionToCommaDelimitedString(header.getValue())); } } HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); UrlPathHelper pathHelper = new UrlPathHelper(); customHeaders.put(CitrusHttpMessageHeaders.HTTP_REQUEST_URI, pathHelper.getRequestUri(request)); customHeaders.put( CitrusHttpMessageHeaders.HTTP_CONTEXT_PATH, pathHelper.getContextPath(request)); String queryParams = pathHelper.getOriginatingQueryString(request); customHeaders.put( CitrusHttpMessageHeaders.HTTP_QUERY_PARAMS, queryParams != null ? queryParams : ""); customHeaders.put(CitrusHttpMessageHeaders.HTTP_REQUEST_METHOD, method.toString()); Message<?> response = messageHandler.handleMessage( MessageBuilder.withPayload(requestEntity.getBody()) .copyHeaders(convertHeaderTypes(httpRequestHeaders)) .copyHeaders(customHeaders) .build()); return generateResponse(response); }
/** * Builds the actual integration message from HTTP response entity. * * @param headers HTTP headers which will be transformed into Message headers * @param responseBody the HTTP body of the response * @param statusCode HTTP status code received * @return the response message */ private Message<?> buildResponseMessage( HttpHeaders headers, Object responseBody, HttpStatus statusCode) { Map<String, ?> mappedHeaders = headerMapper.toHeaders(headers); Message<?> responseMessage = MessageBuilder.withPayload(responseBody) .copyHeaders(mappedHeaders) .copyHeaders(getCustomHeaders(headers, mappedHeaders)) .setHeader(CitrusHttpMessageHeaders.HTTP_STATUS_CODE, statusCode) .setHeader( CitrusHttpMessageHeaders.HTTP_VERSION, "HTTP/1.1") // TODO check if we have access to version information .setHeader(CitrusHttpMessageHeaders.HTTP_REASON_PHRASE, statusCode.name()) .build(); return responseMessage; }
/** * Generates the Http response message from given Spring Integration message. * * @param responseMessage message received from the message handler * @return an HTTP entity as response */ private ResponseEntity<String> generateResponse(Message<?> responseMessage) { if (responseMessage == null) { return new ResponseEntity<String>(HttpStatus.OK); } HttpHeaders httpHeaders = new HttpHeaders(); headerMapper.fromHeaders(responseMessage.getHeaders(), httpHeaders); Map<String, ?> messageHeaders = responseMessage.getHeaders(); for (Entry<String, ?> header : messageHeaders.entrySet()) { if (!header.getKey().startsWith(CitrusMessageHeaders.PREFIX) && !MessageUtils.isSpringInternalHeader(header.getKey()) && !httpHeaders.containsKey(header.getKey())) { httpHeaders.add(header.getKey(), header.getValue().toString()); } } if (httpHeaders.getContentType() == null) { httpHeaders.setContentType( MediaType.parseMediaType( contentType.contains("charset") ? contentType : contentType + ";charset=" + charset)); } HttpStatus status = HttpStatus.OK; if (responseMessage.getHeaders().containsKey(CitrusHttpMessageHeaders.HTTP_STATUS_CODE)) { status = HttpStatus.valueOf( Integer.valueOf( responseMessage .getHeaders() .get(CitrusHttpMessageHeaders.HTTP_STATUS_CODE) .toString())); } responseCache = new ResponseEntity<String>(responseMessage.getPayload().toString(), httpHeaders, status); return responseCache; }