private CacheBuffer welcomPage(File dir, String[] welcomlist) {
   CacheBuffer asyncFile = null;
   for (String welcom : welcomlist) {
     asyncFile = CacheBuffer.open(new File(dir, welcom));
     FileInfo info = asyncFile.getFileInfo();
     if (info.exists() && info.canRead() && info.isFile()) {
       return asyncFile;
     }
     asyncFile.close();
   }
   return null;
 }
  private boolean response() {
    HeaderParser requestHeader = getRequestHeader();
    String ifModifiedSince = requestHeader.getHeader(HeaderParser.IF_MODIFIED_SINCE_HEADER);
    String selfPath = requestHeader.getRequestUri();

    MappingResult mapping = getRequestMapping();
    File file = (File) getRequestAttribute(ATTRIBUTE_RESPONSE_FILE);
    if (file != null) { // レスポンスするファイルが、直接指定された場合
      // FileCacheInfo fileCacheInfo=null;
      boolean useCache = true;
      if (getRequestAttribute(ATTRIBUTE_RESPONSE_FILE_NOT_USE_CACHE) == null) {
        useCache = false;
      }
      CacheBuffer asyncFile = CacheBuffer.open(file, useCache);
      FileInfo fileInfo = asyncFile.getFileInfo();
      if (!fileInfo.exists()) {
        logger.debug("Not found." + file.getAbsolutePath());
        completeResponse("404", "file not exists");
        asyncFile.close();
        return true;
      }
      return sendFile(mapping, null, null, ifModifiedSince, asyncFile);
    }

    String path = mapping.getResolvePath();
    try {
      path = URLDecoder.decode(path, "utf-8");
    } catch (UnsupportedEncodingException e) {
      logger.error("URLDecoder.decode error", e);
      throw new IllegalArgumentException("URLDecoder.decode error", e);
    }
    // クエリの削除
    int pos = path.indexOf('?');
    if (pos >= 0) {
      path = path.substring(0, pos);
    }

    File baseDirectory = mapping.getDestinationFile();
    CacheBuffer asyncFile = CacheBuffer.open(new File(baseDirectory, path));
    FileInfo info = asyncFile.getFileInfo();
    if (info.isError()) {
      logger.warn("fail to getCanonicalPath.");
      completeResponse("500", "fail to getCanonicalPath.");
      asyncFile.close();
      return true;
      // TODO トラバーサル
      // }else if(!info.isInBase()){
      // //トラバーサルされたら、loggingして404
      // logger.warn("traversal error.");
      // completeResponse("404","traversal error");
      // return true;
    } else if (!info.exists() || !info.canRead()) {
      asyncFile.close();
      logger.debug("Not found." + info.getCanonicalFile());
      completeResponse("404", "file not exists");
      return true;
    }
    // welcomefile処理
    String[] welcomeFiles = getWelcomeFiles(mapping);
    if (info.isDirectory() && welcomeFiles != null) {
      File dir = info.getCanonicalFile();
      asyncFile.close();
      asyncFile = welcomPage(dir, welcomeFiles);
      if (asyncFile == null) { // welcomfileが無かった
        //				completeResponse("404", "file not exists");
        return fileListIfNessesary(mapping, selfPath, dir, "/".equals(path));
      }
      info = asyncFile.getFileInfo();
      if (info.exists() && info.canRead() && !path.endsWith("/")) {
        asyncFile.close();
        // もし、URIが"/"で終わっていなかったら相対が解決できないので、リダイレクト
        ServerParser selfServer = requestHeader.getServer();
        StringBuilder sb = new StringBuilder();
        if (isSsl()) {
          sb.append("https://");
        } else {
          sb.append("http://");
        }
        sb.append(selfServer.toString());
        sb.append(selfPath);
        sb.append("/");
        setHeader(HeaderParser.LOCATION_HEADER, sb.toString());
        completeResponse("302");
        return true;
      }
    }
    if (info.isFile()) { // ファイルだったら
      return sendFile(mapping, baseDirectory, path, ifModifiedSince, asyncFile);
    }
    asyncFile.close();
    File dir = info.getCanonicalFile();
    return fileListIfNessesary(mapping, selfPath, dir, "/".equals(path));
  }