annotate src/core/ngx_list.c @ 7892:2096b21fcd10

gRPC: RST_STREAM(NO_ERROR) handling (ticket #1792). As per https://tools.ietf.org/html/rfc7540#section-8.1, : A server can send a complete response prior to the client : sending an entire request if the response does not depend on : any portion of the request that has not been sent and : received. When this is true, a server MAY request that the : client abort transmission of a request without error by : sending a RST_STREAM with an error code of NO_ERROR after : sending a complete response (i.e., a frame with the : END_STREAM flag). Clients MUST NOT discard responses as a : result of receiving such a RST_STREAM, though clients can : always discard responses at their discretion for other : reasons. Previously, RST_STREAM(NO_ERROR) received from upstream after a frame with the END_STREAM flag was incorrectly treated as an error. Now, a single RST_STREAM(NO_ERROR) is properly handled. This fixes problems observed with modern grpc-c [1], as well as with the Go gRPC module. [1] https://github.com/grpc/grpc/pull/1661
author Ruslan Ermilov <ru@nginx.com>
date Thu, 23 Apr 2020 15:10:24 +0300
parents a82f305487c2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 416
diff changeset
1
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 416
diff changeset
2 /*
444
42d11f017717 nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents: 441
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 766
diff changeset
4 * Copyright (C) Nginx, Inc.
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 416
diff changeset
5 */
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 416
diff changeset
6
414
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
766
791ea37bc944 ngx_list_create()
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
12 ngx_list_t *
791ea37bc944 ngx_list_create()
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
13 ngx_list_create(ngx_pool_t *pool, ngx_uint_t n, size_t size)
791ea37bc944 ngx_list_create()
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
14 {
791ea37bc944 ngx_list_create()
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
15 ngx_list_t *list;
791ea37bc944 ngx_list_create()
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
16
791ea37bc944 ngx_list_create()
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
17 list = ngx_palloc(pool, sizeof(ngx_list_t));
791ea37bc944 ngx_list_create()
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
18 if (list == NULL) {
791ea37bc944 ngx_list_create()
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
19 return NULL;
791ea37bc944 ngx_list_create()
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
20 }
791ea37bc944 ngx_list_create()
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
21
5253
a82f305487c2 Simplified ngx_list_create().
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
22 if (ngx_list_init(list, pool, n, size) != NGX_OK) {
766
791ea37bc944 ngx_list_create()
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
23 return NULL;
791ea37bc944 ngx_list_create()
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
24 }
791ea37bc944 ngx_list_create()
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
25
791ea37bc944 ngx_list_create()
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
26 return list;
791ea37bc944 ngx_list_create()
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
27 }
791ea37bc944 ngx_list_create()
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
28
791ea37bc944 ngx_list_create()
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
29
791ea37bc944 ngx_list_create()
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
30 void *
791ea37bc944 ngx_list_create()
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
31 ngx_list_push(ngx_list_t *l)
414
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
32 {
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
33 void *elt;
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34 ngx_list_part_t *last;
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
35
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36 last = l->last;
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
37
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
38 if (last->nelts == l->nalloc) {
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40 /* the last part is full, allocate a new list part */
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
41
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
42 last = ngx_palloc(l->pool, sizeof(ngx_list_part_t));
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
43 if (last == NULL) {
414
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44 return NULL;
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
45 }
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
47 last->elts = ngx_palloc(l->pool, l->nalloc * l->size);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
48 if (last->elts == NULL) {
414
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49 return NULL;
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
50 }
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52 last->nelts = 0;
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
53 last->next = NULL;
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
54
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55 l->last->next = last;
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56 l->last = last;
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57 }
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59 elt = (char *) last->elts + l->size * last->nelts;
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60 last->nelts++;
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62 return elt;
388a842cbbe1 nginx-0.0.10-2004-09-03-19:50:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63 }