From 2206b3edaea03d21bac7c8c98956a72fbf2f8529 Mon Sep 17 00:00:00 2001 From: Joakim Erdfelt Date: Sat, 8 Aug 2020 07:18:02 -0500 Subject: [PATCH 1/2] Issue #3916 - Fixing broken Content-Length evaluation Signed-off-by: Joakim Erdfelt --- .../eclipse/jetty/server/ResourceService.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/ResourceService.java b/jetty-server/src/main/java/org/eclipse/jetty/server/ResourceService.java index 8a2854d05c22..779cb52b973c 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/ResourceService.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/ResourceService.java @@ -789,16 +789,17 @@ public String toString() for (InclusiveByteRange ibr : ranges) { header[i] = ibr.toHeaderRangeString(content_length); - length += - ((i > 0) ? 2 : 0) + - 2 + multi.getBoundary().length() + 2 + - (mimetype == null ? 0 : HttpHeader.CONTENT_TYPE.asString().length() + 2 + mimetype.length()) + 2 + - HttpHeader.CONTENT_RANGE.asString().length() + 2 + header[i].length() + 2 + - 2 + - (ibr.getLast() - ibr.getFirst()) + 1; + if (i > 0) // in-part + length += 2; + length += 2 + multi.getBoundary().length() + 2; // "--" boundary CR LF + if (mimetype != null) + length += HttpHeader.CONTENT_TYPE.asString().length() + 2 + mimetype.length() + 2; // "Content-Type" ": " CR LF + length += HttpHeader.CONTENT_RANGE.asString().length() + 2 + header[i].length() + 2; // "Content-Range" ": " CR LF + length += 2; // CR LF + length += ((ibr.getLast() - ibr.getFirst()) + 1); // content size i++; } - length += 2 + 2 + multi.getBoundary().length() + 2 + 2; + length += 2 + 2 + multi.getBoundary().length() + 2 + 2; // CR LF "--" boundary "--" CR LF response.setContentLength(length); try (RangeWriter rangeWriter = HttpContentRangeWriter.newRangeWriter(content)) From dcf867cd2b52d843641729d6307c1cca1d9f5c67 Mon Sep 17 00:00:00 2001 From: Joakim Erdfelt Date: Sat, 8 Aug 2020 11:34:25 -0500 Subject: [PATCH 2/2] Issue #3916 - Improve multi range response Content-Length calc Signed-off-by: Joakim Erdfelt --- .../eclipse/jetty/server/ResourceService.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/ResourceService.java b/jetty-server/src/main/java/org/eclipse/jetty/server/ResourceService.java index 779cb52b973c..94bf5462e421 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/ResourceService.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/ResourceService.java @@ -786,20 +786,24 @@ public String toString() int length = 0; String[] header = new String[ranges.size()]; int i = 0; + final int CRLF = "\r\n".length(); + final int DASHDASH = "--".length(); + final int BOUNDARY = multi.getBoundary().length(); + final int FIELD_SEP = ": ".length(); for (InclusiveByteRange ibr : ranges) { header[i] = ibr.toHeaderRangeString(content_length); if (i > 0) // in-part - length += 2; - length += 2 + multi.getBoundary().length() + 2; // "--" boundary CR LF + length += CRLF; + length += DASHDASH + BOUNDARY + CRLF; if (mimetype != null) - length += HttpHeader.CONTENT_TYPE.asString().length() + 2 + mimetype.length() + 2; // "Content-Type" ": " CR LF - length += HttpHeader.CONTENT_RANGE.asString().length() + 2 + header[i].length() + 2; // "Content-Range" ": " CR LF - length += 2; // CR LF - length += ((ibr.getLast() - ibr.getFirst()) + 1); // content size + length += HttpHeader.CONTENT_TYPE.asString().length() + FIELD_SEP + mimetype.length() + CRLF; + length += HttpHeader.CONTENT_RANGE.asString().length() + FIELD_SEP + header[i].length() + CRLF; + length += CRLF; + length += ibr.getSize(); i++; } - length += 2 + 2 + multi.getBoundary().length() + 2 + 2; // CR LF "--" boundary "--" CR LF + length += CRLF + DASHDASH + BOUNDARY + DASHDASH + CRLF; response.setContentLength(length); try (RangeWriter rangeWriter = HttpContentRangeWriter.newRangeWriter(content))