James Moger
2014-04-23 553e0f79c99e3c3b6e7fb5364c10cfc1bd3b9c80
Stream directly from repo instead of loading into ram and streaming
1 files modified
47 ■■■■■ changed files
src/main/java/com/gitblit/servlet/BranchServlet.java 47 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/servlet/BranchServlet.java
@@ -35,8 +35,14 @@
import org.apache.tika.Tika;
import org.eclipse.jgit.lib.FileMode;
import org.eclipse.jgit.lib.MutableObjectId;
import org.eclipse.jgit.lib.ObjectLoader;
import org.eclipse.jgit.lib.ObjectReader;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.treewalk.TreeWalk;
import org.eclipse.jgit.treewalk.filter.PathFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -252,10 +258,7 @@
                    }
                    // send content
                    byte [] content = JGitUtils.getByteContent(r, commit.getTree(), requestedPath, false);
                    InputStream is = new ByteArrayInputStream(content);
                    sendContent(response, JGitUtils.getCommitDate(commit), is);
                    streamFromRepo(response, r, commit, requestedPath);
                    return;
                } catch (Exception e) {
                    logger.error(null, e);
@@ -368,6 +371,42 @@
        }
    }
    private void streamFromRepo(HttpServletResponse response, Repository repository,
            RevCommit commit, String requestedPath) throws IOException {
        response.setDateHeader("Last-Modified", JGitUtils.getCommitDate(commit).getTime());
        response.setHeader("Cache-Control", "public, max-age=3600, must-revalidate");
        RevWalk rw = new RevWalk(repository);
        TreeWalk tw = new TreeWalk(repository);
        try {
            tw.reset();
            tw.addTree(commit.getTree());
            PathFilter f = PathFilter.create(requestedPath);
            tw.setFilter(f);
            tw.setRecursive(true);
            MutableObjectId id = new MutableObjectId();
            ObjectReader reader = tw.getObjectReader();
            while (tw.next()) {
                FileMode mode = tw.getFileMode(0);
                if (mode == FileMode.GITLINK || mode == FileMode.TREE) {
                    continue;
                }
                tw.getObjectId(id, 0);
                long len = reader.getObjectSize(id, org.eclipse.jgit.lib.Constants.OBJ_BLOB);
                response.setIntHeader("Content-Length", (int) len);
                ObjectLoader ldr = repository.open(id);
                ldr.copyTo(response.getOutputStream());
            }
        } finally {
            tw.release();
            rw.dispose();
        }
        response.flushBuffer();
    }
    private void sendContent(HttpServletResponse response, Date date, InputStream is) throws ServletException, IOException {
        response.setDateHeader("Last-Modified", date.getTime());
        response.setHeader("Cache-Control", "public, max-age=3600, must-revalidate");