diff --git a/lib/includes/nghttp2/nghttp2.h b/lib/includes/nghttp2/nghttp2.h index 50c40e11..0199796e 100644 --- a/lib/includes/nghttp2/nghttp2.h +++ b/lib/includes/nghttp2/nghttp2.h @@ -893,8 +893,13 @@ typedef int (*nghttp2_on_frame_not_send_callback) * @functypedef * * Callback function invoked after DATA frame is sent. + * + * The implementation of this function must return 0 if it + * succeeds. If nonzero is returned, it is treated as fatal error and + * `nghttp2_session_recv()` and `nghttp2_session_send()` functions + * immediately return :enum:`NGHTTP2_ERR_CALLBACK_FAILURE`. */ -typedef void (*nghttp2_on_data_send_callback) +typedef int (*nghttp2_on_data_send_callback) (nghttp2_session *session, uint16_t length, uint8_t flags, int32_t stream_id, void *user_data); diff --git a/lib/nghttp2_session.c b/lib/nghttp2_session.c index 5ade5e8a..d9e9233a 100644 --- a/lib/nghttp2_session.c +++ b/lib/nghttp2_session.c @@ -1355,13 +1355,15 @@ static int nghttp2_session_after_frame_sent(nghttp2_session *session) nghttp2_data *data_frame; data_frame = nghttp2_outbound_item_get_data_frame(session->aob.item); if(session->callbacks.on_data_send_callback) { - session->callbacks.on_data_send_callback - (session, - session->aob.framebuflen - NGHTTP2_FRAME_HEAD_LENGTH, - data_frame->eof ? data_frame->hd.flags : - (data_frame->hd.flags & (~NGHTTP2_FLAG_END_STREAM)), - data_frame->hd.stream_id, - session->user_data); + if(session->callbacks.on_data_send_callback + (session, + session->aob.framebuflen - NGHTTP2_FRAME_HEAD_LENGTH, + data_frame->eof ? data_frame->hd.flags : + (data_frame->hd.flags & (~NGHTTP2_FLAG_END_STREAM)), + data_frame->hd.stream_id, + session->user_data) != 0) { + return NGHTTP2_ERR_CALLBACK_FAILURE; + } } if(data_frame->eof && (data_frame->hd.flags & NGHTTP2_FLAG_END_STREAM)) { nghttp2_stream *stream = diff --git a/src/HttpServer.cc b/src/HttpServer.cc index fa4f558f..1338c3c4 100644 --- a/src/HttpServer.cc +++ b/src/HttpServer.cc @@ -778,7 +778,7 @@ int hd_on_data_recv_callback } // namespace namespace { -void hd_on_data_send_callback +int hd_on_data_send_callback (nghttp2_session *session, uint16_t length, uint8_t flags, int32_t stream_id, void *user_data) { @@ -787,6 +787,7 @@ void hd_on_data_send_callback print_session_id(hd->session_id()); on_data_send_callback(session, length, flags, stream_id, user_data); } + return 0; } } // namespace diff --git a/src/app_helper.cc b/src/app_helper.cc index 20ca5a76..9429b3e0 100644 --- a/src/app_helper.cc +++ b/src/app_helper.cc @@ -425,7 +425,7 @@ int on_data_recv_callback return 0; } -void on_data_send_callback +int on_data_send_callback (nghttp2_session *session, uint16_t length, uint8_t flags, int32_t stream_id, void *user_data) { @@ -433,6 +433,7 @@ void on_data_send_callback printf(" send "); print_data_frame(PRINT_SEND, length, flags, stream_id); fflush(stdout); + return 0; } int64_t time_delta(const timeval& a, const timeval& b) diff --git a/src/app_helper.h b/src/app_helper.h index 43c2575a..224634df 100644 --- a/src/app_helper.h +++ b/src/app_helper.h @@ -68,7 +68,7 @@ int on_data_recv_callback (nghttp2_session *session, uint16_t length, uint8_t flags, int32_t stream_id, void *user_data); -void on_data_send_callback +int on_data_send_callback (nghttp2_session *session, uint16_t length, uint8_t flags, int32_t stream_id, void *user_data);