Skip to content

Commit d20da95

Browse files
authored
Using case-insensitive headers (#1744) (#1748)
The check for the X-elastic-product header is currently case sensitive. However header names are supposed to be case-insensitive. This commit makes the check case sensitive. Relates #1745
1 parent 7fec545 commit d20da95

File tree

4 files changed

+13
-5
lines changed

4 files changed

+13
-5
lines changed

mr/src/main/java/org/elasticsearch/hadoop/rest/Response.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,10 @@ public interface Response {
4646

4747
boolean hasFailed();
4848

49-
Map<String, List<String>> headers();
49+
/**
50+
* Returns the headers with the given name
51+
* @param headerName, case-insensitive
52+
* @return The list of matching headers
53+
*/
54+
List<String> getHeaders(String headerName);
5055
}

mr/src/main/java/org/elasticsearch/hadoop/rest/RestClient.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -779,7 +779,7 @@ public ClusterInfo mainInfo() {
779779
LOG.warn("Could not verify server is Elasticsearch! Invalid main action response body format [build_flavor].");
780780
}
781781

782-
List<String> productHeader = response.headers().get(ELASTIC_PRODUCT_HEADER);
782+
List<String> productHeader = response.getHeaders(ELASTIC_PRODUCT_HEADER);
783783
boolean validElasticsearchHeader = productHeader != null && productHeader.size() == 1 && productHeader.get(0).equals(ELASTIC_PRODUCT_HEADER_VALUE);
784784
boolean verifyServer = (major.on(V_7_X) && major.parseMinorVersion(versionNumber) >= 14) || major.after(V_7_X);
785785
if (validElasticsearchHeader == false) {

mr/src/main/java/org/elasticsearch/hadoop/rest/SimpleResponse.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.Collections;
2323
import java.util.List;
2424
import java.util.Map;
25+
import java.util.stream.Collectors;
2526

2627
public class SimpleResponse implements Response {
2728

@@ -102,7 +103,8 @@ public boolean hasFailed() {
102103
}
103104

104105
@Override
105-
public Map<String, List<String>> headers() {
106-
return headers;
106+
public List<String> getHeaders(String headerName) {
107+
return headers.entrySet().stream().filter(entry -> entry.getKey().equalsIgnoreCase(headerName)).map(Map.Entry::getValue)
108+
.flatMap(List::stream).collect(Collectors.toList());
107109
}
108110
}

mr/src/test/java/org/elasticsearch/hadoop/rest/RestClientTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import java.util.ArrayList;
3636
import java.util.HashMap;
3737
import java.util.List;
38+
import java.util.Locale;
3839
import java.util.Map;
3940

4041
import static org.junit.Assert.assertEquals;
@@ -440,7 +441,7 @@ public void testMainInfo() {
440441

441442
NetworkClient mock = Mockito.mock(NetworkClient.class);
442443
Map<String, List<String>> headers = new HashMap<>();
443-
headers.computeIfAbsent(RestClient.ELASTIC_PRODUCT_HEADER, k -> new ArrayList<>()).add(RestClient.ELASTIC_PRODUCT_HEADER_VALUE);
444+
headers.computeIfAbsent(RestClient.ELASTIC_PRODUCT_HEADER.toLowerCase(Locale.ROOT), k -> new ArrayList<>()).add(RestClient.ELASTIC_PRODUCT_HEADER_VALUE);
444445
Mockito.when(mock.execute(Mockito.any(SimpleRequest.class), Mockito.eq(true)))
445446
.thenReturn(new SimpleResponse(201, new FastByteArrayInputStream(new BytesArray(response)), "localhost:9200", headers));
446447

0 commit comments

Comments
 (0)