Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShawn O. Pearce2012-09-20 00:33:07 +0000
committerShawn O. Pearce2012-09-20 00:33:07 +0000
commitf93a6a72290d475d080b1e76de58a21934422e90 (patch)
treeb06eb5d42711d10bf68049a246c1dbbde2616276 /org.eclipse.jgit.http.server/src/org/eclipse/jgit/http
parentc9cce254c7e928770763be309573b6cfd0a5ee4e (diff)
downloadjgit-f93a6a72290d475d080b1e76de58a21934422e90.tar.gz
jgit-f93a6a72290d475d080b1e76de58a21934422e90.tar.xz
jgit-f93a6a72290d475d080b1e76de58a21934422e90.zip
Compress large /info/refs responses on HTTP
Enable streaming compression for any response that is bigger than the 32 KiB buffer used by SmartOutputStream. This is useful on the info/refs file which can have many branches and tags listed, and is often bigger than 32 KiB, but also compresses by at least 50%. Disable streaming compression on large git-upload-pack responses, as these are usually highly compressed Git pack data. Trying to compress these with gzip will only waste CPU time and additional transfer space with the gzip wrapper. Small git-upload-pack data is usually text based negotiation responses and can be squeezed smaller with a little bit of CPU usage. Change-Id: Ia13e63ed334f594d5e1ab53a97240eb2e8f550e2
Diffstat (limited to 'org.eclipse.jgit.http.server/src/org/eclipse/jgit/http')
-rw-r--r--org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/InfoRefsServlet.java3
-rw-r--r--org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ReceivePackServlet.java2
-rw-r--r--org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/SmartOutputStream.java15
-rw-r--r--org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/SmartServiceInfoRefs.java2
-rw-r--r--org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/UploadPackServlet.java2
5 files changed, 16 insertions, 8 deletions
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 ffaa13153c..52f928548b 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 10cadd7bb0..3d6c35b0b6 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 c39b78900d..145c63bcaf 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 907b328db9..4810753779 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 046db45766..c5272b55eb 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();

Back to the top