static void stream_reply(uint_fast32_t id, bool nodata) { struct vlc_http_msg *m = vlc_http_resp_create(200); assert(m != NULL); vlc_http_msg_add_agent(m, "VLC-h2-tester"); conn_send(vlc_http_msg_h2_frame(m, id, nodata)); vlc_http_msg_destroy(m); }
/** * Creates a stream. * * Allocates a locally-initiated stream identifier on an HTTP/2 connection and * queue stream headers for sending. * * Headers are sent asynchronously. To obtain the result and answer from the * other end, use vlc_http_stream_recv_headers(). * * \param msg HTTP message headers (including response status or request) * \return an HTTP stream, or NULL on error */ struct vlc_http_stream *vlc_h2_stream_open(struct vlc_h2_conn *conn, const struct vlc_http_msg *msg) { struct vlc_h2_stream *s = malloc(sizeof (*s)); if (unlikely(s == NULL)) return NULL; s->stream.cbs = &vlc_h2_stream_callbacks; s->conn = conn; s->newer = NULL; s->recv_end = false; s->recv_hdr = NULL; s->recv_cwnd = VLC_H2_INIT_WINDOW; s->recv_head = NULL; s->recv_tailp = &s->recv_head; vlc_cond_init(&s->recv_wait); vlc_mutex_lock(&conn->lock); assert(!conn->released); /* Caller is buggy! */ if (conn->next_id > 0x7ffffff) { /* Out of stream identifiers */ msg_Dbg(CO(conn), "no more stream identifiers"); goto error; } s->id = conn->next_id; conn->next_id += 2; struct vlc_h2_frame *f = vlc_http_msg_h2_frame(msg, s->id, true); if (f == NULL) goto error; vlc_h2_output_send(conn->out, f); s->older = conn->streams; if (s->older != NULL) s->older->newer = s; conn->streams = s; vlc_mutex_unlock(&conn->lock); return &s->stream; error: vlc_mutex_unlock(&conn->lock); vlc_cond_destroy(&s->recv_wait); free(s); return NULL; }