113498266Sopenharmony_ci/***************************************************************************
213498266Sopenharmony_ci *                                  _   _ ____  _
313498266Sopenharmony_ci *  Project                     ___| | | |  _ \| |
413498266Sopenharmony_ci *                             / __| | | | |_) | |
513498266Sopenharmony_ci *                            | (__| |_| |  _ <| |___
613498266Sopenharmony_ci *                             \___|\___/|_| \_\_____|
713498266Sopenharmony_ci *
813498266Sopenharmony_ci * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
913498266Sopenharmony_ci *
1013498266Sopenharmony_ci * This software is licensed as described in the file COPYING, which
1113498266Sopenharmony_ci * you should have received as part of this distribution. The terms
1213498266Sopenharmony_ci * are also available at https://curl.se/docs/copyright.html.
1313498266Sopenharmony_ci *
1413498266Sopenharmony_ci * You may opt to use, copy, modify, merge, publish, distribute and/or sell
1513498266Sopenharmony_ci * copies of the Software, and permit persons to whom the Software is
1613498266Sopenharmony_ci * furnished to do so, under the terms of the COPYING file.
1713498266Sopenharmony_ci *
1813498266Sopenharmony_ci * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
1913498266Sopenharmony_ci * KIND, either express or implied.
2013498266Sopenharmony_ci *
2113498266Sopenharmony_ci * SPDX-License-Identifier: curl
2213498266Sopenharmony_ci *
2313498266Sopenharmony_ci ***************************************************************************/
2413498266Sopenharmony_ci
2513498266Sopenharmony_ci#include "curl_setup.h"
2613498266Sopenharmony_ci#include "dynhds.h"
2713498266Sopenharmony_ci#include "strcase.h"
2813498266Sopenharmony_ci
2913498266Sopenharmony_ci/* The last 3 #include files should be in this order */
3013498266Sopenharmony_ci#ifdef USE_NGHTTP2
3113498266Sopenharmony_ci#include <stdint.h>
3213498266Sopenharmony_ci#include <nghttp2/nghttp2.h>
3313498266Sopenharmony_ci#endif /* USE_NGHTTP2 */
3413498266Sopenharmony_ci#include "curl_printf.h"
3513498266Sopenharmony_ci#include "curl_memory.h"
3613498266Sopenharmony_ci#include "memdebug.h"
3713498266Sopenharmony_ci
3813498266Sopenharmony_ci
3913498266Sopenharmony_cistatic struct dynhds_entry *
4013498266Sopenharmony_cientry_new(const char *name, size_t namelen,
4113498266Sopenharmony_ci          const char *value, size_t valuelen, int opts)
4213498266Sopenharmony_ci{
4313498266Sopenharmony_ci  struct dynhds_entry *e;
4413498266Sopenharmony_ci  char *p;
4513498266Sopenharmony_ci
4613498266Sopenharmony_ci  DEBUGASSERT(name);
4713498266Sopenharmony_ci  DEBUGASSERT(value);
4813498266Sopenharmony_ci  e = calloc(1, sizeof(*e) + namelen + valuelen + 2);
4913498266Sopenharmony_ci  if(!e)
5013498266Sopenharmony_ci    return NULL;
5113498266Sopenharmony_ci  e->name = p = ((char *)e) + sizeof(*e);
5213498266Sopenharmony_ci  memcpy(p, name, namelen);
5313498266Sopenharmony_ci  e->namelen = namelen;
5413498266Sopenharmony_ci  e->value = p += namelen + 1; /* leave a \0 at the end of name */
5513498266Sopenharmony_ci  memcpy(p, value, valuelen);
5613498266Sopenharmony_ci  e->valuelen = valuelen;
5713498266Sopenharmony_ci  if(opts & DYNHDS_OPT_LOWERCASE)
5813498266Sopenharmony_ci    Curl_strntolower(e->name, e->name, e->namelen);
5913498266Sopenharmony_ci  return e;
6013498266Sopenharmony_ci}
6113498266Sopenharmony_ci
6213498266Sopenharmony_cistatic struct dynhds_entry *
6313498266Sopenharmony_cientry_append(struct dynhds_entry *e,
6413498266Sopenharmony_ci             const char *value, size_t valuelen)
6513498266Sopenharmony_ci{
6613498266Sopenharmony_ci  struct dynhds_entry *e2;
6713498266Sopenharmony_ci  size_t valuelen2 = e->valuelen + 1 + valuelen;
6813498266Sopenharmony_ci  char *p;
6913498266Sopenharmony_ci
7013498266Sopenharmony_ci  DEBUGASSERT(value);
7113498266Sopenharmony_ci  e2 = calloc(1, sizeof(*e) + e->namelen + valuelen2 + 2);
7213498266Sopenharmony_ci  if(!e2)
7313498266Sopenharmony_ci    return NULL;
7413498266Sopenharmony_ci  e2->name = p = ((char *)e2) + sizeof(*e2);
7513498266Sopenharmony_ci  memcpy(p, e->name, e->namelen);
7613498266Sopenharmony_ci  e2->namelen = e->namelen;
7713498266Sopenharmony_ci  e2->value = p += e->namelen + 1; /* leave a \0 at the end of name */
7813498266Sopenharmony_ci  memcpy(p, e->value, e->valuelen);
7913498266Sopenharmony_ci  p += e->valuelen;
8013498266Sopenharmony_ci  p[0] = ' ';
8113498266Sopenharmony_ci  memcpy(p + 1, value, valuelen);
8213498266Sopenharmony_ci  e2->valuelen = valuelen2;
8313498266Sopenharmony_ci  return e2;
8413498266Sopenharmony_ci}
8513498266Sopenharmony_ci
8613498266Sopenharmony_cistatic void entry_free(struct dynhds_entry *e)
8713498266Sopenharmony_ci{
8813498266Sopenharmony_ci  free(e);
8913498266Sopenharmony_ci}
9013498266Sopenharmony_ci
9113498266Sopenharmony_civoid Curl_dynhds_init(struct dynhds *dynhds, size_t max_entries,
9213498266Sopenharmony_ci                      size_t max_strs_size)
9313498266Sopenharmony_ci{
9413498266Sopenharmony_ci  DEBUGASSERT(dynhds);
9513498266Sopenharmony_ci  DEBUGASSERT(max_strs_size);
9613498266Sopenharmony_ci  dynhds->hds = NULL;
9713498266Sopenharmony_ci  dynhds->hds_len = dynhds->hds_allc = dynhds->strs_len = 0;
9813498266Sopenharmony_ci  dynhds->max_entries = max_entries;
9913498266Sopenharmony_ci  dynhds->max_strs_size = max_strs_size;
10013498266Sopenharmony_ci  dynhds->opts = 0;
10113498266Sopenharmony_ci}
10213498266Sopenharmony_ci
10313498266Sopenharmony_civoid Curl_dynhds_free(struct dynhds *dynhds)
10413498266Sopenharmony_ci{
10513498266Sopenharmony_ci  DEBUGASSERT(dynhds);
10613498266Sopenharmony_ci  if(dynhds->hds && dynhds->hds_len) {
10713498266Sopenharmony_ci    size_t i;
10813498266Sopenharmony_ci    DEBUGASSERT(dynhds->hds);
10913498266Sopenharmony_ci    for(i = 0; i < dynhds->hds_len; ++i) {
11013498266Sopenharmony_ci      entry_free(dynhds->hds[i]);
11113498266Sopenharmony_ci    }
11213498266Sopenharmony_ci  }
11313498266Sopenharmony_ci  Curl_safefree(dynhds->hds);
11413498266Sopenharmony_ci  dynhds->hds_len = dynhds->hds_allc = dynhds->strs_len = 0;
11513498266Sopenharmony_ci}
11613498266Sopenharmony_ci
11713498266Sopenharmony_civoid Curl_dynhds_reset(struct dynhds *dynhds)
11813498266Sopenharmony_ci{
11913498266Sopenharmony_ci  DEBUGASSERT(dynhds);
12013498266Sopenharmony_ci  if(dynhds->hds_len) {
12113498266Sopenharmony_ci    size_t i;
12213498266Sopenharmony_ci    DEBUGASSERT(dynhds->hds);
12313498266Sopenharmony_ci    for(i = 0; i < dynhds->hds_len; ++i) {
12413498266Sopenharmony_ci      entry_free(dynhds->hds[i]);
12513498266Sopenharmony_ci      dynhds->hds[i] = NULL;
12613498266Sopenharmony_ci    }
12713498266Sopenharmony_ci  }
12813498266Sopenharmony_ci  dynhds->hds_len = dynhds->strs_len = 0;
12913498266Sopenharmony_ci}
13013498266Sopenharmony_ci
13113498266Sopenharmony_cisize_t Curl_dynhds_count(struct dynhds *dynhds)
13213498266Sopenharmony_ci{
13313498266Sopenharmony_ci  return dynhds->hds_len;
13413498266Sopenharmony_ci}
13513498266Sopenharmony_ci
13613498266Sopenharmony_civoid Curl_dynhds_set_opts(struct dynhds *dynhds, int opts)
13713498266Sopenharmony_ci{
13813498266Sopenharmony_ci  dynhds->opts = opts;
13913498266Sopenharmony_ci}
14013498266Sopenharmony_ci
14113498266Sopenharmony_cistruct dynhds_entry *Curl_dynhds_getn(struct dynhds *dynhds, size_t n)
14213498266Sopenharmony_ci{
14313498266Sopenharmony_ci  DEBUGASSERT(dynhds);
14413498266Sopenharmony_ci  return (n < dynhds->hds_len)? dynhds->hds[n] : NULL;
14513498266Sopenharmony_ci}
14613498266Sopenharmony_ci
14713498266Sopenharmony_cistruct dynhds_entry *Curl_dynhds_get(struct dynhds *dynhds, const char *name,
14813498266Sopenharmony_ci                                     size_t namelen)
14913498266Sopenharmony_ci{
15013498266Sopenharmony_ci  size_t i;
15113498266Sopenharmony_ci  for(i = 0; i < dynhds->hds_len; ++i) {
15213498266Sopenharmony_ci    if(dynhds->hds[i]->namelen == namelen &&
15313498266Sopenharmony_ci       strncasecompare(dynhds->hds[i]->name, name, namelen)) {
15413498266Sopenharmony_ci      return dynhds->hds[i];
15513498266Sopenharmony_ci    }
15613498266Sopenharmony_ci  }
15713498266Sopenharmony_ci  return NULL;
15813498266Sopenharmony_ci}
15913498266Sopenharmony_ci
16013498266Sopenharmony_cistruct dynhds_entry *Curl_dynhds_cget(struct dynhds *dynhds, const char *name)
16113498266Sopenharmony_ci{
16213498266Sopenharmony_ci  return Curl_dynhds_get(dynhds, name, strlen(name));
16313498266Sopenharmony_ci}
16413498266Sopenharmony_ci
16513498266Sopenharmony_ciCURLcode Curl_dynhds_add(struct dynhds *dynhds,
16613498266Sopenharmony_ci                         const char *name, size_t namelen,
16713498266Sopenharmony_ci                         const char *value, size_t valuelen)
16813498266Sopenharmony_ci{
16913498266Sopenharmony_ci  struct dynhds_entry *entry = NULL;
17013498266Sopenharmony_ci  CURLcode result = CURLE_OUT_OF_MEMORY;
17113498266Sopenharmony_ci
17213498266Sopenharmony_ci  DEBUGASSERT(dynhds);
17313498266Sopenharmony_ci  if(dynhds->max_entries && dynhds->hds_len >= dynhds->max_entries)
17413498266Sopenharmony_ci    return CURLE_OUT_OF_MEMORY;
17513498266Sopenharmony_ci  if(dynhds->strs_len + namelen + valuelen > dynhds->max_strs_size)
17613498266Sopenharmony_ci    return CURLE_OUT_OF_MEMORY;
17713498266Sopenharmony_ci
17813498266Sopenharmony_cientry = entry_new(name, namelen, value, valuelen, dynhds->opts);
17913498266Sopenharmony_ci  if(!entry)
18013498266Sopenharmony_ci    goto out;
18113498266Sopenharmony_ci
18213498266Sopenharmony_ci  if(dynhds->hds_len + 1 >= dynhds->hds_allc) {
18313498266Sopenharmony_ci    size_t nallc = dynhds->hds_len + 16;
18413498266Sopenharmony_ci    struct dynhds_entry **nhds;
18513498266Sopenharmony_ci
18613498266Sopenharmony_ci    if(dynhds->max_entries && nallc > dynhds->max_entries)
18713498266Sopenharmony_ci      nallc = dynhds->max_entries;
18813498266Sopenharmony_ci
18913498266Sopenharmony_ci    nhds = calloc(nallc, sizeof(struct dynhds_entry *));
19013498266Sopenharmony_ci    if(!nhds)
19113498266Sopenharmony_ci      goto out;
19213498266Sopenharmony_ci    if(dynhds->hds) {
19313498266Sopenharmony_ci      memcpy(nhds, dynhds->hds,
19413498266Sopenharmony_ci             dynhds->hds_len * sizeof(struct dynhds_entry *));
19513498266Sopenharmony_ci      Curl_safefree(dynhds->hds);
19613498266Sopenharmony_ci    }
19713498266Sopenharmony_ci    dynhds->hds = nhds;
19813498266Sopenharmony_ci    dynhds->hds_allc = nallc;
19913498266Sopenharmony_ci  }
20013498266Sopenharmony_ci  dynhds->hds[dynhds->hds_len++] = entry;
20113498266Sopenharmony_ci  entry = NULL;
20213498266Sopenharmony_ci  dynhds->strs_len += namelen + valuelen;
20313498266Sopenharmony_ci  result = CURLE_OK;
20413498266Sopenharmony_ci
20513498266Sopenharmony_ciout:
20613498266Sopenharmony_ci  if(entry)
20713498266Sopenharmony_ci    entry_free(entry);
20813498266Sopenharmony_ci  return result;
20913498266Sopenharmony_ci}
21013498266Sopenharmony_ci
21113498266Sopenharmony_ciCURLcode Curl_dynhds_cadd(struct dynhds *dynhds,
21213498266Sopenharmony_ci                          const char *name, const char *value)
21313498266Sopenharmony_ci{
21413498266Sopenharmony_ci  return Curl_dynhds_add(dynhds, name, strlen(name), value, strlen(value));
21513498266Sopenharmony_ci}
21613498266Sopenharmony_ci
21713498266Sopenharmony_ciCURLcode Curl_dynhds_h1_add_line(struct dynhds *dynhds,
21813498266Sopenharmony_ci                                 const char *line, size_t line_len)
21913498266Sopenharmony_ci{
22013498266Sopenharmony_ci  const char *p;
22113498266Sopenharmony_ci  const char *name;
22213498266Sopenharmony_ci  size_t namelen;
22313498266Sopenharmony_ci  const char *value;
22413498266Sopenharmony_ci  size_t valuelen, i;
22513498266Sopenharmony_ci
22613498266Sopenharmony_ci  if(!line || !line_len)
22713498266Sopenharmony_ci    return CURLE_OK;
22813498266Sopenharmony_ci
22913498266Sopenharmony_ci  if((line[0] == ' ') || (line[0] == '\t')) {
23013498266Sopenharmony_ci    struct dynhds_entry *e, *e2;
23113498266Sopenharmony_ci    /* header continuation, yikes! */
23213498266Sopenharmony_ci    if(!dynhds->hds_len)
23313498266Sopenharmony_ci      return CURLE_BAD_FUNCTION_ARGUMENT;
23413498266Sopenharmony_ci
23513498266Sopenharmony_ci    while(line_len && ISBLANK(line[0])) {
23613498266Sopenharmony_ci      ++line;
23713498266Sopenharmony_ci      --line_len;
23813498266Sopenharmony_ci    }
23913498266Sopenharmony_ci    if(!line_len)
24013498266Sopenharmony_ci      return CURLE_BAD_FUNCTION_ARGUMENT;
24113498266Sopenharmony_ci    e = dynhds->hds[dynhds->hds_len-1];
24213498266Sopenharmony_ci    e2 = entry_append(e, line, line_len);
24313498266Sopenharmony_ci    if(!e2)
24413498266Sopenharmony_ci      return CURLE_OUT_OF_MEMORY;
24513498266Sopenharmony_ci    dynhds->hds[dynhds->hds_len-1] = e2;
24613498266Sopenharmony_ci    entry_free(e);
24713498266Sopenharmony_ci    return CURLE_OK;
24813498266Sopenharmony_ci  }
24913498266Sopenharmony_ci  else {
25013498266Sopenharmony_ci    p = memchr(line, ':', line_len);
25113498266Sopenharmony_ci    if(!p)
25213498266Sopenharmony_ci      return CURLE_BAD_FUNCTION_ARGUMENT;
25313498266Sopenharmony_ci    name = line;
25413498266Sopenharmony_ci    namelen = p - line;
25513498266Sopenharmony_ci    p++; /* move past the colon */
25613498266Sopenharmony_ci    for(i = namelen + 1; i < line_len; ++i, ++p) {
25713498266Sopenharmony_ci      if(!ISBLANK(*p))
25813498266Sopenharmony_ci        break;
25913498266Sopenharmony_ci    }
26013498266Sopenharmony_ci    value = p;
26113498266Sopenharmony_ci    valuelen = line_len - i;
26213498266Sopenharmony_ci
26313498266Sopenharmony_ci    p = memchr(value, '\r', valuelen);
26413498266Sopenharmony_ci    if(!p)
26513498266Sopenharmony_ci      p = memchr(value, '\n', valuelen);
26613498266Sopenharmony_ci    if(p)
26713498266Sopenharmony_ci      valuelen = (size_t)(p - value);
26813498266Sopenharmony_ci
26913498266Sopenharmony_ci    return Curl_dynhds_add(dynhds, name, namelen, value, valuelen);
27013498266Sopenharmony_ci  }
27113498266Sopenharmony_ci}
27213498266Sopenharmony_ci
27313498266Sopenharmony_ciCURLcode Curl_dynhds_h1_cadd_line(struct dynhds *dynhds, const char *line)
27413498266Sopenharmony_ci{
27513498266Sopenharmony_ci  return Curl_dynhds_h1_add_line(dynhds, line, line? strlen(line) : 0);
27613498266Sopenharmony_ci}
27713498266Sopenharmony_ci
27813498266Sopenharmony_ci#ifdef DEBUGBUILD
27913498266Sopenharmony_ci/* used by unit2602.c */
28013498266Sopenharmony_ci
28113498266Sopenharmony_cibool Curl_dynhds_contains(struct dynhds *dynhds,
28213498266Sopenharmony_ci                          const char *name, size_t namelen)
28313498266Sopenharmony_ci{
28413498266Sopenharmony_ci  return !!Curl_dynhds_get(dynhds, name, namelen);
28513498266Sopenharmony_ci}
28613498266Sopenharmony_ci
28713498266Sopenharmony_cibool Curl_dynhds_ccontains(struct dynhds *dynhds, const char *name)
28813498266Sopenharmony_ci{
28913498266Sopenharmony_ci  return Curl_dynhds_contains(dynhds, name, strlen(name));
29013498266Sopenharmony_ci}
29113498266Sopenharmony_ci
29213498266Sopenharmony_cisize_t Curl_dynhds_count_name(struct dynhds *dynhds,
29313498266Sopenharmony_ci                              const char *name, size_t namelen)
29413498266Sopenharmony_ci{
29513498266Sopenharmony_ci  size_t n = 0;
29613498266Sopenharmony_ci  if(dynhds->hds_len) {
29713498266Sopenharmony_ci    size_t i;
29813498266Sopenharmony_ci    for(i = 0; i < dynhds->hds_len; ++i) {
29913498266Sopenharmony_ci      if((namelen == dynhds->hds[i]->namelen) &&
30013498266Sopenharmony_ci         strncasecompare(name, dynhds->hds[i]->name, namelen))
30113498266Sopenharmony_ci        ++n;
30213498266Sopenharmony_ci    }
30313498266Sopenharmony_ci  }
30413498266Sopenharmony_ci  return n;
30513498266Sopenharmony_ci}
30613498266Sopenharmony_ci
30713498266Sopenharmony_cisize_t Curl_dynhds_ccount_name(struct dynhds *dynhds, const char *name)
30813498266Sopenharmony_ci{
30913498266Sopenharmony_ci  return Curl_dynhds_count_name(dynhds, name, strlen(name));
31013498266Sopenharmony_ci}
31113498266Sopenharmony_ci
31213498266Sopenharmony_ciCURLcode Curl_dynhds_set(struct dynhds *dynhds,
31313498266Sopenharmony_ci                         const char *name, size_t namelen,
31413498266Sopenharmony_ci                         const char *value, size_t valuelen)
31513498266Sopenharmony_ci{
31613498266Sopenharmony_ci  Curl_dynhds_remove(dynhds, name, namelen);
31713498266Sopenharmony_ci  return Curl_dynhds_add(dynhds, name, namelen, value, valuelen);
31813498266Sopenharmony_ci}
31913498266Sopenharmony_ci
32013498266Sopenharmony_cisize_t Curl_dynhds_remove(struct dynhds *dynhds,
32113498266Sopenharmony_ci                          const char *name, size_t namelen)
32213498266Sopenharmony_ci{
32313498266Sopenharmony_ci  size_t n = 0;
32413498266Sopenharmony_ci  if(dynhds->hds_len) {
32513498266Sopenharmony_ci    size_t i, len;
32613498266Sopenharmony_ci    for(i = 0; i < dynhds->hds_len; ++i) {
32713498266Sopenharmony_ci      if((namelen == dynhds->hds[i]->namelen) &&
32813498266Sopenharmony_ci         strncasecompare(name, dynhds->hds[i]->name, namelen)) {
32913498266Sopenharmony_ci        ++n;
33013498266Sopenharmony_ci        --dynhds->hds_len;
33113498266Sopenharmony_ci        dynhds->strs_len -= (dynhds->hds[i]->namelen +
33213498266Sopenharmony_ci                             dynhds->hds[i]->valuelen);
33313498266Sopenharmony_ci        entry_free(dynhds->hds[i]);
33413498266Sopenharmony_ci        len = dynhds->hds_len - i; /* remaining entries */
33513498266Sopenharmony_ci        if(len) {
33613498266Sopenharmony_ci          memmove(&dynhds->hds[i], &dynhds->hds[i + 1],
33713498266Sopenharmony_ci                  len * sizeof(dynhds->hds[i]));
33813498266Sopenharmony_ci        }
33913498266Sopenharmony_ci        --i; /* do this index again */
34013498266Sopenharmony_ci      }
34113498266Sopenharmony_ci    }
34213498266Sopenharmony_ci  }
34313498266Sopenharmony_ci  return n;
34413498266Sopenharmony_ci}
34513498266Sopenharmony_ci
34613498266Sopenharmony_cisize_t Curl_dynhds_cremove(struct dynhds *dynhds, const char *name)
34713498266Sopenharmony_ci{
34813498266Sopenharmony_ci  return Curl_dynhds_remove(dynhds, name, strlen(name));
34913498266Sopenharmony_ci}
35013498266Sopenharmony_ci
35113498266Sopenharmony_ci#endif
35213498266Sopenharmony_ci
35313498266Sopenharmony_ciCURLcode Curl_dynhds_h1_dprint(struct dynhds *dynhds, struct dynbuf *dbuf)
35413498266Sopenharmony_ci{
35513498266Sopenharmony_ci  CURLcode result = CURLE_OK;
35613498266Sopenharmony_ci  size_t i;
35713498266Sopenharmony_ci
35813498266Sopenharmony_ci  if(!dynhds->hds_len)
35913498266Sopenharmony_ci    return result;
36013498266Sopenharmony_ci
36113498266Sopenharmony_ci  for(i = 0; i < dynhds->hds_len; ++i) {
36213498266Sopenharmony_ci    result = Curl_dyn_addf(dbuf, "%.*s: %.*s\r\n",
36313498266Sopenharmony_ci               (int)dynhds->hds[i]->namelen, dynhds->hds[i]->name,
36413498266Sopenharmony_ci               (int)dynhds->hds[i]->valuelen, dynhds->hds[i]->value);
36513498266Sopenharmony_ci    if(result)
36613498266Sopenharmony_ci      break;
36713498266Sopenharmony_ci  }
36813498266Sopenharmony_ci
36913498266Sopenharmony_ci  return result;
37013498266Sopenharmony_ci}
37113498266Sopenharmony_ci
37213498266Sopenharmony_ci#ifdef USE_NGHTTP2
37313498266Sopenharmony_ci
37413498266Sopenharmony_cinghttp2_nv *Curl_dynhds_to_nva(struct dynhds *dynhds, size_t *pcount)
37513498266Sopenharmony_ci{
37613498266Sopenharmony_ci  nghttp2_nv *nva = calloc(1, sizeof(nghttp2_nv) * dynhds->hds_len);
37713498266Sopenharmony_ci  size_t i;
37813498266Sopenharmony_ci
37913498266Sopenharmony_ci  *pcount = 0;
38013498266Sopenharmony_ci  if(!nva)
38113498266Sopenharmony_ci    return NULL;
38213498266Sopenharmony_ci
38313498266Sopenharmony_ci  for(i = 0; i < dynhds->hds_len; ++i) {
38413498266Sopenharmony_ci    struct dynhds_entry *e = dynhds->hds[i];
38513498266Sopenharmony_ci    DEBUGASSERT(e);
38613498266Sopenharmony_ci    nva[i].name = (unsigned char *)e->name;
38713498266Sopenharmony_ci    nva[i].namelen = e->namelen;
38813498266Sopenharmony_ci    nva[i].value = (unsigned char *)e->value;
38913498266Sopenharmony_ci    nva[i].valuelen = e->valuelen;
39013498266Sopenharmony_ci    nva[i].flags = NGHTTP2_NV_FLAG_NONE;
39113498266Sopenharmony_ci  }
39213498266Sopenharmony_ci  *pcount = dynhds->hds_len;
39313498266Sopenharmony_ci  return nva;
39413498266Sopenharmony_ci}
39513498266Sopenharmony_ci
39613498266Sopenharmony_ci#endif /* USE_NGHTTP2 */
397