James Moger
2013-11-20 bdfdc9c65c5eb2786b7dd8e33ba8a12a3bafe86d
src/main/java/com/gitblit/DownloadZipServlet.java
@@ -16,11 +16,12 @@
package com.gitblit;
import java.io.IOException;
import java.net.SocketException;
import java.text.MessageFormat;
import java.text.ParseException;
import java.util.Date;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletResponse;
@@ -30,6 +31,8 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.gitblit.manager.IRepositoryManager;
import com.gitblit.manager.IRuntimeManager;
import com.gitblit.utils.CompressionUtils;
import com.gitblit.utils.JGitUtils;
import com.gitblit.utils.MarkdownUtils;
@@ -38,25 +41,30 @@
/**
 * Streams out a zip file from the specified repository for any tree path at any
 * revision.
 *
 *
 * @author James Moger
 *
 *
 */
@Singleton
public class DownloadZipServlet extends HttpServlet {
   private static final long serialVersionUID = 1L;
   private transient Logger logger = LoggerFactory.getLogger(DownloadZipServlet.class);
   private final IStoredSettings settings;
   private final IRepositoryManager repositoryManager;
   public static enum Format {
      zip(".zip"), tar(".tar"), gz(".tar.gz"), xz(".tar.xz"), bzip2(".tar.bzip2");
      public final String extension;
      Format(String ext) {
         this.extension = ext;
      }
      public static Format fromName(String name) {
         for (Format format : values()) {
            if (format.name().equalsIgnoreCase(name)) {
@@ -67,13 +75,19 @@
      }
   }
   public DownloadZipServlet() {
   @Inject
   public DownloadZipServlet(
         IRuntimeManager runtimeManager,
         IRepositoryManager repositoryManager) {
      super();
      this.settings = runtimeManager.getSettings();
      this.repositoryManager = repositoryManager;
   }
   /**
    * Returns an url to this servlet for the specified parameters.
    *
    *
    * @param baseURL
    * @param repository
    * @param objectId
@@ -93,7 +107,7 @@
   /**
    * Creates a zip stream from the repository of the requested data.
    *
    *
    * @param request
    * @param response
    * @throws javax.servlet.ServletException
@@ -102,12 +116,12 @@
   private void processRequest(javax.servlet.http.HttpServletRequest request,
         javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException,
         java.io.IOException {
      if (!GitBlit.getBoolean(Keys.web.allowZipDownloads, true)) {
      if (!settings.getBoolean(Keys.web.allowZipDownloads, true)) {
         logger.warn("Zip downloads are disabled");
         response.sendError(HttpServletResponse.SC_FORBIDDEN);
         return;
      }
      Format format = Format.zip;
      String repository = request.getParameter("r");
      String basePath = request.getParameter("p");
@@ -116,7 +130,7 @@
      if (!StringUtils.isEmpty(f)) {
         format = Format.fromName(f);
      }
      try {
         String name = repository;
         if (name.indexOf('/') > -1) {
@@ -130,10 +144,10 @@
         if (!StringUtils.isEmpty(objectId)) {
            name += "-" + objectId;
         }
         Repository r = GitBlit.self().getRepository(repository);
         Repository r = repositoryManager.getRepository(repository);
         if (r == null) {
            if (GitBlit.self().isCollectingGarbage(repository)) {
            if (repositoryManager.isCollectingGarbage(repository)) {
               error(response, MessageFormat.format("# Error\nGitblit is busy collecting garbage in {0}", repository));
               return;
            } else {
@@ -175,14 +189,14 @@
               CompressionUtils.bzip2(r, basePath, objectId, response.getOutputStream());
               break;
            }
            response.flushBuffer();
         } catch (SocketException t) {
         } catch (IOException t) {
            String message = t.getMessage() == null ? "" : t.getMessage().toLowerCase();
            if (message.contains("reset") || message.contains("broken pipe")) {
               logger.error("Client aborted zip download: " + message);
            } else {
               logger.error("Failed to write attachment to client", t);
               logger.error("Failed to write attachment to client", t);
            }
         } catch (Throwable t) {
            logger.error("Failed to write attachment to client", t);