diff -r 8827517054ec -r 0d80f8a2b29f src/server/util/io.h --- a/src/server/util/io.h Wed May 31 19:39:10 2023 +0200 +++ b/src/server/util/io.h Sun Jun 04 20:09:18 2023 +0200 @@ -59,7 +59,7 @@ typedef struct Sysstream Sysstream; typedef struct HttpStream HttpStream; -typedef ssize_t(*io_write_f)(IOStream *, void *, size_t); +typedef ssize_t(*io_write_f)(IOStream *, const void *, size_t); typedef ssize_t(*io_writev_f)(IOStream *, struct iovec *, int); typedef ssize_t(*io_read_f)(IOStream *, void *, size_t); typedef ssize_t(*io_sendfile_f)(IOStream *, sendfiledata *); @@ -136,6 +136,35 @@ */ WSBool chunked_enc; /* + * current chunk size (set after the header is sent) + */ + size_t current_chunk_length; + /* + * current chunk position + */ + size_t current_chunk_pos; + /* + * missing trailer before new data + * 0: no trailer + * 2: crlf + * 1: lf + */ + int current_trailer; + /* + * write chunk header buffer + */ + char write_chunk_buf[HTTP_STREAM_CBUF_SIZE]; + /* + * chunk header buffer length + * only used when the chunk header was completely sent + * must be 0 before payload data is sent + */ + int write_chunk_buf_len; + /* + * current write_chunk_buf position (if remaining != 0) + */ + int write_chunk_buf_pos; + /* * end of file indicator (read) */ WSBool read_eof; @@ -156,7 +185,7 @@ /* system stream */ IOStream* Sysstream_new(pool_handle_t *pool, SYS_SOCKET fd); -ssize_t net_sys_write(Sysstream *st, void *buf, size_t nbytes); +ssize_t net_sys_write(Sysstream *st, const void *buf, size_t nbytes); ssize_t net_sys_writev(Sysstream *st, struct iovec *iovec, int iovcnt); ssize_t net_sys_read(Sysstream *st, void *buf, size_t nbytes); ssize_t net_sys_sendfile(Sysstream *st, sendfiledata *sfd); @@ -173,7 +202,7 @@ WSBool httpstream_eof(IOStream *st); int64_t httpstream_written(IOStream *st); -ssize_t net_http_write(HttpStream *st, void *buf, size_t nbytes); +ssize_t net_http_write(HttpStream *st, const void *buf, size_t nbytes); ssize_t net_http_writev(HttpStream *st, struct iovec *iovec, int iovcnt); ssize_t net_http_read(HttpStream *st, void *buf, size_t nbytes); ssize_t net_http_read_chunked(HttpStream *st, void *buf, size_t nbytes); @@ -183,10 +212,12 @@ void net_http_setmode(HttpStream *st, int mode); int net_http_poll(HttpStream *st, EventHandler *ev, int events, Event *cb); +int http_stream_parse_chunk_header(char *str, int len, WSBool first, int64_t *chunklen); + /* ssl stream */ IOStream* sslstream_new(pool_handle_t *pool, SSL *ssl); -ssize_t net_ssl_write(SSLStream *st, void *buf, size_t nbytes); +ssize_t net_ssl_write(SSLStream *st, const void *buf, size_t nbytes); ssize_t net_ssl_writev(SSLStream *st, struct iovec *iovec, int iovcnt); ssize_t net_ssl_read(SSLStream *st, void *buf, size_t nbytes); void net_ssl_close(SSLStream *st);