Creating a Frameworkless HTTP Server in Java Packaged as a JAR for Docker Placeholder

Java Code

import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpExchange;
import java.io.IOException;
import java.io.OutputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.net.InetSocketAddress;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

public class SimpleHttpServer {
    public static void main(String[] args) throws IOException {
        HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
        server.createContext("/", new EchoHandler());
        server.setExecutor(null);
        server.start();
        System.out.println("Server started on port 8080");
    }

    static class EchoHandler implements HttpHandler {
        @Override
        public void handle(HttpExchange exchange) throws IOException {
            try {
                // Parse request components
                String requestUri = exchange.getRequestURI().toString();
                String queryParams = exchange.getRequestURI().getQuery();
                String requestBody = getRequestBody(exchange);

                // Build response
                String response = buildHtmlResponse(requestUri, queryParams, requestBody);
                String logMessage = buildLogMessage(requestUri, queryParams, requestBody);

                // Send response and log
                exchange.sendResponseHeaders(200, response.getBytes().length);
                try (OutputStream os = exchange.getResponseBody()) {
                    os.write(response.getBytes());
                }
                System.out.println(logMessage);
            } catch (Exception e) {
                e.printStackTrace();
                String errorResponse = "Error processing request: " + e.getMessage();
                exchange.sendResponseHeaders(500, errorResponse.getBytes().length);
                try (OutputStream os = exchange.getResponseBody()) {
                    os.write(errorResponse.getBytes());
                }
            }
        }

        private String getRequestBody(HttpExchange exchange) throws IOException {
            try (BufferedReader br = new BufferedReader(
                    new InputStreamReader(exchange.getRequestBody(), "UTF-8"))) {
                return br.lines().collect(Collectors.joining("\n"));
            }
        }

        private String buildHtmlResponse(String uri, String params, String body) {
            return "<html><body>" +
                   "<h1>Request Details</h1>" +
                   "<p><strong>URI:</strong> " + uri + "</p>" +
                   "<p><strong>Query Parameters:</strong> " + (params != null ? params : "None") + "</p>" +
                   "<p><strong>Request Body:</strong><br/><pre>" + body + "</pre></p>" +
                   "</body></html>";
        }

        private String buildLogMessage(String uri, String params, String body) {
            return String.format("Request Received:\nURI: %s\nParams: %s\nBody: %s\n", 
                uri, params != null ? params : "None", body);
        }
    }
}

Compilation and Packaging

# Clean previous artifacts
del *.class, SimpleHttpServer.jar

# Recompile source
javac SimpleHttpServer.java

# Create JAR with direct main class specification (no external manifest needed)
jar --create --file SimpleHttpServer.jar --main-class SimpleHttpServer -C . .

# Run the server
java -jar SimpleHttpServer.jar

Leave a Comment