Commit Diff


commit - 80b8842f3e4d562e67455de1c1de80cba5532aec
commit + 7eded25c3ca4de99069ff4c6f0e44071fe0be079
blob - 1016ca910a5e4c6eab23d88760c077b08503d5ac
blob + b5339ede0a383c44cf7b1849b19b800ef07b7b88
--- src/libhttpd/hio.c
+++ src/libhttpd/hio.c
@@ -443,7 +443,7 @@ hlflush(Hio* h)
 int
 hwrite(Hio *h, void *vbuf, int len)
 {
-	uchar *pos, *buf;
+	uchar *buf;
 	int n, m;
 
 	buf = vbuf;
@@ -453,36 +453,30 @@ hwrite(Hio *h, void *vbuf, int len)
 		h->stop = h->pos;
 		return -1;
 	}
-	pos = h->pos;
-	if(pos + n >= h->stop){
-		m = pos - h->start;
-		if(m){
-			m = Hsize - m;
-			if(m){
-				memmove(pos, buf, m);
-				buf += m;
-				n -= m;
-			}
-			if(write(h->fd, h->start, Hsize) != Hsize){
-				h->state = Herr;
-				h->stop = h->pos;
+	if(h->pos + n >= h->stop){
+		if(h->start != h->pos)
+			if(hflush(h) < 0)
 				return -1;
-			}
-			h->seek += Hsize;
-		}
-		m = n % Hsize;
-		n -= m;
-		if(n != 0 && write(h->fd, buf, n) != n){
-			h->state = Herr;
-			h->stop = h->pos;
-			return -1;
+		while(h->pos + n >= h->stop){
+			m = h->stop - h->pos;
+			if(h->xferenc){
+				memmove(h->pos, buf, m);
+				h->pos += m;
+				if(hflush(h) < 0)
+					return -1;
+			}else{
+				if(write(h->fd, buf, m) != m){
+					h->state = Herr;
+					h->stop = h->pos;
+					return -1;
+				}
+				h->seek += m;
+			}
+			n -= m;
+			buf += m;
 		}
-		h->seek += n;
-		buf += n;
-		pos = h->pos = h->start;
-		n = m;
 	}
-	memmove(pos, buf, n);
-	h->pos = pos + n;
+	memmove(h->pos, buf, n);
+	h->pos += n;
 	return len;
 }