From a7bb5ca473e55cd7fe1aaddfb30c4ec1ee913054 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Wed, 21 Aug 2019 13:34:17 +0300 Subject: [PATCH] Remove unnecessary iteration over headers The use of LinkedCaseInsensitiveMap, going back to 3.0, makes it unnecessary to iterate over keys which can cause ConcurrentModificationException. Closes gh-23460 --- .../mock/web/HeaderValueHolder.java | 5 ++++- .../mock/web/MockHttpServletRequest.java | 10 +++++----- .../mock/web/MockHttpServletResponse.java | 14 +++++++------- .../mock/web/test/MockHttpServletRequest.java | 10 +++++----- .../mock/web/test/MockHttpServletResponse.java | 14 +++++++------- 5 files changed, 28 insertions(+), 25 deletions(-) diff --git a/spring-test/src/main/java/org/springframework/mock/web/HeaderValueHolder.java b/spring-test/src/main/java/org/springframework/mock/web/HeaderValueHolder.java index de3c74aa25..04f2d77228 100644 --- a/spring-test/src/main/java/org/springframework/mock/web/HeaderValueHolder.java +++ b/spring-test/src/main/java/org/springframework/mock/web/HeaderValueHolder.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -91,8 +91,11 @@ class HeaderValueHolder { * @param headers the Map of header names to HeaderValueHolders * @param name the name of the desired header * @return the corresponding HeaderValueHolder, or {@code null} if none found + * @deprecated as of 5.1.10 in favor of using + * {@link org.springframework.util.LinkedCaseInsensitiveMap}. */ @Nullable + @Deprecated public static HeaderValueHolder getByName(Map headers, String name) { Assert.notNull(name, "Header name must not be null"); for (String headerName : headers.keySet()) { diff --git a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java index 09d9ae77dd..8e32145efd 100644 --- a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java +++ b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java @@ -1038,7 +1038,7 @@ public class MockHttpServletRequest implements HttpServletRequest { } private void doAddHeaderValue(String name, @Nullable Object value, boolean replace) { - HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); + HeaderValueHolder header = this.headers.get(name); Assert.notNull(value, "Header value must not be null"); if (header == null || replace) { header = new HeaderValueHolder(); @@ -1078,7 +1078,7 @@ public class MockHttpServletRequest implements HttpServletRequest { */ @Override public long getDateHeader(String name) { - HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); + HeaderValueHolder header = this.headers.get(name); Object value = (header != null ? header.getValue() : null); if (value instanceof Date) { return ((Date) value).getTime(); @@ -1115,13 +1115,13 @@ public class MockHttpServletRequest implements HttpServletRequest { @Override @Nullable public String getHeader(String name) { - HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); + HeaderValueHolder header = this.headers.get(name); return (header != null ? header.getStringValue() : null); } @Override public Enumeration getHeaders(String name) { - HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); + HeaderValueHolder header = this.headers.get(name); return Collections.enumeration(header != null ? header.getStringValues() : new LinkedList<>()); } @@ -1132,7 +1132,7 @@ public class MockHttpServletRequest implements HttpServletRequest { @Override public int getIntHeader(String name) { - HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); + HeaderValueHolder header = this.headers.get(name); Object value = (header != null ? header.getValue() : null); if (value instanceof Number) { return ((Number) value).intValue(); diff --git a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java index 04d3297a2c..f9b179d60e 100644 --- a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java +++ b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -380,7 +380,7 @@ public class MockHttpServletResponse implements HttpServletResponse { @Override public boolean containsHeader(String name) { - return (HeaderValueHolder.getByName(this.headers, name) != null); + return (this.headers.get(name) != null); } /** @@ -405,7 +405,7 @@ public class MockHttpServletResponse implements HttpServletResponse { @Override @Nullable public String getHeader(String name) { - HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); + HeaderValueHolder header = this.headers.get(name); return (header != null ? header.getStringValue() : null); } @@ -419,7 +419,7 @@ public class MockHttpServletResponse implements HttpServletResponse { */ @Override public List getHeaders(String name) { - HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); + HeaderValueHolder header = this.headers.get(name); if (header != null) { return header.getStringValues(); } @@ -436,7 +436,7 @@ public class MockHttpServletResponse implements HttpServletResponse { */ @Nullable public Object getHeaderValue(String name) { - HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); + HeaderValueHolder header = this.headers.get(name); return (header != null ? header.getValue() : null); } @@ -446,7 +446,7 @@ public class MockHttpServletResponse implements HttpServletResponse { * @return the associated header values, or an empty List if none */ public List getHeaderValues(String name) { - HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); + HeaderValueHolder header = this.headers.get(name); if (header != null) { return header.getValues(); } @@ -614,7 +614,7 @@ public class MockHttpServletResponse implements HttpServletResponse { } private void doAddHeaderValue(String name, Object value, boolean replace) { - HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); + HeaderValueHolder header = this.headers.get(name); Assert.notNull(value, "Header value must not be null"); if (header == null) { header = new HeaderValueHolder(); diff --git a/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletRequest.java b/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletRequest.java index f2fb831b5c..3af239f8f6 100644 --- a/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletRequest.java +++ b/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletRequest.java @@ -1038,7 +1038,7 @@ public class MockHttpServletRequest implements HttpServletRequest { } private void doAddHeaderValue(String name, @Nullable Object value, boolean replace) { - HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); + HeaderValueHolder header = this.headers.get(name); Assert.notNull(value, "Header value must not be null"); if (header == null || replace) { header = new HeaderValueHolder(); @@ -1078,7 +1078,7 @@ public class MockHttpServletRequest implements HttpServletRequest { */ @Override public long getDateHeader(String name) { - HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); + HeaderValueHolder header = this.headers.get(name); Object value = (header != null ? header.getValue() : null); if (value instanceof Date) { return ((Date) value).getTime(); @@ -1115,13 +1115,13 @@ public class MockHttpServletRequest implements HttpServletRequest { @Override @Nullable public String getHeader(String name) { - HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); + HeaderValueHolder header = this.headers.get(name); return (header != null ? header.getStringValue() : null); } @Override public Enumeration getHeaders(String name) { - HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); + HeaderValueHolder header = this.headers.get(name); return Collections.enumeration(header != null ? header.getStringValues() : new LinkedList<>()); } @@ -1132,7 +1132,7 @@ public class MockHttpServletRequest implements HttpServletRequest { @Override public int getIntHeader(String name) { - HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); + HeaderValueHolder header = this.headers.get(name); Object value = (header != null ? header.getValue() : null); if (value instanceof Number) { return ((Number) value).intValue(); diff --git a/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletResponse.java b/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletResponse.java index 9681f4e9ff..50861b3a72 100644 --- a/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletResponse.java +++ b/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletResponse.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -380,7 +380,7 @@ public class MockHttpServletResponse implements HttpServletResponse { @Override public boolean containsHeader(String name) { - return (HeaderValueHolder.getByName(this.headers, name) != null); + return (this.headers.get(name) != null); } /** @@ -405,7 +405,7 @@ public class MockHttpServletResponse implements HttpServletResponse { @Override @Nullable public String getHeader(String name) { - HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); + HeaderValueHolder header = this.headers.get(name); return (header != null ? header.getStringValue() : null); } @@ -419,7 +419,7 @@ public class MockHttpServletResponse implements HttpServletResponse { */ @Override public List getHeaders(String name) { - HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); + HeaderValueHolder header = this.headers.get(name); if (header != null) { return header.getStringValues(); } @@ -436,7 +436,7 @@ public class MockHttpServletResponse implements HttpServletResponse { */ @Nullable public Object getHeaderValue(String name) { - HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); + HeaderValueHolder header = this.headers.get(name); return (header != null ? header.getValue() : null); } @@ -446,7 +446,7 @@ public class MockHttpServletResponse implements HttpServletResponse { * @return the associated header values, or an empty List if none */ public List getHeaderValues(String name) { - HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); + HeaderValueHolder header = this.headers.get(name); if (header != null) { return header.getValues(); } @@ -614,7 +614,7 @@ public class MockHttpServletResponse implements HttpServletResponse { } private void doAddHeaderValue(String name, Object value, boolean replace) { - HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); + HeaderValueHolder header = this.headers.get(name); Assert.notNull(value, "Header value must not be null"); if (header == null) { header = new HeaderValueHolder();