summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn Strauss <gstrauss@gluelogic.com>2016-06-21 15:33:18 -0400
committerGlenn Strauss <gstrauss@gluelogic.com>2016-06-21 15:33:18 -0400
commit1a18669d53874259217358f255936fcaa6885fcc (patch)
treec504fd3d344558a0e5501c5d1e1b122b5cd580f5
parent16a3f3b6fc4dce10ff781d156b0296f708717d13 (diff)
downloadlighttpd-git-1a18669d53874259217358f255936fcaa6885fcc.tar.gz
chunkqueue_append_chunkqueue()
(simpler than chunkqueue_steal() for transferring entire chunkqueue)
-rw-r--r--src/chunk.c18
-rw-r--r--src/chunk.h1
-rw-r--r--src/mod_proxy.c6
-rw-r--r--src/mod_scgi.c6
4 files changed, 23 insertions, 8 deletions
diff --git a/src/chunk.c b/src/chunk.c
index c813a807..7e7d1062 100644
--- a/src/chunk.c
+++ b/src/chunk.c
@@ -281,6 +281,24 @@ void chunkqueue_append_mem(chunkqueue *cq, const char * mem, size_t len) {
chunkqueue_append_chunk(cq, c);
}
+
+void chunkqueue_append_chunkqueue(chunkqueue *cq, chunkqueue *src) {
+ if (src == NULL || NULL == src->first) return;
+
+ if (NULL == cq->first) {
+ cq->first = src->first;
+ } else {
+ cq->last->next = src->first;
+ }
+ cq->last = src->last;
+ cq->bytes_in += (src->bytes_in - src->bytes_out);
+
+ src->first = NULL;
+ src->last = NULL;
+ src->bytes_out = src->bytes_in;
+}
+
+
void chunkqueue_get_memory(chunkqueue *cq, char **mem, size_t *len, size_t min_size, size_t alloc_size) {
static const size_t REALLOC_MAX_SIZE = 256;
chunk *c;
diff --git a/src/chunk.h b/src/chunk.h
index 3cb1fc3e..6acf2cf4 100644
--- a/src/chunk.h
+++ b/src/chunk.h
@@ -56,6 +56,7 @@ void chunkqueue_append_file_fd(chunkqueue *cq, buffer *fn, int fd, off_t offset,
void chunkqueue_append_mem(chunkqueue *cq, const char *mem, size_t len); /* copies memory */
void chunkqueue_append_buffer(chunkqueue *cq, buffer *mem); /* may reset "mem" */
void chunkqueue_prepend_buffer(chunkqueue *cq, buffer *mem); /* may reset "mem" */
+void chunkqueue_append_chunkqueue(chunkqueue *cq, chunkqueue *src);
struct server; /*(declaration)*/
int chunkqueue_append_mem_to_tempfile(struct server *srv, chunkqueue *cq, const char *mem, size_t len);
diff --git a/src/mod_proxy.c b/src/mod_proxy.c
index c18a824e..0ae53778 100644
--- a/src/mod_proxy.c
+++ b/src/mod_proxy.c
@@ -511,9 +511,7 @@ static int proxy_create_env(server *srv, handler_ctx *hctx) {
/* body */
if (con->request.content_length) {
- chunkqueue *req_cq = con->request_content_queue;
-
- chunkqueue_steal(hctx->wb, req_cq, req_cq->bytes_in); /*(0 == req_cq->bytes_out)*/
+ chunkqueue_append_chunkqueue(hctx->wb, con->request_content_queue);
hctx->wb_reqlen += con->request.content_length;/* (eventual) total request size */
}
@@ -973,7 +971,7 @@ SUBREQUEST_FUNC(mod_proxy_handle_subrequest) {
handler_t r = connection_handle_read_post_state(srv, con);
chunkqueue *req_cq = con->request_content_queue;
if (0 != hctx->wb->bytes_in && !chunkqueue_is_empty(req_cq)) {
- chunkqueue_steal(hctx->wb, req_cq, req_cq->bytes_in - req_cq->bytes_out);
+ chunkqueue_append_chunkqueue(hctx->wb, req_cq);
if (fdevent_event_get_interest(srv->ev, hctx->fd) & FDEVENT_OUT) {
return (r == HANDLER_GO_ON) ? HANDLER_WAIT_FOR_EVENT : r;
}
diff --git a/src/mod_scgi.c b/src/mod_scgi.c
index 39e5e4a6..39d4e662 100644
--- a/src/mod_scgi.c
+++ b/src/mod_scgi.c
@@ -1731,9 +1731,7 @@ static int scgi_create_env(server *srv, handler_ctx *hctx) {
buffer_free(b);
if (con->request.content_length) {
- chunkqueue *req_cq = con->request_content_queue;
-
- chunkqueue_steal(hctx->wb, req_cq, req_cq->bytes_in); /*(0 == req_cq->bytes_out)*/
+ chunkqueue_append_chunkqueue(hctx->wb, con->request_content_queue);
hctx->wb_reqlen += con->request.content_length;/* (eventual) total request size */
}
@@ -2563,7 +2561,7 @@ SUBREQUEST_FUNC(mod_scgi_handle_subrequest) {
handler_t r = connection_handle_read_post_state(srv, con);
chunkqueue *req_cq = con->request_content_queue;
if (0 != hctx->wb->bytes_in && !chunkqueue_is_empty(req_cq)) {
- chunkqueue_steal(hctx->wb, req_cq, req_cq->bytes_in - req_cq->bytes_out);
+ chunkqueue_append_chunkqueue(hctx->wb, req_cq);
if (fdevent_event_get_interest(srv->ev, hctx->fd) & FDEVENT_OUT) {
return (r == HANDLER_GO_ON) ? HANDLER_WAIT_FOR_EVENT : r;
}