From acbda6c3e7ccc473b7c3fcc493a360feba3dee10 Mon Sep 17 00:00:00 2001 From: Nitue Date: Sat, 5 Apr 2025 00:37:23 +0300 Subject: [PATCH] RFC7230 compliant HTTP header delimiter Changes HTTP header endings from LF to CRLF. RFC7230 states that headers are separated by CRLF. Brouter currently uses only LF. Most recipients probably accept LF only, but some are strict about this. --- .../main/java/btools/server/RouteServer.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/brouter-server/src/main/java/btools/server/RouteServer.java b/brouter-server/src/main/java/btools/server/RouteServer.java index 4b2be7a..2def82b 100644 --- a/brouter-server/src/main/java/btools/server/RouteServer.java +++ b/brouter-server/src/main/java/btools/server/RouteServer.java @@ -160,8 +160,8 @@ public class RouteServer extends Thread implements Comparable { } else if (url.startsWith(PROFILE_UPLOAD_URL)) { if (getline.startsWith("OPTIONS")) { // handle CORS preflight request (Safari) - String corsHeaders = "Access-Control-Allow-Methods: GET, POST\n" - + "Access-Control-Allow-Headers: Content-Type\n"; + String corsHeaders = "Access-Control-Allow-Methods: GET, POST\r\n" + + "Access-Control-Allow-Headers: Content-Type\r\n"; writeHttpHeader(bw, "text/plain", null, corsHeaders, HTTP_STATUS_OK); bw.flush(); return; @@ -220,7 +220,7 @@ public class RouteServer extends Thread implements Comparable { // no zip for this engineMode encodings = null; } - String headers = encodings == null || encodings.indexOf("gzip") < 0 ? null : "Content-Encoding: gzip\n"; + String headers = encodings == null || encodings.indexOf("gzip") < 0 ? null : "Content-Encoding: gzip\r\n"; writeHttpHeader(bw, handler.getMimeType(), handler.getFileName(), headers, HTTP_STATUS_OK); if (engineMode == RoutingEngine.BROUTER_ENGINEMODE_ROUTING || engineMode == RoutingEngine.BROUTER_ENGINEMODE_ROUNDTRIP) { @@ -407,17 +407,17 @@ public class RouteServer extends Thread implements Comparable { private static void writeHttpHeader(BufferedWriter bw, String mimeType, String fileName, String headers, String status) throws IOException { // http-header - bw.write(String.format("HTTP/1.1 %s\n", status)); - bw.write("Connection: close\n"); - bw.write("Content-Type: " + mimeType + "; charset=utf-8\n"); + bw.write(String.format("HTTP/1.1 %s\r\n", status)); + bw.write("Connection: close\r\n"); + bw.write("Content-Type: " + mimeType + "; charset=utf-8\r\n"); if (fileName != null) { - bw.write("Content-Disposition: attachment; filename=\"" + fileName + "\"\n"); + bw.write("Content-Disposition: attachment; filename=\"" + fileName + "\"\r\n"); } - bw.write("Access-Control-Allow-Origin: *\n"); + bw.write("Access-Control-Allow-Origin: *\r\n"); if (headers != null) { bw.write(headers); } - bw.write("\n"); + bw.write("\r\n"); } private static void cleanupThreadQueue(Queue threadQueue) {