Skip to content

Commit 162e29f

Browse files
committed
Makes HttpParameters case-insensitive
1 parent 649db4d commit 162e29f

2 files changed

Lines changed: 104 additions & 8 deletions

File tree

core/src/main/java/org/apache/struts2/dispatcher/HttpParameters.java

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,22 @@
2525
import java.util.Comparator;
2626
import java.util.HashMap;
2727
import java.util.HashSet;
28+
import java.util.Iterator;
2829
import java.util.Map;
2930
import java.util.Set;
3031
import java.util.TreeMap;
3132
import java.util.TreeSet;
3233

3334
@SuppressWarnings("unchecked")
34-
public class HttpParameters implements Map<String, Parameter>, Cloneable {
35+
public class HttpParameters implements Map<String, Parameter> {
3536

3637
private Map<String, Parameter> parameters;
3738

3839
private HttpParameters(Map<String, Parameter> parameters) {
3940
this.parameters = parameters;
4041
}
4142

43+
@SuppressWarnings("rawtypes")
4244
public static Builder create(Map requestParameterMap) {
4345
return new Builder(requestParameterMap);
4446
}
@@ -49,7 +51,15 @@ public static Builder create() {
4951

5052
public HttpParameters remove(Set<String> paramsToRemove) {
5153
for (String paramName : paramsToRemove) {
52-
parameters.remove(paramName);
54+
String paramNameLowerCase = paramName.toLowerCase();
55+
Iterator<Entry<String, Parameter>> iterator = parameters.entrySet().iterator();
56+
57+
while (iterator.hasNext()) {
58+
Map.Entry<String, Parameter> entry = iterator.next();
59+
if (entry.getKey().equalsIgnoreCase(paramNameLowerCase)) {
60+
iterator.remove();
61+
}
62+
}
5363
}
5464
return this;
5565
}
@@ -61,7 +71,17 @@ public HttpParameters remove(final String paramToRemove) {
6171
}
6272

6373
public boolean contains(String name) {
64-
return parameters.containsKey(name);
74+
boolean found = false;
75+
String nameLowerCase = name.toLowerCase();
76+
77+
for (String key : parameters.keySet()) {
78+
if (key.equalsIgnoreCase(nameLowerCase)) {
79+
found = true;
80+
break;
81+
}
82+
}
83+
84+
return found;
6585
}
6686

6787
/**
@@ -78,7 +98,14 @@ public Map<String, String[]> toMap() {
7898
return result;
7999
}
80100

101+
/**
102+
* Appends all the parameters by overriding any existing params in a case-insensitive manner
103+
*
104+
* @param newParams A new params to append
105+
* @return a current instance of {@link HttpParameters}
106+
*/
81107
public HttpParameters appendAll(Map<String, Parameter> newParams) {
108+
remove(newParams.keySet());
82109
parameters.putAll(newParams);
83110
return this;
84111
}
@@ -109,11 +136,15 @@ public boolean containsValue(Object value) {
109136

110137
@Override
111138
public Parameter get(Object key) {
112-
if (parameters.containsKey(key)) {
113-
return parameters.get(key);
114-
} else {
115-
return new Parameter.Empty(String.valueOf(key));
139+
if (key != null && contains(String.valueOf(key))) {
140+
String keyString = String.valueOf(key).toLowerCase();
141+
for (Map.Entry<String, Parameter> entry : parameters.entrySet()) {
142+
if (entry.getKey() != null && entry.getKey().equalsIgnoreCase(keyString)) {
143+
return entry.getValue();
144+
}
145+
}
116146
}
147+
return new Parameter.Empty(String.valueOf(key));
117148
}
118149

119150
@Override
@@ -206,7 +237,7 @@ public HttpParameters build() {
206237
* Alternate Builder method which avoids wrapping any parameters that are already
207238
* a {@link Parameter} element within another {@link Parameter} wrapper.
208239
*
209-
* @return
240+
* @return
210241
*/
211242
public HttpParameters buildNoNestedWrapping() {
212243
Map<String, Parameter> parameters = (parent == null)
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
package org.apache.struts2.dispatcher;
20+
21+
import org.junit.Test;
22+
23+
import java.util.HashMap;
24+
25+
import static org.junit.Assert.assertEquals;
26+
import static org.junit.Assert.assertTrue;
27+
28+
public class HttpParametersTest {
29+
30+
@Test
31+
public void shouldGetBeCaseInsensitive() {
32+
// given
33+
HttpParameters params = HttpParameters.create(new HashMap<String, Object>() {{
34+
put("param1", "value1");
35+
}}).build();
36+
37+
// then
38+
assertEquals("value1", params.get("Param1").getValue());
39+
assertEquals("value1", params.get("paraM1").getValue());
40+
assertEquals("value1", params.get("pAraM1").getValue());
41+
}
42+
43+
@Test
44+
public void shouldAppendSameParamsIgnoringCase() {
45+
// given
46+
HttpParameters params = HttpParameters.create(new HashMap<String, Object>() {{
47+
put("param1", "value1");
48+
}}).build();
49+
50+
// when
51+
assertEquals("value1", params.get("param1").getValue());
52+
53+
params = params.appendAll(HttpParameters.create(new HashMap<String, String>() {{
54+
put("Param1", "Value1");
55+
}}).build());
56+
57+
// then
58+
assertTrue(params.contains("param1"));
59+
assertTrue(params.contains("Param1"));
60+
61+
assertEquals("Value1", params.get("param1").getValue());
62+
assertEquals("Value1", params.get("Param1").getValue());
63+
}
64+
65+
}

0 commit comments

Comments
 (0)