src/server/util/io.c

branch
webdav
changeset 361
570026d3a685
parent 354
017eda1be105
child 383
a5698877d14a
--- a/src/server/util/io.c	Sat May 14 15:22:37 2022 +0200
+++ b/src/server/util/io.c	Sun May 15 08:56:00 2022 +0200
@@ -260,6 +260,7 @@
     st->chunk_buf_pos = 0;
     st->chunked_enc = WS_FALSE;
     st->read_eof = WS_TRUE;
+    st->write_eof = WS_FALSE;
     return (IOStream*)st;
 }
 
@@ -307,6 +308,7 @@
 }
 
 ssize_t net_http_write(HttpStream *st, void *buf, size_t nbytes) {
+    if(st->write_eof) return 0;
     IOStream *fd = st->fd;
     if(st->chunked_enc) {
         // TODO: on some plattforms iov_len is smaller than size_t
@@ -328,6 +330,7 @@
 }
 
 ssize_t net_http_writev(HttpStream *st, struct iovec *iovec, int iovcnt) {
+    if(st->write_eof) return 0;
     IOStream *fd = st->fd;
     if(st->chunked_enc) {
         struct iovec *io = calloc(iovcnt + 1, sizeof(struct iovec));
@@ -582,7 +585,8 @@
     return rd;
 }
 
-ssize_t net_http_sendfile(HttpStream *st, sendfiledata *sfd) {  
+ssize_t net_http_sendfile(HttpStream *st, sendfiledata *sfd) {
+    if(st->write_eof) return 0;
     ssize_t ret = 0;
     // TODO: support chunked transfer encoding
     if(st->fd->sendfile) {
@@ -599,9 +603,10 @@
 }
 
 void net_http_finish(HttpStream *st) {
-    if(st->chunked_enc) {
+    if(st->chunked_enc && !st->write_eof) {
         st->fd->write(st->fd, "0\r\n\r\n", 5);
     }
+    st->write_eof = WS_TRUE;
 }
 
 void net_http_setmode(HttpStream *st, int mode) {

mercurial