258 st->buflen = NULL; |
258 st->buflen = NULL; |
259 st->bufpos = NULL; |
259 st->bufpos = NULL; |
260 st->chunk_buf_pos = 0; |
260 st->chunk_buf_pos = 0; |
261 st->chunked_enc = WS_FALSE; |
261 st->chunked_enc = WS_FALSE; |
262 st->read_eof = WS_TRUE; |
262 st->read_eof = WS_TRUE; |
|
263 st->write_eof = WS_FALSE; |
263 return (IOStream*)st; |
264 return (IOStream*)st; |
264 } |
265 } |
265 |
266 |
266 int httpstream_enable_chunked_read(IOStream *st, char *buffer, size_t bufsize, int *cursize, int *pos) { |
267 int httpstream_enable_chunked_read(IOStream *st, char *buffer, size_t bufsize, int *cursize, int *pos) { |
267 if(st->read != (io_read_f)net_http_read) { |
268 if(st->read != (io_read_f)net_http_read) { |
305 HttpStream *http = (HttpStream*)st; |
306 HttpStream *http = (HttpStream*)st; |
306 return http->read_eof; |
307 return http->read_eof; |
307 } |
308 } |
308 |
309 |
309 ssize_t net_http_write(HttpStream *st, void *buf, size_t nbytes) { |
310 ssize_t net_http_write(HttpStream *st, void *buf, size_t nbytes) { |
|
311 if(st->write_eof) return 0; |
310 IOStream *fd = st->fd; |
312 IOStream *fd = st->fd; |
311 if(st->chunked_enc) { |
313 if(st->chunked_enc) { |
312 // TODO: on some plattforms iov_len is smaller than size_t |
314 // TODO: on some plattforms iov_len is smaller than size_t |
313 struct iovec io[3]; |
315 struct iovec io[3]; |
314 char chunk_len[16]; |
316 char chunk_len[16]; |
326 return fd->write(fd, buf, nbytes); |
328 return fd->write(fd, buf, nbytes); |
327 } |
329 } |
328 } |
330 } |
329 |
331 |
330 ssize_t net_http_writev(HttpStream *st, struct iovec *iovec, int iovcnt) { |
332 ssize_t net_http_writev(HttpStream *st, struct iovec *iovec, int iovcnt) { |
|
333 if(st->write_eof) return 0; |
331 IOStream *fd = st->fd; |
334 IOStream *fd = st->fd; |
332 if(st->chunked_enc) { |
335 if(st->chunked_enc) { |
333 struct iovec *io = calloc(iovcnt + 1, sizeof(struct iovec)); |
336 struct iovec *io = calloc(iovcnt + 1, sizeof(struct iovec)); |
334 if(!io) { |
337 if(!io) { |
335 return 0; |
338 return 0; |
580 } |
583 } |
581 |
584 |
582 return rd; |
585 return rd; |
583 } |
586 } |
584 |
587 |
585 ssize_t net_http_sendfile(HttpStream *st, sendfiledata *sfd) { |
588 ssize_t net_http_sendfile(HttpStream *st, sendfiledata *sfd) { |
|
589 if(st->write_eof) return 0; |
586 ssize_t ret = 0; |
590 ssize_t ret = 0; |
587 // TODO: support chunked transfer encoding |
591 // TODO: support chunked transfer encoding |
588 if(st->fd->sendfile) { |
592 if(st->fd->sendfile) { |
589 ret = st->fd->sendfile(st->fd, sfd); |
593 ret = st->fd->sendfile(st->fd, sfd); |
590 } else { |
594 } else { |
597 void net_http_close(HttpStream *st) { |
601 void net_http_close(HttpStream *st) { |
598 st->fd->close(st->fd); |
602 st->fd->close(st->fd); |
599 } |
603 } |
600 |
604 |
601 void net_http_finish(HttpStream *st) { |
605 void net_http_finish(HttpStream *st) { |
602 if(st->chunked_enc) { |
606 if(st->chunked_enc && !st->write_eof) { |
603 st->fd->write(st->fd, "0\r\n\r\n", 5); |
607 st->fd->write(st->fd, "0\r\n\r\n", 5); |
604 } |
608 } |
|
609 st->write_eof = WS_TRUE; |
605 } |
610 } |
606 |
611 |
607 void net_http_setmode(HttpStream *st, int mode) { |
612 void net_http_setmode(HttpStream *st, int mode) { |
608 st->fd->setmode(st->fd, mode); |
613 st->fd->setmode(st->fd, mode); |
609 } |
614 } |