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;

public class KirimBerbagai {
    public static void main(String[] args) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0);
        server.createContext("/tugas", exchange -> {
            String metode = exchange.getRequestMethod();
            String bodyMasuk = new String(exchange.getRequestBody().readAllBytes(),
                    StandardCharsets.UTF_8);
            String headerSapa = exchange.getRequestHeaders().getFirst("X-Kategori");

            String jawaban = metode + " diterima";
            if (!bodyMasuk.isEmpty()) {
                jawaban += ", body: " + bodyMasuk;
            }
            if (headerSapa != null) {
                jawaban += ", header X-Kategori=" + headerSapa;
            }
            byte[] body = jawaban.getBytes(StandardCharsets.UTF_8);
            exchange.sendResponseHeaders(200, body.length);
            try (OutputStream os = exchange.getResponseBody()) {
                os.write(body);
            }
        });
        server.start();

        String dasar = "http://127.0.0.1:" + server.getAddress().getPort() + "/tugas";
        HttpClient klien = HttpClient.newHttpClient();
        try {
            HttpRequest get = HttpRequest.newBuilder(URI.create(dasar)).GET().build();
            HttpRequest post = HttpRequest.newBuilder(URI.create(dasar))
                    .POST(HttpRequest.BodyPublishers.ofString("tugas baru Budi"))
                    .build();
            HttpRequest put = HttpRequest.newBuilder(URI.create(dasar))
                    .header("X-Kategori", "penting")
                    .PUT(HttpRequest.BodyPublishers.ofString("tugas revisi", StandardCharsets.UTF_8))
                    .build();
            HttpRequest hapus = HttpRequest.newBuilder(URI.create(dasar)).DELETE().build();

            for (HttpRequest req : new HttpRequest[]{get, post, put, hapus}) {
                HttpResponse<String> res = klien.send(req,
                        HttpResponse.BodyHandlers.ofString());
                System.out.printf("%-6s -> %d : %s%n", req.method(), res.statusCode(), res.body());
            }
        } finally {
            server.stop(0);
        }
    }
}
