Packages
hackney
2.0.0
4.7.2
4.7.1
4.7.0
4.6.1
4.6.0
4.5.2
4.5.1
4.5.0
4.4.5
4.4.3
4.4.2
4.4.1
4.4.0
4.3.0
4.2.3
4.2.2
4.2.1
4.2.0
4.1.0
4.0.3
4.0.2
4.0.1
4.0.0
3.2.1
3.2.0
3.1.2
3.1.1
3.1.0
3.0.3
3.0.2
3.0.1
3.0.0
retired
2.0.1
2.0.0
2.0.0-beta.1
1.25.0
1.24.1
1.24.0
1.23.0
1.22.0
1.21.0
1.20.1
1.20.0
1.19.1
1.19.0
1.18.2
1.18.1
1.18.0
1.17.4
1.17.3
1.17.2
1.17.1
1.17.0
1.16.0
1.15.2
1.15.1
1.15.0
1.14.3
1.14.2
1.14.0
1.13.0
1.12.1
1.12.0
1.11.0
1.10.1
1.10.0
1.9.0
1.8.6
1.8.5
1.8.4
1.8.3
1.8.2
1.8.0
1.7.1
1.7.0
1.6.6
retired
1.6.5
1.6.4
retired
1.6.3
1.6.2
1.6.1
1.6.0
1.5.7
1.5.6
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.10
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.2
1.3.1
1.3.0
1.2.0
1.1.0
1.0.6
1.0.5
1.0.2
1.0.1
0.15.2
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.13.1
Simple HTTP client with HTTP/1.1, HTTP/2, and HTTP/3 support
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
c_src/lsquic/src/liblsquic/lsquic_http.c
/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc. See LICENSE. */
/* Various HTTP-related functions. */
#include <stddef.h>
#include <stdlib.h>
#ifdef WIN32
#include <vc_compat.h>
#endif
#include "ls-sfparser.h"
#include "lsquic.h"
#include "lsquic_hq.h"
struct parse_pfv_ctx
{
enum ppc_flags ppc_flags;
struct lsquic_ext_http_prio *ppc_ehp;
};
static int
parse_pfv (void *user_data, enum ls_sf_dt type, char *str, size_t len, int off)
{
struct parse_pfv_ctx *const pfv_ctx = user_data;
unsigned urgency;
if (type == LS_SF_DT_NAME)
{
if (1 == len)
switch (str[0])
{
case 'u': pfv_ctx->ppc_flags |= PPC_URG_NAME; return 0;
case 'i': pfv_ctx->ppc_flags |= PPC_INC_NAME; return 0;
}
}
else if (pfv_ctx->ppc_flags & PPC_URG_NAME)
{
if (type == LS_SF_DT_INTEGER)
{
urgency = atoi(str);
if (urgency <= LSQUIC_MAX_HTTP_URGENCY)
{
pfv_ctx->ppc_ehp->urgency = urgency;
pfv_ctx->ppc_flags |= PPC_URG_SET;
}
}
}
else if (pfv_ctx->ppc_flags & PPC_INC_NAME)
{
if (type == LS_SF_DT_BOOLEAN)
{
pfv_ctx->ppc_ehp->incremental = str[0] - '0';
pfv_ctx->ppc_flags |= PPC_INC_SET;
}
}
pfv_ctx->ppc_flags &= ~(PPC_INC_NAME|PPC_URG_NAME);
return 0;
}
int
lsquic_http_parse_pfv (const char *pfv, size_t pfv_sz,
enum ppc_flags *flags, struct lsquic_ext_http_prio *ehp,
char *scratch_buf, size_t scratch_sz)
{
int ret;
struct parse_pfv_ctx pfv_ctx = { .ppc_flags = flags ? *flags : 0,
.ppc_ehp = ehp, };
ret = ls_sf_parse(LS_SF_TLT_DICTIONARY, pfv, pfv_sz, parse_pfv, &pfv_ctx,
scratch_buf, scratch_sz);
if (flags)
*flags = pfv_ctx.ppc_flags;
return ret;
}