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";
}
/**