src/server/util/io.c

changeset 406
e5d96f6b9306
parent 383
a5698877d14a
child 407
78af44222463
equal deleted inserted replaced
405:162f122b96a1 406:e5d96f6b9306
318 io[0].iov_len = snprintf(chunk_len, 16, "%zx\r\n", nbytes); 318 io[0].iov_len = snprintf(chunk_len, 16, "%zx\r\n", nbytes);
319 io[1].iov_base = buf; 319 io[1].iov_base = buf;
320 io[1].iov_len = nbytes; 320 io[1].iov_len = nbytes;
321 io[2].iov_base = "\r\n"; 321 io[2].iov_base = "\r\n";
322 io[2].iov_len = 2; 322 io[2].iov_len = 2;
323 // TODO: FIXME: if r < sum of iov_len, everything would explode 323 // TODO: FIXME: if wv < sum of iov_len, everything would explode
324 // we need to store the chunk state and remaining bytes 324 // we need to store the chunk state and remaining bytes
325 ssize_t r = fd->writev(fd, io, 3); 325 // TODO: FIX IT NOW, IT IS HORRIBLE BROKEN
326 return r - io[0].iov_len - io[2].iov_len; 326 ssize_t wv = fd->writev(fd, io, 3);
327 ssize_t w = wv - io[0].iov_len - io[2].iov_len;
328 st->written += w > 0 ? w : 0;
329 return w;
327 } else { 330 } else {
328 return fd->write(fd, buf, nbytes); 331 ssize_t w = fd->write(fd, buf, nbytes);
332 st->written += w > 0 ? w : 0;
333 return w;
329 } 334 }
330 } 335 }
331 336
332 ssize_t net_http_writev(HttpStream *st, struct iovec *iovec, int iovcnt) { 337 ssize_t net_http_writev(HttpStream *st, struct iovec *iovec, int iovcnt) {
333 if(st->write_eof) return 0; 338 if(st->write_eof) return 0;
347 memcpy(io + 1, iovec, iovcnt * sizeof(struct iovec)); 352 memcpy(io + 1, iovec, iovcnt * sizeof(struct iovec));
348 ssize_t r = fd->writev(fd, io, iovcnt + 1); 353 ssize_t r = fd->writev(fd, io, iovcnt + 1);
349 354
350 ssize_t ret = r - io[0].iov_len; 355 ssize_t ret = r - io[0].iov_len;
351 free(io); 356 free(io);
357 st->written += ret;
352 return ret; 358 return ret;
353 } else { 359 } else {
354 return fd->writev(fd, iovec, iovcnt); 360 ssize_t w = fd->writev(fd, iovec, iovcnt);
361 st->written += w;
362 return w;
355 } 363 }
356 } 364 }
357 365
358 ssize_t net_http_read(HttpStream *st, void *buf, size_t nbytes) { 366 ssize_t net_http_read(HttpStream *st, void *buf, size_t nbytes) {
359 if(st->read >= st->max_read) { 367 if(st->read >= st->max_read) {

mercurial