// 存在確認済みのファイルをレスポンスする。
  private boolean sendFile(
      MappingResult mapping,
      File baseDirectory,
      String path,
      String ifModifiedSince,
      CacheBuffer asyncFile) {
    if (isVelocityUse(mapping, path)) {
      // TODO ちゃんとする
      mapping.setResolvePath(path); // 加工後のpathを設定
      mapping.setDesitinationFile(baseDirectory);
      forwardHandler(Mapping.VELOCITY_PAGE_HANDLER);
      asyncFile.close();
      return false; // 委譲
    }

    // String
    // ifModifiedSince=requestParser.getHeader(HeaderParser.IF_MODIFIED_SINCE_HEADER);
    Date ifModifiedSinceDate = HeaderParser.parseDateHeader(ifModifiedSince);
    long ifModifiedSinceTime = -1;
    if (ifModifiedSinceDate != null) {
      ifModifiedSinceTime = ifModifiedSinceDate.getTime();
    }
    FileInfo fileInfo = asyncFile.getFileInfo();
    long lastModifiedTime = fileInfo.getLastModified();
    String lastModified = HeaderParser.fomatDateHeader(new Date(lastModifiedTime));
    // ファイル日付として表現できる値には、誤差があるため、表現できる時刻を取得
    lastModifiedTime = HeaderParser.parseDateHeader(lastModified).getTime();
    if (ifModifiedSinceTime >= lastModifiedTime) {
      completeResponse("304");
      asyncFile.close();
      return true;
    }
    setHeader(HeaderParser.LAST_MODIFIED_HEADER, lastModified);
    long contentLength = getContentLength(fileInfo.length());
    setContentLength(contentLength);
    String contentDisposition =
        (String) getRequestAttribute(ATTRIBUTE_RESPONSE_CONTENT_DISPOSITION);
    if (contentDisposition != null) {
      setHeader(HeaderParser.CONTENT_DISPOSITION_HEADER, contentDisposition);
    }
    String contentType = getContentType(fileInfo.getCanonicalFile());
    setContentType(contentType);
    setStatusCode("200");
    responseBodyFromFile(asyncFile);
    return false;
  }