diff options
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.java | 81 |
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); |