Beispiel #1
0
    protected HttpResponse doRequest(HttpRequest request, RequestLine requestLine)
        throws IOException, MuleException {
      Map headers = parseHeaders(request);

      // TODO Mule 2.0 generic way to set stream message adapter
      MessageAdapter adapter = buildStandardAdapter(request, headers);

      MuleMessage message = new DefaultMuleMessage(adapter, connector.getMuleContext());

      String path = (String) message.getProperty(HttpConnector.HTTP_REQUEST_PROPERTY);
      int i = path.indexOf('?');
      if (i > -1) {
        path = path.substring(0, i);
      }

      message.setProperty(HttpConnector.HTTP_REQUEST_PATH_PROPERTY, path);

      if (logger.isDebugEnabled()) {
        logger.debug(message.getProperty(HttpConnector.HTTP_REQUEST_PROPERTY));
      }

      // determine if the request path on this request denotes a different receiver
      MessageReceiver receiver = getTargetReceiver(message, endpoint);

      HttpResponse response;
      // the response only needs to be transformed explicitly if
      // A) the request was not served or B) a null result was returned
      if (receiver != null) {
        message.setProperty(
            HttpConnector.HTTP_CONTEXT_PATH_PROPERTY,
            HttpConnector.normalizeUrl(receiver.getEndpointURI().getPath()));

        preRouteMessage(message);
        MuleMessage returnMessage = receiver.routeMessage(message, endpoint.isSynchronous(), null);

        Object tempResponse;
        if (returnMessage != null) {
          tempResponse = returnMessage.getPayload();
        } else {
          tempResponse = NullPayload.getInstance();
        }
        // This removes the need for users to explicitly adding the response transformer
        // ObjectToHttpResponse in their config
        if (tempResponse instanceof HttpResponse) {
          response = (HttpResponse) tempResponse;
        } else {
          response = transformResponse(returnMessage);
        }

        response.setupKeepAliveFromRequestVersion(request.getRequestLine().getHttpVersion());
        HttpConnector httpConnector = (HttpConnector) connector;
        response.disableKeepAlive(!httpConnector.isKeepAlive());

        Header connectionHeader = request.getFirstHeader("Connection");
        if (connectionHeader != null) {
          String value = connectionHeader.getValue();
          boolean endpointOverride = getEndpointKeepAliveValue(endpoint);
          if ("keep-alive".equalsIgnoreCase(value) && endpointOverride) {
            response.setKeepAlive(true);

            Header header =
                new Header(
                    HttpConstants.HEADER_KEEP_ALIVE,
                    "timeout=" + httpConnector.getKeepAliveTimeout());
            response.addHeader(header);

            if (response.getHttpVersion().equals(HttpVersion.HTTP_1_0)) {
              connectionHeader = new Header(HttpConstants.HEADER_CONNECTION, "Keep-Alive");
              response.setHeader(connectionHeader);
            }
          } else if ("close".equalsIgnoreCase(value)) {
            response.setKeepAlive(false);
          }
        }
      } else {
        response = buildFailureResponse(requestLine, message);
      }
      return response;
    }