Packages
hackney
3.0.3
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_push_promise.h
/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc. See LICENSE. */
#ifndef LSQUIC_PUSH_PROMISE_H
#define LSQUIC_PUSH_PROMISE_H 1
struct push_promise
{
/* A push promise is associated with a single stream, while a stream can
* have several push promises it depends on. These push promises are
* stored on a list. A push promise is destroyed when the dependent
* stream is destroyed.
*/
SLIST_ENTRY(push_promise) pp_next;
/* Push promises are stored a hash and can be searched by ID */
struct lsquic_hash_elem pp_hash_id;
uint64_t pp_id;
struct lsquic_stream *pp_pushed_stream;
size_t pp_content_len;
/* Number of streams holding a reference to this push promise. When this
* value becomes zero, the push promise is destroyed. See lsquic_pp_put().
*
* The stream on which PUSH_PROMISE frame is sent has a reference in its
* sm_promises list. The push streams themselves have a reference in
* sm_promise.
*/
unsigned pp_refcnt;
/* State for the promise reader. If the state is not PPWS_NONE, we are
* in the process of writing the first push promise on sm_promises list
* (that's the last promise received).
*/
enum {
PPWS_ID0, /* Write first byte of Push ID */
PPWS_ID1, /* Write second byte of Push ID */
PPWS_ID2, /* Write third byte of Push ID */
PPWS_ID3, /* Write fourth byte of Push ID */
PPWS_ID4, /* Write fifth byte of Push ID */
PPWS_ID5, /* Write sixth byte of Push ID */
PPWS_ID6, /* Write seventh byte of Push ID */
PPWS_ID7, /* Write eighth byte of Push ID */
PPWS_PFX0, /* Write first NUL byte of the Header Block Prefix */
PPWS_PFX1, /* Write second NUL byte of the Header Block Prefix */
PPWS_HBLOCK, /* Write header block -- use sm_push_hblock_off */
PPWS_DONE,
} pp_write_state;
unsigned pp_write_off;
unsigned char pp_encoded_push_id[8];
/* The content buffer is the header block: it does not include Header
* Block Prefix.
*/
unsigned char pp_content_buf[0];
};
#define lsquic_pp_put(promise_, all_promises_) do { \
if ((promise_)->pp_refcnt > 0) { \
--(promise_)->pp_refcnt; \
if (0 == (promise_)->pp_refcnt) { \
LSQ_DEBUG("destroy push promise %"PRIu64, (promise_)->pp_id); \
if ((promise_)->pp_hash_id.qhe_flags & QHE_HASHED) \
lsquic_hash_erase(all_promises_, &(promise_)->pp_hash_id); \
free(promise_); \
} \
} \
else \
assert(0); \
} while (0)
#endif