This is an automated email from the ASF dual-hosted git repository.
remm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/main by this push:
new e3d05323c5 Add specific test for TE parsing
e3d05323c5 is described below
commit e3d05323c50f26455348616ff3ddc826d8538336
Author: remm <[email protected]>
AuthorDate: Fri Feb 21 10:43:16 2025 +0100
Add specific test for TE parsing
Add quality parsing for completeness.
Taken from accept-language tests (without duplicating too much since
this is the same quality parsing).
---
java/org/apache/tomcat/util/http/parser/TE.java | 26 ++++--
.../org/apache/tomcat/util/http/parser/TestTE.java | 95 ++++++++++++++++++++++
2 files changed, 114 insertions(+), 7 deletions(-)
diff --git a/java/org/apache/tomcat/util/http/parser/TE.java
b/java/org/apache/tomcat/util/http/parser/TE.java
index b2792448fa..76f60fbbef 100644
--- a/java/org/apache/tomcat/util/http/parser/TE.java
+++ b/java/org/apache/tomcat/util/http/parser/TE.java
@@ -27,10 +27,12 @@ public class TE {
private final String encoding;
private final Map<String,String> parameters;
+ private final double quality;
- protected TE(String encoding, Map<String,String> parameters) {
+ protected TE(String encoding, Map<String,String> parameters, double
quality) {
this.encoding = encoding;
this.parameters = parameters;
+ this.quality = quality;
}
public String getEncoding() {
@@ -41,6 +43,10 @@ public class TE {
return parameters;
}
+ public double getQuality() {
+ return quality;
+ }
+
public static List<TE> parse(StringReader input) throws IOException {
@@ -59,9 +65,9 @@ public class TE {
break;
}
- Map<String,String> parameters = null;
+ Map<String,String> parameters = new HashMap<>();
- // See if a quality has been provided
+ // Parse parameters (including optional quality)
while (HttpParser.skipConstant(input, ";") == SkipResult.FOUND) {
String name = HttpParser.readToken(input);
String value = null;
@@ -69,14 +75,20 @@ public class TE {
value = HttpParser.readTokenOrQuotedString(input, true);
}
if (name != null && value != null) {
- if (parameters == null) {
- parameters = new HashMap<>();
- }
parameters.put(name, value);
}
}
- result.add(new TE(encoding, parameters));
+ // See if a quality has been provided in the parameters
+ double quality = 1;
+ String q = parameters.remove("q");
+ if (q != null) {
+ quality = HttpParser.readWeight(new StringReader("q=" + q),
',');
+ }
+
+ if (quality > 0) {
+ result.add(new TE(encoding, parameters, quality));
+ }
} while (true);
return result;
diff --git a/test/org/apache/tomcat/util/http/parser/TestTE.java
b/test/org/apache/tomcat/util/http/parser/TestTE.java
new file mode 100644
index 0000000000..59d6ab2f78
--- /dev/null
+++ b/test/org/apache/tomcat/util/http/parser/TestTE.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.util.http.parser;
+
+import java.io.StringReader;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestTE {
+
+ private static final String GZIP = "gzip";
+ private static final double Q1_000 = 1;
+ private static final double Q0_500 = 0.5;
+ private static final double Q0_050 = 0.05;
+
+ @Test
+ public void testSimpleTE() throws Exception {
+ List<TE> actual = TE.parse(new StringReader("gzip"));
+
+ Assert.assertEquals(1, actual.size());
+ Assert.assertEquals("gzip", actual.get(0).getEncoding());
+ Assert.assertEquals(Q1_000, actual.get(0).getQuality(), 0.0001);
+ }
+
+ @Test
+ public void testComplexTE1() throws Exception {
+ List<TE> actual = TE.parse(new StringReader("gzip;q=0.5"));
+
+ Assert.assertEquals(1, actual.size());
+ Assert.assertEquals("gzip", actual.get(0).getEncoding());
+ Assert.assertEquals(Q0_500, actual.get(0).getQuality(), 0.0001);
+ }
+
+ @Test
+ public void testComplexTE2() throws Exception {
+ List<TE> actual = TE.parse(new StringReader("gzip;q=0.5,
something;q=0.05"));
+
+ Assert.assertEquals(2, actual.size());
+ Assert.assertEquals("gzip", actual.get(0).getEncoding());
+ Assert.assertEquals(Q0_500, actual.get(0).getQuality(), 0.0001);
+ }
+
+ @Test
+ public void testComplexTE3() throws Exception {
+ List<TE> actual = TE.parse(new StringReader("gzip; arg1= val1; arg2 =
val2 ; q =0.05"));
+
+ Assert.assertEquals(1, actual.size());
+ Assert.assertEquals(GZIP, actual.get(0).getEncoding());
+ Assert.assertEquals(Q0_050, actual.get(0).getQuality(), 0.0001);
+ Assert.assertEquals("val1", actual.get(0).getParameters().get("arg1"));
+ Assert.assertEquals("val2", actual.get(0).getParameters().get("arg2"));
+ }
+
+ @Test
+ public void testMalformed01() throws Exception {
+ List<TE> actual = TE.parse(new StringReader("gzip;q=a,gzip;q=0.5"));
+
+ Assert.assertEquals(1, actual.size());
+ Assert.assertEquals(GZIP, actual.get(0).getEncoding());
+ Assert.assertEquals(Q0_500, actual.get(0).getQuality(), 0.0001);
+ }
+
+ @Test
+ public void testMalformed02() throws Exception {
+ List<TE> actual = TE.parse(new StringReader("gzip,,"));
+
+ Assert.assertEquals(1, actual.size());
+ Assert.assertEquals("gzip", actual.get(0).getEncoding());
+ Assert.assertEquals(Q1_000, actual.get(0).getQuality(), 0.0001);
+ }
+
+ @Test
+ public void testMalformed03() throws Exception {
+ List<TE> actual = TE.parse(new StringReader("gzip;q=1.0a0"));
+
+ Assert.assertEquals(0, actual.size());
+ }
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]