Deleted Added
1
2/*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) NGINX, Inc.
5 */
6
7#include <nxt_router.h>
8#include <nxt_http.h>

--- 803 unchanged lines hidden (view full) ---

812
813 return NXT_OK;
814}
815
816
817static void
818nxt_h1p_request_body_read(nxt_task_t *task, nxt_http_request_t *r)
819{
820 size_t size, body_length;
821 nxt_buf_t *in, *b;
822 nxt_conn_t *c;
823 nxt_h1proto_t *h1p;
824 nxt_http_status_t status;
825
826 h1p = r->proto.h1;
827
828 nxt_debug(task, "h1p request body read %O te:%d",
829 r->content_length_n, h1p->transfer_encoding);
830
831 switch (h1p->transfer_encoding) {
832
833 case NXT_HTTP_TE_CHUNKED:

--- 10 unchanged lines hidden (view full) ---

844 }
845
846 if (r->content_length_n == -1 || r->content_length_n == 0) {
847 goto ready;
848 }
849
850 body_length = (size_t) r->content_length_n;
851
852 b = r->body;
853
854 if (b == NULL) {
855 b = nxt_buf_mem_alloc(r->mem_pool, body_length, 0);
856 if (nxt_slow_path(b == NULL)) {
857 status = NXT_HTTP_INTERNAL_SERVER_ERROR;
858 goto error;
859 }
860
861 r->body = b;
862 }
863
864 in = h1p->conn->read;
865
866 size = nxt_buf_mem_used_size(&in->mem);
867
868 if (size != 0) {
869 if (size > body_length) {
870 size = body_length;
871 }
872
873 b->mem.free = nxt_cpymem(b->mem.free, in->mem.pos, size);
874 in->mem.pos += size;
875 }
876
877 size = nxt_buf_mem_free_size(&b->mem);
878
879 nxt_debug(task, "h1p body rest: %uz", size);
880
881 if (size != 0) {
882 in->next = h1p->buffers;
883 h1p->buffers = in;
884 h1p->nbuffers++;
885
886 c = h1p->conn;
887 c->read = b;
888 c->read_state = &nxt_h1p_read_body_state;
889
890 nxt_conn_read(task->thread->engine, c);
891 return;
892 }
893
894ready:
895
896 r->state->ready_handler(task, r, NULL);
897
898 return;
899
900error:
901

--- 15 unchanged lines hidden (view full) ---

917 .timer_data = offsetof(nxt_socket_conf_t, body_read_timeout),
918 .timer_autoreset = 1,
919};
920
921
922static void
923nxt_h1p_conn_request_body_read(nxt_task_t *task, void *obj, void *data)
924{
925 size_t size;
926 nxt_conn_t *c;
927 nxt_h1proto_t *h1p;
928 nxt_http_request_t *r;
929 nxt_event_engine_t *engine;
930
931 c = obj;
932 h1p = data;
933
934 nxt_debug(task, "h1p conn request body read");
935
936 size = nxt_buf_mem_free_size(&c->read->mem);
937
938 nxt_debug(task, "h1p body rest: %uz", size);
939
940 engine = task->thread->engine;
941
942 if (size != 0) {
943 nxt_conn_read(engine, c);
944
945 } else {
946 c->read = NULL;
947 r = h1p->request;
948
949 r->state->ready_handler(task, r, NULL);
950 }
951}
952
953
954static void
955nxt_h1p_request_local_addr(nxt_task_t *task, nxt_http_request_t *r)

--- 1179 unchanged lines hidden (view full) ---

2135 header->mem.free = p;
2136 size = p - header->mem.pos;
2137
2138 c = peer->proto.h1->conn;
2139 c->write = header;
2140 c->write_state = &nxt_h1p_peer_header_send_state;
2141
2142 if (r->body != NULL) {
2143 body = nxt_buf_mem_alloc(r->mem_pool, 0, 0);
2144 if (nxt_slow_path(body == NULL)) {
2145 r->state->error_handler(task, r, peer);
2146 return;
2147 }
2148
2149 header->next = body;
2150
2151 body->mem = r->body->mem;
2152 size += nxt_buf_mem_used_size(&body->mem);
2153
2154// nxt_mp_retain(r->mem_pool);
2155 }
2156
2157 if (size > 16384) {
2158 /* Use proxy_send_timeout instead of proxy_timeout. */
2159 c->write_state = &nxt_h1p_peer_header_body_send_state;
2160 }
2161

--- 38 unchanged lines hidden (view full) ---

2200 peer = data;
2201
2202 nxt_debug(task, "h1p peer header sent");
2203
2204 engine = task->thread->engine;
2205
2206 c->write = nxt_sendbuf_completion(task, &engine->fast_work_queue, c->write);
2207
2208 if (c->write == NULL) {
2209 r = peer->request;
2210 r->state->ready_handler(task, r, peer);
2211 return;
2212 }
2213
2214 nxt_conn_write(engine, c);
2215}
2216
2217
2218static void
2219nxt_h1p_peer_header_read(nxt_task_t *task, nxt_http_peer_t *peer)
2220{
2221 nxt_conn_t *c;
2222

--- 401 unchanged lines hidden ---