diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/GitFilter.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/GitFilter.java index 980d246d2..529b8391f 100644 --- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/GitFilter.java +++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/GitFilter.java @@ -225,7 +225,7 @@ public class GitFilter extends MetaFilter { refs = refs.through(new AsIsFileFilter(asIs)); refs.with(new InfoRefsServlet()); } else - refs.with(new ErrorServlet(HttpServletResponse.SC_FORBIDDEN)); + refs.with(new ErrorServlet(HttpServletResponse.SC_NOT_ACCEPTABLE)); if (asIs != AsIsFileService.DISABLED) { final IsLocalFilter mustBeLocal = new IsLocalFilter(); diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/InfoRefsServlet.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/InfoRefsServlet.java index ffaa13153..52f928548 100644 --- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/InfoRefsServlet.java +++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/InfoRefsServlet.java @@ -72,7 +72,8 @@ class InfoRefsServlet extends HttpServlet { final Repository db = getRepository(req); final OutputStreamWriter out = new OutputStreamWriter( - new SmartOutputStream(req, rsp), Constants.CHARSET); + new SmartOutputStream(req, rsp, true), + Constants.CHARSET); final RefAdvertiser adv = new RefAdvertiser() { @Override protected void writeOne(final CharSequence line) throws IOException { 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 10cadd7bb..3d6c35b0b 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 @@ -171,7 +171,7 @@ class ReceivePackServlet extends HttpServlet { return; } - SmartOutputStream out = new SmartOutputStream(req, rsp) { + SmartOutputStream out = new SmartOutputStream(req, rsp, true) { @Override public void flush() throws IOException { doFlush(); diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/SmartOutputStream.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/SmartOutputStream.java index c39b78900..145c63bca 100644 --- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/SmartOutputStream.java +++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/SmartOutputStream.java @@ -70,22 +70,29 @@ class SmartOutputStream extends TemporaryBuffer { private static final int LIMIT = 32 * 1024; private final HttpServletRequest req; - private final HttpServletResponse rsp; - + private boolean compressStream; private boolean startedOutput; SmartOutputStream(final HttpServletRequest req, - final HttpServletResponse rsp) { + final HttpServletResponse rsp, + boolean compressStream) { super(LIMIT); this.req = req; this.rsp = rsp; + this.compressStream = compressStream; } @Override protected OutputStream overflow() throws IOException { startedOutput = true; - return rsp.getOutputStream(); + + OutputStream out = rsp.getOutputStream(); + if (compressStream && acceptsGzipEncoding(req)) { + rsp.setHeader(HDR_CONTENT_ENCODING, ENCODING_GZIP); + out = new GZIPOutputStream(out); + } + return out; } public void close() throws IOException { diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/SmartServiceInfoRefs.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/SmartServiceInfoRefs.java index 907b328db..481075377 100644 --- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/SmartServiceInfoRefs.java +++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/SmartServiceInfoRefs.java @@ -122,7 +122,7 @@ abstract class SmartServiceInfoRefs implements Filter { throws IOException { final HttpServletRequest req = (HttpServletRequest) request; final HttpServletResponse res = (HttpServletResponse) response; - final SmartOutputStream buf = new SmartOutputStream(req, res); + final SmartOutputStream buf = new SmartOutputStream(req, res, true); try { res.setContentType(infoRefsResultType(svc)); diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/UploadPackServlet.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/UploadPackServlet.java index 046db4576..c5272b55e 100644 --- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/UploadPackServlet.java +++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/UploadPackServlet.java @@ -172,7 +172,7 @@ class UploadPackServlet extends HttpServlet { return; } - SmartOutputStream out = new SmartOutputStream(req, rsp) { + SmartOutputStream out = new SmartOutputStream(req, rsp, false) { @Override public void flush() throws IOException { doFlush();