nginxtra 1.2.0.1 → 1.2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/bin/nginxtra +1 -1
- data/lib/nginxtra.rb +2 -0
- data/lib/nginxtra/action.rb +1 -1
- data/lib/nginxtra/actions/convert.rb +67 -0
- data/lib/nginxtra/actions/install.rb +3 -0
- data/lib/nginxtra/cli.rb +20 -0
- data/lib/nginxtra/config_converter.rb +324 -0
- data/lib/nginxtra/error.rb +3 -0
- data/src/nginx/CHANGES +45 -0
- data/src/nginx/CHANGES.ru +46 -0
- data/src/nginx/src/core/nginx.h +2 -2
- data/src/nginx/src/core/ngx_resolver.c +14 -2
- data/src/nginx/src/event/ngx_event.c +18 -21
- data/src/nginx/src/event/ngx_event.h +0 -6
- data/src/nginx/src/event/ngx_event_accept.c +90 -13
- data/src/nginx/src/event/ngx_event_openssl.c +1 -0
- data/src/nginx/src/http/modules/ngx_http_fastcgi_module.c +26 -4
- data/src/nginx/src/http/modules/ngx_http_flv_module.c +1 -1
- data/src/nginx/src/http/modules/ngx_http_geo_module.c +62 -74
- data/src/nginx/src/http/modules/ngx_http_geoip_module.c +130 -30
- data/src/nginx/src/http/modules/ngx_http_gzip_static_module.c +1 -1
- data/src/nginx/src/http/modules/ngx_http_mp4_module.c +1 -1
- data/src/nginx/src/http/modules/ngx_http_realip_module.c +45 -93
- data/src/nginx/src/http/modules/ngx_http_scgi_module.c +2 -0
- data/src/nginx/src/http/modules/ngx_http_stub_status_module.c +1 -1
- data/src/nginx/src/http/modules/ngx_http_uwsgi_module.c +2 -0
- data/src/nginx/src/http/modules/perl/nginx.pm +1 -1
- data/src/nginx/src/http/ngx_http_core_module.c +104 -0
- data/src/nginx/src/http/ngx_http_core_module.h +3 -0
- data/src/nginx/src/http/ngx_http_parse.c +20 -0
- data/src/nginx/src/http/ngx_http_request.c +26 -15
- data/src/nginx/src/http/ngx_http_script.c +0 -1
- data/src/nginx/src/http/ngx_http_upstream_round_robin.c +72 -170
- data/src/nginx/src/http/ngx_http_upstream_round_robin.h +1 -0
- data/src/nginx/src/os/unix/ngx_errno.h +2 -0
- metadata +6 -4
data/lib/nginxtra/error.rb
CHANGED
data/src/nginx/CHANGES
CHANGED
@@ -1,4 +1,49 @@
|
|
1
1
|
|
2
|
+
Changes with nginx 1.2.1 05 Jun 2012
|
3
|
+
|
4
|
+
*) Security: now nginx/Windows ignores trailing dot in URI path
|
5
|
+
component, and does not allow URIs with ":$" in it.
|
6
|
+
Thanks to Vladimir Kochetkov, Positive Research Center.
|
7
|
+
|
8
|
+
*) Feature: the "debug_connection" directive now supports IPv6 addresses
|
9
|
+
and the "unix:" parameter.
|
10
|
+
|
11
|
+
*) Feature: the "set_real_ip_from" directive and the "proxy" parameter
|
12
|
+
of the "geo" directive now support IPv6 addresses.
|
13
|
+
|
14
|
+
*) Feature: the "real_ip_recursive", "geoip_proxy", and
|
15
|
+
"geoip_proxy_recursive" directives.
|
16
|
+
|
17
|
+
*) Feature: the "proxy_recursive" parameter of the "geo" directive.
|
18
|
+
|
19
|
+
*) Bugfix: a segmentation fault might occur in a worker process if the
|
20
|
+
"resolver" directive was used.
|
21
|
+
|
22
|
+
*) Bugfix: a segmentation fault might occur in a worker process if the
|
23
|
+
"fastcgi_pass", "scgi_pass", or "uwsgi_pass" directives were used and
|
24
|
+
backend returned incorrect response.
|
25
|
+
|
26
|
+
*) Bugfix: a segmentation fault might occur in a worker process if the
|
27
|
+
"rewrite" directive was used and new request arguments in a
|
28
|
+
replacement used variables.
|
29
|
+
|
30
|
+
*) Bugfix: nginx might hog CPU if the open file resource limit was
|
31
|
+
reached.
|
32
|
+
|
33
|
+
*) Bugfix: nginx might loop infinitely over backends if the
|
34
|
+
"proxy_next_upstream" directive with the "http_404" parameter was
|
35
|
+
used and there were backup servers specified in an upstream block.
|
36
|
+
|
37
|
+
*) Bugfix: adding the "down" parameter of the "server" directive might
|
38
|
+
cause unneeded client redistribution among backend servers if the
|
39
|
+
"ip_hash" directive was used.
|
40
|
+
|
41
|
+
*) Bugfix: socket leak.
|
42
|
+
Thanks to Yichun Zhang.
|
43
|
+
|
44
|
+
*) Bugfix: in the ngx_http_fastcgi_module.
|
45
|
+
|
46
|
+
|
2
47
|
Changes with nginx 1.2.0 23 Apr 2012
|
3
48
|
|
4
49
|
*) Bugfix: a segmentation fault might occur in a worker process if the
|
data/src/nginx/CHANGES.ru
CHANGED
@@ -1,4 +1,50 @@
|
|
1
1
|
|
2
|
+
Изменения в nginx 1.2.1 05.06.2012
|
3
|
+
|
4
|
+
*) Безопасность: теперь nginx/Windows игнорирует точку в конце
|
5
|
+
компонента URI и не разрешает URI, содержащие последовательность
|
6
|
+
":$".
|
7
|
+
Спасибо Владимиру Кочеткову, Positive Research Center.
|
8
|
+
|
9
|
+
*) Добавление: директива debug_connection теперь поддерживает
|
10
|
+
IPv6-адреса и параметр "unix:".
|
11
|
+
|
12
|
+
*) Добавление: директива set_real_ip_from и параметр proxy директивы geo
|
13
|
+
теперь поддерживают IPv6-адреса.
|
14
|
+
|
15
|
+
*) Добавление: директивы real_ip_recursive, geoip_proxy и
|
16
|
+
geoip_proxy_recursive.
|
17
|
+
|
18
|
+
*) Добавление: параметр proxy_recursive директивы geo.
|
19
|
+
|
20
|
+
*) Исправление: в рабочем процессе мог произойти segmentation fault,
|
21
|
+
если использовалась директива resolver.
|
22
|
+
|
23
|
+
*) Исправление: в рабочем процессе мог произойти segmentation fault,
|
24
|
+
если использовались директивы fastcgi_pass, scgi_pass или uwsgi_pass
|
25
|
+
и бэкенд возвращал некорректный ответ.
|
26
|
+
|
27
|
+
*) Исправление: в рабочем процессе мог произойти segmentation fault,
|
28
|
+
если использовалась директива rewrite и в новых аргументах запроса в
|
29
|
+
строке замены использовались переменные.
|
30
|
+
|
31
|
+
*) Исправление: nginx мог нагружать процессор, если было достигнуто
|
32
|
+
ограничение на количество открытых файлов.
|
33
|
+
|
34
|
+
*) Исправление: при использовании директивы proxy_next_upstream с
|
35
|
+
параметром http_404 nginx мог бесконечно перебирать бэкенды, если в
|
36
|
+
блоке upstream был хотя бы один сервер с флагом backup.
|
37
|
+
|
38
|
+
*) Исправление: при использовании директивы ip_hash установка параметра
|
39
|
+
down директивы server могла приводить к ненужному перераспределению
|
40
|
+
клиентов между бэкендами.
|
41
|
+
|
42
|
+
*) Исправление: утечки сокетов.
|
43
|
+
Спасибо Yichun Zhang.
|
44
|
+
|
45
|
+
*) Исправление: в модуле ngx_http_fastcgi_module.
|
46
|
+
|
47
|
+
|
2
48
|
Изменения в nginx 1.2.0 23.04.2012
|
3
49
|
|
4
50
|
*) Исправление: в рабочем процессе мог произойти segmentation fault,
|
data/src/nginx/src/core/nginx.h
CHANGED
@@ -513,8 +513,10 @@ ngx_resolve_name_locked(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx)
|
|
513
513
|
|
514
514
|
/* lock alloc mutex */
|
515
515
|
|
516
|
-
|
517
|
-
|
516
|
+
if (rn->query) {
|
517
|
+
ngx_resolver_free_locked(r, rn->query);
|
518
|
+
rn->query = NULL;
|
519
|
+
}
|
518
520
|
|
519
521
|
if (rn->cnlen) {
|
520
522
|
ngx_resolver_free_locked(r, rn->u.cname);
|
@@ -1409,6 +1411,9 @@ ngx_resolver_process_a(ngx_resolver_t *r, u_char *buf, size_t last,
|
|
1409
1411
|
ngx_resolver_free(r, addrs);
|
1410
1412
|
}
|
1411
1413
|
|
1414
|
+
ngx_resolver_free(r, rn->query);
|
1415
|
+
rn->query = NULL;
|
1416
|
+
|
1412
1417
|
return;
|
1413
1418
|
|
1414
1419
|
} else if (cname) {
|
@@ -1441,6 +1446,9 @@ ngx_resolver_process_a(ngx_resolver_t *r, u_char *buf, size_t last,
|
|
1441
1446
|
(void) ngx_resolve_name_locked(r, ctx);
|
1442
1447
|
}
|
1443
1448
|
|
1449
|
+
ngx_resolver_free(r, rn->query);
|
1450
|
+
rn->query = NULL;
|
1451
|
+
|
1444
1452
|
return;
|
1445
1453
|
}
|
1446
1454
|
|
@@ -1834,6 +1842,10 @@ ngx_resolver_create_name_query(ngx_resolver_node_t *rn, ngx_resolver_ctx_t *ctx)
|
|
1834
1842
|
p--;
|
1835
1843
|
*p-- = '\0';
|
1836
1844
|
|
1845
|
+
if (ctx->name.len == 0) {
|
1846
|
+
return NGX_DECLINED;
|
1847
|
+
}
|
1848
|
+
|
1837
1849
|
for (s = ctx->name.data + ctx->name.len - 1; s >= ctx->name.data; s--) {
|
1838
1850
|
if (*s != '.') {
|
1839
1851
|
*p = *s;
|
@@ -1064,38 +1064,34 @@ ngx_event_debug_connection(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
|
1064
1064
|
|
1065
1065
|
ngx_int_t rc;
|
1066
1066
|
ngx_str_t *value;
|
1067
|
-
ngx_event_debug_t *dc;
|
1068
1067
|
struct hostent *h;
|
1069
|
-
ngx_cidr_t
|
1068
|
+
ngx_cidr_t *cidr;
|
1070
1069
|
|
1071
1070
|
value = cf->args->elts;
|
1072
1071
|
|
1073
|
-
|
1074
|
-
if (
|
1072
|
+
cidr = ngx_array_push(&ecf->debug_connection);
|
1073
|
+
if (cidr == NULL) {
|
1075
1074
|
return NGX_CONF_ERROR;
|
1076
1075
|
}
|
1077
1076
|
|
1078
|
-
|
1077
|
+
#if (NGX_HAVE_UNIX_DOMAIN)
|
1078
|
+
|
1079
|
+
if (ngx_strcmp(value[1].data, "unix:") == 0) {
|
1080
|
+
cidr->family = AF_UNIX;
|
1081
|
+
return NGX_CONF_OK;
|
1082
|
+
}
|
1083
|
+
|
1084
|
+
#endif
|
1085
|
+
|
1086
|
+
rc = ngx_ptocidr(&value[1], cidr);
|
1079
1087
|
|
1080
1088
|
if (rc == NGX_DONE) {
|
1081
1089
|
ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
|
1082
1090
|
"low address bits of %V are meaningless", &value[1]);
|
1083
|
-
|
1091
|
+
return NGX_CONF_OK;
|
1084
1092
|
}
|
1085
1093
|
|
1086
1094
|
if (rc == NGX_OK) {
|
1087
|
-
|
1088
|
-
/* AF_INET only */
|
1089
|
-
|
1090
|
-
if (cidr.family != AF_INET) {
|
1091
|
-
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
1092
|
-
"\"debug_connection\" supports IPv4 only");
|
1093
|
-
return NGX_CONF_ERROR;
|
1094
|
-
}
|
1095
|
-
|
1096
|
-
dc->mask = cidr.u.in.mask;
|
1097
|
-
dc->addr = cidr.u.in.addr;
|
1098
|
-
|
1099
1095
|
return NGX_CONF_OK;
|
1100
1096
|
}
|
1101
1097
|
|
@@ -1107,8 +1103,9 @@ ngx_event_debug_connection(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
|
1107
1103
|
return NGX_CONF_ERROR;
|
1108
1104
|
}
|
1109
1105
|
|
1110
|
-
|
1111
|
-
|
1106
|
+
cidr->family = AF_INET;
|
1107
|
+
cidr->u.in.mask = 0xffffffff;
|
1108
|
+
cidr->u.in.addr = *(in_addr_t *)(h->h_addr_list[0]);
|
1112
1109
|
|
1113
1110
|
#else
|
1114
1111
|
|
@@ -1142,7 +1139,7 @@ ngx_event_core_create_conf(ngx_cycle_t *cycle)
|
|
1142
1139
|
#if (NGX_DEBUG)
|
1143
1140
|
|
1144
1141
|
if (ngx_array_init(&ecf->debug_connection, cycle->pool, 4,
|
1145
|
-
sizeof(
|
1142
|
+
sizeof(ngx_cidr_t)) == NGX_ERROR)
|
1146
1143
|
{
|
1147
1144
|
return NULL;
|
1148
1145
|
}
|
@@ -221,12 +221,6 @@ struct ngx_event_aio_s {
|
|
221
221
|
#endif
|
222
222
|
|
223
223
|
|
224
|
-
typedef struct {
|
225
|
-
in_addr_t mask;
|
226
|
-
in_addr_t addr;
|
227
|
-
} ngx_event_debug_t;
|
228
|
-
|
229
|
-
|
230
224
|
typedef struct {
|
231
225
|
ngx_int_t (*add)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
|
232
226
|
ngx_int_t (*del)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
|
@@ -21,6 +21,7 @@ ngx_event_accept(ngx_event_t *ev)
|
|
21
21
|
socklen_t socklen;
|
22
22
|
ngx_err_t err;
|
23
23
|
ngx_log_t *log;
|
24
|
+
ngx_uint_t level;
|
24
25
|
ngx_socket_t s;
|
25
26
|
ngx_event_t *rev, *wev;
|
26
27
|
ngx_listening_t *ls;
|
@@ -31,6 +32,14 @@ ngx_event_accept(ngx_event_t *ev)
|
|
31
32
|
static ngx_uint_t use_accept4 = 1;
|
32
33
|
#endif
|
33
34
|
|
35
|
+
if (ev->timedout) {
|
36
|
+
if (ngx_enable_accept_events((ngx_cycle_t *) ngx_cycle) != NGX_OK) {
|
37
|
+
return;
|
38
|
+
}
|
39
|
+
|
40
|
+
ev->timedout = 0;
|
41
|
+
}
|
42
|
+
|
34
43
|
ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module);
|
35
44
|
|
36
45
|
if (ngx_event_flags & NGX_USE_RTSIG_EVENT) {
|
@@ -70,10 +79,17 @@ ngx_event_accept(ngx_event_t *ev)
|
|
70
79
|
return;
|
71
80
|
}
|
72
81
|
|
82
|
+
level = NGX_LOG_ALERT;
|
83
|
+
|
84
|
+
if (err == NGX_ECONNABORTED) {
|
85
|
+
level = NGX_LOG_ERR;
|
86
|
+
|
87
|
+
} else if (err == NGX_EMFILE || err == NGX_ENFILE) {
|
88
|
+
level = NGX_LOG_CRIT;
|
89
|
+
}
|
90
|
+
|
73
91
|
#if (NGX_HAVE_ACCEPT4)
|
74
|
-
ngx_log_error(
|
75
|
-
NGX_LOG_ERR : NGX_LOG_ALERT),
|
76
|
-
ev->log, err,
|
92
|
+
ngx_log_error(level, ev->log, err,
|
77
93
|
use_accept4 ? "accept4() failed" : "accept() failed");
|
78
94
|
|
79
95
|
if (use_accept4 && err == NGX_ENOSYS) {
|
@@ -82,9 +98,7 @@ ngx_event_accept(ngx_event_t *ev)
|
|
82
98
|
continue;
|
83
99
|
}
|
84
100
|
#else
|
85
|
-
ngx_log_error(
|
86
|
-
NGX_LOG_ERR : NGX_LOG_ALERT),
|
87
|
-
ev->log, err, "accept() failed");
|
101
|
+
ngx_log_error(level, ev->log, err, "accept() failed");
|
88
102
|
#endif
|
89
103
|
|
90
104
|
if (err == NGX_ECONNABORTED) {
|
@@ -97,6 +111,26 @@ ngx_event_accept(ngx_event_t *ev)
|
|
97
111
|
}
|
98
112
|
}
|
99
113
|
|
114
|
+
if (err == NGX_EMFILE || err == NGX_ENFILE) {
|
115
|
+
if (ngx_disable_accept_events((ngx_cycle_t *) ngx_cycle)
|
116
|
+
!= NGX_OK)
|
117
|
+
{
|
118
|
+
return;
|
119
|
+
}
|
120
|
+
|
121
|
+
if (ngx_use_accept_mutex) {
|
122
|
+
if (ngx_accept_mutex_held) {
|
123
|
+
ngx_shmtx_unlock(&ngx_accept_mutex);
|
124
|
+
ngx_accept_mutex_held = 0;
|
125
|
+
}
|
126
|
+
|
127
|
+
ngx_accept_disabled = 1;
|
128
|
+
|
129
|
+
} else {
|
130
|
+
ngx_add_timer(ev, ecf->accept_mutex_delay);
|
131
|
+
}
|
132
|
+
}
|
133
|
+
|
100
134
|
return;
|
101
135
|
}
|
102
136
|
|
@@ -252,17 +286,56 @@ ngx_event_accept(ngx_event_t *ev)
|
|
252
286
|
#if (NGX_DEBUG)
|
253
287
|
{
|
254
288
|
|
255
|
-
|
256
|
-
|
257
|
-
|
289
|
+
struct sockaddr_in *sin;
|
290
|
+
ngx_cidr_t *cidr;
|
291
|
+
ngx_uint_t i;
|
292
|
+
#if (NGX_HAVE_INET6)
|
293
|
+
struct sockaddr_in6 *sin6;
|
294
|
+
ngx_uint_t n;
|
295
|
+
#endif
|
258
296
|
|
259
|
-
|
260
|
-
dc = ecf->debug_connection.elts;
|
297
|
+
cidr = ecf->debug_connection.elts;
|
261
298
|
for (i = 0; i < ecf->debug_connection.nelts; i++) {
|
262
|
-
if (
|
263
|
-
|
299
|
+
if (cidr[i].family != c->sockaddr->sa_family) {
|
300
|
+
goto next;
|
301
|
+
}
|
302
|
+
|
303
|
+
switch (cidr[i].family) {
|
304
|
+
|
305
|
+
#if (NGX_HAVE_INET6)
|
306
|
+
case AF_INET6:
|
307
|
+
sin6 = (struct sockaddr_in6 *) c->sockaddr;
|
308
|
+
for (n = 0; n < 16; n++) {
|
309
|
+
if ((sin6->sin6_addr.s6_addr[n]
|
310
|
+
& cidr[i].u.in6.mask.s6_addr[n])
|
311
|
+
!= cidr[i].u.in6.addr.s6_addr[n])
|
312
|
+
{
|
313
|
+
goto next;
|
314
|
+
}
|
315
|
+
}
|
316
|
+
break;
|
317
|
+
#endif
|
318
|
+
|
319
|
+
#if (NGX_HAVE_UNIX_DOMAIN)
|
320
|
+
case AF_UNIX:
|
321
|
+
break;
|
322
|
+
#endif
|
323
|
+
|
324
|
+
default: /* AF_INET */
|
325
|
+
sin = (struct sockaddr_in *) c->sockaddr;
|
326
|
+
if ((sin->sin_addr.s_addr & cidr[i].u.in.mask)
|
327
|
+
!= cidr[i].u.in.addr)
|
328
|
+
{
|
329
|
+
goto next;
|
330
|
+
}
|
264
331
|
break;
|
265
332
|
}
|
333
|
+
|
334
|
+
log->log_level = NGX_LOG_DEBUG_CONNECTION|NGX_LOG_DEBUG_ALL;
|
335
|
+
break;
|
336
|
+
|
337
|
+
next:
|
338
|
+
continue;
|
266
339
|
}
|
267
340
|
|
268
341
|
}
|
@@ -344,6 +417,10 @@ ngx_enable_accept_events(ngx_cycle_t *cycle)
|
|
344
417
|
|
345
418
|
c = ls[i].connection;
|
346
419
|
|
420
|
+
if (c->read->active) {
|
421
|
+
continue;
|
422
|
+
}
|
423
|
+
|
347
424
|
if (ngx_event_flags & NGX_USE_RTSIG_EVENT) {
|
348
425
|
|
349
426
|
if (ngx_add_conn(c) == NGX_ERROR) {
|
@@ -619,6 +619,7 @@ ngx_http_fastcgi_handler(ngx_http_request_t *r)
|
|
619
619
|
u->process_header = ngx_http_fastcgi_process_header;
|
620
620
|
u->abort_request = ngx_http_fastcgi_abort_request;
|
621
621
|
u->finalize_request = ngx_http_fastcgi_finalize_request;
|
622
|
+
r->state = 0;
|
622
623
|
|
623
624
|
u->buffering = 1;
|
624
625
|
|
@@ -1194,6 +1195,8 @@ ngx_http_fastcgi_reinit_request(ngx_http_request_t *r)
|
|
1194
1195
|
f->fastcgi_stdout = 0;
|
1195
1196
|
f->large_stderr = 0;
|
1196
1197
|
|
1198
|
+
r->state = 0;
|
1199
|
+
|
1197
1200
|
return NGX_OK;
|
1198
1201
|
}
|
1199
1202
|
|
@@ -1353,7 +1356,11 @@ ngx_http_fastcgi_process_header(ngx_http_request_t *r)
|
|
1353
1356
|
}
|
1354
1357
|
|
1355
1358
|
} else {
|
1356
|
-
f->
|
1359
|
+
if (f->padding) {
|
1360
|
+
f->state = ngx_http_fastcgi_st_padding;
|
1361
|
+
} else {
|
1362
|
+
f->state = ngx_http_fastcgi_st_version;
|
1363
|
+
}
|
1357
1364
|
}
|
1358
1365
|
|
1359
1366
|
continue;
|
@@ -1686,7 +1693,12 @@ ngx_http_fastcgi_input_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)
|
|
1686
1693
|
}
|
1687
1694
|
|
1688
1695
|
if (f->type == NGX_HTTP_FASTCGI_STDOUT && f->length == 0) {
|
1689
|
-
|
1696
|
+
|
1697
|
+
if (f->padding) {
|
1698
|
+
f->state = ngx_http_fastcgi_st_padding;
|
1699
|
+
} else {
|
1700
|
+
f->state = ngx_http_fastcgi_st_version;
|
1701
|
+
}
|
1690
1702
|
|
1691
1703
|
if (!flcf->keep_conn) {
|
1692
1704
|
p->upstream_done = 1;
|
@@ -1699,7 +1711,13 @@ ngx_http_fastcgi_input_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)
|
|
1699
1711
|
}
|
1700
1712
|
|
1701
1713
|
if (f->type == NGX_HTTP_FASTCGI_END_REQUEST) {
|
1702
|
-
|
1714
|
+
|
1715
|
+
if (f->padding) {
|
1716
|
+
f->state = ngx_http_fastcgi_st_padding;
|
1717
|
+
} else {
|
1718
|
+
f->state = ngx_http_fastcgi_st_version;
|
1719
|
+
}
|
1720
|
+
|
1703
1721
|
p->upstream_done = 1;
|
1704
1722
|
|
1705
1723
|
if (flcf->keep_conn) {
|
@@ -1772,7 +1790,11 @@ ngx_http_fastcgi_input_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)
|
|
1772
1790
|
}
|
1773
1791
|
|
1774
1792
|
} else {
|
1775
|
-
f->
|
1793
|
+
if (f->padding) {
|
1794
|
+
f->state = ngx_http_fastcgi_st_padding;
|
1795
|
+
} else {
|
1796
|
+
f->state = ngx_http_fastcgi_st_version;
|
1797
|
+
}
|
1776
1798
|
}
|
1777
1799
|
|
1778
1800
|
continue;
|