static int submit_response(h2_session *session, h2_response *response) { nghttp2_data_provider provider; int rv; memset(&provider, 0, sizeof(provider)); provider.source.fd = response->stream_id; provider.read_callback = stream_data_cb; ap_log_cerror(APLOG_MARK, APLOG_TRACE1, 0, session->c, "h2_stream(%ld-%d): submitting response %s", session->id, response->stream_id, response->status); rv = nghttp2_submit_response(session->ngh2, response->stream_id, response->ngheader->nv, response->ngheader->nvlen, &provider); if (rv != 0) { ap_log_cerror(APLOG_MARK, APLOG_ERR, 0, session->c, APLOGNO(02939) "h2_stream(%ld-%d): submit_response: %s", session->id, response->stream_id, nghttp2_strerror(rv)); } else { ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0, session->c, "h2_stream(%ld-%d): submitted response %s, rv=%d", session->id, response->stream_id, response->status, rv); } return rv; }
static int send_response(nghttp2_session *session, int32_t stream_id, nghttp2_nv *nva, size_t nvlen, int fd) { int rv; nghttp2_data_provider data_prd; data_prd.source.fd = fd; data_prd.read_callback = file_read_callback; rv = nghttp2_submit_response(session, stream_id, nva, nvlen, &data_prd); if (rv != 0) { warnx("Fatal error: %s", nghttp2_strerror(rv)); return -1; } return 0; }
/* Start submitting the response to a stream request. This is possible * once we have all the response headers. The response body will be * read by the session using the callback we supply. */ apr_status_t h2_session_handle_response(h2_session *session, h2_stream *stream, h2_response *head) { assert(session); apr_status_t status = APR_SUCCESS; int rv = 0; if (head->http_status) { ap_log_cerror(APLOG_MARK, APLOG_TRACE1, 0, session->c, "h2_stream(%ld-%d): submitting response %s with %d headers", session->id, stream->id, head->http_status, (int)head->nvlen); assert(head->nvlen); nghttp2_data_provider provider = { stream->id, stream_data_cb }; rv = nghttp2_submit_response(session->ngh2, stream->id, &head->nv, head->nvlen, &provider); if (rv != 0) { ap_log_cerror(APLOG_MARK, APLOG_ERR, status, session->c, "h2_stream(%ld-%d): submit_response: %s", session->id, stream->id, nghttp2_strerror(rv)); } else { ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0, session->c, "h2_stream(%ld-%d): submitted response %s with %d " "headers, rv=%d", session->id, stream->id, head->http_status, (int)head->nvlen, rv); } } else { rv = nghttp2_submit_rst_stream(session->ngh2, 0, stream->id, NGHTTP2_ERR_INVALID_STATE); } if (nghttp2_is_fatal(rv)) { status = APR_EGENERAL; h2_session_abort_int(session, rv); ap_log_cerror(APLOG_MARK, APLOG_ERR, status, session->c, "submit_response: %s", nghttp2_strerror(rv)); } return status; }