Refactor a bit

This commit is contained in:
Tatsuhiro Tsujikawa 2014-01-27 23:28:45 +09:00
parent a3193bee69
commit 7f5a87395e
3 changed files with 39 additions and 19 deletions

View File

@ -181,6 +181,16 @@ void nghttp2_frame_window_update_init(nghttp2_window_update *frame,
void nghttp2_frame_window_update_free(nghttp2_window_update *frame) void nghttp2_frame_window_update_free(nghttp2_window_update *frame)
{} {}
void nghttp2_frame_data_init(nghttp2_data *frame, nghttp2_private_data *pdata)
{
frame->hd = pdata->hd;
/* flags may have NGHTTP2_FLAG_END_STREAM even if the sent chunk
is not the end of the stream */
if(!pdata->eof) {
frame->hd.flags &= ~NGHTTP2_FLAG_END_STREAM;
}
}
void nghttp2_frame_private_data_init(nghttp2_private_data *frame, void nghttp2_frame_private_data_init(nghttp2_private_data *frame,
uint8_t flags, uint8_t flags,
int32_t stream_id, int32_t stream_id,

View File

@ -416,6 +416,8 @@ void nghttp2_frame_window_update_init(nghttp2_window_update *frame,
void nghttp2_frame_window_update_free(nghttp2_window_update *frame); void nghttp2_frame_window_update_free(nghttp2_window_update *frame);
void nghttp2_frame_data_init(nghttp2_data *frame, nghttp2_private_data *pdata);
void nghttp2_frame_private_data_init(nghttp2_private_data *frame, void nghttp2_frame_private_data_init(nghttp2_private_data *frame,
uint8_t flags, uint8_t flags,
int32_t stream_id, int32_t stream_id,

View File

@ -1387,6 +1387,25 @@ nghttp2_outbound_item* nghttp2_session_pop_next_ob_item
} }
} }
static int session_call_before_frame_send(nghttp2_session *session,
nghttp2_frame *frame)
{
int rv;
if(session->callbacks.before_frame_send_callback) {
/* Adjust frame length to deal with CONTINUATION frame */
size_t origlen = frame->hd.length;
frame->hd.length =
session->aob.framebuflen - NGHTTP2_FRAME_HEAD_LENGTH;
rv = session->callbacks.before_frame_send_callback(session, frame,
session->user_data);
frame->hd.length = origlen;
if(rv != 0) {
return NGHTTP2_ERR_CALLBACK_FAILURE;
}
}
return 0;
}
static int session_call_on_frame_send(nghttp2_session *session, static int session_call_on_frame_send(nghttp2_session *session,
nghttp2_frame *frame) nghttp2_frame *frame)
{ {
@ -1584,12 +1603,8 @@ static int nghttp2_session_after_frame_sent(nghttp2_session *session)
data_frame = nghttp2_outbound_item_get_data_frame(session->aob.item); data_frame = nghttp2_outbound_item_get_data_frame(session->aob.item);
if(session->callbacks.on_frame_send_callback) { if(session->callbacks.on_frame_send_callback) {
nghttp2_frame public_data_frame = { data_frame->hd }; nghttp2_frame public_data_frame;
/* flags may have NGHTTP2_FLAG_END_STREAM even if the sent chunk nghttp2_frame_data_init(&public_data_frame.data, data_frame);
is not the end of the stream */
if(!data_frame->eof) {
public_data_frame.hd.flags &= ~NGHTTP2_FLAG_END_STREAM;
}
rv = session_call_on_frame_send(session, &public_data_frame); rv = session_call_on_frame_send(session, &public_data_frame);
if(nghttp2_is_fatal(rv)) { if(nghttp2_is_fatal(rv)) {
return rv; return rv;
@ -1737,22 +1752,15 @@ int nghttp2_session_send(nghttp2_session *session)
nghttp2_frame *frame = nghttp2_outbound_item_get_ctrl_frame(item); nghttp2_frame *frame = nghttp2_outbound_item_get_ctrl_frame(item);
session->aob.framebufmark = session->aob.framebufmark =
frame->hd.length + NGHTTP2_FRAME_HEAD_LENGTH; frame->hd.length + NGHTTP2_FRAME_HEAD_LENGTH;
/* Call before_send callback */ r = session_call_before_frame_send(session, frame);
if(session->callbacks.before_frame_send_callback) { if(nghttp2_is_fatal(r)) {
size_t origlen = frame->hd.length; return r;
frame->hd.length =
session->aob.framebuflen - NGHTTP2_FRAME_HEAD_LENGTH;
r = session->callbacks.before_frame_send_callback
(session, frame, session->user_data);
frame->hd.length = origlen;
if(r != 0) {
return NGHTTP2_ERR_CALLBACK_FAILURE;
}
} }
} else { } else {
nghttp2_private_data *frame;
frame = nghttp2_outbound_item_get_data_frame(session->aob.item);
session->aob.framebufmark = session->aob.framebufmark =
nghttp2_outbound_item_get_data_frame frame->hd.length + NGHTTP2_FRAME_HEAD_LENGTH;
(session->aob.item)->hd.length + NGHTTP2_FRAME_HEAD_LENGTH;
} }
} }
data = session->aob.framebuf + session->aob.framebufoff; data = session->aob.framebuf + session->aob.framebufoff;