-
Bug
-
Resolution: Not an Issue
-
P4
-
None
-
11, 17, 21, 22
-
generic
-
generic
ADDITIONAL SYSTEM INFORMATION :
Edition: Windows 10 Enterprise
Version: 22H2
JDK-Version: 21.0.2
Used IDE: IntelliJ IDE 2023.3.3 (Ultimate Edition)
A DESCRIPTION OF THE PROBLEM :
When using the HttpClient from java.net.http creating a request and catching the response we receive headers as key-value-tupples (HttpHeaders) where the key is `:status`.
This only happens when using the HttpClient - When we switch to URLConnection (java.net) the same header field looks different - Key = null
Respecting the general specification of proper header field syntax, the colon should be used as a seperator between key(field name) and value (field value). But for this particular header field it's part of the field name.
Please find attached an example which shows the difference.
HttpClient: ":status" => [200]
URLConnection: null => [HTTP/1.1 200 OK]
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Execute the attached source code and check the console output - There you can find the headers from both mentioned classes
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
HttpClient headers should respect the header field name specifiaction and use colon as a seperator (In the described case the colon should not be part of the `key`)
---------- BEGIN SOURCE ----------
import java.io.IOException;
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandlers;
import java.util.List;
import java.util.Map;
public class RestClientTesting {
public static void main(String[] args) throws IOException, InterruptedException {
HttpClient jdkClient = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder(URI.create("https://www.google.com")).build();
HttpResponse<Void> response = jdkClient.send(request, BodyHandlers.discarding());
java.net.http.HttpHeaders httpClientHeaders = response.headers();
System.out.println("\n \n ======= HTTP Client Headers =======\n \n");
httpClientHeaders.map().forEach((k,v) -> System.out.println("\t" + k + ":\t" + v));
URL url = new URL("https://www.google.com");
URLConnection urlConnection = url.openConnection();
urlConnection.connect();
Map<String, List<String>> urlConnectionHeaders = urlConnection.getHeaderFields();
System.out.println("\n \n ======= HttpURLConnection Headers =======\n \n");
urlConnectionHeaders.forEach((k,v) -> System.out.println("\t" + k + ":\t" + v));
}
}
---------- END SOURCE ----------
FREQUENCY : always
Edition: Windows 10 Enterprise
Version: 22H2
JDK-Version: 21.0.2
Used IDE: IntelliJ IDE 2023.3.3 (Ultimate Edition)
A DESCRIPTION OF THE PROBLEM :
When using the HttpClient from java.net.http creating a request and catching the response we receive headers as key-value-tupples (HttpHeaders) where the key is `:status`.
This only happens when using the HttpClient - When we switch to URLConnection (java.net) the same header field looks different - Key = null
Respecting the general specification of proper header field syntax, the colon should be used as a seperator between key(field name) and value (field value). But for this particular header field it's part of the field name.
Please find attached an example which shows the difference.
HttpClient: ":status" => [200]
URLConnection: null => [HTTP/1.1 200 OK]
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Execute the attached source code and check the console output - There you can find the headers from both mentioned classes
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
HttpClient headers should respect the header field name specifiaction and use colon as a seperator (In the described case the colon should not be part of the `key`)
---------- BEGIN SOURCE ----------
import java.io.IOException;
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandlers;
import java.util.List;
import java.util.Map;
public class RestClientTesting {
public static void main(String[] args) throws IOException, InterruptedException {
HttpClient jdkClient = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder(URI.create("https://www.google.com")).build();
HttpResponse<Void> response = jdkClient.send(request, BodyHandlers.discarding());
java.net.http.HttpHeaders httpClientHeaders = response.headers();
System.out.println("\n \n ======= HTTP Client Headers =======\n \n");
httpClientHeaders.map().forEach((k,v) -> System.out.println("\t" + k + ":\t" + v));
URL url = new URL("https://www.google.com");
URLConnection urlConnection = url.openConnection();
urlConnection.connect();
Map<String, List<String>> urlConnectionHeaders = urlConnection.getHeaderFields();
System.out.println("\n \n ======= HttpURLConnection Headers =======\n \n");
urlConnectionHeaders.forEach((k,v) -> System.out.println("\t" + k + ":\t" + v));
}
}
---------- END SOURCE ----------
FREQUENCY : always