public AWResponse handleRequest(AWRequest request) {
    AWRequestContext requestContext = application().createRequestContext(request);
    AWResponse response = null;
    try {
      response = requestContext.handleRequest(request, this);
    } catch (AWSessionRestorationException exception) {
      requestContext.createHttpSession();
      response = handleSessionRestorationError(requestContext).generateResponse();
    } catch (AWRemoteHostMismatchException exception) {
      response =
          this.handleRemoteHostMismatchException(requestContext, exception).generateResponse();
    } catch (Exception exception) {
      response = handleUncaughtException(requestContext, exception);
    } finally {
      // record & playback
      // record & playback
      _debugDoRecordAndPlayback(requestContext, request, response);

      // Note: it seems as though this sleep should come after the checkInExistingHttpSession,
      // However this was changed around at some point for some unknown reason, so we don't want
      // to break whatever that was.  So sleep should come before checkInExistingHttpSession.
      // Also note that, in requestContext.sleep(), we don't null out the httpSession to accomodate
      // this reversed logic.  See also: AWComponentActionRequestHandler
      try {
        requestContext.sleep();
      } finally {
        requestContext.checkInExistingHttpSession();
      }
    }
    return response;
  }