Packages
hackney
3.0.2
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_shsk_stream.c
/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc. See LICENSE. */
/*
* Stream/crypto handshake adapter for the server side. Since on the server
* side, the handshake logic is handled in mini conn, this adapter does not
* have much to do. If peer sends any data on this stream, the adapter
* throws the data out and warns.
*/
#include <assert.h>
#include <errno.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <sys/queue.h>
#include <time.h>
#ifndef WIN32
#include <netdb.h>
#include <sys/socket.h>
#endif
#include "lsquic_int_types.h"
#include "lsquic.h"
#include "lsquic_str.h"
#include "lsquic_mm.h"
#include "lsquic_engine_public.h"
#include "lsquic_hash.h"
#include "lsquic_conn.h"
#include "lsquic_shsk_stream.h"
#define LSQUIC_LOGGER_MODULE LSQLM_HSK_ADAPTER
#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(s_hsk->lconn)
#include "lsquic_logger.h"
static lsquic_stream_ctx_t *
hsk_server_on_new_stream (void *stream_if_ctx, lsquic_stream_t *stream)
{
struct server_hsk_ctx *const s_hsk = stream_if_ctx;
LSQ_DEBUG("stream created");
lsquic_stream_wantread(stream, 1);
/* Note that we return the same thing we're passed. This structure lives
* inside struct full_conn.
*/
return (lsquic_stream_ctx_t *) s_hsk;
}
static void
hsk_server_on_read (lsquic_stream_t *stream, struct lsquic_stream_ctx *ctx)
{
struct server_hsk_ctx *const s_hsk = (struct server_hsk_ctx *) ctx;
struct lsquic_mm *const mm = &s_hsk->enpub->enp_mm;
ssize_t nread;
unsigned char *buf;
buf = lsquic_mm_get_4k(mm);
if (!buf)
{
LSQ_WARN("could not allocate buffer: %s", strerror(errno));
return;
}
nread = lsquic_stream_read(stream, buf, 4 * 1024);
lsquic_mm_put_4k(mm, buf);
if (!(s_hsk->flags & SHC_WARNED))
{
LSQ_WARN("read %zd bytes from stream: what are we to do with them? "
"Further warnings suppressed", nread);
s_hsk->flags |= SHC_WARNED;
}
else
LSQ_DEBUG("read %zd bytes from stream", nread);
}
static void
hsk_server_on_write (lsquic_stream_t *stream, struct lsquic_stream_ctx *ctx)
{
assert(0); /* This function is never called */
}
static void
hsk_server_on_close (lsquic_stream_t *stream, struct lsquic_stream_ctx *ctx)
{
struct server_hsk_ctx *s_hsk = (struct server_hsk_ctx *) ctx;
LSQ_DEBUG("stream closed");
}
const struct lsquic_stream_if lsquic_server_hsk_stream_if =
{
.on_new_stream = hsk_server_on_new_stream,
.on_read = hsk_server_on_read,
.on_write = hsk_server_on_write,
.on_close = hsk_server_on_close,
};