diff --git a/src/core/ext/transport/chttp2/transport/parsing.c b/src/core/ext/transport/chttp2/transport/parsing.c
index e1fc0ddee200ec85d1f0b3607ab3320ebeec9b7c..6e86431b1c9ea6c7616e9933fcaced100747472a 100644
--- a/src/core/ext/transport/chttp2/transport/parsing.c
+++ b/src/core/ext/transport/chttp2/transport/parsing.c
@@ -253,8 +253,16 @@ void grpc_chttp2_publish_reads(
     }
 
     if (stream_parsing->received_close) {
-      grpc_chttp2_mark_stream_closed(exec_ctx, transport_global, stream_global,
-                                     1, 0, GRPC_ERROR_NONE);
+      if (transport_global->is_client && !stream_global->write_closed) {
+        gpr_slice_buffer_add(&transport_global->qbuf,
+                             grpc_chttp2_rst_stream_create(transport_parsing->incoming_stream_id, GRPC_CHTTP2_NO_ERROR, &stream_parsing->stats.outgoing));
+        grpc_chttp2_initiate_write(exec_ctx, transport_global, false, "rst");
+        grpc_chttp2_mark_stream_closed(exec_ctx, transport_global, stream_global,
+                                       1, 1, GRPC_ERROR_NONE);
+      } else {
+        grpc_chttp2_mark_stream_closed(exec_ctx, transport_global, stream_global,
+                                       1, 0, GRPC_ERROR_NONE);
+      }
     }
   }
 }