Skip to content

Commit 770c8ad

Browse files
authored
Fix StreamObserver object calls onCompleted() without first calling onNext() will fail. (#15466)
1 parent a225968 commit 770c8ad

3 files changed

Lines changed: 24 additions & 0 deletions

File tree

dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/AbstractServerHttpChannelObserver.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,9 @@ protected void customizeHeaders(HttpHeaders headers, Throwable throwable, HttpOu
188188
}
189189

190190
protected final void sendMetadata(HttpMetadata metadata) {
191+
if (headerSent) {
192+
return;
193+
}
191194
getHttpChannel().writeHeader(metadata);
192195
headerSent = true;
193196
if (LOGGER.isDebugEnabled()) {
@@ -327,6 +330,10 @@ protected String getContentType() {
327330
return responseEncoder.contentType();
328331
}
329332

333+
protected boolean isHeaderSent() {
334+
return headerSent;
335+
}
336+
330337
protected void customizeTrailers(HttpHeaders headers, Throwable throwable) {
331338
List<BiConsumer<HttpHeaders, Throwable>> trailersCustomizers = this.trailersCustomizers;
332339
if (trailersCustomizers != null) {

dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/h12/http1/Http1SseServerChannelObserver.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,14 @@ public void setResponseEncoder(HttpMessageEncoder responseEncoder) {
3535
super.setResponseEncoder(new ServerSentEventEncoder(responseEncoder));
3636
}
3737

38+
@Override
39+
protected void doOnCompleted(Throwable throwable) {
40+
if (!isHeaderSent()) {
41+
sendMetadata(encodeHttpMetadata(true));
42+
}
43+
super.doOnCompleted(throwable);
44+
}
45+
3846
@Override
3947
protected HttpMetadata encodeHttpMetadata(boolean endStream) {
4048
return super.encodeHttpMetadata(endStream)

dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/h12/http2/Http2SseServerChannelObserver.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,13 @@ protected HttpMetadata encodeHttpMetadata(boolean endStream) {
4040
return super.encodeHttpMetadata(endStream)
4141
.header(HttpHeaderNames.CACHE_CONTROL.getKey(), HttpConstants.NO_CACHE);
4242
}
43+
44+
@Override
45+
protected void doOnCompleted(Throwable throwable) {
46+
// if throwable is not null, the header will be flushed by super.doOnCompleted(throwable)
47+
if (!isHeaderSent() && throwable == null) {
48+
sendMetadata(encodeHttpMetadata(true));
49+
}
50+
super.doOnCompleted(throwable);
51+
}
4352
}

0 commit comments

Comments
 (0)