James Moger
2014-05-04 1946fe76331b37c5a3be97268f0e3b0e58f3bb00
Refine branch and pages servlets
2 files modified
73 ■■■■ changed files
src/main/java/com/gitblit/servlet/BranchServlet.java 67 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/servlet/PagesServlet.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/servlet/BranchServlet.java
@@ -47,8 +47,10 @@
import org.slf4j.LoggerFactory;
import com.gitblit.Constants;
import com.gitblit.Keys;
import com.gitblit.dagger.DaggerServlet;
import com.gitblit.manager.IRepositoryManager;
import com.gitblit.manager.IRuntimeManager;
import com.gitblit.models.PathModel;
import com.gitblit.utils.ByteFormat;
import com.gitblit.utils.JGitUtils;
@@ -69,10 +71,13 @@
    private transient Logger logger = LoggerFactory.getLogger(BranchServlet.class);
    private IRuntimeManager runtimeManager;
    private IRepositoryManager repositoryManager;
    @Override
    protected void inject(ObjectGraph dagger) {
        this.runtimeManager = dagger.get(IRuntimeManager.class);
        this.repositoryManager = dagger.get(IRepositoryManager.class);
    }
@@ -89,7 +94,12 @@
        if (baseURL.length() > 0 && baseURL.charAt(baseURL.length() - 1) == '/') {
            baseURL = baseURL.substring(0, baseURL.length() - 1);
        }
        return baseURL + Constants.BRANCH + repository + "/" + (branch == null ? "" : (branch + "/" + (path == null ? "" : (path + "/"))));
        String encodedPath = path.replace(' ', '-');
        try {
            encodedPath = URLEncoder.encode(encodedPath, "UTF-8");
        } catch (UnsupportedEncodingException e) {
        }
        return baseURL + Constants.BRANCH + repository + "/" + (branch == null ? "" : (branch + "/" + (path == null ? "" : (encodedPath + "/"))));
    }
    protected String getBranch(String repository, HttpServletRequest request) {
@@ -210,9 +220,8 @@
            List<PathModel> pathEntries = JGitUtils.getFilesInPath(r, requestedPath, commit);
            if (pathEntries.isEmpty()) {
                // requested a specific resource
                String file = StringUtils.getLastPathElement(requestedPath);
                try {
                    String file = StringUtils.getLastPathElement(requestedPath);
                    // query Tika for the content type
                    Tika tika = new Tika();
                    String contentType = tika.detect(file);
@@ -226,16 +235,20 @@
                            contentType = "application/octet-stream";
                        }
                    }
                    response.setContentType(contentType);
                    setContentType(response, contentType);
                    if (contentType.startsWith("text/")
                            || "application/json".equals(contentType)
                            || "application/xml".equals(contentType)) {
                    if (isTextType(contentType)) {
                        // serve text content
                        String encoding = commit.getEncoding().name();
                        response.setCharacterEncoding(encoding);
                        // load, interpret, and serve text content as UTF-8
                        String [] encodings = runtimeManager.getSettings().getStrings(Keys.web.blobEncodings).toArray(new String[0]);
                        String content = JGitUtils.getStringContent(r, commit.getTree(), requestedPath, encodings);
                        byte [] bytes = content.getBytes(Constants.ENCODING);
                        response.setContentLength(bytes.length);
                        ByteArrayInputStream is = new ByteArrayInputStream(bytes);
                        sendContent(response, JGitUtils.getCommitDate(commit), is);
                    } else {
                        // serve binary content
                        String filename = StringUtils.getLastPathElement(requestedPath);
@@ -255,10 +268,10 @@
                        catch (UnsupportedEncodingException e) {
                            response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
                        }
                    }
                    // send content
                    streamFromRepo(response, r, commit, requestedPath);
                        // stream binary content directly from the repository
                        streamFromRepo(response, r, commit, requestedPath);
                    }
                    return;
                } catch (Exception e) {
                    logger.error(null, e);
@@ -293,8 +306,8 @@
                                fullPath = requestedPath + "/" + fileName;
                            }
                            String encoding = commit.getEncoding().name();
                            String stringContent = JGitUtils.getStringContent(r, commit.getTree(), fullPath, encoding);
                            String [] encodings = runtimeManager.getSettings().getStrings(Keys.web.blobEncodings).toArray(new String[0]);
                            String stringContent = JGitUtils.getStringContent(r, commit.getTree(), fullPath, encodings);
                            if (stringContent == null) {
                                continue;
                            }
@@ -306,6 +319,7 @@
                    response.setContentType("text/html; charset=" + Constants.ENCODING);
                    byte [] bytes = content.getBytes(Constants.ENCODING);
                    response.setContentLength(bytes.length);
                    ByteArrayInputStream is = new ByteArrayInputStream(bytes);
                    sendContent(response, JGitUtils.getCommitDate(commit), is);
@@ -371,6 +385,29 @@
        }
    }
    protected boolean isTextType(String contentType) {
        if (contentType.startsWith("text/")
                || "application/json".equals(contentType)
                || "application/xml".equals(contentType)) {
            return true;
        }
        return false;
    }
    /**
     * Override all text types to be plain text.
     *
     * @param response
     * @param contentType
     */
    protected void setContentType(HttpServletResponse response, String contentType) {
        if (isTextType(contentType)) {
            response.setContentType("text/plain");
        } else {
            response.setContentType(contentType);
        }
    }
    private void streamFromRepo(HttpServletResponse response, Repository repository,
            RevCommit commit, String requestedPath) throws IOException {
src/main/java/com/gitblit/servlet/PagesServlet.java
@@ -16,6 +16,7 @@
package com.gitblit.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.gitblit.Constants;
@@ -67,4 +68,9 @@
    protected boolean renderIndex() {
        return true;
    }
    @Override
    protected void setContentType(HttpServletResponse response, String contentType) {
        response.setContentType(contentType);;
    }
}