int nghttp2_bufs_add(nghttp2_bufs *bufs, const void *data, size_t len) { int rv; size_t nwrite; nghttp2_buf *buf; const uint8_t *p; if(bufs_avail(bufs) < (ssize_t)len) { return NGHTTP2_ERR_BUFFER_ERROR; } p = (const uint8_t *)data; while(len) { buf = &bufs->cur->buf; nwrite = nghttp2_min((size_t)nghttp2_buf_avail(buf), len); if(nwrite == 0) { rv = bufs_alloc_chain(bufs); if(rv != 0) { return rv; } continue; } buf->last = nghttp2_cpymem(buf->last, p, nwrite); p += len; len -= nwrite; } return 0; }
ssize_t nghttp2_bufs_remove(nghttp2_bufs *bufs, uint8_t **out) { size_t len; nghttp2_buf_chain *chain; nghttp2_buf *buf; uint8_t *res; nghttp2_buf resbuf; len = 0; for (chain = bufs->head; chain; chain = chain->next) { len += nghttp2_buf_len(&chain->buf); } if (len == 0) { res = NULL; return 0; } res = nghttp2_mem_malloc(bufs->mem, len); if (res == NULL) { return NGHTTP2_ERR_NOMEM; } nghttp2_buf_wrap_init(&resbuf, res, len); for (chain = bufs->head; chain; chain = chain->next) { buf = &chain->buf; resbuf.last = nghttp2_cpymem(resbuf.last, buf->pos, nghttp2_buf_len(buf)); } *out = res; return (ssize_t)len; }
int nghttp2_bufs_add(nghttp2_bufs *bufs, const void *data, size_t len) { int rv; size_t nwrite; nghttp2_buf *buf; const uint8_t *p; // h1994st: if (!bufs->random_enabled && bufs_avail(bufs) < len) { return NGHTTP2_ERR_BUFFER_ERROR; } p = data; while (len) { buf = &bufs->cur->buf; nwrite = nghttp2_min(nghttp2_buf_avail(buf), len); if (nwrite == 0) { rv = bufs_alloc_chain(bufs); if (rv != 0) { return rv; } continue; } buf->last = nghttp2_cpymem(buf->last, p, nwrite); p += nwrite; len -= nwrite; } return 0; }
int nghttp2_rcbuf_new2(nghttp2_rcbuf **rcbuf_ptr, const uint8_t *src, size_t srclen, nghttp2_mem *mem) { int rv; rv = nghttp2_rcbuf_new(rcbuf_ptr, srclen + 1, mem); if (rv != 0) { return rv; } (*rcbuf_ptr)->len = srclen; *nghttp2_cpymem((*rcbuf_ptr)->base, src, srclen) = '\0'; return 0; }
size_t nghttp2_bufs_remove_copy(nghttp2_bufs *bufs, uint8_t *out) { size_t len; nghttp2_buf_chain *chain; nghttp2_buf *buf; nghttp2_buf resbuf; len = nghttp2_bufs_len(bufs); nghttp2_buf_wrap_init(&resbuf, out, len); for (chain = bufs->head; chain; chain = chain->next) { buf = &chain->buf; resbuf.last = nghttp2_cpymem(resbuf.last, buf->pos, nghttp2_buf_len(buf)); } return len; }
ssize_t nghttp2_bufs_remove(nghttp2_bufs *bufs, uint8_t **out) { size_t len; nghttp2_buf_chain *chain; nghttp2_buf *buf; uint8_t *res; nghttp2_buf resbuf; len = 0; for(chain = bufs->head; chain; chain = chain->next) { len += nghttp2_buf_len(&chain->buf); } if(!len) { res = NULL; } else { res = (uint8_t *)malloc(len); if(res == NULL) { return NGHTTP2_ERR_NOMEM; } } nghttp2_buf_wrap_init(&resbuf, res, len); for(chain = bufs->head; chain; chain = chain->next) { buf = &chain->buf; if(resbuf.last) { resbuf.last = nghttp2_cpymem(resbuf.last, buf->pos, nghttp2_buf_len(buf)); } nghttp2_buf_reset(buf); nghttp2_buf_shift_right(&chain->buf, bufs->offset); } bufs->cur = bufs->head; *out = res; return (ssize_t)len; }
int nghttp2_submit_altsvc(nghttp2_session *session, uint8_t flags _U_, int32_t stream_id, const uint8_t *origin, size_t origin_len, const uint8_t *field_value, size_t field_value_len) { nghttp2_mem *mem; uint8_t *buf, *p; uint8_t *origin_copy; uint8_t *field_value_copy; nghttp2_outbound_item *item; nghttp2_frame *frame; nghttp2_ext_altsvc *altsvc; int rv; mem = &session->mem; if (!session->server) { return NGHTTP2_ERR_INVALID_STATE; } if (2 + origin_len + field_value_len > NGHTTP2_MAX_PAYLOADLEN) { return NGHTTP2_ERR_INVALID_ARGUMENT; } if (stream_id == 0) { if (origin_len == 0) { return NGHTTP2_ERR_INVALID_ARGUMENT; } } else if (origin_len != 0) { return NGHTTP2_ERR_INVALID_ARGUMENT; } buf = nghttp2_mem_malloc(mem, origin_len + field_value_len + 2); if (buf == NULL) { return NGHTTP2_ERR_NOMEM; } p = buf; origin_copy = p; if (origin_len) { p = nghttp2_cpymem(p, origin, origin_len); } *p++ = '\0'; field_value_copy = p; if (field_value_len) { p = nghttp2_cpymem(p, field_value, field_value_len); } *p++ = '\0'; item = nghttp2_mem_malloc(mem, sizeof(nghttp2_outbound_item)); if (item == NULL) { rv = NGHTTP2_ERR_NOMEM; goto fail_item_malloc; } nghttp2_outbound_item_init(item); item->aux_data.ext.builtin = 1; altsvc = &item->ext_frame_payload.altsvc; frame = &item->frame; frame->ext.payload = altsvc; nghttp2_frame_altsvc_init(&frame->ext, stream_id, origin_copy, origin_len, field_value_copy, field_value_len); rv = nghttp2_session_add_item(session, item); if (rv != 0) { nghttp2_frame_altsvc_free(&frame->ext, mem); nghttp2_mem_free(mem, item); return rv; } return 0; fail_item_malloc: free(buf); return rv; }