static apr_status_t make_h2_headers(h2_from_h1 *from_h1, request_rec *r) { from_h1->response = h2_response_create(from_h1->stream_id, APR_SUCCESS, from_h1->status, from_h1->hlines, from_h1->pool); if (from_h1->response == NULL) { ap_log_cerror(APLOG_MARK, APLOG_ERR, APR_EINVAL, r->connection, "h2_from_h1(%d): unable to create resp_head", from_h1->stream_id); return APR_EINVAL; } from_h1->content_length = from_h1->response->content_length; from_h1->chunked = r->chunked; ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0, r->connection, "h2_from_h1(%d): converted headers, content-length: %d" ", chunked=%d", from_h1->stream_id, (int)from_h1->content_length, (int)from_h1->chunked); set_state(from_h1, ((from_h1->chunked || from_h1->content_length > 0)? H2_RESP_ST_BODY : H2_RESP_ST_DONE)); /* We are ready to be sent to the client */ return APR_SUCCESS; }
apr_status_t h2_mplx_out_close(h2_mplx *m, int stream_id) { apr_status_t status; AP_DEBUG_ASSERT(m); if (m->aborted) { return APR_ECONNABORTED; } status = apr_thread_mutex_lock(m->lock); if (APR_SUCCESS == status) { if (!m->aborted) { h2_io *io = h2_io_set_get(m->stream_ios, stream_id); if (io) { if (!io->response->ngheader) { /* In case a close comes before a response was created, * insert an error one so that our streams can properly * reset. */ h2_response *r = h2_response_create(stream_id, "500", NULL, m->pool); status = out_open(m, stream_id, r, NULL, NULL, NULL); } status = h2_io_out_close(io); have_out_data_for(m, stream_id); if (m->aborted) { /* if we were the last output, the whole session might * have gone down in the meantime. */ return APR_SUCCESS; } } else { status = APR_ECONNABORTED; } } apr_thread_mutex_unlock(m->lock); } return status; }