commit b07d2757b848245032749fb16d7a4ab6f360d7f4 from: Omar Polo date: Wed Jan 31 11:08:51 2024 UTC rework net_read() a bit - don't stop after parsing the header maybe there's some page data in the buffer, let's try to forward it immediately too. - use a local buffer plus bufferevent_read() commit - 7d2a2ace4dcbea184a9363adac6ecb9731ada286 commit + b07d2757b848245032749fb16d7a4ab6f360d7f4 blob - ed3abfee0fe463f4fc956de8d32196632a3bb4a3 blob + 6528084bfa930cd2ef30613e9c636fd130fb0de7 --- net.c +++ net.c @@ -531,10 +531,10 @@ net_ready(struct req *req) static void net_read(struct bufferevent *bev, void *d) { + static char buf[4096]; struct req *req = d; struct evbuffer *src = EVBUFFER_INPUT(bev); - uint8_t *data; - size_t len, chunk; + size_t len; int r; char *header; @@ -549,27 +549,21 @@ net_read(struct bufferevent *bev, void *d) req->done_header = 1; if (r == 0) goto err; - else if (r < 20 || r >= 30) + else if (r < 20 || r >= 30) { close_conn(0, 0, req); - return; + return; + } } - - if ((len = EVBUFFER_LENGTH(src)) == 0) - return; - data = EVBUFFER_DATA(src); /* * Split data into chunks before sending. imsg can't handle * message that are "too big". */ - while (len != 0) { - chunk = MIN(len, 4096); - net_send_ui(IMSG_BUF, req->id, data, chunk); - data += chunk; - len -= chunk; + for (;;) { + if ((len = bufferevent_read(bev, buf, sizeof(buf))) == 0) + break; + net_send_ui(IMSG_BUF, req->id, buf, len); } - - evbuffer_drain(src, EVBUFFER_LENGTH(src)); return; err: