11/*
2- * Copyright (c) 2016, 2024 , Oracle and/or its affiliates. All rights reserved.
2+ * Copyright (c) 2016, 2025 , Oracle and/or its affiliates. All rights reserved.
33 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44 *
55 * This code is free software; you can redistribute it and/or modify it
2525import java .net .http .HttpClient ;
2626import java .time .Duration ;
2727import java .util .Arrays ;
28+ import java .util .List ;
29+ import java .util .Map ;
30+ import java .util .Objects ;
2831import java .util .function .BiFunction ;
2932import java .util .function .Function ;
3033import java .util .function .Supplier ;
3437import static java .net .http .HttpRequest .BodyPublishers .ofString ;
3538import static java .net .http .HttpRequest .BodyPublishers .noBody ;
3639
37- /**
40+ /*
3841 * @test
3942 * @bug 8170064 8276559
40- * @summary HttpRequest[.Builder] API and behaviour checks
43+ * @summary HttpRequest[.Builder] API and behaviour checks
4144 */
45+
4246public class HttpRequestBuilderTest {
4347
4448 static final URI TEST_URI = URI .create ("http://www.foo.com/" );
@@ -262,13 +266,11 @@ public static void main(String[] args) throws Exception {
262266 // verify that the default HEAD() method implementation in HttpRequest.Builder
263267 // interface works as expected
264268 HttpRequest defaultHeadReq = new NotOverriddenHEADImpl ().HEAD ().uri (TEST_URI ).build ();
265- String actualMethod = defaultHeadReq .method ();
266- if (!actualMethod .equals ("HEAD" )) {
267- throw new AssertionError ("failed: expected HEAD method but got method: " + actualMethod );
268- }
269- if (defaultHeadReq .bodyPublisher ().isEmpty ()) {
270- throw new AssertionError ("failed: missing bodyPublisher on HEAD request" );
271- }
269+ assertEquals ("HEAD" , defaultHeadReq .method (), "Method" );
270+ assertEquals (false , defaultHeadReq .bodyPublisher ().isEmpty (), "Body publisher absence" );
271+
272+ verifyCopy ();
273+
272274 }
273275
274276 private static boolean shouldFail (Class <? extends Exception > ...exceptions ) {
@@ -295,13 +297,7 @@ static void method(String name,
295297 throw new AssertionError ("failed: " + name
296298 + ". Unexpected body processor for GET: "
297299 + request .bodyPublisher ().get ());
298-
299- if (expectedMethod .equals (method )) {
300- System .out .println ("success: " + name );
301- } else {
302- throw new AssertionError ("failed: " + name
303- + ". Expected " + expectedMethod + ", got " + method );
304- }
300+ assertEquals (expectedMethod , method , "Method" );
305301 }
306302
307303 static void test0 (String name ,
@@ -378,6 +374,45 @@ public static <R,P1, P2> R test2(String name, R receiver, BiFunction<P1, P2, R>
378374 }
379375 }
380376
377+ private static void verifyCopy () {
378+
379+ // Create the request builder
380+ HttpRequest .Builder requestBuilder = HttpRequest
381+ .newBuilder (TEST_URI )
382+ .header ("X-Foo" , "1" )
383+ .method ("GET" , noBody ())
384+ .expectContinue (true )
385+ .timeout (Duration .ofSeconds (0xBEEF ))
386+ .version (HttpClient .Version .HTTP_2 );
387+
388+ // Create the original and the _copy_ requests
389+ HttpRequest request = requestBuilder .build ();
390+ HttpRequest copiedRequest = requestBuilder
391+ .copy ()
392+ .header ("X-Foo" , "2" )
393+ .header ("X-Bar" , "3" )
394+ .build ();
395+
396+ // Verify copied _references_
397+ assertEquals (request .uri (), copiedRequest .uri (), "URI" );
398+ assertEquals (request .method (), copiedRequest .method (), "Method" );
399+ assertEquals (request .expectContinue (), copiedRequest .expectContinue (), "Expect continue setting" );
400+ assertEquals (request .timeout (), copiedRequest .timeout (), "Timeout" );
401+ assertEquals (request .version (), copiedRequest .version (), "Version" );
402+
403+ // Verify headers
404+ assertEquals (request .headers ().map (), Map .of ("X-Foo" , List .of ("1" )), "Request headers" );
405+ assertEquals (copiedRequest .headers ().map (), Map .of ("X-Foo" , List .of ("1" , "2" ), "X-Bar" , List .of ("3" )), "Copied request headers" );
406+
407+ }
408+
409+ private static void assertEquals (Object expected , Object actual , Object name ) {
410+ if (!Objects .equals (expected , actual )) {
411+ String message = String .format ("%s mismatch!%nExpected: %s%nActual: %s" , name , expected , actual );
412+ throw new AssertionError (message );
413+ }
414+ }
415+
381416 // doesn't override the default HEAD() method
382417 private static final class NotOverriddenHEADImpl implements HttpRequest .Builder {
383418 private final HttpRequest .Builder underlying = HttpRequest .newBuilder ();
0 commit comments