? httpd ? parse.c ? y.tab.h Index: httpd.h =================================================================== RCS file: /cvs/src/usr.sbin/httpd/httpd.h,v retrieving revision 1.102 diff -u -p -r1.102 httpd.h --- httpd.h 2 Dec 2015 15:13:00 -0000 1.102 +++ httpd.h 15 Dec 2015 13:24:21 -0000 @@ -540,6 +540,7 @@ in_port_t int server_socket_connect(struct sockaddr_storage *, in_port_t, struct server_config *); void server_write(struct bufferevent *, void *); +void server_writing_file(struct bufferevent *, void *); void server_read(struct bufferevent *, void *); void server_error(struct bufferevent *, short, void *); void server_log(struct client *, const char *); Index: server.c =================================================================== RCS file: /cvs/src/usr.sbin/httpd/server.c,v retrieving revision 1.83 diff -u -p -r1.83 server.c --- server.c 2 Dec 2015 15:13:00 -0000 1.83 +++ server.c 15 Dec 2015 13:24:21 -0000 @@ -743,6 +743,45 @@ server_write(struct bufferevent *bev, vo } void +server_writing_file(struct bufferevent *bev, void *arg) +{ + struct client *clt = arg; + struct evbuffer *dst = EVBUFFER_OUTPUT(bev); + size_t len = EVBUFFER_LENGTH(dst); + + if (len == 0 && clt->clt_toread == TOREAD_HTTP_NONE) + goto done; + + getmonotime(&clt->clt_tv_last); + + if (clt->clt_done) + goto done; + + bufferevent_enable(bev, EV_READ); + + if (len >= bev->wm_write.low) + return; + + switch (evbuffer_read(dst, clt->clt_fd, bev->wm_write.low)) { + case -1: + clt->clt_bev->writecb = server_write; + (*bev->errorcb)(bev, EVBUFFER_WRITE|EVBUFFER_ERROR, bev->cbarg); + return; + case 0: + clt->clt_bev->writecb = server_write; + goto done; + default: + bufferevent_enable(bev, EV_WRITE); + break; + } + + return; + done: + (*bev->errorcb)(bev, EVBUFFER_WRITE|EVBUFFER_EOF, bev->cbarg); + return; +} + +void server_dump(struct client *clt, const void *buf, size_t len) { if (!len) Index: server_file.c =================================================================== RCS file: /cvs/src/usr.sbin/httpd/server_file.c,v retrieving revision 1.60 diff -u -p -r1.60 server_file.c --- server_file.c 3 Aug 2015 11:45:17 -0000 1.60 +++ server_file.c 15 Dec 2015 13:24:21 -0000 @@ -262,25 +262,11 @@ server_file_request(struct httpd *env, s if (clt->clt_srvbev != NULL) bufferevent_free(clt->clt_srvbev); - clt->clt_srvbev_throttled = 0; - clt->clt_srvbev = bufferevent_new(clt->clt_fd, server_read, - server_write, server_file_error, clt); - if (clt->clt_srvbev == NULL) { - errstr = "failed to allocate file buffer event"; - goto fail; - } - - /* Adjust read watermark to the socket output buffer size */ - bufferevent_setwatermark(clt->clt_srvbev, EV_READ, 0, - clt->clt_sndbufsiz); - - bufferevent_settimeout(clt->clt_srvbev, - srv_conf->timeout.tv_sec, srv_conf->timeout.tv_sec); - bufferevent_enable(clt->clt_srvbev, EV_READ); - bufferevent_disable(clt->clt_bev, EV_READ); + clt->clt_bev->writecb = server_writing_file; done: server_reset_http(clt); + server_writing_file(clt->clt_bev, clt); /* kick off some io */ return (0); fail: bufferevent_disable(clt->clt_bev, EV_READ|EV_WRITE);