Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ReceivePackServlet.java')
-rw-r--r--org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ReceivePackServlet.java81
1 files changed, 61 insertions, 20 deletions
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ReceivePackServlet.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ReceivePackServlet.java
index bb4ae19e78..69b5aec25e 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ReceivePackServlet.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ReceivePackServlet.java
@@ -47,11 +47,19 @@ import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN;
import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED;
import static javax.servlet.http.HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE;
+import static org.eclipse.jgit.http.server.ServletUtils.ATTRIBUTE_HANDLER;
import static org.eclipse.jgit.http.server.ServletUtils.getInputStream;
import static org.eclipse.jgit.http.server.ServletUtils.getRepository;
import java.io.IOException;
-
+import java.util.List;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -72,18 +80,27 @@ class ReceivePackServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
static class InfoRefs extends SmartServiceInfoRefs {
- private final ReceivePackFactory receivePackFactory;
+ private final ReceivePackFactory<HttpServletRequest> receivePackFactory;
- InfoRefs(final ReceivePackFactory receivePackFactory) {
- super("git-receive-pack");
+ InfoRefs(ReceivePackFactory<HttpServletRequest> receivePackFactory,
+ List<Filter> filters) {
+ super("git-receive-pack", filters);
this.receivePackFactory = receivePackFactory;
}
@Override
- protected void advertise(HttpServletRequest req, Repository db,
+ protected void begin(HttpServletRequest req, Repository db)
+ throws IOException, ServiceNotEnabledException,
+ ServiceNotAuthorizedException {
+ ReceivePack rp = receivePackFactory.create(req, db);
+ req.setAttribute(ATTRIBUTE_HANDLER, rp);
+ }
+
+ @Override
+ protected void advertise(HttpServletRequest req,
PacketLineOutRefAdvertiser pck) throws IOException,
ServiceNotEnabledException, ServiceNotAuthorizedException {
- ReceivePack rp = receivePackFactory.create(req, db);
+ ReceivePack rp = (ReceivePack) req.getAttribute(ATTRIBUTE_HANDLER);
try {
rp.sendAdvertisedRefs(pck);
} finally {
@@ -92,10 +109,44 @@ class ReceivePackServlet extends HttpServlet {
}
}
- private final ReceivePackFactory receivePackFactory;
+ static class Factory implements Filter {
+ private final ReceivePackFactory<HttpServletRequest> receivePackFactory;
- ReceivePackServlet(final ReceivePackFactory receivePackFactory) {
- this.receivePackFactory = receivePackFactory;
+ Factory(ReceivePackFactory<HttpServletRequest> receivePackFactory) {
+ this.receivePackFactory = receivePackFactory;
+ }
+
+ public void doFilter(ServletRequest request, ServletResponse response,
+ FilterChain chain) throws IOException, ServletException {
+ HttpServletRequest req = (HttpServletRequest) request;
+ HttpServletResponse rsp = (HttpServletResponse) response;
+ ReceivePack rp;
+ try {
+ rp = receivePackFactory.create(req, getRepository(req));
+ } catch (ServiceNotAuthorizedException e) {
+ rsp.sendError(SC_UNAUTHORIZED);
+ return;
+
+ } catch (ServiceNotEnabledException e) {
+ rsp.sendError(SC_FORBIDDEN);
+ return;
+ }
+
+ try {
+ req.setAttribute(ATTRIBUTE_HANDLER, rp);
+ chain.doFilter(req, rsp);
+ } finally {
+ req.removeAttribute(ATTRIBUTE_HANDLER);
+ }
+ }
+
+ public void init(FilterConfig filterConfig) throws ServletException {
+ // Nothing.
+ }
+
+ public void destroy() {
+ // Nothing.
+ }
}
@Override
@@ -106,9 +157,8 @@ class ReceivePackServlet extends HttpServlet {
return;
}
- final Repository db = getRepository(req);
+ ReceivePack rp = (ReceivePack) req.getAttribute(ATTRIBUTE_HANDLER);
try {
- final ReceivePack rp = receivePackFactory.create(req, db);
rp.setBiDirectionalPipe(false);
rsp.setContentType(RSP_TYPE);
@@ -120,15 +170,6 @@ class ReceivePackServlet extends HttpServlet {
};
rp.receive(getInputStream(req), out, null);
out.close();
-
- } catch (ServiceNotAuthorizedException e) {
- rsp.sendError(SC_UNAUTHORIZED);
- return;
-
- } catch (ServiceNotEnabledException e) {
- rsp.sendError(SC_FORBIDDEN);
- return;
-
} catch (IOException e) {
getServletContext().log(HttpServerText.get().internalErrorDuringReceivePack, e);
rsp.sendError(SC_INTERNAL_SERVER_ERROR);

Back to the top