From 8a7bc3362e6e95f7147f3b8db1b398c395c4e1b5 Mon Sep 17 00:00:00 2001 From: Ziver Koc Date: Sat, 4 Apr 2026 23:50:36 +0200 Subject: [PATCH] HTTP server no adhears to the correct carrage return of \r\n --- build.gradle | 3 +- src/zutil/net/http/HttpPrintStream.java | 31 ++++++----- test/zutil/net/http/HttpPrintStreamTest.java | 56 ++++++++++---------- 3 files changed, 47 insertions(+), 43 deletions(-) diff --git a/build.gradle b/build.gradle index 18d5f62..592a8f8 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ plugins { /* * The MIT License (MIT) * - * Copyright (c) 2025 Ziver Koc + * Copyright (c) 2025-2026 Ziver Koc * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -82,6 +82,7 @@ java { tasks.withType(JavaCompile) { options.compilerArgs << "-Xlint:deprecation" + options.compilerArgs << "-Xlint:unchecked" } sourceSets { diff --git a/src/zutil/net/http/HttpPrintStream.java b/src/zutil/net/http/HttpPrintStream.java index 371f0ae..8f04af2 100755 --- a/src/zutil/net/http/HttpPrintStream.java +++ b/src/zutil/net/http/HttpPrintStream.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2020 Ziver Koc + * Copyright (c) 2020-2026 Ziver Koc * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,8 +24,6 @@ package zutil.net.http; -import zutil.converter.Converter; - import java.io.OutputStream; import java.io.PrintStream; import java.util.HashMap; @@ -37,6 +35,8 @@ import java.util.HashMap; * @author Ziver */ public class HttpPrintStream extends OutputStream { + protected static final String LINE_SEPARATOR = "\r\n"; + /** * Specifies if the HTTP message is a request (client) or a response (server). */ @@ -60,7 +60,7 @@ public class HttpPrintStream extends OutputStream { /** - * Creates an new instance of HttpPrintStream with + * Creates a new instance of HttpPrintStream with * message type of RESPONSE and buffering disabled. * * @param out is the OutputStream where the data will be written to @@ -70,7 +70,7 @@ public class HttpPrintStream extends OutputStream { } /** - * Creates an new instance of HttpPrintStream with + * Creates a new instance of HttpPrintStream with * message type buffering disabled. * * @param out is the OutputStream where the data will be written to @@ -101,6 +101,8 @@ public class HttpPrintStream extends OutputStream { * is enabled until you close or flush the stream. * This function will flush the stream if buffering is * disabled. + * + * @param enable true if buffering is enabled, false otherwise */ public void enableBuffering(boolean enable) { if (enable && !isBufferEnabled()) { @@ -181,7 +183,7 @@ public class HttpPrintStream extends OutputStream { } /** - * Adds an header value + * Adds a header value * * @param key is the header name * @param value is the value of the header @@ -206,18 +208,18 @@ public class HttpPrintStream extends OutputStream { * Prints a new line */ public void println() { - printOrBuffer(System.lineSeparator()); + printOrBuffer(LINE_SEPARATOR); } /** * Prints with a new line */ public void println(String s) { - printOrBuffer(s + System.lineSeparator()); + printOrBuffer(s + LINE_SEPARATOR); } /** - * Prints an string + * Prints a string */ public void print(String s) { printOrBuffer(s); @@ -248,12 +250,13 @@ public class HttpPrintStream extends OutputStream { header.getResponseStatusCode() + " " + header.getResponseStatusString()); } - out.println(); + out.print(LINE_SEPARATOR); // Send headers for (String key : header.getHeaderMap().keySet()) { - out.println(key + ": " + header.getHeader(key)); + out.print(key + ": " + header.getHeader(key)); + out.print(LINE_SEPARATOR); } // Send cookies @@ -264,16 +267,16 @@ public class HttpPrintStream extends OutputStream { for (String key : header.getCookieMap().keySet()) { out.print(" " + key + "=" + header.getCookie(key) + ";"); } - out.println(); + out.print(LINE_SEPARATOR); } else { for (String key : header.getCookieMap().keySet()) { out.print(HttpHeader.HEADER_SET_COOKIE + ": " + key + "=" + header.getCookie(key) + ";"); - out.println(); + out.print(LINE_SEPARATOR); } } } - out.println(); + out.print(LINE_SEPARATOR); header = null; // Check for errors diff --git a/test/zutil/net/http/HttpPrintStreamTest.java b/test/zutil/net/http/HttpPrintStreamTest.java index 56514a9..16d3229 100644 --- a/test/zutil/net/http/HttpPrintStreamTest.java +++ b/test/zutil/net/http/HttpPrintStreamTest.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2020 Ziver Koc + * Copyright (c) 2020-2026 Ziver Koc * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -39,8 +39,8 @@ public class HttpPrintStreamTest { httpOut.flush(); assertEquals( - "GET / HTTP/1.0" + System.lineSeparator() + - System.lineSeparator(), + "GET / HTTP/1.0" + HttpPrintStream.LINE_SEPARATOR + + HttpPrintStream.LINE_SEPARATOR, out.toString() ); } @@ -54,8 +54,8 @@ public class HttpPrintStreamTest { httpOut.flush(); assertEquals( - "POST / HTTP/1.0" + System.lineSeparator() + - System.lineSeparator(), + "POST / HTTP/1.0" + HttpPrintStream.LINE_SEPARATOR + + HttpPrintStream.LINE_SEPARATOR, out.toString() ); } @@ -69,8 +69,8 @@ public class HttpPrintStreamTest { httpOut.flush(); assertEquals( - "GET /test/path/to/page?param=aa&tt=aa HTTP/1.0" + System.lineSeparator() + - System.lineSeparator(), + "GET /test/path/to/page?param=aa&tt=aa HTTP/1.0" + HttpPrintStream.LINE_SEPARATOR + + HttpPrintStream.LINE_SEPARATOR, out.toString() ); } @@ -84,9 +84,9 @@ public class HttpPrintStreamTest { httpOut.flush(); assertEquals( - "GET / HTTP/1.0" + System.lineSeparator() + - "Cookie: Test=value;" + System.lineSeparator() + - System.lineSeparator(), + "GET / HTTP/1.0" + HttpPrintStream.LINE_SEPARATOR + + "Cookie: Test=value;" + HttpPrintStream.LINE_SEPARATOR + + HttpPrintStream.LINE_SEPARATOR, out.toString() ); } @@ -101,9 +101,9 @@ public class HttpPrintStreamTest { httpOut.flush(); assertEquals( - "GET / HTTP/1.0" + System.lineSeparator() + - "Cookie: Test1=value1; Test2=value2;" + System.lineSeparator() + - System.lineSeparator(), + "GET / HTTP/1.0" + HttpPrintStream.LINE_SEPARATOR + + "Cookie: Test1=value1; Test2=value2;" + HttpPrintStream.LINE_SEPARATOR + + HttpPrintStream.LINE_SEPARATOR, out.toString() ); } @@ -116,8 +116,8 @@ public class HttpPrintStreamTest { httpOut.flush(); assertEquals( - "HTTP/1.0 200 OK" + System.lineSeparator() + - System.lineSeparator(), + "HTTP/1.0 200 OK" + HttpPrintStream.LINE_SEPARATOR + + HttpPrintStream.LINE_SEPARATOR, out.toString() ); } @@ -131,8 +131,8 @@ public class HttpPrintStreamTest { httpOut.flush(); assertEquals( - "HTTP/1.0 400 Bad Request" + System.lineSeparator() + - System.lineSeparator(), + "HTTP/1.0 400 Bad Request" + HttpPrintStream.LINE_SEPARATOR + + HttpPrintStream.LINE_SEPARATOR, out.toString() ); } @@ -146,9 +146,9 @@ public class HttpPrintStreamTest { httpOut.flush(); assertEquals( - "HTTP/1.0 200 OK" + System.lineSeparator() + - "Set-Cookie: Test=value;" + System.lineSeparator() + - System.lineSeparator(), + "HTTP/1.0 200 OK" + HttpPrintStream.LINE_SEPARATOR + + "Set-Cookie: Test=value;" + HttpPrintStream.LINE_SEPARATOR + + HttpPrintStream.LINE_SEPARATOR, out.toString() ); } @@ -163,10 +163,10 @@ public class HttpPrintStreamTest { httpOut.flush(); assertEquals( - "HTTP/1.0 200 OK" + System.lineSeparator() + - "Set-Cookie: Test1=value1;" + System.lineSeparator() + - "Set-Cookie: Test2=value2;" + System.lineSeparator() + - System.lineSeparator(), + "HTTP/1.0 200 OK" + HttpPrintStream.LINE_SEPARATOR + + "Set-Cookie: Test1=value1;" + HttpPrintStream.LINE_SEPARATOR + + "Set-Cookie: Test2=value2;" + HttpPrintStream.LINE_SEPARATOR + + HttpPrintStream.LINE_SEPARATOR, out.toString() ); } @@ -182,10 +182,10 @@ public class HttpPrintStreamTest { httpOut.flush(); assertEquals( - "HTTP/1.0 200 OK" + System.lineSeparator() + - "Test1: value1" + System.lineSeparator() + - "Test2: value2" + System.lineSeparator() + - System.lineSeparator(), + "HTTP/1.0 200 OK" + HttpPrintStream.LINE_SEPARATOR + + "Test1: value1" + HttpPrintStream.LINE_SEPARATOR + + "Test2: value2" + HttpPrintStream.LINE_SEPARATOR + + HttpPrintStream.LINE_SEPARATOR, out.toString() ); }