diff options
author | James Moger <james.moger@gitblit.com> | 2014-09-04 16:05:09 -0400 |
---|---|---|
committer | James Moger <james.moger@gitblit.com> | 2014-09-04 16:05:09 -0400 |
commit | 846ee5329f201ea89b4f84b60137b540cef870db (patch) | |
tree | 39f307d20b213fa535d41682abffdd47c32fa3f1 /src/main/java/com/gitblit/servlet/RawServlet.java | |
parent | a83841169a6a2f369dd57f875cd778c70cb81714 (diff) | |
download | gitblit-846ee5329f201ea89b4f84b60137b540cef870db.tar.gz gitblit-846ee5329f201ea89b4f84b60137b540cef870db.zip |
Fix raw serving of files/directories that do not exist in a branch/ref
Diffstat (limited to 'src/main/java/com/gitblit/servlet/RawServlet.java')
-rw-r--r-- | src/main/java/com/gitblit/servlet/RawServlet.java | 74 |
1 files changed, 40 insertions, 34 deletions
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); |