Skip to content

Commit 22f61cf

Browse files
committed
[java] ensure all headers are removed or replaced
1 parent 51ad546 commit 22f61cf

File tree

3 files changed

+106
-26
lines changed

3 files changed

+106
-26
lines changed

java/src/org/openqa/selenium/grid/node/DefaultActiveSession.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
import java.io.UncheckedIOException;
66
import java.net.URL;
77
import java.time.Instant;
8-
import java.util.stream.Collectors;
9-
import java.util.stream.StreamSupport;
108
import org.openqa.selenium.Capabilities;
119
import org.openqa.selenium.grid.web.ReverseProxyHandler;
1210
import org.openqa.selenium.internal.Require;
@@ -43,12 +41,7 @@ protected DefaultActiveSession(
4341

4442
@Override
4543
public HttpResponse execute(HttpRequest req) throws UncheckedIOException {
46-
String host = "host";
47-
StreamSupport.stream(req.getHeaderNames().spliterator(), true)
48-
.filter(host::equalsIgnoreCase)
49-
.collect(Collectors.toList())
50-
.forEach(req::removeHeader);
51-
req.addHeader(host, String.format("%s:%s", getUri().getHost(), getUri().getPort()));
44+
req.setHeader("host", String.format("%s:%s", getUri().getHost(), getUri().getPort()));
5245
HttpResponse res = handler.execute(req);
5346
if (req.getMethod() == DELETE && killUrl.equals(req.getUri())) {
5447
stop();

java/src/org/openqa/selenium/remote/http/HttpMessage.java

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626
import com.google.common.net.MediaType;
2727
import java.io.InputStream;
2828
import java.nio.charset.Charset;
29+
import java.util.Collections;
2930
import java.util.HashMap;
30-
import java.util.Iterator;
3131
import java.util.Map;
3232
import java.util.Objects;
3333
import java.util.function.Supplier;
@@ -66,7 +66,7 @@ public Iterable<String> getAttributeNames() {
6666
}
6767

6868
public Iterable<String> getHeaderNames() {
69-
return headers.keySet();
69+
return Collections.unmodifiableCollection(headers.keySet());
7070
}
7171

7272
public Iterable<String> getHeaders(String name) {
@@ -78,16 +78,12 @@ public Iterable<String> getHeaders(String name) {
7878
}
7979

8080
public String getHeader(String name) {
81-
Iterable<String> initialHeaders = getHeaders(name);
82-
if (initialHeaders == null) {
83-
return null;
84-
}
85-
86-
Iterator<String> headers = initialHeaders.iterator();
87-
if (headers.hasNext()) {
88-
return headers.next();
89-
}
90-
return null;
81+
return headers.entries().stream()
82+
.filter(e -> Objects.nonNull(e.getKey()))
83+
.filter(e -> e.getKey().equalsIgnoreCase(name.toLowerCase()))
84+
.map(Map.Entry::getValue)
85+
.findFirst()
86+
.orElse(null);
9187
}
9288

9389
public M setHeader(String name, String value) {
@@ -100,12 +96,7 @@ public M addHeader(String name, String value) {
10096
}
10197

10298
public M removeHeader(String name) {
103-
String toRemove =
104-
headers.keySet().stream()
105-
.filter(header -> header.equalsIgnoreCase(name))
106-
.findFirst()
107-
.orElse(name);
108-
headers.removeAll(toRemove);
99+
headers.keySet().removeIf(header -> header.equalsIgnoreCase(name));
109100
return self();
110101
}
111102

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
// Licensed to the Software Freedom Conservancy (SFC) under one
2+
// or more contributor license agreements. See the NOTICE file
3+
// distributed with this work for additional information
4+
// regarding copyright ownership. The SFC licenses this file
5+
// to you under the Apache License, Version 2.0 (the
6+
// "License"); you may not use this file except in compliance
7+
// with the License. You may obtain a copy of the License at
8+
//
9+
// http://www.apache.org/licenses/LICENSE-2.0
10+
//
11+
// Unless required by applicable law or agreed to in writing,
12+
// software distributed under the License is distributed on an
13+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
// KIND, either express or implied. See the License for the
15+
// specific language governing permissions and limitations
16+
// under the License.
17+
18+
package org.openqa.selenium.remote.http;
19+
20+
import static org.assertj.core.api.Assertions.assertThat;
21+
22+
import java.util.Arrays;
23+
import java.util.HashSet;
24+
import java.util.Set;
25+
import org.junit.jupiter.api.Tag;
26+
import org.junit.jupiter.api.Test;
27+
28+
@Tag("UnitTests")
29+
class HttpMessageTest {
30+
31+
@Test
32+
void allHeadersAreAdded() {
33+
for (HttpMessage<?> message :
34+
Arrays.asList(new HttpRequest(HttpMethod.GET, "/"), new HttpResponse())) {
35+
message.addHeader("Content-Length", "1024");
36+
message.addHeader("Content-length", "2048");
37+
message.addHeader("content-length", "4096");
38+
39+
Set<String> headers = new HashSet<>();
40+
41+
message.getHeaderNames().forEach(headers::add);
42+
43+
assertThat(headers.contains("Content-Length")).isTrue();
44+
assertThat(headers.contains("Content-length")).isTrue();
45+
assertThat(headers.contains("content-length")).isTrue();
46+
}
47+
}
48+
49+
@Test
50+
void readingIsCaseInsensitive() {
51+
for (HttpMessage<?> message :
52+
Arrays.asList(new HttpRequest(HttpMethod.GET, "/"), new HttpResponse())) {
53+
message.addHeader("Content-Length", "1024");
54+
message.addHeader("Content-length", "2048");
55+
message.addHeader("content-length", "4096");
56+
57+
assertThat(message.getHeader("Content-Length")).isEqualTo("4096");
58+
}
59+
}
60+
61+
@Test
62+
void replacingIsCaseInsensitive() {
63+
for (HttpMessage<?> message :
64+
Arrays.asList(new HttpRequest(HttpMethod.GET, "/"), new HttpResponse())) {
65+
message.addHeader("Content-Length", "1024");
66+
message.addHeader("Content-length", "2048");
67+
message.addHeader("content-length", "4096");
68+
message.setHeader("contenT-length", "8192");
69+
70+
Set<String> headers = new HashSet<>();
71+
72+
message.getHeaderNames().forEach(headers::add);
73+
74+
assertThat(message.getHeader("content-length")).isEqualTo("8192");
75+
assertThat(headers.contains("Content-Length")).isFalse();
76+
assertThat(headers.contains("Content-length")).isFalse();
77+
assertThat(headers.contains("content-length")).isFalse();
78+
}
79+
}
80+
81+
@Test
82+
void allHeadersAreRemoved() {
83+
for (HttpMessage<?> message :
84+
Arrays.asList(new HttpRequest(HttpMethod.GET, "/"), new HttpResponse())) {
85+
message.addHeader("Content-Length", "1024");
86+
message.addHeader("Content-length", "2048");
87+
message.addHeader("content-length", "4096");
88+
89+
assertThat(message.getHeaderNames().iterator().hasNext()).isTrue();
90+
91+
message.removeHeader("Content-Length");
92+
93+
assertThat(message.getHeaderNames().iterator().hasNext()).isFalse();
94+
}
95+
}
96+
}

0 commit comments

Comments
 (0)