

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class LongResponseHeaderDemoServer {
  public static void main(String[] args) throws Exception {
    int port = args.length == 0 ? 3000 : Integer.parseInt(args[0]);

    System.err.println("Listening on port " + port + "...");
    System.err.println();

    try (ServerSocket server = new ServerSocket(port);
        Socket sock = server.accept();
        BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
        PrintStream out = new PrintStream(sock.getOutputStream())) {

      // Read the request and print to stderr...
      System.err.println("Reading request...");
      for (String line = in.readLine(); !line.isEmpty(); line = in.readLine()) {
        System.err.println(line);
      }
      System.err.println();

      // Write the response to the socket...
      System.err.println("Writing response...");
      out.println("HTTP/1.1 200 OK");
      out.println("Content-Type: text/plain");
      out.println("Connection: close");
      out.println("Content-Length: 3");

      // This is an endless header.
      out.print("X-Long-Header: ");
      while (true) {
        // Dump 16K to the socket for every iteration
        out.print("abcdefghijklmnop".repeat(1024));
        out.flush();
        if (false) {
          // Appease the compiler...
          break;
        }
      }
      // We won't ever reach here...
      out.println();


      // End the header section
      out.println();

      // Print the body
      out.print(new byte[] {'O', 'K', '\n'});
    }
  }
}
