From 248b7172cd23ac5853747c7c77e07ea8afded899 Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Thu, 04 Sep 2014 16:08:45 -0400 Subject: [PATCH] Merge branch 'ticket/154' into develop --- 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 0ae9155..cda2475 100644 --- a/src/main/java/com/gitblit/servlet/RawServlet.java +++ b/src/main/java/com/gitblit/servlet/RawServlet.java @@ -105,7 +105,7 @@ fsc = c; } if (branch != null) { - branch = branch.replace('/', fsc); + branch = Repository.shortenRefName(branch).replace('/', fsc); } String encodedPath = path == null ? "" : path.replace(' ', '-'); @@ -252,8 +252,6 @@ } } - setContentType(response, contentType); - if (isTextType(contentType)) { // load, interpret, and serve text content as UTF-8 @@ -261,41 +259,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) { @@ -355,11 +334,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 { // @@ -425,9 +400,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 { @@ -445,10 +421,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(); @@ -456,6 +452,7 @@ } response.flushBuffer(); + return served; } protected void sendContent(HttpServletResponse response, Date date, InputStream is) throws ServletException, IOException { @@ -472,6 +469,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); -- Gitblit v1.9.1