James Moger
2014-09-04 f1f419772730457e67986d48577c78a858a772b1
Merged #154 "Raw servlet returns 0-length files instead of 404s"
2 files modified
78 ■■■■ changed files
src/main/java/com/gitblit/servlet/PagesServlet.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/servlet/RawServlet.java 74 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/servlet/PagesServlet.java
@@ -84,13 +84,13 @@
    }
    @Override
    protected void streamFromRepo(HttpServletResponse response, Repository repository,
    protected boolean streamFromRepo(HttpServletRequest request, 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");
        super.streamFromRepo(response, repository, commit, requestedPath);
        return super.streamFromRepo(request, response, repository, commit, requestedPath);
    }
    @Override
src/main/java/com/gitblit/servlet/RawServlet.java
@@ -101,7 +101,7 @@
            fsc = c;
        }
        if (branch != null) {
            branch = branch.replace('/', fsc);
            branch = Repository.shortenRefName(branch).replace('/', fsc);
        }
        String encodedPath = path == null ? "" : path.replace(' ', '-');
@@ -248,8 +248,6 @@
                        }
                    }
                    setContentType(response, contentType);
                    if (isTextType(contentType)) {
                        // load, interpret, and serve text content as UTF-8
@@ -257,41 +255,22 @@
                        String content = JGitUtils.getStringContent(r, commit.getTree(), requestedPath, encodings);
                        if (content == null) {
                            logger.error("RawServlet Failed to load {} {} {}", repository, commit.getName(), path);
                            String str = MessageFormat.format(
                                    "# Error\nSorry, the requested resource **{0}** was not found.",
                                    requestedPath);
                            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
                            error(response, str);
                            notFound(response, requestedPath, branch);
                            return;
                        }
                        byte [] bytes = content.getBytes(Constants.ENCODING);
                        setContentType(response, contentType);
                        response.setContentLength(bytes.length);
                        ByteArrayInputStream is = new ByteArrayInputStream(bytes);
                        sendContent(response, JGitUtils.getCommitDate(commit), is);
                    } else {
                        // serve binary content
                        String filename = StringUtils.getLastPathElement(requestedPath);
                        try {
                            String userAgent = request.getHeader("User-Agent");
                            if (userAgent != null && userAgent.indexOf("MSIE 5.5") > -1) {
                                  response.setHeader("Content-Disposition", "filename=\""
                                          +  URLEncoder.encode(filename, Constants.ENCODING) + "\"");
                            } else if (userAgent != null && userAgent.indexOf("MSIE") > -1) {
                                  response.setHeader("Content-Disposition", "attachment; filename=\""
                                          +  URLEncoder.encode(filename, Constants.ENCODING) + "\"");
                            } else {
                                    response.setHeader("Content-Disposition", "attachment; filename=\""
                                          + new String(filename.getBytes(Constants.ENCODING), "latin1") + "\"");
                            }
                        }
                        catch (UnsupportedEncodingException e) {
                            response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
                        }
                        // stream binary content directly from the repository
                        streamFromRepo(response, r, commit, requestedPath);
                        if (!streamFromRepo(request, response, r, commit, requestedPath)) {
                            logger.error("RawServlet Failed to load {} {} {}", repository, commit.getName(), path);
                            notFound(response, requestedPath, branch);
                        }
                    }
                    return;
                } catch (Exception e) {
@@ -351,11 +330,7 @@
            // no content, document list or 404 page
            if (pathEntries.isEmpty()) {
                // default 404 page
                String str = MessageFormat.format(
                        "# Error\nSorry, the requested resource **{0}** was not found.",
                        requestedPath);
                response.setStatus(HttpServletResponse.SC_NOT_FOUND);
                error(response, str);
                notFound(response, requestedPath, branch);
                return;
            } else {
                //
@@ -421,9 +396,10 @@
        }
    }
    protected void streamFromRepo(HttpServletResponse response, Repository repository,
    protected boolean streamFromRepo(HttpServletRequest request, HttpServletResponse response, Repository repository,
            RevCommit commit, String requestedPath) throws IOException {
        boolean served = false;
        RevWalk rw = new RevWalk(repository);
        TreeWalk tw = new TreeWalk(repository);
        try {
@@ -441,10 +417,30 @@
                }
                tw.getObjectId(id, 0);
                String filename = StringUtils.getLastPathElement(requestedPath);
                try {
                    String userAgent = request.getHeader("User-Agent");
                    if (userAgent != null && userAgent.indexOf("MSIE 5.5") > -1) {
                          response.setHeader("Content-Disposition", "filename=\""
                                  +  URLEncoder.encode(filename, Constants.ENCODING) + "\"");
                    } else if (userAgent != null && userAgent.indexOf("MSIE") > -1) {
                          response.setHeader("Content-Disposition", "attachment; filename=\""
                                  +  URLEncoder.encode(filename, Constants.ENCODING) + "\"");
                    } else {
                            response.setHeader("Content-Disposition", "attachment; filename=\""
                                  + new String(filename.getBytes(Constants.ENCODING), "latin1") + "\"");
                    }
                }
                catch (UnsupportedEncodingException e) {
                    response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
                }
                long len = reader.getObjectSize(id, org.eclipse.jgit.lib.Constants.OBJ_BLOB);
                setContentType(response, "application/octet-stream");
                response.setIntHeader("Content-Length", (int) len);
                ObjectLoader ldr = repository.open(id);
                ldr.copyTo(response.getOutputStream());
                served = true;
            }
        } finally {
            tw.release();
@@ -452,6 +448,7 @@
        }
        response.flushBuffer();
        return served;
    }
    protected void sendContent(HttpServletResponse response, Date date, InputStream is) throws ServletException, IOException {
@@ -468,6 +465,15 @@
        response.flushBuffer();
    }
    protected void notFound(HttpServletResponse response, String requestedPath, String branch)
            throws ParseException, ServletException, IOException {
        String str = MessageFormat.format(
                "# Error\nSorry, the requested resource **{0}** was not found in **{1}**.",
                requestedPath, branch);
        response.setStatus(HttpServletResponse.SC_NOT_FOUND);
        error(response, str);
    }
    private void error(HttpServletResponse response, String mkd) throws ServletException,
            IOException, ParseException {
        String content = MarkdownUtils.transformMarkdown(mkd);