Don't send GOAWAY when it is received from peer. Fixed want_read, want_write.
This commit is contained in:
parent
ebd3dc9dcc
commit
e212eea08a
|
@ -859,18 +859,8 @@ int spdylay_session_on_ping_received(spdylay_session *session,
|
|||
int spdylay_session_on_goaway_received(spdylay_session *session,
|
||||
spdylay_frame *frame)
|
||||
{
|
||||
int r;
|
||||
session->last_good_stream_id = frame->goaway.last_good_stream_id;
|
||||
session->goaway_flags |= SPDYLAY_GOAWAY_RECV;
|
||||
if(!(session->goaway_flags & SPDYLAY_GOAWAY_SEND)) {
|
||||
/* TODO The spec does not mandate to send back GOAWAY. I think the
|
||||
remote endpoint does not expect this, but sending GOAWAY does
|
||||
not harm. */
|
||||
r = spdylay_session_add_goaway(session, session->last_recv_stream_id);
|
||||
if(r != 0) {
|
||||
return r;
|
||||
}
|
||||
}
|
||||
spdylay_session_call_on_ctrl_frame_received(session, SPDYLAY_GOAWAY, frame);
|
||||
return 0;
|
||||
}
|
||||
|
@ -1152,19 +1142,23 @@ int spdylay_session_recv(spdylay_session *session)
|
|||
|
||||
int spdylay_session_want_read(spdylay_session *session)
|
||||
{
|
||||
/* If GOAWAY is not sent or received, we always want to read
|
||||
/* Unless GOAWAY is sent or received, we always want to read
|
||||
incoming frames. After GOAWAY is sent or received, we are only
|
||||
interested in existing streams. */
|
||||
return !(session->goaway_flags & SPDYLAY_GOAWAY_SEND) ||
|
||||
spdylay_map_size(&session->streams) == 0;
|
||||
interested in active streams. */
|
||||
return !session->goaway_flags || spdylay_map_size(&session->streams) > 0;
|
||||
}
|
||||
|
||||
int spdylay_session_want_write(spdylay_session *session)
|
||||
{
|
||||
uint8_t goaway_sent = session->goaway_flags & SPDYLAY_GOAWAY_SEND;
|
||||
return (!goaway_sent &&
|
||||
(session->aob.item != NULL || !spdylay_pq_empty(&session->ob_pq))) ||
|
||||
(goaway_sent && spdylay_map_size(&session->streams) == 0);
|
||||
/*
|
||||
* Unless GOAWAY is sent or received, we want to write frames if
|
||||
* there is pending ones. After GOAWAY is sent or received, we want
|
||||
* to write frames if there is pending ones AND there are active
|
||||
* frames.
|
||||
*/
|
||||
return (session->aob.item != NULL || !spdylay_pq_empty(&session->ob_pq)) &&
|
||||
(!session->goaway_flags ||
|
||||
spdylay_map_size(&session->streams) > 0);
|
||||
}
|
||||
|
||||
int spdylay_session_add_ping(spdylay_session *session, uint32_t unique_id)
|
||||
|
|
|
@ -606,10 +606,6 @@ void test_spdylay_session_on_goaway_received()
|
|||
CU_ASSERT(1 == user_data.valid);
|
||||
CU_ASSERT(session->goaway_flags == SPDYLAY_GOAWAY_RECV);
|
||||
|
||||
top = spdylay_session_get_ob_pq_top(session);
|
||||
CU_ASSERT(SPDYLAY_GOAWAY == top->frame_type);
|
||||
CU_ASSERT(0 == top->frame->goaway.last_good_stream_id);
|
||||
|
||||
spdylay_frame_goaway_free(&frame.goaway);
|
||||
spdylay_session_del(session);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue