This commit is contained in:
Chris Hegarty 2019-02-08 12:44:16 +00:00
commit bba5ddd08f
2 changed files with 64 additions and 29 deletions

View file

@ -597,10 +597,6 @@ class Stream<T> extends ExchangeImpl<T> {
if (contentLength > 0) { if (contentLength > 0) {
h.setHeader("content-length", Long.toString(contentLength)); h.setHeader("content-length", Long.toString(contentLength));
} }
URI uri = request.uri();
if (uri != null) {
h.setHeader("host", Utils.hostString(request));
}
HttpHeaders sysh = filterHeaders(h.build()); HttpHeaders sysh = filterHeaders(h.build());
HttpHeaders userh = filterHeaders(request.getUserHeaders()); HttpHeaders userh = filterHeaders(request.getUserHeaders());
// Filter context restricted from userHeaders // Filter context restricted from userHeaders

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,7 +25,7 @@
* @test * @test
* @summary Verify that some special headers - such as User-Agent * @summary Verify that some special headers - such as User-Agent
* can be specified by the caller. * can be specified by the caller.
* @bug 8203771 * @bug 8203771 8218546
* @modules java.base/sun.net.www.http * @modules java.base/sun.net.www.http
* java.net.http/jdk.internal.net.http.common * java.net.http/jdk.internal.net.http.common
* java.net.http/jdk.internal.net.http.frame * java.net.http/jdk.internal.net.http.frame
@ -64,8 +64,6 @@ import java.net.http.HttpHeaders;
import java.net.http.HttpRequest; import java.net.http.HttpRequest;
import java.net.http.HttpResponse; import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandlers; import java.net.http.HttpResponse.BodyHandlers;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.time.Duration; import java.time.Duration;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -74,13 +72,13 @@ import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.function.Function; import java.util.function.Function;
import static java.lang.System.err;
import static java.lang.System.out; import static java.lang.System.out;
import static java.net.http.HttpClient.Builder.NO_PROXY; import static java.net.http.HttpClient.Builder.NO_PROXY;
import static java.net.http.HttpClient.Version.HTTP_2;
import static java.nio.charset.StandardCharsets.US_ASCII; import static java.nio.charset.StandardCharsets.US_ASCII;
import org.testng.Assert; import org.testng.Assert;
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
public class SpecialHeadersTest implements HttpServerAdapters { public class SpecialHeadersTest implements HttpServerAdapters {
@ -151,7 +149,11 @@ public class SpecialHeadersTest implements HttpServerAdapters {
"USER-AGENT", u -> userAgent(), "HOST", u -> u.getRawAuthority()); "USER-AGENT", u -> userAgent(), "HOST", u -> u.getRawAuthority());
@Test(dataProvider = "variants") @Test(dataProvider = "variants")
void test(String uriString, String headerNameAndValue, boolean sameClient) throws Exception { void test(String uriString,
String headerNameAndValue,
boolean sameClient)
throws Exception
{
out.println("\n--- Starting "); out.println("\n--- Starting ");
int index = headerNameAndValue.indexOf(":"); int index = headerNameAndValue.indexOf(":");
@ -183,21 +185,41 @@ public class SpecialHeadersTest implements HttpServerAdapters {
assertEquals(resp.statusCode(), 200, assertEquals(resp.statusCode(), 200,
"Expected 200, got:" + resp.statusCode()); "Expected 200, got:" + resp.statusCode());
String receivedHeaderString = value == null ? null boolean isInitialRequest = i == 0;
: resp.headers().firstValue("X-"+key).get(); boolean isSecure = uri.getScheme().equalsIgnoreCase("https");
out.println("Got X-" + key + ": " + resp.headers().allValues("X-"+key)); boolean isHTTP2 = resp.version() == HTTP_2;
if (value != null) { boolean isNotH2CUpgrade = isSecure || (sameClient == true && !isInitialRequest);
assertEquals(receivedHeaderString, value); boolean isDefaultHostHeader = name.equalsIgnoreCase("host") && useDefault;
assertEquals(resp.headers().allValues("X-"+key), List.of(value));
} else {
assertEquals(resp.headers().allValues("X-"+key).size(), 0);
}
// By default, HTTP/2 sets the `:authority:` pseudo-header, instead
// of the `Host` header. Therefore, there should be no "X-Host"
// header in the response, except the response to the h2c Upgrade
// request which will have been sent through HTTP/1.1.
if (isDefaultHostHeader && isHTTP2 && isNotH2CUpgrade) {
assertTrue(resp.headers().firstValue("X-" + key).isEmpty());
assertTrue(resp.headers().allValues("X-" + key).isEmpty());
out.println("No X-" + key + " header received, as expected");
} else {
String receivedHeaderString = value == null ? null
: resp.headers().firstValue("X-"+key).get();
out.println("Got X-" + key + ": " + resp.headers().allValues("X-"+key));
if (value != null) {
assertEquals(receivedHeaderString, value);
assertEquals(resp.headers().allValues("X-"+key), List.of(value));
} else {
assertEquals(resp.headers().allValues("X-"+key).size(), 0);
}
}
} }
} }
@Test(dataProvider = "variants") @Test(dataProvider = "variants")
void testHomeMadeIllegalHeader(String uriString, String headerNameAndValue, boolean sameClient) throws Exception { void testHomeMadeIllegalHeader(String uriString,
String headerNameAndValue,
boolean sameClient)
throws Exception
{
out.println("\n--- Starting "); out.println("\n--- Starting ");
final URI uri = URI.create(uriString); final URI uri = URI.create(uriString);
@ -266,6 +288,11 @@ public class SpecialHeadersTest implements HttpServerAdapters {
} }
HttpRequest request = requestBuilder.build(); HttpRequest request = requestBuilder.build();
boolean isInitialRequest = i == 0;
boolean isSecure = uri.getScheme().equalsIgnoreCase("https");
boolean isNotH2CUpgrade = isSecure || (sameClient == true && !isInitialRequest);
boolean isDefaultHostHeader = name.equalsIgnoreCase("host") && useDefault;
client.sendAsync(request, BodyHandlers.ofString()) client.sendAsync(request, BodyHandlers.ofString())
.thenApply(response -> { .thenApply(response -> {
out.println("Got response: " + response); out.println("Got response: " + response);
@ -273,15 +300,27 @@ public class SpecialHeadersTest implements HttpServerAdapters {
assertEquals(response.statusCode(), 200); assertEquals(response.statusCode(), 200);
return response;}) return response;})
.thenAccept(resp -> { .thenAccept(resp -> {
String receivedHeaderString = value == null ? null // By default, HTTP/2 sets the `:authority:` pseudo-header, instead
: resp.headers().firstValue("X-"+key).get(); // of the `Host` header. Therefore, there should be no "X-Host"
out.println("Got X-" + key + ": " + resp.headers().allValues("X-"+key)); // header in the response, except the response to the h2c Upgrade
if (value != null) { // request which will have been sent through HTTP/1.1.
assertEquals(receivedHeaderString, value);
assertEquals(resp.headers().allValues("X-" + key), List.of(value)); if (isDefaultHostHeader && resp.version() == HTTP_2 && isNotH2CUpgrade) {
assertTrue(resp.headers().firstValue("X-" + key).isEmpty());
assertTrue(resp.headers().allValues("X-" + key).isEmpty());
out.println("No X-" + key + " header received, as expected");
} else { } else {
assertEquals(resp.headers().allValues("X-" + key).size(), 1); String receivedHeaderString = value == null ? null
} }) : resp.headers().firstValue("X-"+key).get();
out.println("Got X-" + key + ": " + resp.headers().allValues("X-"+key));
if (value != null) {
assertEquals(receivedHeaderString, value);
assertEquals(resp.headers().allValues("X-" + key), List.of(value));
} else {
assertEquals(resp.headers().allValues("X-" + key).size(), 1);
}
}
})
.join(); .join();
} }
} }