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