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 <r...@apache.org>
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: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to