Skip to content

Commit a3f6bda

Browse files
authored
Fixed #12603 Errors logged after cross context dispatch
Fixed #12603 Errors logged after cross context dispatch: + Update bytes written in HttpOutput when bypassed by optimization + abort if error dispatch throws
1 parent d650efe commit a3f6bda

File tree

5 files changed

+28
-12
lines changed

5 files changed

+28
-12
lines changed

jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/HttpOutput.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,15 @@ public long getWritten()
176176
return _written;
177177
}
178178

179+
/**
180+
* Used by ServletCoreResponse when it bypasses HttpOutput to update bytes written.
181+
* @param written The bytes written
182+
*/
183+
void addBytesWritten(int written)
184+
{
185+
_written += written;
186+
}
187+
179188
public void reopen()
180189
{
181190
try (AutoLock l = _channelState.lock())

jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/ServletCoreResponse.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ public void write(boolean last, ByteBuffer byteBuffer, Callback callback)
138138
{
139139
if (!_wrapped && !_servletContextResponse.isWritingOrStreaming())
140140
{
141+
// We can bypass the HttpOutput stream, but we need to update its bytes written
142+
_servletContextResponse.getHttpOutput().addBytesWritten(byteBuffer.remaining());
141143
_servletContextResponse.write(last, byteBuffer, callback);
142144
}
143145
else

jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/HttpChannel.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@
5656
import org.eclipse.jetty.server.Server;
5757
import org.eclipse.jetty.util.BufferUtil;
5858
import org.eclipse.jetty.util.Callback;
59-
import org.eclipse.jetty.util.ExceptionUtil;
6059
import org.eclipse.jetty.util.HostPort;
6160
import org.eclipse.jetty.util.IO;
6261
import org.eclipse.jetty.util.SharedBlockingCallback.Blocker;
@@ -561,16 +560,7 @@ public boolean handle()
561560
{
562561
if (LOG.isDebugEnabled())
563562
LOG.debug("Could not perform ERROR dispatch, aborting", x);
564-
try
565-
{
566-
_response.resetContent();
567-
sendResponseAndComplete();
568-
}
569-
catch (Throwable t)
570-
{
571-
ExceptionUtil.addSuppressedIfNotAssociated(x, t);
572-
throw x;
573-
}
563+
abort(x);
574564
}
575565
finally
576566
{

jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/HttpOutput.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,15 @@ public long getWritten()
241241
return _written;
242242
}
243243

244+
/**
245+
* Used by ServletCoreResponse when it bypasses HttpOutput to update bytes written.
246+
* @param written The bytes written
247+
*/
248+
void addBytesWritten(int written)
249+
{
250+
_written += written;
251+
}
252+
244253
public void reopen()
245254
{
246255
try (AutoLock l = _channelState.lock())

jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/ServletCoreResponse.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,13 @@ public void write(boolean last, ByteBuffer byteBuffer, Callback callback)
139139
{
140140
if (!_wrapped && !_baseResponse.isWritingOrStreaming())
141141
{
142+
// We can bypass the HttpOutput stream, but we need to update its bytes written
143+
_baseResponse.getHttpOutput().addBytesWritten(byteBuffer.remaining());
142144
_coreResponse.write(last, byteBuffer, callback);
143145
}
144146
else
145147
{
148+
// Write the byteBuffer via the HttpOutput stream or writer wrapping the stream
146149
if (BufferUtil.hasContent(byteBuffer))
147150
{
148151
if (isWriting())
@@ -333,7 +336,10 @@ public Mutable add(HttpHeader header, String value)
333336
@Override
334337
public Mutable add(HttpField field)
335338
{
336-
_response.addHeader(field.getName(), field.getValue());
339+
if (field.getHeader() == HttpHeader.CONTENT_LENGTH)
340+
_response.setContentLengthLong(field.getLongValue());
341+
else
342+
_response.addHeader(field.getName(), field.getValue());
337343
return this;
338344
}
339345

0 commit comments

Comments
 (0)