142 struct iovec trvec; |
142 struct iovec trvec; |
143 trvec.iov_base = (void*)sfd->trailer; |
143 trvec.iov_base = (void*)sfd->trailer; |
144 trvec.iov_len = sfd->tlen; |
144 trvec.iov_len = sfd->tlen; |
145 struct sf_hdtr hdtr; |
145 struct sf_hdtr hdtr; |
146 hdtr.headers = &hdvec; |
146 hdtr.headers = &hdvec; |
147 hdtr.hdr_cnt = 1; |
147 hdtr.hdr_cnt = sfd->hlen > 0 ? 1 : 0; |
148 hdtr.trailers = &trvec; |
148 hdtr.trailers = &trvec; |
149 hdtr.trl_cnt = 1; |
149 hdtr.trl_cnt = sfd->tlen > 0 ? 1 : 0; |
150 |
150 |
151 off_t len = sfd->len; |
151 off_t len = sfd->len; |
152 #ifdef OSX |
152 #ifdef OSX |
153 ret = sendfile(sfd->fd->fd, st->fd, fileoffset, &len, &hdtr, 0); |
153 ret = sendfile(sfd->fd->fd, st->fd, fileoffset, &len, &hdtr, 0); |
154 #else // BSD |
154 #else // BSD |
159 sfd->len, |
159 sfd->len, |
160 &hdtr, |
160 &hdtr, |
161 NULL, |
161 NULL, |
162 0); |
162 0); |
163 #endif |
163 #endif |
|
164 if(ret == 0) { |
|
165 ret = sfd->hlen + sfd->tlen + sfd->len; |
|
166 } |
|
167 |
164 #else // Solaris/Linux |
168 #else // Solaris/Linux |
165 if(sfd->header) { |
169 if(sfd->header) { |
166 ret += write(st->fd, sfd->header, sfd->hlen); |
170 ret += write(st->fd, sfd->header, sfd->hlen); |
167 } |
171 } |
168 ret += sendfile(st->fd, sfd->fd->fd, &fileoffset, sfd->len); |
172 ret += sendfile(st->fd, sfd->fd->fd, &fileoffset, sfd->len); |
608 ret = st->fd->sendfile(st->fd, sfd); |
612 ret = st->fd->sendfile(st->fd, sfd); |
609 } else { |
613 } else { |
610 ret = net_fallback_sendfile((IOStream*)st, sfd); |
614 ret = net_fallback_sendfile((IOStream*)st, sfd); |
611 } |
615 } |
612 |
616 |
|
617 st->written += ret > 0 ? ret : 0; |
|
618 |
613 return ret; |
619 return ret; |
614 } |
620 } |
615 |
621 |
616 void net_http_close(HttpStream *st) { |
622 void net_http_close(HttpStream *st) { |
617 st->fd->close(st->fd); |
623 st->fd->close(st->fd); |