Added spdylay_on_stream_close_callback
This commit is contained in:
parent
bf1be4850e
commit
6e12291ae1
|
@ -78,6 +78,7 @@ typedef enum {
|
|||
} spdylay_flag;
|
||||
|
||||
typedef enum {
|
||||
SPDYLAY_OK = 0,
|
||||
SPDYLAY_PROTOCOL_ERROR = 1,
|
||||
SPDYLAY_INVALID_STREAM = 2,
|
||||
SPDYLAY_REFUSED_STREAM = 3,
|
||||
|
@ -256,6 +257,14 @@ typedef void (*spdylay_before_ctrl_send_callback)
|
|||
(spdylay_session *session, spdylay_frame_type type, spdylay_frame *frame,
|
||||
void *user_data);
|
||||
|
||||
/*
|
||||
* Callback function invoked when stream |stream_id| is closed. The
|
||||
* reason of closure is indicated by |status_code|.
|
||||
*/
|
||||
typedef void (*spdylay_on_stream_close_callback)
|
||||
(spdylay_session *session, int32_t stream_id, spdylay_status_code status_code,
|
||||
void *user_data);
|
||||
|
||||
typedef struct {
|
||||
spdylay_send_callback send_callback;
|
||||
spdylay_recv_callback recv_callback;
|
||||
|
@ -267,6 +276,7 @@ typedef struct {
|
|||
spdylay_before_ctrl_send_callback before_ctrl_send_callback;
|
||||
spdylay_on_ctrl_send_callback on_ctrl_send_callback;
|
||||
spdylay_on_data_send_callback on_data_send_callback;
|
||||
spdylay_on_stream_close_callback on_stream_close_callback;
|
||||
} spdylay_session_callbacks;
|
||||
|
||||
/*
|
||||
|
|
|
@ -286,11 +286,18 @@ spdylay_stream* spdylay_session_open_stream(spdylay_session *session,
|
|||
return stream;
|
||||
}
|
||||
|
||||
int spdylay_session_close_stream(spdylay_session *session, int32_t stream_id)
|
||||
int spdylay_session_close_stream(spdylay_session *session, int32_t stream_id,
|
||||
spdylay_status_code status_code)
|
||||
{
|
||||
spdylay_stream *stream = spdylay_session_get_stream(session, stream_id);
|
||||
if(stream) {
|
||||
spdylay_map_erase(&session->streams, stream_id);
|
||||
if(stream->state != SPDYLAY_STREAM_INITIAL &&
|
||||
session->callbacks.on_stream_close_callback) {
|
||||
session->callbacks.on_stream_close_callback(session, stream_id,
|
||||
status_code,
|
||||
session->user_data);
|
||||
}
|
||||
spdylay_stream_free(stream);
|
||||
free(stream);
|
||||
return 0;
|
||||
|
@ -303,7 +310,8 @@ int spdylay_session_close_stream_if_shut_rdwr(spdylay_session *session,
|
|||
spdylay_stream *stream)
|
||||
{
|
||||
if((stream->shut_flags & SPDYLAY_SHUT_RDWR) == SPDYLAY_SHUT_RDWR) {
|
||||
return spdylay_session_close_stream(session, stream->stream_id);
|
||||
return spdylay_session_close_stream(session, stream->stream_id,
|
||||
SPDYLAY_OK);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
@ -381,7 +389,7 @@ ssize_t spdylay_session_prep_frame(spdylay_session *session,
|
|||
r = spdylay_submit_data(session, stream_id, data_prd);
|
||||
if(r != 0) {
|
||||
free(framebuf);
|
||||
spdylay_session_close_stream(session, stream_id);
|
||||
spdylay_session_close_stream(session, stream_id, SPDYLAY_OK);
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
@ -506,7 +514,8 @@ static int spdylay_session_after_frame_sent(spdylay_session *session)
|
|||
break;
|
||||
}
|
||||
case SPDYLAY_RST_STREAM:
|
||||
spdylay_session_close_stream(session, frame->rst_stream.stream_id);
|
||||
spdylay_session_close_stream(session, frame->rst_stream.stream_id,
|
||||
frame->rst_stream.status_code);
|
||||
break;
|
||||
case SPDYLAY_NOOP:
|
||||
/* We don't have any public API to add NOOP, so here is
|
||||
|
@ -835,7 +844,8 @@ int spdylay_session_on_syn_reply_received(spdylay_session *session,
|
|||
int spdylay_session_on_rst_stream_received(spdylay_session *session,
|
||||
spdylay_frame *frame)
|
||||
{
|
||||
spdylay_session_close_stream(session, frame->rst_stream.stream_id);
|
||||
spdylay_session_close_stream(session, frame->rst_stream.stream_id,
|
||||
frame->rst_stream.status_code);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -159,12 +159,14 @@ spdylay_stream* spdylay_session_open_stream(spdylay_session *session,
|
|||
spdylay_stream_state initial_state);
|
||||
|
||||
/*
|
||||
* Closes stream whose stream ID is |stream_id|. This function returns
|
||||
* 0 if it succeeds, or negative error code. The possible error code
|
||||
* is SPDYLAY_ERR_INVALID_ARGUMENT, which is used when stream
|
||||
* |stream_id| does not exist. So the caller may ignore this error.
|
||||
* Closes stream whose stream ID is |stream_id|. The reason of closure
|
||||
* is indicated by |status_code|. This function returns 0 if it
|
||||
* succeeds, or negative error code. The possible error code is
|
||||
* SPDYLAY_ERR_INVALID_ARGUMENT, which is used when stream |stream_id|
|
||||
* does not exist. So the caller may ignore this error.
|
||||
*/
|
||||
int spdylay_session_close_stream(spdylay_session *session, int32_t stream_id);
|
||||
int spdylay_session_close_stream(spdylay_session *session, int32_t stream_id,
|
||||
spdylay_status_code status_code);
|
||||
|
||||
/*
|
||||
* If further receptions and transmissions over this stream are
|
||||
|
|
Loading…
Reference in New Issue