src/server/util/io.c

branch
webdav
changeset 361
570026d3a685
parent 354
017eda1be105
child 383
a5698877d14a
equal deleted inserted replaced
360:79ddd772e807 361:570026d3a685
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 }

mercurial