Don't send DATA frame if RST_STREAM was queued for this stream.
This commit is contained in:
parent
fd06d21638
commit
f71572b835
|
@ -437,7 +437,16 @@ static int spdylay_session_is_data_allowed(spdylay_session *session,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if(spdylay_session_is_my_stream_id(session, stream_id)) {
|
if(spdylay_session_is_my_stream_id(session, stream_id)) {
|
||||||
return (stream->shut_flags & SPDYLAY_SHUT_WR) == 0;
|
/* If stream->state is SPDYLAY_STREAM_CLOSING, RST_STREAM was
|
||||||
|
queued but not yet sent. In this case, we won't send DATA
|
||||||
|
frames. This is because in the current architecture, DATA and
|
||||||
|
RST_STREAM in the same stream have same priority and DATA is
|
||||||
|
small seq number. So RST_STREAM will not be sent until all DATA
|
||||||
|
frames are sent. This is not desirable situation; we want to
|
||||||
|
close stream as soon as possible. To achieve this, we remove
|
||||||
|
DATA frame before RST_STREAM. */
|
||||||
|
return stream->state != SPDYLAY_STREAM_CLOSING &&
|
||||||
|
(stream->shut_flags & SPDYLAY_SHUT_WR) == 0;
|
||||||
} else {
|
} else {
|
||||||
return stream->state == SPDYLAY_STREAM_OPENED &&
|
return stream->state == SPDYLAY_STREAM_OPENED &&
|
||||||
(stream->shut_flags & SPDYLAY_SHUT_WR) == 0;
|
(stream->shut_flags & SPDYLAY_SHUT_WR) == 0;
|
||||||
|
@ -756,9 +765,10 @@ static int spdylay_session_after_frame_sent(spdylay_session *session)
|
||||||
};
|
};
|
||||||
if(type == SPDYLAY_DATA) {
|
if(type == SPDYLAY_DATA) {
|
||||||
int r;
|
int r;
|
||||||
/* If session is canceled by RST_STREAM, we won't send further data. */
|
/* If session is closed or RST_STREAM was queued, we won't send
|
||||||
|
further data. */
|
||||||
if((frame->data.flags & SPDYLAY_FLAG_FIN) ||
|
if((frame->data.flags & SPDYLAY_FLAG_FIN) ||
|
||||||
spdylay_session_get_stream(session, frame->data.stream_id) == NULL) {
|
!spdylay_session_is_data_allowed(session, frame->data.stream_id)) {
|
||||||
spdylay_active_outbound_item_reset(&session->aob);
|
spdylay_active_outbound_item_reset(&session->aob);
|
||||||
} else {
|
} else {
|
||||||
spdylay_outbound_item* item = spdylay_session_get_next_ob_item(session);
|
spdylay_outbound_item* item = spdylay_session_get_next_ob_item(session);
|
||||||
|
|
Loading…
Reference in New Issue