annotate src/stream/ngx_stream_return_module.c @ 7690:8253424d1aff

Added size check to ngx_http_alloc_large_header_buffer(). This ensures that copying won't write more than the buffer size even if the buffer comes from hc->free and it is smaller than the large client header buffer size in the virtual host configuration. This might happen if size of large client header buffers is different in name-based virtual hosts, similarly to the problem with number of buffers fixed in 6926:e662cbf1b932.
author Maxim Dounin <mdounin@mdounin.ru>
date Thu, 06 Aug 2020 05:02:22 +0300
parents 56fc55e32f23
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6612
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
2 /*
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
3 * Copyright (C) Roman Arutyunyan
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
4 * Copyright (C) Nginx, Inc.
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
5 */
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
6
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
7
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
8 #include <ngx_config.h>
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
9 #include <ngx_core.h>
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
10 #include <ngx_stream.h>
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
11
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
12
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
13 typedef struct {
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
14 ngx_stream_complex_value_t text;
6612
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
15 } ngx_stream_return_srv_conf_t;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
16
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
17
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
18 typedef struct {
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
19 ngx_chain_t *out;
6612
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
20 } ngx_stream_return_ctx_t;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
21
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
22
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
23 static void ngx_stream_return_handler(ngx_stream_session_t *s);
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
24 static void ngx_stream_return_write_handler(ngx_event_t *ev);
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
25
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
26 static void *ngx_stream_return_create_srv_conf(ngx_conf_t *cf);
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
27 static char *ngx_stream_return(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
28
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
29
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
30 static ngx_command_t ngx_stream_return_commands[] = {
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
31
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
32 { ngx_string("return"),
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
33 NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
34 ngx_stream_return,
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
35 NGX_STREAM_SRV_CONF_OFFSET,
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
36 0,
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
37 NULL },
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
38
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
39 ngx_null_command
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
40 };
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
41
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
42
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
43 static ngx_stream_module_t ngx_stream_return_module_ctx = {
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
44 NULL, /* preconfiguration */
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
45 NULL, /* postconfiguration */
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
46
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
47 NULL, /* create main configuration */
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
48 NULL, /* init main configuration */
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
49
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
50 ngx_stream_return_create_srv_conf, /* create server configuration */
6629
8ed51b02f655 Stream: style.
Vladimir Homutov <vl@nginx.com>
parents: 6612
diff changeset
51 NULL /* merge server configuration */
6612
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
52 };
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
53
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
54
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
55 ngx_module_t ngx_stream_return_module = {
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
56 NGX_MODULE_V1,
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
57 &ngx_stream_return_module_ctx, /* module context */
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
58 ngx_stream_return_commands, /* module directives */
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
59 NGX_STREAM_MODULE, /* module type */
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
60 NULL, /* init master */
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
61 NULL, /* init module */
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
62 NULL, /* init process */
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
63 NULL, /* init thread */
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
64 NULL, /* exit thread */
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
65 NULL, /* exit process */
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
66 NULL, /* exit master */
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
67 NGX_MODULE_V1_PADDING
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
68 };
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
69
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
70
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
71 static void
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
72 ngx_stream_return_handler(ngx_stream_session_t *s)
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
73 {
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
74 ngx_str_t text;
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
75 ngx_buf_t *b;
6612
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
76 ngx_connection_t *c;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
77 ngx_stream_return_ctx_t *ctx;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
78 ngx_stream_return_srv_conf_t *rscf;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
79
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
80 c = s->connection;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
81
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
82 c->log->action = "returning text";
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
83
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
84 rscf = ngx_stream_get_module_srv_conf(s, ngx_stream_return_module);
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
85
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
86 if (ngx_stream_complex_value(s, &rscf->text, &text) != NGX_OK) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6629
diff changeset
87 ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6612
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
88 return;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
89 }
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
90
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
91 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0,
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
92 "stream return text: \"%V\"", &text);
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
93
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
94 if (text.len == 0) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6629
diff changeset
95 ngx_stream_finalize_session(s, NGX_STREAM_OK);
6612
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
96 return;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
97 }
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
98
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
99 ctx = ngx_pcalloc(c->pool, sizeof(ngx_stream_return_ctx_t));
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
100 if (ctx == NULL) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6629
diff changeset
101 ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6612
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
102 return;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
103 }
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
104
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
105 ngx_stream_set_ctx(s, ctx, ngx_stream_return_module);
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
106
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
107 b = ngx_calloc_buf(c->pool);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
108 if (b == NULL) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
109 ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
110 return;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
111 }
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
112
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
113 b->memory = 1;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
114 b->pos = text.data;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
115 b->last = text.data + text.len;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
116 b->last_buf = 1;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
117
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
118 ctx->out = ngx_alloc_chain_link(c->pool);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
119 if (ctx->out == NULL) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
120 ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
121 return;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
122 }
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
123
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
124 ctx->out->buf = b;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
125 ctx->out->next = NULL;
6612
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
126
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
127 c->write->handler = ngx_stream_return_write_handler;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
128
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
129 ngx_stream_return_write_handler(c->write);
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
130 }
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
131
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
132
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
133 static void
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
134 ngx_stream_return_write_handler(ngx_event_t *ev)
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
135 {
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
136 ngx_connection_t *c;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
137 ngx_stream_session_t *s;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
138 ngx_stream_return_ctx_t *ctx;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
139
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
140 c = ev->data;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
141 s = c->data;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
142
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
143 if (ev->timedout) {
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
144 ngx_connection_error(c, NGX_ETIMEDOUT, "connection timed out");
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6629
diff changeset
145 ngx_stream_finalize_session(s, NGX_STREAM_OK);
6612
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
146 return;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
147 }
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
148
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
149 ctx = ngx_stream_get_module_ctx(s, ngx_stream_return_module);
6612
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
150
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
151 if (ngx_stream_top_filter(s, ctx->out, 1) == NGX_ERROR) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
152 ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
153 return;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
154 }
6612
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
155
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
156 ctx->out = NULL;
6612
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
157
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
158 if (!c->buffered) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
159 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0,
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
160 "stream return done sending");
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
161 ngx_stream_finalize_session(s, NGX_STREAM_OK);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6674
diff changeset
162 return;
6612
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
163 }
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
164
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
165 if (ngx_handle_write_event(ev, 0) != NGX_OK) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6629
diff changeset
166 ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6612
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
167 return;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
168 }
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
169
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
170 ngx_add_timer(ev, 5000);
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
171 }
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
172
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
173
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
174 static void *
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
175 ngx_stream_return_create_srv_conf(ngx_conf_t *cf)
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
176 {
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
177 ngx_stream_return_srv_conf_t *conf;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
178
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
179 conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_return_srv_conf_t));
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
180 if (conf == NULL) {
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
181 return NULL;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
182 }
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
183
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
184 return conf;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
185 }
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
186
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
187
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
188 static char *
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
189 ngx_stream_return(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
190 {
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
191 ngx_stream_return_srv_conf_t *rscf = conf;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
192
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
193 ngx_str_t *value;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
194 ngx_stream_core_srv_conf_t *cscf;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
195 ngx_stream_compile_complex_value_t ccv;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
196
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
197 if (rscf->text.value.data) {
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
198 return "is duplicate";
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
199 }
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
200
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
201 value = cf->args->elts;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
202
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
203 ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t));
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
204
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
205 ccv.cf = cf;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
206 ccv.value = &value[1];
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
207 ccv.complex_value = &rscf->text;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
208
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
209 if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) {
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
210 return NGX_CONF_ERROR;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
211 }
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
212
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
213 cscf = ngx_stream_conf_get_module_srv_conf(cf, ngx_stream_core_module);
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
214
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
215 cscf->handler = ngx_stream_return_handler;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
216
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
217 return NGX_CONF_OK;
4c4ac9e335c4 Stream: return module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
218 }