// 存在確認済みのファイルをレスポンスする。 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; }