Skip to content

Commit 60aebc2

Browse files
committed
servlet: Register response trailers before stream writes
Register the trailer supplier while creating the servlet stream, before a peer reset can cause the container to commit the response. This removes the race where Jetty throws IllegalStateException from writeHeaders after receiving RST_STREAM. Fixes #12777
1 parent fc43144 commit 60aebc2

1 file changed

Lines changed: 2 additions & 1 deletion

File tree

‎servlet/src/main/java/io/grpc/servlet/ServletServerStream.java‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ final class ServletServerStream extends AbstractServerStream {
8282
this.resp = (HttpServletResponse) asyncCtx.getResponse();
8383
this.writer = new AsyncServletOutputStreamWriter(
8484
asyncCtx, transportState, logId);
85+
// Register before the peer can reset the stream and cause the container to commit the response.
86+
resp.setTrailerFields(sink.trailerSupplier);
8587
resp.getOutputStream().setWriteListener(new GrpcWriteListener());
8688
}
8789

@@ -231,7 +233,6 @@ private final class Sink implements AbstractServerStream.Sink {
231233
@Override
232234
public void writeHeaders(Metadata headers, boolean flush) {
233235
writeHeadersToServletResponse(headers);
234-
resp.setTrailerFields(trailerSupplier);
235236
try {
236237
writer.flush();
237238
} catch (IOException e) {

0 commit comments

Comments
 (0)