Reject git operation when server is not ready.

This commit is contained in:
robin shine 2013-10-02 16:47:42 +08:00
parent 4e10bbc1b6
commit 81a19f4ce3
2 changed files with 31 additions and 19 deletions

View File

@ -4,6 +4,7 @@ import java.io.IOException;
import java.util.EnumSet;
import java.util.Set;
import javax.inject.Provider;
import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
@ -29,16 +30,19 @@ public class JettyPlugin extends AbstractPlugin {
private ServletContextHandler contextHandler;
private final Set<ServerConfigurator> serverConfigurators;
private final Provider<Set<ServerConfigurator>> serverConfiguratorsProvider;
private final Set<ServletConfigurator> servletContextConfigurators;
private final Provider<Set<ServletConfigurator>> servletConfiguratorsProvider;
/*
* Inject providers here to avoid circurlar dependencies when dependency graph gets complicated
*/
@Inject
public JettyPlugin(
Set<ServerConfigurator> serverConfigurators,
Set<ServletConfigurator> servletContextConfigurators) {
this.serverConfigurators = serverConfigurators;
this.servletContextConfigurators = servletContextConfigurators;
Provider<Set<ServerConfigurator>> serverConfiguratorsProvider,
Provider<Set<ServletConfigurator>> servletConfiguratorsProvider) {
this.serverConfiguratorsProvider = serverConfiguratorsProvider;
this.servletConfiguratorsProvider = servletConfiguratorsProvider;
}
@Override
@ -80,7 +84,7 @@ public class JettyPlugin extends AbstractPlugin {
contextHandler.addFilter(DisableTraceFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
for (ServletConfigurator configurator: servletContextConfigurators)
for (ServletConfigurator configurator: servletConfiguratorsProvider.get())
configurator.configure(contextHandler);
/*
@ -92,7 +96,7 @@ public class JettyPlugin extends AbstractPlugin {
server.setHandler(contextHandler);
for (ServerConfigurator configurator: serverConfigurators)
for (ServerConfigurator configurator: serverConfiguratorsProvider.get())
configurator.configure(server);
return server;

View File

@ -35,10 +35,13 @@ public class GitFilter implements Filter {
private static final String INFO_REFS = "info/refs";
private final Gitop gitop;
private final ProjectManager projectManager;
@Inject
public GitFilter(ProjectManager projectManager) {
public GitFilter(Gitop gitop, ProjectManager projectManager) {
this.gitop = gitop;
this.projectManager = projectManager;
}
@ -147,17 +150,22 @@ public class GitFilter implements Filter {
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
try {
if (GitSmartHttpTools.isInfoRefs(httpRequest)) {
processRefs(httpRequest, httpResponse);
} else if (GitSmartHttpTools.isReceivePack(httpRequest) || GitSmartHttpTools.isUploadPack(httpRequest)) {
processPacks(httpRequest, httpResponse);
} else {
chain.doFilter(request, response);
if (gitop.isReady()) {
try {
if (GitSmartHttpTools.isInfoRefs(httpRequest)) {
processRefs(httpRequest, httpResponse);
} else if (GitSmartHttpTools.isReceivePack(httpRequest) || GitSmartHttpTools.isUploadPack(httpRequest)) {
processPacks(httpRequest, httpResponse);
} else {
chain.doFilter(request, response);
}
} catch (GeneralException e) {
logger.error("Error serving git request", e);
GitSmartHttpTools.sendError(httpRequest, httpResponse, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
}
} catch (GeneralException e) {
logger.error("Error serving git request", e);
GitSmartHttpTools.sendError(httpRequest, httpResponse, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
} else {
GitSmartHttpTools.sendError(httpRequest, httpResponse, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Server is not ready.");
}
}