You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by re...@apache.org on 2020/07/09 12:59:45 UTC

svn commit: r1879705 - in /jackrabbit/branches/2.20: ./ jackrabbit-jcr-server/src/test/java/org/apache/jackrabbit/webdav/server/ContentCodingTest.java jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/WebdavRequestImpl.java

Author: reschke
Date: Thu Jul  9 12:59:45 2020
New Revision: 1879705

URL: http://svn.apache.org/viewvc?rev=1879705&view=rev
Log:
JCR-4582: support 'deflate' encoding in requests (merged r1878707 into 2.20)

Modified:
    jackrabbit/branches/2.20/   (props changed)
    jackrabbit/branches/2.20/jackrabbit-jcr-server/src/test/java/org/apache/jackrabbit/webdav/server/ContentCodingTest.java
    jackrabbit/branches/2.20/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/WebdavRequestImpl.java

Propchange: jackrabbit/branches/2.20/
------------------------------------------------------------------------------
  Merged /jackrabbit/trunk:r1878707

Modified: jackrabbit/branches/2.20/jackrabbit-jcr-server/src/test/java/org/apache/jackrabbit/webdav/server/ContentCodingTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.20/jackrabbit-jcr-server/src/test/java/org/apache/jackrabbit/webdav/server/ContentCodingTest.java?rev=1879705&r1=1879704&r2=1879705&view=diff
==============================================================================
--- jackrabbit/branches/2.20/jackrabbit-jcr-server/src/test/java/org/apache/jackrabbit/webdav/server/ContentCodingTest.java (original)
+++ jackrabbit/branches/2.20/jackrabbit-jcr-server/src/test/java/org/apache/jackrabbit/webdav/server/ContentCodingTest.java Thu Jul  9 12:59:45 2020
@@ -19,8 +19,14 @@ package org.apache.jackrabbit.webdav.ser
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+import java.util.zip.DeflaterOutputStream;
 import java.util.zip.GZIPOutputStream;
 
+import org.apache.http.Header;
 import org.apache.http.HttpResponse;
 import org.apache.http.client.methods.HttpHead;
 import org.apache.http.client.methods.HttpPut;
@@ -104,7 +110,9 @@ public class ContentCodingTest extends W
         HttpResponse response = this.client.execute(propfind, this.context);
         int status = response.getStatusLine().getStatusCode();
         assertTrue("server must signal error for unknown content coding, got: " + status, status == 415);
-        assertEquals("gzip", response.getFirstHeader("Accept").getValue());
+        List<String> encodings = getContentCodings(response);
+        assertTrue("Accept should list 'gzip' but did not: " + encodings, encodings.contains("gzip"));
+        assertTrue("Accept should list 'deflate' but did not: " + encodings, encodings.contains("deflate"));
     }
 
     public void testPropfindGzipContentCoding() throws IOException {
@@ -137,6 +145,33 @@ public class ContentCodingTest extends W
         assertEquals(400, status);
     }
 
+    public void testPropfindDeflateContentCoding() throws IOException {
+        HttpPropfind propfind = new HttpPropfind(uri, DavConstants.PROPFIND_BY_PROPERTY, 0);
+        ByteArrayEntity entity = new ByteArrayEntity(asDeflateOctets(PF));
+        entity.setContentEncoding(new BasicHeader("Content-Encoding", "deflate"));
+        propfind.setEntity(entity);
+        int status = this.client.execute(propfind, this.context).getStatusLine().getStatusCode();
+        assertEquals(207, status);
+    }
+
+    public void testPropfindGzipDeflateContentCoding() throws IOException {
+        HttpPropfind propfind = new HttpPropfind(uri, DavConstants.PROPFIND_BY_PROPERTY, 0);
+        ByteArrayEntity entity = new ByteArrayEntity(asDeflateOctets(asGzipOctets(PF)));
+        entity.setContentEncoding(new BasicHeader("Content-Encoding", "gzip, deflate"));
+        propfind.setEntity(entity);
+        int status = this.client.execute(propfind, this.context).getStatusLine().getStatusCode();
+        assertEquals(207, status);
+    }
+
+    public void testPropfindGzipDeflateContentCodingMislabeled() throws IOException {
+        HttpPropfind propfind = new HttpPropfind(uri, DavConstants.PROPFIND_BY_PROPERTY, 0);
+        ByteArrayEntity entity = new ByteArrayEntity(asDeflateOctets(asGzipOctets(PF)));
+        entity.setContentEncoding(new BasicHeader("Content-Encoding", "deflate, gzip"));
+        propfind.setEntity(entity);
+        int status = this.client.execute(propfind, this.context).getStatusLine().getStatusCode();
+        assertEquals(400, status);
+    }
+
     private static byte[] asGzipOctets(String input) throws IOException {
         return asGzipOctets(input.getBytes("UTF-8"));
     }
@@ -149,4 +184,33 @@ public class ContentCodingTest extends W
         gos.close();
         return bos.toByteArray();
     }
+
+    private static byte[] asDeflateOctets(String input) throws IOException {
+        return asDeflateOctets(input.getBytes("UTF-8"));
+    }
+
+    private static byte[] asDeflateOctets(byte[] input) throws IOException {
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        OutputStream gos = new DeflaterOutputStream(bos);
+        gos.write(input);
+        gos.flush();
+        gos.close();
+        return bos.toByteArray();
+    }
+
+    private static List<String> getContentCodings(HttpResponse response) {
+        List<String> result = Collections.emptyList();
+        for (Header l : response.getHeaders("Accept")) {
+            for (String h : l.getValue().split(",")) {
+                if (!h.trim().isEmpty()) {
+                    if (result.isEmpty()) {
+                        result = new ArrayList<String>();
+                    }
+                    result.add(h.trim().toLowerCase(Locale.ENGLISH));
+                }
+            }
+        }
+
+        return result;
+    }
 }

Modified: jackrabbit/branches/2.20/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/WebdavRequestImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.20/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/WebdavRequestImpl.java?rev=1879705&r1=1879704&r2=1879705&view=diff
==============================================================================
--- jackrabbit/branches/2.20/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/WebdavRequestImpl.java (original)
+++ jackrabbit/branches/2.20/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/WebdavRequestImpl.java Thu Jul  9 12:59:45 2020
@@ -31,6 +31,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.zip.GZIPInputStream;
+import java.util.zip.InflaterInputStream;
 
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletInputStream;
@@ -383,6 +384,8 @@ public class WebdavRequestImpl implement
             log.trace("decoding: " + s);
             if ("gzip".equals(s)) {
                 result = new GZIPInputStream(result);
+            } else if ("deflate".equals(s)) {
+                result = new InflaterInputStream(result);
             } else {
                 String message = "Unsupported content coding: " + s;
                 try {
@@ -400,7 +403,7 @@ public class WebdavRequestImpl implement
 
     @Override
     public String getAcceptableCodings() {
-        return "gzip";
+        return "deflate, gzip";
     }
 
     /**