This is an automated email from the ASF dual-hosted git repository. remm pushed a commit to branch 10.1.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/10.1.x by this push: new 8829e96c45 Add specific test for TE parsing 8829e96c45 is described below commit 8829e96c45ea85656a33ef8c8d809da9afc4cb2d 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