2525import java .util .Comparator ;
2626import java .util .HashMap ;
2727import java .util .HashSet ;
28+ import java .util .Iterator ;
2829import java .util .Map ;
2930import java .util .Set ;
3031import java .util .TreeMap ;
3132import 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 )
0 commit comments