summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorZhidao HONG <z.hong@f5.com>2024-06-11 10:18:44 +0800
committerZhidao HONG <z.hong@f5.com>2024-06-20 10:39:17 +0800
commit999d274837273e354efc05075c0b012b81902ef1 (patch)
treea5b349d73aa1f992155482efb5e984343ebd8239
parent57a0f94efb2550ea1c6cb593b2b968e022c89346 (diff)
downloadunit-999d274837273e354efc05075c0b012b81902ef1.tar.gz
unit-999d274837273e354efc05075c0b012b81902ef1.tar.bz2
http: Move chunked buffer pos pointer while parsing
Previously, Unit didn't move the buffer pointer when parsing chunked data because the buffer was not used after sent. It's used for upstream response. With the new requirement to support request chunked body, the buffer might be used for pipeline request, so it's necessary to move the pos pointer while parsing. Reviewed-by: Andrew Clayton <a.clayton@nginx.com>
-rw-r--r--src/nxt_http_chunk_parse.c10
-rw-r--r--src/nxt_http_parse.h3
2 files changed, 4 insertions, 9 deletions
diff --git a/src/nxt_http_chunk_parse.c b/src/nxt_http_chunk_parse.c
index b60bc801..a43ce75b 100644
--- a/src/nxt_http_chunk_parse.c
+++ b/src/nxt_http_chunk_parse.c
@@ -48,9 +48,7 @@ nxt_http_chunk_parse(nxt_task_t *task, nxt_http_chunk_parse_t *hcp,
for (b = in; b != NULL; b = next) {
- hcp->pos = b->mem.pos;
-
- while (hcp->pos < b->mem.free) {
+ while (b->mem.pos < b->mem.free) {
/*
* The sw_chunk state is tested outside the switch
* to preserve hcp->pos and to not touch memory.
@@ -76,7 +74,7 @@ nxt_http_chunk_parse(nxt_task_t *task, nxt_http_chunk_parse_t *hcp,
/* ret == NXT_HTTP_CHUNK_END */
}
- ch = *hcp->pos++;
+ ch = *b->mem.pos++;
switch (state) {
@@ -203,7 +201,7 @@ nxt_http_chunk_buffer(nxt_http_chunk_parse_t *hcp, nxt_buf_t ***tail,
size_t size;
nxt_buf_t *b;
- p = hcp->pos;
+ p = in->mem.pos;
size = in->mem.free - p;
b = nxt_buf_mem_alloc(hcp->mem_pool, 0, 0);
@@ -224,7 +222,7 @@ nxt_http_chunk_buffer(nxt_http_chunk_parse_t *hcp, nxt_buf_t ***tail,
if (hcp->chunk_size < size) {
p += hcp->chunk_size;
- hcp->pos = p;
+ in->mem.pos = p;
b->mem.free = p;
b->mem.end = p;
diff --git a/src/nxt_http_parse.h b/src/nxt_http_parse.h
index 9e1265d1..9e2f6fab 100644
--- a/src/nxt_http_parse.h
+++ b/src/nxt_http_parse.h
@@ -96,11 +96,8 @@ struct nxt_http_field_s {
typedef struct {
- u_char *pos;
nxt_mp_t *mem_pool;
-
uint64_t chunk_size;
-
uint8_t state;
uint8_t last; /* 1 bit */
uint8_t chunk_error; /* 1 bit */