Lines Matching refs:stream

51   nghttp3_stream *stream = nghttp3_objalloc_stream_get(stream_objalloc);
54 if (stream == NULL) {
58 memset(stream, 0, sizeof(*stream));
60 stream->out_chunk_objalloc = out_chunk_objalloc;
61 stream->stream_objalloc = stream_objalloc;
64 &stream->node,
68 nghttp3_ringbuf_init(&stream->frq, 0, sizeof(nghttp3_frame_entry), mem);
69 nghttp3_ringbuf_init(&stream->chunks, 0, sizeof(nghttp3_buf), mem);
70 nghttp3_ringbuf_init(&stream->outq, 0, sizeof(nghttp3_typed_buf), mem);
71 nghttp3_ringbuf_init(&stream->inq, 0, sizeof(nghttp3_buf), mem);
73 nghttp3_qpack_stream_context_init(&stream->qpack_sctx, stream_id, mem);
75 stream->qpack_blocked_pe.index = NGHTTP3_PQ_BAD_INDEX;
76 stream->mem = mem;
77 stream->tx.offset = 0;
78 stream->rx.http.status_code = -1;
79 stream->rx.http.content_length = -1;
80 stream->rx.http.pri = NGHTTP3_DEFAULT_URGENCY;
81 stream->error_code = NGHTTP3_H3_NO_ERROR;
84 stream->callbacks = *callbacks;
87 *pstream = stream;
157 void nghttp3_stream_del(nghttp3_stream *stream) {
158 if (stream == NULL) {
162 nghttp3_qpack_stream_context_free(&stream->qpack_sctx);
163 delete_chunks(&stream->inq, stream->mem);
164 delete_outq(&stream->outq, stream->mem);
165 delete_out_chunks(&stream->chunks, stream->out_chunk_objalloc, stream->mem);
166 delete_frq(&stream->frq, stream->mem);
167 nghttp3_tnode_free(&stream->node);
169 nghttp3_objalloc_stream_release(stream->stream_objalloc, stream);
225 int nghttp3_stream_frq_add(nghttp3_stream *stream,
227 nghttp3_ringbuf *frq = &stream->frq;
245 int nghttp3_stream_fill_outq(nghttp3_stream *stream) {
246 nghttp3_ringbuf *frq = &stream->frq;
251 for (; nghttp3_ringbuf_len(frq) && !nghttp3_stream_outq_is_full(stream) &&
252 stream->unsent_bytes < NGHTTP3_MIN_UNSENT_BYTES;) {
257 rv = nghttp3_stream_write_settings(stream, frent);
263 rv = nghttp3_stream_write_headers(stream, frent);
267 nghttp3_frame_headers_free(&frent->fr.headers, stream->mem);
270 rv = nghttp3_stream_write_data(stream, &data_eof, frent);
274 if (stream->flags & NGHTTP3_STREAM_FLAG_READ_DATA_BLOCKED) {
282 rv = nghttp3_stream_write_goaway(stream, frent);
288 rv = nghttp3_stream_write_priority_update(stream, frent);
310 int nghttp3_stream_write_stream_type(nghttp3_stream *stream) {
311 size_t len = nghttp3_put_varint_len((int64_t)stream->type);
316 rv = nghttp3_stream_ensure_chunk(stream, len);
321 chunk = nghttp3_stream_get_chunk(stream);
324 chunk->last = nghttp3_put_varint(chunk->last, (int64_t)stream->type);
327 return nghttp3_stream_outq_add(stream, &tbuf);
330 int nghttp3_stream_write_settings(nghttp3_stream *stream,
362 rv = nghttp3_stream_ensure_chunk(stream, len);
367 chunk = nghttp3_stream_get_chunk(stream);
374 return nghttp3_stream_outq_add(stream, &tbuf);
377 int nghttp3_stream_write_goaway(nghttp3_stream *stream,
387 rv = nghttp3_stream_ensure_chunk(stream, len);
392 chunk = nghttp3_stream_get_chunk(stream);
399 return nghttp3_stream_outq_add(stream, &tbuf);
402 int nghttp3_stream_write_priority_update(nghttp3_stream *stream,
412 rv = nghttp3_stream_ensure_chunk(stream, len);
417 chunk = nghttp3_stream_get_chunk(stream);
424 return nghttp3_stream_outq_add(stream, &tbuf);
427 int nghttp3_stream_write_headers(nghttp3_stream *stream,
430 nghttp3_conn *conn = stream->conn;
435 stream, &conn->qenc, conn->tx.qenc, &conn->tx.qpack.rbuf,
439 int nghttp3_stream_write_header_block(nghttp3_stream *stream,
457 stream->node.nid.id, nva, nvlen);
475 rv = nghttp3_stream_ensure_chunk(stream, len);
480 chunk = nghttp3_stream_get_chunk(stream);
491 rv = nghttp3_stream_outq_add(stream, &tbuf);
497 rv = nghttp3_stream_outq_add(stream, &tbuf);
506 rv = nghttp3_stream_outq_add(stream, &tbuf);
554 int nghttp3_stream_write_data(nghttp3_stream *stream, int *peof,
562 nghttp3_conn *conn = stream->conn;
571 assert(!(stream->flags & NGHTTP3_STREAM_FLAG_READ_DATA_BLOCKED));
577 sveccnt = read_data(conn, stream->node.nid.id, vec, nghttp3_arraylen(vec),
578 &flags, conn->user_data, stream->user_data);
581 stream->flags |= NGHTTP3_STREAM_FLAG_READ_DATA_BLOCKED;
597 stream->flags |= NGHTTP3_STREAM_FLAG_WRITE_END_STREAM;
599 if (nghttp3_stream_outq_write_done(stream)) {
602 outq to schedule stream, so add empty tbuf to outq to
606 return nghttp3_stream_outq_add(stream, &tbuf);
624 rv = nghttp3_stream_ensure_chunk(stream, len);
629 chunk = nghttp3_stream_get_chunk(stream);
636 rv = nghttp3_stream_outq_add(stream, &tbuf);
650 rv = nghttp3_stream_outq_add(stream, &tbuf);
660 int nghttp3_stream_write_qpack_decoder_stream(nghttp3_stream *stream) {
667 assert(stream->conn);
668 assert(stream->conn->tx.qdec == stream);
670 qdec = &stream->conn->qdec;
679 rv = nghttp3_stream_ensure_chunk(stream, len);
684 chunk = nghttp3_stream_get_chunk(stream);
691 return nghttp3_stream_outq_add(stream, &tbuf);
694 int nghttp3_stream_outq_is_full(nghttp3_stream *stream) {
696 return nghttp3_ringbuf_len(&stream->outq) >= 1024;
699 int nghttp3_stream_outq_add(nghttp3_stream *stream,
701 nghttp3_ringbuf *outq = &stream->outq;
707 if (buflen > NGHTTP3_MAX_VARINT - stream->tx.offset) {
711 stream->tx.offset += buflen;
712 stream->unsent_bytes += buflen;
720 if (len == stream->outq_idx) {
721 --stream->outq_idx;
722 stream->outq_offset = nghttp3_buf_len(&dest->buf);
747 int nghttp3_stream_ensure_chunk(nghttp3_stream *stream, size_t need) {
748 nghttp3_ringbuf *chunks = &stream->chunks;
766 p = (uint8_t *)nghttp3_objalloc_chunk_len_get(stream->out_chunk_objalloc,
769 p = nghttp3_mem_malloc(stream->mem, n);
789 nghttp3_buf *nghttp3_stream_get_chunk(nghttp3_stream *stream) {
790 nghttp3_ringbuf *chunks = &stream->chunks;
798 int nghttp3_stream_is_blocked(nghttp3_stream *stream) {
799 return (stream->flags & NGHTTP3_STREAM_FLAG_FC_BLOCKED) ||
800 (stream->flags & NGHTTP3_STREAM_FLAG_SHUT_WR) ||
801 (stream->flags & NGHTTP3_STREAM_FLAG_READ_DATA_BLOCKED);
804 int nghttp3_stream_require_schedule(nghttp3_stream *stream) {
805 return (!nghttp3_stream_outq_write_done(stream) &&
806 !(stream->flags & NGHTTP3_STREAM_FLAG_FC_BLOCKED) &&
807 !(stream->flags & NGHTTP3_STREAM_FLAG_SHUT_WR)) ||
808 (nghttp3_ringbuf_len(&stream->frq) &&
809 !(stream->flags & NGHTTP3_STREAM_FLAG_READ_DATA_BLOCKED));
812 nghttp3_ssize nghttp3_stream_writev(nghttp3_stream *stream, int *pfin,
814 nghttp3_ringbuf *outq = &stream->outq;
817 uint64_t offset = stream->outq_offset;
824 for (i = stream->outq_idx; i < len; ++i) {
847 *pfin = nghttp3_ringbuf_len(&stream->frq) == 0 && i == len &&
848 (stream->flags & NGHTTP3_STREAM_FLAG_WRITE_END_STREAM);
853 int nghttp3_stream_add_outq_offset(nghttp3_stream *stream, size_t n) {
854 nghttp3_ringbuf *outq = &stream->outq;
857 uint64_t offset = stream->outq_offset + n;
861 for (i = stream->outq_idx; i < len; ++i) {
874 stream->unsent_bytes -= n;
875 stream->outq_idx = i;
876 stream->outq_offset = offset;
881 int nghttp3_stream_outq_write_done(nghttp3_stream *stream) {
882 nghttp3_ringbuf *outq = &stream->outq;
885 return len == 0 || stream->outq_idx >= len;
888 static int stream_pop_outq_entry(nghttp3_stream *stream,
890 nghttp3_ringbuf *chunks = &stream->chunks;
895 nghttp3_buf_free(&tbuf->buf, stream->mem);
909 nghttp3_objalloc_chunk_release(stream->out_chunk_objalloc,
912 nghttp3_buf_free(chunk, stream->mem);
922 nghttp3_ringbuf_pop_front(&stream->outq);
927 int nghttp3_stream_add_ack_offset(nghttp3_stream *stream, uint64_t n) {
928 nghttp3_ringbuf *outq = &stream->outq;
929 uint64_t offset = stream->ack_offset + n;
941 nack = nghttp3_min(offset, (uint64_t)buflen) - stream->ack_done;
942 if (stream->callbacks.acked_data) {
943 rv = stream->callbacks.acked_data(stream, stream->node.nid.id, nack,
944 stream->user_data);
949 stream->ack_done += nack;
953 rv = stream_pop_outq_entry(stream, tbuf);
960 stream->ack_done = 0;
962 if (stream->outq_idx + 1 == npopped) {
963 stream->outq_offset = 0;
973 assert(stream->outq_idx + 1 >= npopped);
974 if (stream->outq_idx >= npopped) {
975 stream->outq_idx -= npopped;
977 stream->outq_idx = 0;
980 stream->ack_offset = offset;
985 int nghttp3_stream_buffer_data(nghttp3_stream *stream, const uint8_t *data,
987 nghttp3_ringbuf *inq = &stream->inq;
1014 rawbuf = nghttp3_mem_malloc(stream->mem, 16384);
1031 size_t nghttp3_stream_get_buffered_datalen(nghttp3_stream *stream) {
1032 nghttp3_ringbuf *inq = &stream->inq;
1045 int nghttp3_stream_transit_rx_http_state(nghttp3_stream *stream,
1049 switch (stream->rx.hstate) {
1055 stream->rx.hstate = NGHTTP3_HTTP_STATE_REQ_HEADERS_BEGIN;
1064 stream->rx.hstate = NGHTTP3_HTTP_STATE_REQ_HEADERS_END;
1070 if (stream->rx.http.flags & NGHTTP3_HTTP_FLAG_METH_CONNECT) {
1073 stream->rx.hstate = NGHTTP3_HTTP_STATE_REQ_TRAILERS_BEGIN;
1076 stream->rx.hstate = NGHTTP3_HTTP_STATE_REQ_DATA_BEGIN;
1079 rv = nghttp3_http_on_remote_end_stream(stream);
1083 stream->rx.hstate = NGHTTP3_HTTP_STATE_REQ_END;
1092 stream->rx.hstate = NGHTTP3_HTTP_STATE_REQ_DATA_END;
1097 stream->rx.hstate = NGHTTP3_HTTP_STATE_REQ_DATA_BEGIN;
1101 if (stream->rx.http.flags & NGHTTP3_HTTP_FLAG_METH_CONNECT) {
1104 stream->rx.hstate = NGHTTP3_HTTP_STATE_REQ_TRAILERS_BEGIN;
1107 rv = nghttp3_http_on_remote_end_stream(stream);
1111 stream->rx.hstate = NGHTTP3_HTTP_STATE_REQ_END;
1120 stream->rx.hstate = NGHTTP3_HTTP_STATE_REQ_TRAILERS_END;
1128 rv = nghttp3_http_on_remote_end_stream(stream);
1132 stream->rx.hstate = NGHTTP3_HTTP_STATE_REQ_END;
1140 stream->rx.hstate = NGHTTP3_HTTP_STATE_RESP_HEADERS_BEGIN;
1146 stream->rx.hstate = NGHTTP3_HTTP_STATE_RESP_HEADERS_END;
1151 if (stream->rx.http.status_code == -1) {
1152 stream->rx.hstate = NGHTTP3_HTTP_STATE_RESP_HEADERS_BEGIN;
1155 if ((stream->rx.http.flags & NGHTTP3_HTTP_FLAG_METH_CONNECT) &&
1156 stream->rx.http.status_code / 100 == 2) {
1159 stream->rx.hstate = NGHTTP3_HTTP_STATE_RESP_TRAILERS_BEGIN;
1162 if (stream->rx.http.flags & NGHTTP3_HTTP_FLAG_EXPECT_FINAL_RESPONSE) {
1165 stream->rx.hstate = NGHTTP3_HTTP_STATE_RESP_DATA_BEGIN;
1168 rv = nghttp3_http_on_remote_end_stream(stream);
1172 stream->rx.hstate = NGHTTP3_HTTP_STATE_RESP_END;
1181 stream->rx.hstate = NGHTTP3_HTTP_STATE_RESP_DATA_END;
1186 stream->rx.hstate = NGHTTP3_HTTP_STATE_RESP_DATA_BEGIN;
1189 if ((stream->rx.http.flags & NGHTTP3_HTTP_FLAG_METH_CONNECT) &&
1190 stream->rx.http.status_code / 100 == 2) {
1193 stream->rx.hstate = NGHTTP3_HTTP_STATE_RESP_TRAILERS_BEGIN;
1196 rv = nghttp3_http_on_remote_end_stream(stream);
1200 stream->rx.hstate = NGHTTP3_HTTP_STATE_RESP_END;
1209 stream->rx.hstate = NGHTTP3_HTTP_STATE_RESP_TRAILERS_END;
1215 rv = nghttp3_http_on_remote_end_stream(stream);
1219 stream->rx.hstate = NGHTTP3_HTTP_STATE_RESP_END;
1229 int nghttp3_stream_empty_headers_allowed(nghttp3_stream *stream) {
1230 switch (stream->rx.hstate) {