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
This commit is contained in:
Rossen Stoyanchev 2019-08-21 13:34:17 +03:00
parent 6d8bf3466c
commit a7bb5ca473
5 changed files with 28 additions and 25 deletions

View File

@ -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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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 headers the Map of header names to HeaderValueHolders
* @param name the name of the desired header * @param name the name of the desired header
* @return the corresponding HeaderValueHolder, or {@code null} if none found * @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 @Nullable
@Deprecated
public static HeaderValueHolder getByName(Map<String, HeaderValueHolder> headers, String name) { public static HeaderValueHolder getByName(Map<String, HeaderValueHolder> headers, String name) {
Assert.notNull(name, "Header name must not be null"); Assert.notNull(name, "Header name must not be null");
for (String headerName : headers.keySet()) { for (String headerName : headers.keySet()) {

View File

@ -1038,7 +1038,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
} }
private void doAddHeaderValue(String name, @Nullable Object value, boolean replace) { 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"); Assert.notNull(value, "Header value must not be null");
if (header == null || replace) { if (header == null || replace) {
header = new HeaderValueHolder(); header = new HeaderValueHolder();
@ -1078,7 +1078,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
*/ */
@Override @Override
public long getDateHeader(String name) { 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); Object value = (header != null ? header.getValue() : null);
if (value instanceof Date) { if (value instanceof Date) {
return ((Date) value).getTime(); return ((Date) value).getTime();
@ -1115,13 +1115,13 @@ public class MockHttpServletRequest implements HttpServletRequest {
@Override @Override
@Nullable @Nullable
public String getHeader(String name) { public String getHeader(String name) {
HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); HeaderValueHolder header = this.headers.get(name);
return (header != null ? header.getStringValue() : null); return (header != null ? header.getStringValue() : null);
} }
@Override @Override
public Enumeration<String> getHeaders(String name) { public Enumeration<String> 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<>()); return Collections.enumeration(header != null ? header.getStringValues() : new LinkedList<>());
} }
@ -1132,7 +1132,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
@Override @Override
public int getIntHeader(String name) { 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); Object value = (header != null ? header.getValue() : null);
if (value instanceof Number) { if (value instanceof Number) {
return ((Number) value).intValue(); return ((Number) value).intValue();

View File

@ -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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -380,7 +380,7 @@ public class MockHttpServletResponse implements HttpServletResponse {
@Override @Override
public boolean containsHeader(String name) { 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 @Override
@Nullable @Nullable
public String getHeader(String name) { public String getHeader(String name) {
HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); HeaderValueHolder header = this.headers.get(name);
return (header != null ? header.getStringValue() : null); return (header != null ? header.getStringValue() : null);
} }
@ -419,7 +419,7 @@ public class MockHttpServletResponse implements HttpServletResponse {
*/ */
@Override @Override
public List<String> getHeaders(String name) { public List<String> getHeaders(String name) {
HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); HeaderValueHolder header = this.headers.get(name);
if (header != null) { if (header != null) {
return header.getStringValues(); return header.getStringValues();
} }
@ -436,7 +436,7 @@ public class MockHttpServletResponse implements HttpServletResponse {
*/ */
@Nullable @Nullable
public Object getHeaderValue(String name) { public Object getHeaderValue(String name) {
HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); HeaderValueHolder header = this.headers.get(name);
return (header != null ? header.getValue() : null); 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 * @return the associated header values, or an empty List if none
*/ */
public List<Object> getHeaderValues(String name) { public List<Object> getHeaderValues(String name) {
HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); HeaderValueHolder header = this.headers.get(name);
if (header != null) { if (header != null) {
return header.getValues(); return header.getValues();
} }
@ -614,7 +614,7 @@ public class MockHttpServletResponse implements HttpServletResponse {
} }
private void doAddHeaderValue(String name, Object value, boolean replace) { 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"); Assert.notNull(value, "Header value must not be null");
if (header == null) { if (header == null) {
header = new HeaderValueHolder(); header = new HeaderValueHolder();

View File

@ -1038,7 +1038,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
} }
private void doAddHeaderValue(String name, @Nullable Object value, boolean replace) { 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"); Assert.notNull(value, "Header value must not be null");
if (header == null || replace) { if (header == null || replace) {
header = new HeaderValueHolder(); header = new HeaderValueHolder();
@ -1078,7 +1078,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
*/ */
@Override @Override
public long getDateHeader(String name) { 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); Object value = (header != null ? header.getValue() : null);
if (value instanceof Date) { if (value instanceof Date) {
return ((Date) value).getTime(); return ((Date) value).getTime();
@ -1115,13 +1115,13 @@ public class MockHttpServletRequest implements HttpServletRequest {
@Override @Override
@Nullable @Nullable
public String getHeader(String name) { public String getHeader(String name) {
HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); HeaderValueHolder header = this.headers.get(name);
return (header != null ? header.getStringValue() : null); return (header != null ? header.getStringValue() : null);
} }
@Override @Override
public Enumeration<String> getHeaders(String name) { public Enumeration<String> 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<>()); return Collections.enumeration(header != null ? header.getStringValues() : new LinkedList<>());
} }
@ -1132,7 +1132,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
@Override @Override
public int getIntHeader(String name) { 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); Object value = (header != null ? header.getValue() : null);
if (value instanceof Number) { if (value instanceof Number) {
return ((Number) value).intValue(); return ((Number) value).intValue();

View File

@ -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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -380,7 +380,7 @@ public class MockHttpServletResponse implements HttpServletResponse {
@Override @Override
public boolean containsHeader(String name) { 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 @Override
@Nullable @Nullable
public String getHeader(String name) { public String getHeader(String name) {
HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); HeaderValueHolder header = this.headers.get(name);
return (header != null ? header.getStringValue() : null); return (header != null ? header.getStringValue() : null);
} }
@ -419,7 +419,7 @@ public class MockHttpServletResponse implements HttpServletResponse {
*/ */
@Override @Override
public List<String> getHeaders(String name) { public List<String> getHeaders(String name) {
HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); HeaderValueHolder header = this.headers.get(name);
if (header != null) { if (header != null) {
return header.getStringValues(); return header.getStringValues();
} }
@ -436,7 +436,7 @@ public class MockHttpServletResponse implements HttpServletResponse {
*/ */
@Nullable @Nullable
public Object getHeaderValue(String name) { public Object getHeaderValue(String name) {
HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); HeaderValueHolder header = this.headers.get(name);
return (header != null ? header.getValue() : null); 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 * @return the associated header values, or an empty List if none
*/ */
public List<Object> getHeaderValues(String name) { public List<Object> getHeaderValues(String name) {
HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); HeaderValueHolder header = this.headers.get(name);
if (header != null) { if (header != null) {
return header.getValues(); return header.getValues();
} }
@ -614,7 +614,7 @@ public class MockHttpServletResponse implements HttpServletResponse {
} }
private void doAddHeaderValue(String name, Object value, boolean replace) { 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"); Assert.notNull(value, "Header value must not be null");
if (header == null) { if (header == null) {
header = new HeaderValueHolder(); header = new HeaderValueHolder();