import com.sun.net.httpserver.HttpServer;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.time.Duration;

public class KlienDenganBuilder {
    public static void main(String[] args) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0);
        // /asal membalas redirect 302 menuju /tujuan
        server.createContext("/asal", exchange -> {
            exchange.getResponseHeaders().set("Location", "/tujuan");
            exchange.sendResponseHeaders(302, -1);
            exchange.close();
        });
        server.createContext("/tujuan", exchange -> {
            byte[] body = "sampai di tujuan".getBytes(StandardCharsets.UTF_8);
            exchange.sendResponseHeaders(200, body.length);
            try (OutputStream os = exchange.getResponseBody()) {
                os.write(body);
            }
        });
        server.start();

        URI asal = URI.create("http://127.0.0.1:" + server.getAddress().getPort() + "/asal");
        try {
            HttpClient tanpaIkut = HttpClient.newBuilder()
                    .followRedirects(HttpClient.Redirect.NEVER)
                    .connectTimeout(Duration.ofSeconds(3))
                    .version(HttpClient.Version.HTTP_2)
                    .build();
            HttpResponse<String> r1 = tanpaIkut.send(
                    HttpRequest.newBuilder(asal).GET().build(),
                    HttpResponse.BodyHandlers.ofString());
            System.out.println("NEVER  : status " + r1.statusCode()
                    + ", location " + r1.headers().firstValue("location").orElse("-"));

            HttpClient ikut = HttpClient.newBuilder()
                    .followRedirects(HttpClient.Redirect.NORMAL)
                    .build();
            HttpResponse<String> r2 = ikut.send(
                    HttpRequest.newBuilder(asal).GET().build(),
                    HttpResponse.BodyHandlers.ofString());
            System.out.println("NORMAL : status " + r2.statusCode()
                    + ", body " + r2.body() + ", versi " + r2.version());
        } finally {
            server.stop(0);
        }
    }
}
