This is an automated email from the ASF dual-hosted git repository.
jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/master by this push:
new a00669a org.apache.juneau.http improvements.
a00669a is described below
commit a00669a3e519bb0ea2e3890ae41e7b4eb1e8fde8
Author: JamesBognar <[email protected]>
AuthorDate: Tue Jul 14 17:03:53 2020 -0400
org.apache.juneau.http improvements.
---
.../java/org/apache/juneau/http/Constants.java | 3 -
.../java/org/apache/juneau/http/MediaRange.java | 34 +-----
.../java/org/apache/juneau/http/MediaRanges.java | 30 +-----
.../java/org/apache/juneau/http/MediaType.java | 18 +---
.../java/org/apache/juneau/http/StringRange.java | 18 +---
.../org/apache/juneau/http/Constants_Test.java | 22 ++--
...ptTest.java => MediaRanges_FindMatch_Test.java} | 8 +-
.../org/apache/juneau/http/MediaRanges_Test.java | 117 +++++++++++++++++++++
.../http/annotation/AnnotationUtilsTest.java | 0
.../juneau/http/header/AcceptExtensionsTest.java | 112 --------------------
.../java/org/apache/juneau/rest/RestRequest.java | 15 ++-
11 files changed, 155 insertions(+), 222 deletions(-)
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/Constants.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/Constants.java
index 42e8019..ae31e09 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/Constants.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/Constants.java
@@ -12,8 +12,6 @@
//
***************************************************************************************************************************
package org.apache.juneau.http;
-import org.apache.juneau.http.annotation.*;
-
/**
* Constants used by classes in this package.
*
@@ -21,7 +19,6 @@ import org.apache.juneau.http.annotation.*;
* <li class='extlink'>{@doc RFC2616}
* </ul>
*/
-@Header("Constants")
public class Constants {
/** Use caching of HTTP artifacts. */
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/MediaRange.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/MediaRange.java
index 812fdb3..aa13a85 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/MediaRange.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/MediaRange.java
@@ -12,8 +12,6 @@
//
***************************************************************************************************************************
package org.apache.juneau.http;
-import static org.apache.juneau.internal.ObjectUtils.*;
-
import java.util.*;
import org.apache.http.*;
@@ -24,7 +22,7 @@ import org.apache.juneau.collections.*;
/**
* Describes a single type used in content negotiation between an HTTP client
and server, as described in
* Section 14.1 and 14.7 of RFC2616 (the HTTP/1.1 specification).
- *
+ *
* <ul class='seealso'>
* <li class='extlink'>{@doc RFC2616}
* </ul>
@@ -39,15 +37,6 @@ public class MediaRange extends MediaType {
/**
* Constructor.
*
- * @param value The raw media range string.
- */
- public MediaRange(String value) {
- this(parse(value));
- }
-
- /**
- * Constructor.
- *
* @param e The parsed media range element.
*/
public MediaRange(HeaderElement e) {
@@ -116,27 +105,6 @@ public class MediaRange extends MediaType {
return Collections.unmodifiableList(Arrays.asList(extensions));
}
- /**
- * Returns <jk>true</jk> if the specified object is also a
<c>MediaType</c>, and has the same qValue, type,
- * parameters, and extensions.
- *
- * @return <jk>true</jk> if object is equivalent.
- */
- @Override /* Object */
- public boolean equals(Object o) {
- return (o instanceof MediaRange) && eq(this, (MediaRange)o,
(x,y)->eq(x.string, y.string));
- }
-
- /**
- * Returns a hash based on this instance's <c>media-type</c>.
- *
- * @return A hash based on this instance's <c>media-type</c>.
- */
- @Override /* Object */
- public int hashCode() {
- return string.hashCode();
- }
-
@Override /* Object */
public String toString() {
return string;
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/MediaRanges.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/MediaRanges.java
index 1cc6c44..6258827 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/MediaRanges.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/MediaRanges.java
@@ -169,22 +169,6 @@ public class MediaRanges {
}
/**
- * Same as {@link #findMatch(List)} but matching against media type
ranges.
- *
- * <p>
- * Note that the q-types on both the <c>mediaTypeRanges</c> parameter
and this header
- * are taken into account when trying to find the best match.
- * <br>When both this header and the matching range have q-values, the
q-value for the match is the result of multiplying them.
- * <br>(e.g. Accept=<js>"text/html;q=0.9"</js> and
mediaTypeRange=<js>"text/html;q=0.9"</js> ==>, q-value=<c>0.81</c>).
- *
- * @param mediaRanges The media type ranges to match against.
- * @return The index into the array of the best match, or <c>-1</c> if
no suitable matches could be found.
- */
- public int findMatch(MediaRanges mediaRanges) {
- return findMatch(mediaRanges.getRanges());
- }
-
- /**
* Returns the {@link MediaRange} at the specified index.
*
* @param index The index position of the media range.
@@ -217,16 +201,6 @@ public class MediaRanges {
}
/**
- * Parses the specified header element part.
- *
- * @param value The header element part.
- * @return Thew parsed header element part. Never <jk>null</jk>.
- */
- protected static HeaderElement[] parse(String value) {
- return
BasicHeaderValueParser.parseElements(emptyIfNull(trim(value)), null);
- }
-
- /**
* Returns the media ranges that make up this object.
*
* @return The media ranges that make up this object.
@@ -235,6 +209,10 @@ public class MediaRanges {
return Collections.unmodifiableList(Arrays.asList(ranges));
}
+ private static HeaderElement[] parse(String value) {
+ return
BasicHeaderValueParser.parseElements(emptyIfNull(trim(value)), null);
+ }
+
@Override /* Object */
public String toString() {
return string;
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/MediaType.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/MediaType.java
index c08d11a..78bf361 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/MediaType.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/MediaType.java
@@ -39,8 +39,6 @@ public class MediaType implements Comparable<MediaType> {
private static final Cache<String,MediaType> CACHE = new
Cache<>(NOCACHE, CACHE_MAX_SIZE);
- private static final HeaderElement DEFAULT_ELEMENT = new
BasicHeaderElement("", "");
-
/** Reusable predefined media type */
@SuppressWarnings("javadoc")
public static final MediaType
@@ -161,17 +159,6 @@ public class MediaType implements Comparable<MediaType> {
}
/**
- * Parses the specified header element part.
- *
- * @param value The header element part.
- * @return Thew parsed header element part. Never <jk>null</jk>.
- */
- protected static HeaderElement parse(String value) {
- HeaderElement[] elements =
BasicHeaderValueParser.parseElements(emptyIfNull(trim(value)), null);
- return (elements.length > 0 ? elements[0] : DEFAULT_ELEMENT);
- }
-
- /**
* Returns the <js>'type'</js> fragment of the <js>'type/subType'</js>
string.
*
* @return The media type.
@@ -327,6 +314,11 @@ public class MediaType implements Comparable<MediaType> {
return Collections.unmodifiableList(Arrays.asList(parameters));
}
+ private static HeaderElement parse(String value) {
+ HeaderElement[] elements =
BasicHeaderValueParser.parseElements(emptyIfNull(trim(value)), null);
+ return (elements.length > 0 ? elements[0] : new
BasicHeaderElement("", ""));
+ }
+
@Override /* Object */
public String toString() {
return string;
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/StringRange.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/StringRange.java
index 5605340..24f6b78 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/StringRange.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/StringRange.java
@@ -40,8 +40,6 @@ import org.apache.juneau.collections.*;
@BeanIgnore
public class StringRange {
- private static final HeaderElement DEFAULT_ELEMENT = new
BasicHeaderElement("", "");
-
private final NameValuePair[] extensions;
private final Float qValue;
private final String name;
@@ -97,17 +95,6 @@ public class StringRange {
}
/**
- * Parses the specified header element part.
- *
- * @param value The header element part.
- * @return Thew parsed header element part. Never <jk>null</jk>.
- */
- protected static HeaderElement parse(String value) {
- HeaderElement[] elements =
BasicHeaderValueParser.parseElements(emptyIfNull(trim(value)), null);
- return (elements.length > 0 ? elements[0] : DEFAULT_ELEMENT);
- }
-
- /**
* Returns the name of this string range.
*
* <p>
@@ -185,6 +172,11 @@ public class StringRange {
return 0;
}
+ private static HeaderElement parse(String value) {
+ HeaderElement[] elements =
BasicHeaderValueParser.parseElements(emptyIfNull(trim(value)), null);
+ return (elements.length > 0 ? elements[0] : new
BasicHeaderElement("", ""));
+ }
+
@Override /* Object */
public String toString() {
return string;
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/Constants.java
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/Constants_Test.java
similarity index 76%
copy from
juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/Constants.java
copy to
juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/Constants_Test.java
index 42e8019..5f5b6a8 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/Constants.java
+++
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/Constants_Test.java
@@ -12,21 +12,15 @@
//
***************************************************************************************************************************
package org.apache.juneau.http;
-import org.apache.juneau.http.annotation.*;
+import static org.junit.runners.MethodSorters.*;
-/**
- * Constants used by classes in this package.
- *
- * <ul class='seealso'>
- * <li class='extlink'>{@doc RFC2616}
- * </ul>
- */
-@Header("Constants")
-public class Constants {
+import org.junit.*;
- /** Use caching of HTTP artifacts. */
- public static boolean NOCACHE =
Boolean.getBoolean("juneau.http.cache.disable");
+@FixMethodOrder(NAME_ASCENDING)
+public class Constants_Test {
- /** Maximum cache size of HTTP artifacts. */
- public static int CACHE_MAX_SIZE =
Integer.getInteger("juneau.http.cache.maxSize", 1000);
+ @Test
+ public void a01_basic() {
+ new Constants();
+ }
}
diff --git
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/header/AcceptTest.java
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/MediaRanges_FindMatch_Test.java
similarity index 97%
rename from
juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/header/AcceptTest.java
rename to
juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/MediaRanges_FindMatch_Test.java
index fa20da2..dccaa39 100644
---
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/header/AcceptTest.java
+++
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/MediaRanges_FindMatch_Test.java
@@ -10,7 +10,7 @@
// * "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.juneau.http.header;
+package org.apache.juneau.http;
import static org.apache.juneau.assertions.Assertions.*;
import static org.junit.runners.MethodSorters.*;
@@ -18,7 +18,7 @@ import static org.junit.runners.MethodSorters.*;
import java.util.*;
import org.apache.juneau.collections.*;
-import org.apache.juneau.http.*;
+import org.apache.juneau.http.header.*;
import org.apache.juneau.json.*;
import org.junit.*;
import org.junit.runner.*;
@@ -29,7 +29,7 @@ import org.junit.runners.*;
*/
@RunWith(Parameterized.class)
@FixMethodOrder(NAME_ASCENDING)
-public class AcceptTest {
+public class MediaRanges_FindMatch_Test {
@Parameterized.Parameters
public static Collection<Object[]> getParameters() {
return Arrays.asList(new Object[][] {
@@ -154,7 +154,7 @@ public class AcceptTest {
private String label, accept, mediaTypes;
private int expected, expectedReverse;
- public AcceptTest(String label, String accept, String mediaTypes, int
expected, int expectedReverse) {
+ public MediaRanges_FindMatch_Test(String label, String accept, String
mediaTypes, int expected, int expectedReverse) {
this.label = label;
this.accept = accept;
this.mediaTypes = mediaTypes;
diff --git
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/MediaRanges_Test.java
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/MediaRanges_Test.java
new file mode 100644
index 0000000..9512b7a
--- /dev/null
+++
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/MediaRanges_Test.java
@@ -0,0 +1,117 @@
+//
***************************************************************************************************************************
+// * 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.juneau.http;
+
+import static org.apache.juneau.assertions.Assertions.*;
+import static org.junit.Assert.*;
+import static org.junit.runners.MethodSorters.*;
+
+import org.junit.*;
+
+@FixMethodOrder(NAME_ASCENDING)
+public class MediaRanges_Test {
+
+
//-----------------------------------------------------------------------------------------------------------------
+ // Verifies that media type parameters are distinguished from media
range extensions.
+
//-----------------------------------------------------------------------------------------------------------------
+ @Test
+ public void testExtensions() throws Exception {
+ MediaRanges x1;
+ MediaRange x2;
+
+ x1 = MediaRanges.of("text/json");
+ x2 = x1.getRange(0);
+ assertString(x2).is("text/json");
+ assertObject(x2.getParameters()).json().is("[]");
+ assertString(x2.getQValue()).is("1.0");
+ assertObject(x2.getExtensions()).json().is("[]");
+
+ assertNull(x1.getRange(-1));
+ assertNull(x1.getRange(1));
+
+ x1 = MediaRanges.of("foo,bar");
+ x2 = x1.getRange(0);
+ assertString(x2).is("foo");
+ assertObject(x2.getParameters()).json().is("[]");
+ assertString(x2.getQValue()).is("1.0");
+ assertObject(x2.getExtensions()).json().is("[]");
+
+ x1 = MediaRanges.of(" foo , bar ");
+ x2 = x1.getRange(0);
+ assertString(x2).is("foo");
+ assertObject(x2.getParameters()).json().is("[]");
+ assertString(x2.getQValue()).is("1.0");
+ assertObject(x2.getExtensions()).json().is("[]");
+
+ x1 = MediaRanges.of("text/json;a=1;q=0.9;b=2");
+ x2 = x1.getRange(0);
+ assertString(x2).is("text/json;a=1;q=0.9;b=2");
+ assertObject(x2.getParameters()).json().is("['a=1']");
+ assertString(x2.getQValue()).is("0.9");
+ assertObject(x2.getExtensions()).json().is("['b=2']");
+
+ x1 = MediaRanges.of("text/json;a=1;a=2;q=0.9;b=3;b=4");
+ x2 = x1.getRange(0);
+ assertString(x2).is("text/json;a=1;a=2;q=0.9;b=3;b=4");
+ assertObject(x2.getParameters()).json().is("['a=1','a=2']");
+ assertString(x2.getQValue()).is("0.9");
+ assertObject(x2.getExtensions()).json().is("['b=3','b=4']");
+
+ x1 = MediaRanges.of("text/json;a=1;a=2;q=1.0;b=3;b=4");
+ x2 = x1.getRange(0);
+ assertString(x2).is("text/json;a=1;a=2;q=1.0;b=3;b=4");
+ assertObject(x2.getParameters()).json().is("['a=1','a=2']");
+ assertString(x2.getQValue()).is("1.0");
+ assertObject(x2.getExtensions()).json().is("['b=3','b=4']");
+
+ x1 = MediaRanges.of("text/json;a=1");
+ x2 = x1.getRange(0);
+ assertString(x2).is("text/json;a=1");
+ assertObject(x2.getParameters()).json().is("['a=1']");
+ assertString(x2.getQValue()).is("1.0");
+ assertObject(x2.getExtensions()).json().is("[]");
+
+ x1 = MediaRanges.of("text/json;a=1;");
+ x2 = x1.getRange(0);
+ assertString(x2).is("text/json;a=1");
+ assertObject(x2.getParameters()).json().is("['a=1']");
+ assertString(x2.getQValue()).is("1.0");
+ assertObject(x2.getExtensions()).json().is("[]");
+
+ x1 = MediaRanges.of("text/json;q=0.9");
+ x2 = x1.getRange(0);
+ assertString(x2).is("text/json;q=0.9");
+ assertObject(x2.getParameters()).json().is("[]");
+ assertString(x2.getQValue()).is("0.9");
+ assertObject(x2.getExtensions()).json().is("[]");
+
+ x1 = MediaRanges.of("text/json;q=0.9;");
+ x2 = x1.getRange(0);
+ assertString(x2).is("text/json;q=0.9");
+ assertObject(x2.getParameters()).json().is("[]");
+ assertString(x2.getQValue()).is("0.9");
+ assertObject(x2.getExtensions()).json().is("[]");
+ }
+
+
//-----------------------------------------------------------------------------------------------------------------
+ // Tests the Accept.hasSubtypePart() method.
+
//-----------------------------------------------------------------------------------------------------------------
+ @Test
+ public void testHasSubtypePart() {
+ MediaRanges mr = MediaRanges.of("text/json+x,text/foo+y;q=0.0");
+ assertTrue(mr.hasSubtypePart("json"));
+ assertTrue(mr.hasSubtypePart("x"));
+ assertFalse(mr.hasSubtypePart("foo"));
+ assertFalse(mr.hasSubtypePart("y"));
+ }
+}
diff --git
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/http/annotation/AnnotationUtilsTest.java
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/annotation/AnnotationUtilsTest.java
similarity index 100%
rename from
juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/http/annotation/AnnotationUtilsTest.java
rename to
juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/annotation/AnnotationUtilsTest.java
diff --git
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/header/AcceptExtensionsTest.java
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/header/AcceptExtensionsTest.java
deleted file mode 100644
index 98e26c4..0000000
---
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/header/AcceptExtensionsTest.java
+++ /dev/null
@@ -1,112 +0,0 @@
-//
***************************************************************************************************************************
-// * 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.juneau.http.header;
-
-import static org.apache.juneau.assertions.Assertions.*;
-import static org.junit.Assert.*;
-import static org.junit.runners.MethodSorters.*;
-
-import org.apache.juneau.http.*;
-import org.junit.*;
-
-/**
- * Verifies that the Accept class handles parameters and extensions correctly.
- */
-@FixMethodOrder(NAME_ASCENDING)
-public class AcceptExtensionsTest {
-
-
//-----------------------------------------------------------------------------------------------------------------
- // Verifies that media type parameters are distinguished from media
range extensions.
-
//-----------------------------------------------------------------------------------------------------------------
- @Test
- public void testExtensions() throws Exception {
- Accept accept;
- MediaRange mr;
-
- accept = Accept.of("text/json");
- mr = accept.getRange(0);
- assertString(mr).is("text/json");
- assertObject(mr.getParameters()).json().is("[]");
- assertString(mr.getQValue()).is("1.0");
- assertObject(mr.getExtensions()).json().is("[]");
-
- accept = Accept.of("foo,bar");
- mr = accept.getRange(0);
- assertString(mr).is("foo");
- assertObject(mr.getParameters()).json().is("[]");
- assertString(mr.getQValue()).is("1.0");
- assertObject(mr.getExtensions()).json().is("[]");
-
- accept = Accept.of(" foo , bar ");
- mr = accept.getRange(0);
- assertString(mr).is("foo");
- assertObject(mr.getParameters()).json().is("[]");
- assertString(mr.getQValue()).is("1.0");
- assertObject(mr.getExtensions()).json().is("[]");
-
- accept = Accept.of("text/json;a=1;q=0.9;b=2");
- mr = accept.getRange(0);
- assertString(mr).is("text/json;a=1;q=0.9;b=2");
- assertObject(mr.getParameters()).json().is("['a=1']");
- assertString(mr.getQValue()).is("0.9");
- assertObject(mr.getExtensions()).json().is("['b=2']");
-
- accept = Accept.of("text/json;a=1;a=2;q=0.9;b=3;b=4");
- mr = accept.getRange(0);
- assertString(mr).is("text/json;a=1;a=2;q=0.9;b=3;b=4");
- assertObject(mr.getParameters()).json().is("['a=1','a=2']");
- assertString(mr.getQValue()).is("0.9");
- assertObject(mr.getExtensions()).json().is("['b=3','b=4']");
-
- accept = Accept.of("text/json;a=1");
- mr = accept.getRange(0);
- assertString(mr).is("text/json;a=1");
- assertObject(mr.getParameters()).json().is("['a=1']");
- assertString(mr.getQValue()).is("1.0");
- assertObject(mr.getExtensions()).json().is("[]");
-
- accept = Accept.of("text/json;a=1;");
- mr = accept.getRange(0);
- assertString(mr).is("text/json;a=1");
- assertObject(mr.getParameters()).json().is("['a=1']");
- assertString(mr.getQValue()).is("1.0");
- assertObject(mr.getExtensions()).json().is("[]");
-
- accept = Accept.of("text/json;q=0.9");
- mr = accept.getRange(0);
- assertString(mr).is("text/json;q=0.9");
- assertObject(mr.getParameters()).json().is("[]");
- assertString(mr.getQValue()).is("0.9");
- assertObject(mr.getExtensions()).json().is("[]");
-
- accept = Accept.of("text/json;q=0.9;");
- mr = accept.getRange(0);
- assertString(mr).is("text/json;q=0.9");
- assertObject(mr.getParameters()).json().is("[]");
- assertString(mr.getQValue()).is("0.9");
- assertObject(mr.getExtensions()).json().is("[]");
- }
-
-
//-----------------------------------------------------------------------------------------------------------------
- // Tests the Accept.hasSubtypePart() method.
-
//-----------------------------------------------------------------------------------------------------------------
- @Test
- public void testHasSubtypePart() {
- Accept accept = Accept.of("text/json+x,text/foo+y;q=0.0");
- MediaRanges mr = accept.asRanges();
- assertTrue(mr.hasSubtypePart("json"));
- assertTrue(mr.hasSubtypePart("x"));
- assertFalse(mr.hasSubtypePart("foo"));
- assertFalse(mr.hasSubtypePart("y"));
- }
-}
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
index 7398fb3..5925ab6 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
@@ -452,13 +452,19 @@ public final class RestRequest extends
HttpServletRequestWrapper {
@Override /* ServletRequest */
public Locale getLocale() {
+ Locale best = super.getLocale();
String h = headers.getString("Accept-Language");
if (h != null) {
StringRanges sr = StringRanges.of(h);
- if (! sr.getRanges().isEmpty())
- return toLocale(sr.getRange(0).getName());
+ float qValue = 0;
+ for (StringRange r : sr.getRanges()) {
+ if (r.getQValue() > qValue) {
+ best = toLocale(r.getName());
+ qValue = r.getQValue();
+ }
+ }
}
- return super.getLocale();
+ return best;
}
@Override /* ServletRequest */
@@ -469,7 +475,8 @@ public final class RestRequest extends
HttpServletRequestWrapper {
if (! mr.getRanges().isEmpty()) {
List<Locale> l = new
ArrayList<>(mr.getRanges().size());
for (StringRange r : mr.getRanges())
- l.add(toLocale(r.getName()));
+ if (r.getQValue() > 0)
+ l.add(toLocale(r.getName()));
return enumeration(l);
}
}