src/server/util/io.h

changeset 498
0d80f8a2b29f
parent 430
83560f32e7d5
child 513
9a49c245a49c
--- 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);

mercurial