add raw mode for http streams

Sun, 22 Feb 2026 10:05:37 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 22 Feb 2026 10:05:37 +0100
changeset 697
3ddfd45d4e47
parent 696
27e42da5050f
child 698
fea7c3d74cc6

add raw mode for http streams

src/server/util/io.c file | annotate | diff | comparison | revisions
src/server/util/io.h file | annotate | diff | comparison | revisions
--- a/src/server/util/io.c	Sun Feb 22 09:33:48 2026 +0100
+++ b/src/server/util/io.c	Sun Feb 22 10:05:37 2026 +0100
@@ -209,6 +209,9 @@
 }
 
 void net_sys_setmode(Sysstream *st, int mode) {
+    if(mode > IO_MODE_NONBLOCKING) {
+        return;
+    }
     int flags;
     if (-1 == (flags = fcntl(st->fd, F_GETFL, 0))) {
         flags = 0;
@@ -539,6 +542,14 @@
     }
 }
 
+ssize_t net_http_write_raw(HttpStream *st, const void *buf, size_t nbytes) {
+    return st->fd->write(st->fd, buf, nbytes);
+}
+
+ssize_t net_http_writev_raw(HttpStream *st, struct iovec *iovec, int iovcnt) {
+    return st->fd->writev(st->fd, iovec, iovcnt);
+}
+
 ssize_t net_http_read(HttpStream *st, void *buf, size_t nbytes) {
     if(st->read >= st->max_read) {
         st->read_eof = WS_TRUE;
@@ -797,6 +808,10 @@
     return rd;
 }
 
+ssize_t net_http_read_raw(HttpStream *st, void *buf, size_t nbytes) {
+    return st->fd->read(st->fd, buf, nbytes);
+}
+
 ssize_t net_http_sendfile(HttpStream *st, sendfiledata *sfd) {
     if(st->write_eof) return 0;
     ssize_t ret = 0;
@@ -824,7 +839,11 @@
 }
 
 void net_http_setmode(HttpStream *st, int mode) {
-    st->fd->setmode(st->fd, mode);
+    if(mode == IO_MODE_RAW) {
+        st->raw = TRUE;
+    } else {
+        st->fd->setmode(st->fd, mode);
+    }
 }
 
 int net_http_poll(HttpStream *st, EventHandler *ev, int events, Event *cb) {
--- a/src/server/util/io.h	Sun Feb 22 09:33:48 2026 +0100
+++ b/src/server/util/io.h	Sun Feb 22 10:05:37 2026 +0100
@@ -50,6 +50,7 @@
 
 #define IO_MODE_BLOCKING    0
 #define IO_MODE_NONBLOCKING 1
+#define IO_MODE_RAW         2
     
 #define IO_POLL_NONE        0
 #define IO_POLL_IN          1
@@ -180,6 +181,10 @@
      * end of file indicator (write)
      */
     WSBool write_eof;
+    /*
+     * raw socket IO
+     */
+    WSBool raw;
 };
 
 typedef struct SSLStream {
@@ -216,9 +221,12 @@
 
 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_write_raw(HttpStream *st, const void *buf, size_t nbytes);
+ssize_t net_http_writev_raw(HttpStream *st, struct iovec *iovec, int iovcnt);
 ssize_t net_http_read(HttpStream *st, void *buf, size_t nbytes);
 ssize_t net_http_read_buffered(HttpStream *st, void *buf, size_t nbytes);
 ssize_t net_http_read_chunked(HttpStream *st, void *buf, size_t nbytes);
+ssize_t net_http_read_raw(HttpStream *st, void *buf, size_t nbytes);
 ssize_t net_http_sendfile(HttpStream *st, sendfiledata *sfd);
 void    net_http_close(HttpStream *st);
 void    net_http_finish(HttpStream *st);

mercurial