From 388f49ada1b32bd2e99c964a0278094e4f21c3fb Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Thu, 25 Sep 2014 10:20:03 -0400 Subject: [PATCH] Fix failure to clear/delete ticket topic and description --- src/main/java/com/gitblit/servlet/RawServlet.java | 94 ++++++++++++++++++++++------------------------ 1 files changed, 45 insertions(+), 49 deletions(-) diff --git a/src/main/java/com/gitblit/servlet/RawServlet.java b/src/main/java/com/gitblit/servlet/RawServlet.java index 6e93307..9fb96a5 100644 --- a/src/main/java/com/gitblit/servlet/RawServlet.java +++ b/src/main/java/com/gitblit/servlet/RawServlet.java @@ -101,15 +101,11 @@ fsc = c; } if (branch != null) { - branch = branch.replace('/', fsc); + branch = Repository.shortenRefName(branch).replace('/', fsc); } String encodedPath = path == null ? "" : path.replace(' ', '-'); encodedPath = encodedPath.replace('/', fsc); - try { - encodedPath = URLEncoder.encode(encodedPath, "UTF-8"); - } catch (UnsupportedEncodingException e) { - } return baseURL + Constants.RAW_PATH + repository + "/" + (branch == null ? "" : (branch + "/" + (path == null ? "" : encodedPath))); } @@ -134,7 +130,8 @@ if (path.endsWith("/")) { path = path.substring(0, path.length() - 1); } - return path; + char c = runtimeManager.getSettings().getChar(Keys.web.forwardSlashCharacter, '/'); + return path.replace('!', '/').replace(c, '/'); } protected boolean renderIndex() { @@ -175,10 +172,7 @@ } else { repository = path.substring(0, slash); } - offset += slash; - if (offset == 0) { - offset++; - } + offset += ( slash + 1 ); r = repositoryManager.getRepository(repository, false); if (repository.equals(path)) { // either only repository in url or no repository found @@ -251,8 +245,6 @@ } } - setContentType(response, contentType); - if (isTextType(contentType)) { // load, interpret, and serve text content as UTF-8 @@ -260,41 +252,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) { @@ -354,11 +327,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 { // @@ -424,12 +393,10 @@ } } - private 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"); - + boolean served = false; RevWalk rw = new RevWalk(repository); TreeWalk tw = new TreeWalk(repository); try { @@ -447,10 +414,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(); @@ -458,11 +445,11 @@ } response.flushBuffer(); + return served; } - 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"); + protected void sendContent(HttpServletResponse response, Date date, InputStream is) throws ServletException, IOException { + try { byte[] tmp = new byte[8192]; int len = 0; @@ -475,6 +462,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