Skip to content

Commit 05a64a2

Browse files
mjameson-sesenivam
authored andcommitted
Use locale insensitive case changes to ensure user code doesn't break… (#4268)
* Use locale insensitive case changes to ensure user code doesn't break in other locales (i.e. Turkey) Signed-off-by: Michael Jameson <mjameson.se@gmail.com>
1 parent 584664c commit 05a64a2

File tree

24 files changed

+74
-49
lines changed

24 files changed

+74
-49
lines changed

connectors/jdk-connector/src/main/java/org/glassfish/jersey/jdk/connector/internal/ProxyDigestAuthenticator.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.security.MessageDigest;
2323
import java.security.NoSuchAlgorithmException;
2424
import java.security.SecureRandom;
25+
import java.util.Locale;
2526
import java.util.logging.Logger;
2627
import java.util.regex.Matcher;
2728
import java.util.regex.Pattern;
@@ -98,7 +99,7 @@ private DigestScheme parseAuthHeaders(final String authHeader) throws IOExceptio
9899
if (parts.length != 2) {
99100
return null;
100101
}
101-
if (!parts[0].toLowerCase().equals("digest")) {
102+
if (!parts[0].toLowerCase(Locale.ROOT).equals("digest")) {
102103
return null;
103104
}
104105

@@ -326,7 +327,7 @@ public static Algorithm parse(String val) {
326327
return Algorithm.UNSPECIFIED;
327328
}
328329
val = val.trim();
329-
if (val.contains(MD5_SESS.md) || val.contains(MD5_SESS.md.toLowerCase())) {
330+
if (val.contains(MD5_SESS.md) || val.contains(MD5_SESS.md.toLowerCase(Locale.ROOT))) {
330331
return MD5_SESS;
331332
}
332333
return MD5;

containers/netty-http/src/main/java/org/glassfish/jersey/netty/httpserver/NettyHttp2ResponseWriter.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.io.IOException;
2020
import java.io.OutputStream;
2121
import java.util.List;
22+
import java.util.Locale;
2223
import java.util.Map;
2324
import java.util.concurrent.ScheduledFuture;
2425
import java.util.concurrent.TimeUnit;
@@ -74,7 +75,7 @@ public OutputStream writeResponseStatusAndHeaders(long contentLength, ContainerR
7475
response.status(Integer.toString(responseContext.getStatus()));
7576

7677
for (final Map.Entry<String, List<String>> e : responseContext.getStringHeaders().entrySet()) {
77-
response.add(e.getKey().toLowerCase(), e.getValue());
78+
response.add(e.getKey().toLowerCase(Locale.ROOT), e.getValue());
7879
}
7980

8081
response.set(HttpHeaderNames.CONTENT_LENGTH, Long.toString(contentLength));

core-client/src/main/java/org/glassfish/jersey/client/JerseyInvocation.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ private void validateHttpMethodAndEntity(final ClientRequest request) {
125125

126126
final String method = request.getMethod();
127127

128-
final EntityPresence entityPresence = METHODS.get(method.toUpperCase());
128+
final EntityPresence entityPresence = METHODS.get(method.toUpperCase(Locale.ROOT));
129129
if (entityPresence == EntityPresence.MUST_BE_NULL && request.hasEntity()) {
130130
if (suppressExceptions) {
131131
LOGGER.warning(LocalizationMessages.ERROR_HTTP_METHOD_ENTITY_NOT_NULL(method));

core-client/src/main/java/org/glassfish/jersey/client/authentication/BasicAuthenticator.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.glassfish.jersey.client.authentication;
1818

1919
import java.util.Base64;
20+
import java.util.Locale;
2021
import java.util.logging.Level;
2122
import java.util.logging.Logger;
2223

@@ -96,7 +97,7 @@ public void filterRequest(ClientRequestContext request) {
9697
*/
9798
public boolean filterResponseAndAuthenticate(ClientRequestContext request, ClientResponseContext response) {
9899
final String authenticate = response.getHeaders().getFirst(HttpHeaders.WWW_AUTHENTICATE);
99-
if (authenticate != null && authenticate.trim().toUpperCase().startsWith("BASIC")) {
100+
if (authenticate != null && authenticate.trim().toUpperCase(Locale.ROOT).startsWith("BASIC")) {
100101
HttpAuthenticationFilter.Credentials credentials = HttpAuthenticationFilter
101102
.getCredentials(request, defaultCredentials, HttpAuthenticationFilter.Type.BASIC);
102103

core-client/src/main/java/org/glassfish/jersey/client/authentication/DigestAuthenticator.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2013, 2018 Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2013, 2019 Oracle and/or its affiliates. All rights reserved.
33
*
44
* This program and the accompanying materials are made available under the
55
* terms of the Eclipse Public License v. 2.0, which is available at
@@ -24,6 +24,7 @@
2424
import java.util.Collections;
2525
import java.util.LinkedHashMap;
2626
import java.util.List;
27+
import java.util.Locale;
2728
import java.util.Map;
2829
import java.util.regex.Matcher;
2930
import java.util.regex.Pattern;
@@ -166,7 +167,7 @@ private DigestScheme parseAuthHeaders(final List<?> headers) throws IOException
166167
if (parts.length != 2) {
167168
continue;
168169
}
169-
if (!"digest".equals(parts[0].toLowerCase())) {
170+
if (!"digest".equals(parts[0].toLowerCase(Locale.ROOT))) {
170171
continue;
171172
}
172173

@@ -400,7 +401,7 @@ public static Algorithm parse(String val) {
400401
return Algorithm.UNSPECIFIED;
401402
}
402403
val = val.trim();
403-
if (val.contains(MD5_SESS.md) || val.contains(MD5_SESS.md.toLowerCase())) {
404+
if (val.contains(MD5_SESS.md) || val.contains(MD5_SESS.md.toLowerCase(Locale.ROOT))) {
404405
return MD5_SESS;
405406
}
406407
return MD5;

core-client/src/main/java/org/glassfish/jersey/client/authentication/HttpAuthenticationFilter.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2013, 2018 Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2013, 2019 Oracle and/or its affiliates. All rights reserved.
33
*
44
* This program and the accompanying materials are made available under the
55
* terms of the Eclipse Public License v. 2.0, which is available at
@@ -23,6 +23,7 @@
2323
import java.util.Collections;
2424
import java.util.LinkedHashMap;
2525
import java.util.List;
26+
import java.util.Locale;
2627
import java.util.Map;
2728

2829
import javax.annotation.Priority;
@@ -202,7 +203,7 @@ public void filter(ClientRequestContext request, ClientResponseContext response)
202203
List<String> authStrings = response.getHeaders().get(HttpHeaders.WWW_AUTHENTICATE);
203204
if (authStrings != null) {
204205
for (String authString : authStrings) {
205-
final String upperCaseAuth = authString.trim().toUpperCase();
206+
final String upperCaseAuth = authString.trim().toUpperCase(Locale.ROOT);
206207
if (result == null && upperCaseAuth.startsWith("BASIC")) {
207208
result = Type.BASIC;
208209
} else if (upperCaseAuth.startsWith("DIGEST")) {

core-client/src/main/java/org/glassfish/jersey/client/internal/HttpUrlConnector.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.security.PrivilegedExceptionAction;
3030
import java.util.HashSet;
3131
import java.util.List;
32+
import java.util.Locale;
3233
import java.util.Map;
3334
import java.util.Set;
3435
import java.util.concurrent.CompletableFuture;
@@ -90,7 +91,7 @@ public class HttpUrlConnector implements Connector {
9091

9192
static {
9293
for (String headerName : restrictedHeaders) {
93-
restrictedHeaderSet.add(headerName.toLowerCase());
94+
restrictedHeaderSet.add(headerName.toLowerCase(Locale.ROOT));
9495
}
9596
}
9697

@@ -424,7 +425,7 @@ private void setOutboundHeaders(MultivaluedMap<String, String> headers, HttpURLC
424425
}
425426

426427
private boolean isHeaderRestricted(String name, String value) {
427-
name = name.toLowerCase();
428+
name = name.toLowerCase(Locale.ROOT);
428429
return name.startsWith("sec-")
429430
|| restrictedHeaderSet.contains(name)
430431
&& !("connection".equalsIgnoreCase(name) && "close".equalsIgnoreCase(value));

core-common/src/main/java/org/glassfish/jersey/internal/util/PropertiesHelper.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2012, 2018 Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2012, 2019 Oracle and/or its affiliates. All rights reserved.
33
*
44
* This program and the accompanying materials are made available under the
55
* terms of the Eclipse Public License v. 2.0, which is available at
@@ -20,6 +20,7 @@
2020
import java.lang.reflect.Method;
2121
import java.security.AccessController;
2222
import java.security.PrivilegedAction;
23+
import java.util.Locale;
2324
import java.util.Map;
2425
import java.util.Properties;
2526
import java.util.logging.Level;
@@ -217,7 +218,7 @@ public static <T> T getValue(Map<String, ?> properties, RuntimeType runtimeType,
217218
String runtimeAwareKey = getPropertyNameForRuntime(key, runtimeType);
218219
if (key.equals(runtimeAwareKey)) {
219220
// legacy behaviour
220-
runtimeAwareKey = key + "." + runtimeType.name().toLowerCase();
221+
runtimeAwareKey = key + "." + runtimeType.name().toLowerCase(Locale.ROOT);
221222
}
222223
value = properties.get(runtimeAwareKey);
223224
}
@@ -251,11 +252,11 @@ public static String getPropertyNameForRuntime(String key, RuntimeType runtimeTy
251252
if (runtimeType != null && key.startsWith("jersey.config")) {
252253
RuntimeType[] types = RuntimeType.values();
253254
for (RuntimeType type : types) {
254-
if (key.startsWith("jersey.config." + type.name().toLowerCase())) {
255+
if (key.startsWith("jersey.config." + type.name().toLowerCase(Locale.ROOT))) {
255256
return key;
256257
}
257258
}
258-
return key.replace("jersey.config", "jersey.config." + runtimeType.name().toLowerCase());
259+
return key.replace("jersey.config", "jersey.config." + runtimeType.name().toLowerCase(Locale.ROOT));
259260
}
260261
return key;
261262
}

core-common/src/main/java/org/glassfish/jersey/message/internal/CacheControlProvider.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.text.ParseException;
2020
import java.util.Arrays;
2121
import java.util.List;
22+
import java.util.Locale;
2223
import java.util.Map;
2324
import java.util.regex.Matcher;
2425
import java.util.regex.Pattern;
@@ -113,7 +114,7 @@ private int readIntValue(HttpHeaderReader reader, String directiveName)
113114
private void readDirective(CacheControl cacheControl,
114115
HttpHeaderReader reader) throws ParseException {
115116

116-
final String directiveName = reader.nextToken().toString().toLowerCase();
117+
final String directiveName = reader.nextToken().toString().toLowerCase(Locale.ROOT);
117118
if ("private".equals(directiveName)) {
118119
cacheControl.setPrivate(true);
119120
readFieldNames(cacheControl.getPrivateFields(), reader);

core-common/src/main/java/org/glassfish/jersey/message/internal/CookiesParser.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.text.ParseException;
2020
import java.util.Date;
2121
import java.util.LinkedHashMap;
22+
import java.util.Locale;
2223
import java.util.Map;
2324
import java.util.logging.Level;
2425
import java.util.logging.Logger;
@@ -133,7 +134,7 @@ public static NewCookie parseNewCookie(String header) {
133134
if (cookie == null) {
134135
cookie = new MutableNewCookie(name, value);
135136
} else {
136-
final String param = name.toLowerCase();
137+
final String param = name.toLowerCase(Locale.ROOT);
137138

138139
if (param.startsWith("comment")) {
139140
cookie.comment = value;

core-common/src/main/java/org/glassfish/jersey/message/internal/HttpHeaderReader.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.util.HashSet;
2525
import java.util.LinkedHashMap;
2626
import java.util.List;
27+
import java.util.Locale;
2728
import java.util.Map;
2829
import java.util.Set;
2930

@@ -291,7 +292,7 @@ public static Map<String, String> readParameters(HttpHeaderReader reader, boolea
291292
}
292293

293294
// Get the parameter name
294-
String name = reader.nextToken().toString().toLowerCase();
295+
String name = reader.nextToken().toString().toLowerCase(Locale.ROOT);
295296
reader.nextSeparator('=');
296297
// Get the parameter value
297298
String value;

core-common/src/main/java/org/glassfish/jersey/message/internal/InboundMessageContext.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -539,7 +539,7 @@ public Set<String> getAllowedMethods() {
539539
return Collections.emptySet();
540540
}
541541
try {
542-
return new HashSet<String>(HttpHeaderReader.readStringList(allowed.toUpperCase()));
542+
return new HashSet<String>(HttpHeaderReader.readStringList(allowed.toUpperCase(Locale.ROOT)));
543543
} catch (java.text.ParseException e) {
544544
throw exception(HttpHeaders.ALLOW, allowed, e);
545545
}

core-common/src/main/java/org/glassfish/jersey/message/internal/MessageBodyFactory.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import java.util.LinkedHashSet;
3535
import java.util.LinkedList;
3636
import java.util.List;
37+
import java.util.Locale;
3738
import java.util.Map;
3839
import java.util.Set;
3940
import java.util.concurrent.ConcurrentHashMap;
@@ -131,7 +132,7 @@ public boolean equals(final MediaType mt1, final MediaType mt2) {
131132
@Override
132133
public int hash(final MediaType mt) {
133134
// treat compatible types as equal
134-
return mt.getType().toLowerCase().hashCode() + mt.getSubtype().toLowerCase().hashCode();
135+
return mt.getType().toLowerCase(Locale.ROOT).hashCode() + mt.getSubtype().toLowerCase(Locale.ROOT).hashCode();
135136
}
136137
};
137138
/**

core-server/src/main/java/org/glassfish/jersey/server/TracingUtils.java

+7-6
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.util.ArrayList;
2020
import java.util.List;
21+
import java.util.Locale;
2122

2223
import javax.ws.rs.core.Configuration;
2324
import javax.ws.rs.core.HttpHeaders;
@@ -36,12 +37,12 @@ public final class TracingUtils {
3637
private static final List<String> SUMMARY_HEADERS = new ArrayList<>();
3738

3839
static {
39-
SUMMARY_HEADERS.add(HttpHeaders.ACCEPT.toLowerCase());
40-
SUMMARY_HEADERS.add(HttpHeaders.ACCEPT_ENCODING.toLowerCase());
41-
SUMMARY_HEADERS.add(HttpHeaders.ACCEPT_CHARSET.toLowerCase());
42-
SUMMARY_HEADERS.add(HttpHeaders.ACCEPT_LANGUAGE.toLowerCase());
43-
SUMMARY_HEADERS.add(HttpHeaders.CONTENT_TYPE.toLowerCase());
44-
SUMMARY_HEADERS.add(HttpHeaders.CONTENT_LENGTH.toLowerCase());
40+
SUMMARY_HEADERS.add(HttpHeaders.ACCEPT.toLowerCase(Locale.ROOT));
41+
SUMMARY_HEADERS.add(HttpHeaders.ACCEPT_ENCODING.toLowerCase(Locale.ROOT));
42+
SUMMARY_HEADERS.add(HttpHeaders.ACCEPT_CHARSET.toLowerCase(Locale.ROOT));
43+
SUMMARY_HEADERS.add(HttpHeaders.ACCEPT_LANGUAGE.toLowerCase(Locale.ROOT));
44+
SUMMARY_HEADERS.add(HttpHeaders.CONTENT_TYPE.toLowerCase(Locale.ROOT));
45+
SUMMARY_HEADERS.add(HttpHeaders.CONTENT_LENGTH.toLowerCase(Locale.ROOT));
4546
}
4647

4748
private static final TracingConfig DEFAULT_CONFIGURATION_TYPE = TracingConfig.OFF;

core-server/src/main/java/org/glassfish/jersey/server/filter/HttpMethodOverrideFilter.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2010, 2019 Oracle and/or its affiliates. All rights reserved.
33
*
44
* This program and the accompanying materials are made available under the
55
* terms of the Eclipse Public License v. 2.0, which is available at
@@ -17,6 +17,7 @@
1717
package org.glassfish.jersey.server.filter;
1818

1919
import java.util.List;
20+
import java.util.Locale;
2021
import java.util.Map;
2122
import java.util.logging.Level;
2223
import java.util.logging.Logger;
@@ -228,7 +229,7 @@ private String getParamValue(final Source source, final MultivaluedMap<String, S
228229
return null;
229230
}
230231
value = value.trim();
231-
return value.length() == 0 ? null : value.toUpperCase();
232+
return value.length() == 0 ? null : value.toUpperCase(Locale.ROOT);
232233
}
233234

234235
@Override

core-server/src/main/java/org/glassfish/jersey/server/internal/scanning/PackageNamesScanner.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.security.AccessController;
2626
import java.util.Enumeration;
2727
import java.util.HashMap;
28+
import java.util.Locale;
2829
import java.util.Map;
2930

3031
import org.glassfish.jersey.internal.OsgiRegistry;
@@ -133,7 +134,7 @@ public Enumeration<URL> getResources(final String packagePath, final ClassLoader
133134

134135
private void add(final UriSchemeResourceFinderFactory uriSchemeResourceFinderFactory) {
135136
for (final String scheme : uriSchemeResourceFinderFactory.getSchemes()) {
136-
finderFactories.put(scheme.toLowerCase(), uriSchemeResourceFinderFactory);
137+
finderFactories.put(scheme.toLowerCase(Locale.ROOT), uriSchemeResourceFinderFactory);
137138
}
138139
}
139140

@@ -254,7 +255,7 @@ public static void setResourcesProvider(final ResourcesProvider provider) throws
254255
}
255256

256257
private void addResourceFinder(final URI u) {
257-
final UriSchemeResourceFinderFactory finderFactory = finderFactories.get(u.getScheme().toLowerCase());
258+
final UriSchemeResourceFinderFactory finderFactory = finderFactories.get(u.getScheme().toLowerCase(Locale.ROOT));
258259
if (finderFactory != null) {
259260
compositeResourceFinder.push(finderFactory.create(u, recursive));
260261
} else {

core-server/src/main/java/org/glassfish/jersey/server/model/ResourceMethod.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.LinkedHashSet;
2727
import java.util.LinkedList;
2828
import java.util.List;
29+
import java.util.Locale;
2930
import java.util.Set;
3031
import java.util.concurrent.TimeUnit;
3132
import java.util.function.Function;
@@ -578,7 +579,7 @@ private Data(final String httpMethod,
578579
this.managedAsync = managedAsync;
579580
this.type = JaxrsType.classify(httpMethod);
580581

581-
this.httpMethod = (httpMethod == null) ? httpMethod : httpMethod.toUpperCase();
582+
this.httpMethod = (httpMethod == null) ? httpMethod : httpMethod.toUpperCase(Locale.ROOT);
582583

583584
this.consumedTypes = Collections.unmodifiableList(new ArrayList<>(consumedTypes));
584585
this.producedTypes = Collections.unmodifiableList(new ArrayList<>(producedTypes));

core-server/src/main/java/org/glassfish/jersey/server/wadl/config/WadlGeneratorLoader.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2010, 2019 Oracle and/or its affiliates. All rights reserved.
33
*
44
* This program and the accompanying materials are made available under the
55
* terms of the Eclipse Public License v. 2.0, which is available at
@@ -25,6 +25,7 @@
2525
import java.util.ArrayList;
2626
import java.util.Arrays;
2727
import java.util.List;
28+
import java.util.Locale;
2829
import java.util.Map.Entry;
2930
import java.util.Properties;
3031
import java.util.logging.Level;
@@ -147,7 +148,7 @@ private static Callback setProperty(final Object generator,
147148
final Class<?> osgiConfigClass) throws Exception {
148149
Callback result = null;
149150

150-
final String methodName = "set" + propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);
151+
final String methodName = "set" + propertyName.substring(0, 1).toUpperCase(Locale.ROOT) + propertyName.substring(1);
151152
final Method method = getMethodByName(methodName, generator.getClass());
152153
if (method.getParameterTypes().length != 1) {
153154
throw new RuntimeException(

0 commit comments

Comments
 (0)