h2o_http2_stream_t *h2o_http2_stream_open(h2o_http2_conn_t *conn, uint32_t stream_id, const h2o_http2_priority_t *priority, h2o_req_t *src_req) { h2o_http2_stream_t *stream = h2o_mem_alloc(sizeof(*stream)); /* init properties (other than req) */ memset(stream, 0, offsetof(h2o_http2_stream_t, req)); stream->stream_id = stream_id; if (src_req != NULL) stream->is_half_closed = 1; stream->_ostr_final.do_send = finalostream_send; stream->_ostr_final.start_pull = finalostream_start_pull; stream->state = H2O_HTTP2_STREAM_STATE_RECV_PSUEDO_HEADERS; h2o_http2_window_init(&stream->output_window, &conn->peer_settings); h2o_http2_window_init(&stream->input_window, &H2O_HTTP2_SETTINGS_HOST); memcpy(&stream->priority, priority, sizeof(stream->priority)); h2o_buffer_init(&stream->_req_body, &h2o_socket_buffer_prototype); /* init request */ h2o_init_request(&stream->req, &conn->super, src_req); stream->req.version = 0x200; if (src_req != NULL) memset(&stream->req.upgrade, 0, sizeof(stream->req.upgrade)); stream->req._ostr_top = &stream->_ostr_final; h2o_http2_conn_register_stream(conn, stream); return stream; }
h2o_http2_stream_t *h2o_http2_stream_open(h2o_http2_conn_t *conn, uint32_t stream_id, h2o_req_t *src_req, const h2o_http2_priority_t *received_priority) { h2o_http2_stream_t *stream = h2o_mem_alloc(sizeof(*stream)); /* init properties (other than req) */ memset(stream, 0, offsetof(h2o_http2_stream_t, req)); stream->stream_id = stream_id; stream->_ostr_final.do_send = finalostream_send; stream->_ostr_final.start_pull = finalostream_start_pull; stream->state = H2O_HTTP2_STREAM_STATE_IDLE; h2o_http2_window_init(&stream->output_window, &conn->peer_settings); h2o_http2_window_init(&stream->input_window, &H2O_HTTP2_SETTINGS_HOST); stream->received_priority = *received_priority; stream->_expected_content_length = SIZE_MAX; /* init request */ h2o_init_request(&stream->req, &conn->super, src_req); stream->req.version = 0x200; if (src_req != NULL) memset(&stream->req.upgrade, 0, sizeof(stream->req.upgrade)); stream->req._ostr_top = &stream->_ostr_final; h2o_http2_conn_register_stream(conn, stream); ++conn->num_streams.priority.open; stream->_num_streams_slot = &conn->num_streams.priority; return stream; }