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) { |