78a79,80
> static nxt_unit_mmap_buf_t *nxt_unit_request_preread(
> nxt_unit_request_info_t *req, size_t size);
963a966,968
> req->content_fd = recv_msg->fd;
> recv_msg->fd = -1;
>
1180a1186,1191
> if (req->content_fd != -1) {
> close(req->content_fd);
>
> req->content_fd = -1;
> }
>
2426,2427c2437,2466
< return nxt_unit_buf_read(&req->content_buf, &req->content_length,
< dst, size);
---
> ssize_t buf_res, res;
>
> buf_res = nxt_unit_buf_read(&req->content_buf, &req->content_length,
> dst, size);
>
> if (buf_res < (ssize_t) size && req->content_fd != -1) {
> res = read(req->content_fd, dst, size);
> if (res < 0) {
> nxt_unit_req_alert(req, "failed to read content: %s (%d)",
> strerror(errno), errno);
>
> return res;
> }
>
> if (res < (ssize_t) size) {
> close(req->content_fd);
>
> req->content_fd = -1;
> }
>
> req->content_length -= res;
> size -= res;
>
> dst = nxt_pointer_to(dst, res);
>
> } else {
> res = 0;
> }
>
> return buf_res + res;
2434,2436c2473,2476
< char *p;
< size_t l_size, b_size;
< nxt_unit_buf_t *b;
---
> char *p;
> size_t l_size, b_size;
> nxt_unit_buf_t *b;
> nxt_unit_mmap_buf_t *mmap_buf, *preread_buf;
2461a2502,2514
> mmap_buf = nxt_container_of(b, nxt_unit_mmap_buf_t, buf);
> if (mmap_buf->next == NULL
> && req->content_fd != -1
> && l_size < req->content_length)
> {
> preread_buf = nxt_unit_request_preread(req, 16384);
> if (nxt_slow_path(preread_buf == NULL)) {
> return -1;
> }
>
> nxt_unit_mmap_buf_insert(&mmap_buf->next, preread_buf);
> }
>
2468a2522,2577
> static nxt_unit_mmap_buf_t *
> nxt_unit_request_preread(nxt_unit_request_info_t *req, size_t size)
> {
> ssize_t res;
> nxt_unit_mmap_buf_t *mmap_buf;
>
> if (req->content_fd == -1) {
> nxt_unit_req_alert(req, "preread: content_fd == -1");
> return NULL;
> }
>
> mmap_buf = nxt_unit_mmap_buf_get(req->ctx);
> if (nxt_slow_path(mmap_buf == NULL)) {
> nxt_unit_req_alert(req, "preread: failed to allocate buf");
> return NULL;
> }
>
> mmap_buf->free_ptr = malloc(size);
> if (nxt_slow_path(mmap_buf->free_ptr == NULL)) {
> nxt_unit_req_alert(req, "preread: failed to allocate buf memory");
> nxt_unit_mmap_buf_release(mmap_buf);
> return NULL;
> }
>
> mmap_buf->plain_ptr = mmap_buf->free_ptr;
>
> mmap_buf->hdr = NULL;
> mmap_buf->buf.start = mmap_buf->free_ptr;
> mmap_buf->buf.free = mmap_buf->buf.start;
> mmap_buf->buf.end = mmap_buf->buf.start + size;
> mmap_buf->process = NULL;
>
> res = read(req->content_fd, mmap_buf->free_ptr, size);
> if (res < 0) {
> nxt_unit_req_alert(req, "failed to read content: %s (%d)",
> strerror(errno), errno);
>
> nxt_unit_mmap_buf_free(mmap_buf);
>
> return NULL;
> }
>
> if (res < (ssize_t) size) {
> close(req->content_fd);
>
> req->content_fd = -1;
> }
>
> nxt_unit_req_debug(req, "preread: read %d", (int) res);
>
> mmap_buf->buf.end = mmap_buf->buf.free + res;
>
> return mmap_buf;
> }
>
>
2474c2583
< nxt_unit_buf_t *buf;
---
> nxt_unit_buf_t *buf, *last_buf;
2479a2589
> last_buf = buf;
2481a2592,2593
> last_buf = buf;
>
2501c2613
< *b = buf;
---
> *b = last_buf;