From: James Moger Date: Thu, 4 Sep 2014 20:05:09 +0000 (-0400) Subject: Fix raw serving of files/directories that do not exist in a branch/ref X-Git-Tag: v1.6.1~51^2 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=refs%2Ftickets%2F54%2F154%2F1;p=gitblit.git Fix raw serving of files/directories that do not exist in a branch/ref --- diff --git a/src/main/java/com/gitblit/servlet/PagesServlet.java b/src/main/java/com/gitblit/servlet/PagesServlet.java index a8e83418..defd9e63 100644 --- a/src/main/java/com/gitblit/servlet/PagesServlet.java +++ b/src/main/java/com/gitblit/servlet/PagesServlet.java @@ -84,13 +84,13 @@ public class PagesServlet extends RawServlet { } @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 diff --git a/src/main/java/com/gitblit/servlet/RawServlet.java b/src/main/java/com/gitblit/servlet/RawServlet.java index 30d33fd7..7504b4be 100644 --- a/src/main/java/com/gitblit/servlet/RawServlet.java +++ b/src/main/java/com/gitblit/servlet/RawServlet.java @@ -101,7 +101,7 @@ public class RawServlet extends DaggerServlet { 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 @@ public class RawServlet extends DaggerServlet { } } - setContentType(response, contentType); - if (isTextType(contentType)) { // load, interpret, and serve text content as UTF-8 @@ -257,41 +255,22 @@ public class RawServlet extends DaggerServlet { 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 @@ public class RawServlet extends DaggerServlet { // 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 @@ public class RawServlet extends DaggerServlet { } } - 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 @@ public class RawServlet extends DaggerServlet { } 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 @@ public class RawServlet extends DaggerServlet { } response.flushBuffer(); + return served; } protected void sendContent(HttpServletResponse response, Date date, InputStream is) throws ServletException, IOException { @@ -468,6 +465,15 @@ public class RawServlet extends DaggerServlet { 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);