import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
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.net.http.HttpTimeoutException;
import java.nio.charset.StandardCharsets;
import java.time.Duration;

public class KlienTimeout {
    public static void main(String[] args) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0);
        // Server sengaja membalas sangat lambat
        server.createContext("/lambat", exchange -> {
            try {
                Thread.sleep(1000);
                byte[] body = "akhirnya tiba".getBytes(StandardCharsets.UTF_8);
                exchange.sendResponseHeaders(200, body.length);
                try (OutputStream os = exchange.getResponseBody()) {
                    os.write(body);
                }
            } catch (IOException | InterruptedException e) {
                // klien sudah memutuskan menunggu — abaikan
            }
        });
        server.start();

        try {
            HttpClient klien = HttpClient.newBuilder()
                    .connectTimeout(Duration.ofSeconds(2))
                    .build();
            HttpRequest req = HttpRequest.newBuilder()
                    .uri(URI.create("http://127.0.0.1:" + server.getAddress().getPort() + "/lambat"))
                    .timeout(Duration.ofMillis(200))
                    .GET()
                    .build();

            try {
                klien.send(req, HttpResponse.BodyHandlers.ofString());
                System.out.println("respons tiba (tidak diharapkan)");
            } catch (HttpTimeoutException e) {
                System.out.println("jenis galat : " + e.getClass().getSimpleName());
                System.out.println("pesan       : " + e.getMessage());
            }
        } finally {
            server.stop(0);
        }
    }
}
