Example #1
0
  public Object transform(MuleMessage msg, String outputEncoding) throws TransformerException {
    Object src = msg.getPayload();
    // Send back the exception payload if one has been set
    if (msg.getExceptionPayload() != null) {
      // src = context.getMessage().getExceptionPayload();
    }

    // Note this transformer excepts Null as we must always return a result
    // from the Http
    // connector if a response transformer is present
    if (src instanceof NullPayload) {
      src = StringUtils.EMPTY;
    }

    try {
      HttpResponse response;
      if (src instanceof HttpResponse) {
        response = (HttpResponse) src;
      } else {
        response = createResponse(src, outputEncoding, msg);
      }

      // Ensure there's a content type header
      if (!response.containsHeader(HttpConstants.HEADER_CONTENT_TYPE)) {
        response.addHeader(
            new Header(HttpConstants.HEADER_CONTENT_TYPE, HttpConstants.DEFAULT_CONTENT_TYPE));
      }

      // Ensure there's a content length or transfer encoding header
      if (!response.containsHeader(HttpConstants.HEADER_CONTENT_LENGTH)
          && !response.containsHeader(HttpConstants.HEADER_TRANSFER_ENCODING)) {
        if (response.hasBody()) {
          long len = response.getContentLength();
          if (len < 0) {
            if (response.getHttpVersion().lessEquals(HttpVersion.HTTP_1_0)) {
              throw new IOException(
                  "Chunked encoding not supported for HTTP version " + response.getHttpVersion());
            }
            Header header = new Header(HttpConstants.HEADER_TRANSFER_ENCODING, "chunked");
            response.addHeader(header);
          } else {
            Header header = new Header(HttpConstants.HEADER_CONTENT_LENGTH, Long.toString(len));
            response.setHeader(header);
          }
        } else {
          Header header = new Header(HttpConstants.HEADER_CONTENT_LENGTH, "0");
          response.addHeader(header);
        }
      }

      if (!response.containsHeader(HttpConstants.HEADER_CONNECTION)) {
        // See if the the client explicitly handles connection persistence
        String connHeader = msg.getStringProperty(HttpConstants.HEADER_CONNECTION, null);
        if (connHeader != null) {
          if (connHeader.equalsIgnoreCase("keep-alive")) {
            Header header = new Header(HttpConstants.HEADER_CONNECTION, "keep-alive");
            response.addHeader(header);
            response.setKeepAlive(true);
          }
          if (connHeader.equalsIgnoreCase("close")) {
            Header header = new Header(HttpConstants.HEADER_CONNECTION, "close");
            response.addHeader(header);
            response.setKeepAlive(false);
          }
        } else {
          // Use protocol default connection policy
          if (response.getHttpVersion().greaterEquals(HttpVersion.HTTP_1_1)) {
            response.setKeepAlive(true);
          } else {
            response.setKeepAlive(false);
          }
        }
      }
      if ("HEAD"
          .equalsIgnoreCase(msg.getStringProperty(HttpConnector.HTTP_METHOD_PROPERTY, null))) {
        // this is a head request, we don't want to send the actual content
        response.setBody((MuleMessage) null);
      }
      return response;
    } catch (IOException e) {
      throw new TransformerException(this, e);
    }
  }