~ubuntu-branches/ubuntu/quantal/nginx/quantal-updates

« back to all changes in this revision

Viewing changes to debian/modules/nginx-lua/src/ngx_http_lua_headers.c

  • Committer: Bazaar Package Importer
  • Author(s): Michael Lustfield, Micheal Lustfield, Kartik Mistry
  • Date: 2011-03-03 23:39:07 UTC
  • mfrom: (4.2.29 sid)
  • Revision ID: james.westby@ubuntu.com-20110303233907-y48yifhfnn5qjuxz
Tags: 0.8.54-4
[Micheal Lustfield]
* debian/nginx-{full,light,extras}.default:
  + Added comment about alternative to ULIMIT.
* debian/nginx-{full,light,extras}.init.d:
  + Added quotes around a test variable. (Closes: #610946, LP: #699736)
* debian/patches/609343-log-time-iso8601.diff:
  + Added patch to add $time_iso8601 variable to logs. (Closes: #609343)
* Clean up old logrotate files. (Closes: #608983, Closes: #610289)
  + Added Files:
    - debian/nginx-common.preinst
  + Modified Files:
    - debian/rules
  + Moved debian/nginx-common.logrotate to debian/logrotate.
* Added common files to nginx-common package. (Closes: #610290)
  + Removed Files:
    - debian/nginx-full.dirs
    - debian/nginx-light.dirs
    - debian/nginx-full.install
    - debian/nginx-light.install
    - debian/nginx-extras.install
    - debian/nginx.*
  + Added Files:
    - debian/nginx-common.default
    - debian/nginx-common.dirs
    - debian/nginx-common.init.d
    - debian/nginx-common.install
    - debian/nginx-common.manpages
    - debian/logrotate
  + Modified Files:
    - debian/nginx-extras.dirs
    - debian/control
    - debian/rules
* debian/nginx-*.install: (Closes: #609797)
  + Removed NEWS.Debian from nginx-{full,light,extras}.install.
  + Added NEWS.Debian to nginx-common.install.
* nginx-common.postinst:
  + Enforce /var/log/nginx mode and user:group. (Closes: #610983)
  + Enforce /var/log/nginx/*.log mode and user:group. (Closes: #612832)
* debian/rules:
  + Added --with-file-aio to nginx-extras. (Closes: #613175)
  + Removed split clients and user id modules from nginx-light.
* debian/conf/sites-available/default:
  + Fixed a minor typo ( s/Quickstart/QuickStart/ ). (Closes: #613355)
* debian/conf/mime.types:
  + Changed xml type to application/xhtml+xml. (Closes: #613851)
* debian/help/docs/fcgiwrap:
  + Removed Ubuntu specific line in docs. (Closes: #614987)
* debian/conf/sites-available/default:
  + Fixed a pointer to a file. (Closes: #614980)

[Kartik Mistry]
* debian/*.lintian-overrides:
  + Add Lintian overrides for nginx man page. We've manpage in nginx-common
    binary

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Copyright (C) agentzh */
 
2
 
 
3
#define DDEBUG 0
 
4
 
 
5
#include "ddebug.h"
 
6
 
 
7
#include "ngx_http_lua_headers.h"
 
8
#include "ngx_http_lua_util.h"
 
9
#include <ctype.h>
 
10
 
 
11
/* request time */
 
12
 
 
13
static ngx_int_t ngx_http_set_header(ngx_http_request_t *r,
 
14
    ngx_http_lua_header_val_t *hv, ngx_str_t *value);
 
15
 
 
16
static ngx_int_t ngx_http_set_header_helper(ngx_http_request_t *r,
 
17
    ngx_http_lua_header_val_t *hv, ngx_str_t *value,
 
18
    ngx_table_elt_t **output_header, ngx_flag_t no_create);
 
19
 
 
20
static ngx_int_t ngx_http_set_builtin_header(ngx_http_request_t *r,
 
21
    ngx_http_lua_header_val_t *hv, ngx_str_t *value);
 
22
 
 
23
static ngx_int_t ngx_http_set_content_length_header(ngx_http_request_t *r,
 
24
    ngx_http_lua_header_val_t *hv, ngx_str_t *value);
 
25
 
 
26
static ngx_int_t ngx_http_set_content_type_header(ngx_http_request_t *r,
 
27
        ngx_http_lua_header_val_t *hv, ngx_str_t *value);
 
28
 
 
29
static ngx_int_t ngx_http_clear_builtin_header(ngx_http_request_t *r,
 
30
    ngx_http_lua_header_val_t *hv, ngx_str_t *value);
 
31
 
 
32
static ngx_int_t ngx_http_clear_content_length_header(ngx_http_request_t *r,
 
33
        ngx_http_lua_header_val_t *hv, ngx_str_t *value);
 
34
 
 
35
 
 
36
static ngx_http_lua_set_header_t ngx_http_lua_set_handlers[] = {
 
37
 
 
38
    { ngx_string("Server"),
 
39
                 offsetof(ngx_http_headers_out_t, server),
 
40
                 ngx_http_set_builtin_header },
 
41
 
 
42
    { ngx_string("Date"),
 
43
                 offsetof(ngx_http_headers_out_t, date),
 
44
                 ngx_http_set_builtin_header },
 
45
 
 
46
    { ngx_string("Content-Encoding"),
 
47
                 offsetof(ngx_http_headers_out_t, content_encoding),
 
48
                 ngx_http_set_builtin_header },
 
49
 
 
50
    { ngx_string("Location"),
 
51
                 offsetof(ngx_http_headers_out_t, location),
 
52
                 ngx_http_set_builtin_header },
 
53
 
 
54
    { ngx_string("Refresh"),
 
55
                 offsetof(ngx_http_headers_out_t, refresh),
 
56
                 ngx_http_set_builtin_header },
 
57
 
 
58
    { ngx_string("Last-Modified"),
 
59
                 offsetof(ngx_http_headers_out_t, last_modified),
 
60
                 ngx_http_set_builtin_header },
 
61
 
 
62
    { ngx_string("Content-Range"),
 
63
                 offsetof(ngx_http_headers_out_t, content_range),
 
64
                 ngx_http_set_builtin_header },
 
65
 
 
66
    { ngx_string("Accept-Ranges"),
 
67
                 offsetof(ngx_http_headers_out_t, accept_ranges),
 
68
                 ngx_http_set_builtin_header },
 
69
 
 
70
    { ngx_string("WWW-Authenticate"),
 
71
                 offsetof(ngx_http_headers_out_t, www_authenticate),
 
72
                 ngx_http_set_builtin_header },
 
73
 
 
74
    { ngx_string("Expires"),
 
75
                 offsetof(ngx_http_headers_out_t, expires),
 
76
                 ngx_http_set_builtin_header },
 
77
 
 
78
    { ngx_string("E-Tag"),
 
79
                 offsetof(ngx_http_headers_out_t, etag),
 
80
                 ngx_http_set_builtin_header },
 
81
 
 
82
    { ngx_string("Content-Length"),
 
83
                 offsetof(ngx_http_headers_out_t, content_length),
 
84
                 ngx_http_set_content_length_header },
 
85
 
 
86
    { ngx_string("Content-Type"),
 
87
                 0,
 
88
                 ngx_http_set_content_type_header },
 
89
 
 
90
    { ngx_null_string, 0, ngx_http_set_header }
 
91
};
 
92
 
 
93
 
 
94
/* request time implementation */
 
95
 
 
96
static ngx_int_t
 
97
ngx_http_set_header(ngx_http_request_t *r, ngx_http_lua_header_val_t *hv,
 
98
        ngx_str_t *value)
 
99
{
 
100
    return ngx_http_set_header_helper(r, hv, value, NULL, 0);
 
101
}
 
102
 
 
103
 
 
104
static ngx_int_t
 
105
ngx_http_set_header_helper(ngx_http_request_t *r, ngx_http_lua_header_val_t *hv,
 
106
        ngx_str_t *value, ngx_table_elt_t **output_header,
 
107
        ngx_flag_t no_create)
 
108
{
 
109
    ngx_table_elt_t             *h;
 
110
    ngx_list_part_t             *part;
 
111
    ngx_uint_t                  i;
 
112
    ngx_flag_t                  matched = 0;
 
113
 
 
114
    if (hv->no_override) {
 
115
        goto new_header;
 
116
    }
 
117
 
 
118
    part = &r->headers_out.headers.part;
 
119
    h = part->elts;
 
120
 
 
121
    for (i = 0; /* void */; i++) {
 
122
        if (i >= part->nelts) {
 
123
            if (part->next == NULL) {
 
124
                break;
 
125
            }
 
126
            part = part->next;
 
127
            h = part->elts;
 
128
            i = 0;
 
129
        }
 
130
 
 
131
        if (
 
132
            (h[i].key.len == hv->key.len
 
133
                && ngx_strncasecmp(h[i].key.data,
 
134
                    hv->key.data,
 
135
                                   h[i].key.len) == 0)
 
136
            ||
 
137
            (h[i].key.len >= hv->key.len-1
 
138
                && ngx_strncasecmp(h[i].key.data,
 
139
                    hv->key.data,
 
140
                                   hv->key.len-1) == 0)
 
141
            )
 
142
        {
 
143
            if (value->len == 0) {
 
144
                dd("clearing normal header for %.*s", (int) hv->key.len,
 
145
                        hv->key.data);
 
146
 
 
147
                h[i].hash = 0;
 
148
            }
 
149
 
 
150
            h[i].value = *value;
 
151
 
 
152
            if (output_header) {
 
153
                *output_header = &h[i];
 
154
            }
 
155
 
 
156
            /* return NGX_OK; */
 
157
            matched = 1;
 
158
        }
 
159
    }
 
160
 
 
161
    if (matched){
 
162
      return NGX_OK;
 
163
    }
 
164
 
 
165
    if (no_create && value->len == 0) {
 
166
        return NGX_OK;
 
167
    }
 
168
 
 
169
new_header:
 
170
    h = ngx_list_push(&r->headers_out.headers);
 
171
 
 
172
    if (h == NULL) {
 
173
        return NGX_HTTP_INTERNAL_SERVER_ERROR;
 
174
    }
 
175
 
 
176
    if (value->len == 0) {
 
177
        h->hash = 0;
 
178
    } else {
 
179
        h->hash = hv->hash;
 
180
    }
 
181
 
 
182
    h->key = hv->key;
 
183
    h->value = *value;
 
184
 
 
185
    h->lowcase_key = ngx_pnalloc(r->pool, h->key.len);
 
186
    if (h->lowcase_key == NULL) {
 
187
        return NGX_HTTP_INTERNAL_SERVER_ERROR;
 
188
    }
 
189
 
 
190
    ngx_strlow(h->lowcase_key, h->key.data, h->key.len);
 
191
 
 
192
    if (output_header) {
 
193
        *output_header = h;
 
194
    }
 
195
 
 
196
    return NGX_OK;
 
197
}
 
198
 
 
199
 
 
200
static ngx_int_t
 
201
ngx_http_set_builtin_header(ngx_http_request_t *r, ngx_http_lua_header_val_t *hv,
 
202
        ngx_str_t *value)
 
203
{
 
204
    ngx_table_elt_t  *h, **old;
 
205
 
 
206
    if (hv->offset) {
 
207
        old = (ngx_table_elt_t **) ((char *) &r->headers_out + hv->offset);
 
208
 
 
209
    } else {
 
210
        old = NULL;
 
211
    }
 
212
 
 
213
    if (old == NULL || *old == NULL) {
 
214
        return ngx_http_set_header_helper(r, hv, value, old, 0);
 
215
    }
 
216
 
 
217
    h = *old;
 
218
 
 
219
    if (value->len == 0) {
 
220
        dd("clearing the builtin header");
 
221
 
 
222
        h->hash = 0;
 
223
        h->value = *value;
 
224
 
 
225
        return NGX_OK;
 
226
    }
 
227
 
 
228
    h->hash = hv->hash;
 
229
    h->key = hv->key;
 
230
    h->value = *value;
 
231
 
 
232
    return NGX_OK;
 
233
}
 
234
 
 
235
 
 
236
static ngx_int_t
 
237
ngx_http_set_content_type_header(ngx_http_request_t *r, ngx_http_lua_header_val_t *hv,
 
238
        ngx_str_t *value)
 
239
{
 
240
    r->headers_out.content_type_len = value->len;
 
241
    r->headers_out.content_type = *value;
 
242
    r->headers_out.content_type_hash = hv->hash;
 
243
    r->headers_out.content_type_lowcase = NULL;
 
244
 
 
245
    value->len = 0;
 
246
 
 
247
    return ngx_http_set_header_helper(r, hv, value, NULL, 1);
 
248
}
 
249
 
 
250
 
 
251
static ngx_int_t
 
252
ngx_http_set_content_length_header(ngx_http_request_t *r, ngx_http_lua_header_val_t *hv,
 
253
        ngx_str_t *value)
 
254
{
 
255
    off_t           len;
 
256
 
 
257
    if (value->len == 0) {
 
258
        return ngx_http_clear_content_length_header(r, hv, value);
 
259
    }
 
260
 
 
261
    len = ngx_atosz(value->data, value->len);
 
262
    if (len == NGX_ERROR) {
 
263
        return NGX_ERROR;
 
264
    }
 
265
 
 
266
    r->headers_out.content_length_n = len;
 
267
 
 
268
    return ngx_http_set_builtin_header(r, hv, value);
 
269
}
 
270
 
 
271
 
 
272
static ngx_int_t
 
273
ngx_http_clear_content_length_header(ngx_http_request_t *r, ngx_http_lua_header_val_t *hv,
 
274
        ngx_str_t *value)
 
275
{
 
276
    r->headers_out.content_length_n = -1;
 
277
 
 
278
    return ngx_http_clear_builtin_header(r, hv, value);
 
279
}
 
280
 
 
281
 
 
282
static ngx_int_t
 
283
ngx_http_clear_builtin_header(ngx_http_request_t *r, ngx_http_lua_header_val_t *hv,
 
284
        ngx_str_t *value)
 
285
{
 
286
    value->len = 0;
 
287
 
 
288
    return ngx_http_set_builtin_header(r, hv, value);
 
289
}
 
290
 
 
291
 
 
292
ngx_int_t
 
293
ngx_http_lua_set_header(ngx_http_request_t *r, ngx_str_t key, ngx_str_t value,
 
294
        ngx_flag_t override)
 
295
{
 
296
    ngx_http_lua_header_val_t         hv;
 
297
    ngx_http_lua_set_header_t        *handlers = ngx_http_lua_set_handlers;
 
298
 
 
299
    ngx_uint_t                        i;
 
300
 
 
301
    dd("set header value: %.*s", (int) value.len, value.data);
 
302
 
 
303
    hv.hash = 1;
 
304
    hv.key = key;
 
305
 
 
306
    hv.offset = 0;
 
307
    hv.no_override = ! override;
 
308
 
 
309
    for (i = 0; handlers[i].name.len; i++) {
 
310
        if (hv.key.len != handlers[i].name.len
 
311
                || ngx_strncasecmp(hv.key.data, handlers[i].name.data,
 
312
                    handlers[i].name.len) != 0)
 
313
        {
 
314
            dd("hv key comparison: %s <> %s", handlers[i].name.data, hv.key.data);
 
315
 
 
316
            continue;
 
317
        }
 
318
 
 
319
        dd("Matched handler: %s %s", handlers[i].name.data, hv.key.data);
 
320
 
 
321
        hv.offset = handlers[i].offset;
 
322
        hv.handler = handlers[i].handler;
 
323
 
 
324
        break;
 
325
    }
 
326
 
 
327
    if (handlers[i].name.len == 0 && handlers[i].handler) {
 
328
        hv.offset = handlers[i].offset;
 
329
        hv.handler = handlers[i].handler;
 
330
    }
 
331
 
 
332
    return hv.handler(r, &hv, &value);
 
333
}
 
334