annotate src/http/modules/ngx_http_referer_module.c @ 4248:2fad4d19ea4b stable-1.0

Merging r4151, r4152, r4177: HTTP cache related fixes: *) Cache: fix for sending of empty responses. Revert wrong fix for empty responses introduced in 0.8.31 and apply new one, rewritten to match things done by static module as close as possible. *) Cache: fix for sending of stale responses. For normal cached responses ngx_http_cache_send() sends last buffer and then request finalized via ngx_http_finalize_request() call, i.e. everything is ok. But for stale responses (i.e. when upstream died, but we have something in cache) the same ngx_http_cache_send() sends last buffer, but then in ngx_http_upstream_finalize_request() another last buffer is send. This causes duplicate final chunk to appear if chunked encoding is used (and resulting problems with keepalive connections and so on). Fix this by not sending in ngx_http_upstream_finalize_request() another last buffer if we know response was from cache. *) Fixed cache bypass caching of non-cacheable replies (ticket #21). If cache was bypassed with proxy_cache_bypass, cache-controlling headers (Cache-Control, Expires) wasn't considered and response was cached even if it was actually non-cacheable. Patch by John Ferlito.
author Igor Sysoev <igor@sysoev.ru>
date Tue, 01 Nov 2011 13:49:31 +0000
parents 6afb20bf2ad5
children d620f497c50f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4 */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_http.h>
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
12 #define NGX_HTTP_REFERER_NO_URI_PART ((void *) 4)
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
13
1785
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
14 #if !(NGX_PCRE)
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
15
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
16 #define ngx_regex_t void
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
17
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
18 #endif
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
19
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
20
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
21 typedef struct {
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
22 ngx_hash_combined_t hash;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
23
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
24 #if (NGX_PCRE)
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
25 ngx_array_t *regex;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
26 #endif
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
27
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
28 ngx_flag_t no_referer;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
29 ngx_flag_t blocked_referer;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
31 ngx_hash_keys_arrays_t *keys;
3939
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
32
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
33 ngx_uint_t referer_hash_max_size;
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
34 ngx_uint_t referer_hash_bucket_size;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
35 } ngx_http_referer_conf_t;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
37
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
38 static void * ngx_http_referer_create_conf(ngx_conf_t *cf);
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39 static char * ngx_http_referer_merge_conf(ngx_conf_t *cf, void *parent,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40 void *child);
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
41 static char *ngx_http_valid_referers(ngx_conf_t *cf, ngx_command_t *cmd,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
42 void *conf);
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
43 static char *ngx_http_add_referer(ngx_conf_t *cf, ngx_hash_keys_arrays_t *keys,
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
44 ngx_str_t *value, ngx_str_t *uri);
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
45 static char *ngx_http_add_regex_referer(ngx_conf_t *cf,
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
46 ngx_http_referer_conf_t *rlcf, ngx_str_t *name, ngx_regex_t *regex);
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
47 static int ngx_libc_cdecl ngx_http_cmp_referer_wildcards(const void *one,
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
48 const void *two);
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
50
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51 static ngx_command_t ngx_http_referer_commands[] = {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
53 { ngx_string("valid_referers"),
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
54 NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55 ngx_http_valid_referers,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56 NGX_HTTP_LOC_CONF_OFFSET,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57 0,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 NULL },
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59
3939
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
60 { ngx_string("referer_hash_max_size"),
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
61 NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
62 ngx_conf_set_num_slot,
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
63 NGX_HTTP_LOC_CONF_OFFSET,
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
64 offsetof(ngx_http_referer_conf_t, referer_hash_max_size),
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
65 NULL },
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
66
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
67 { ngx_string("referer_hash_bucket_size"),
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
68 NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
69 ngx_conf_set_num_slot,
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
70 NGX_HTTP_LOC_CONF_OFFSET,
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
71 offsetof(ngx_http_referer_conf_t, referer_hash_bucket_size),
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
72 NULL },
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
73
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74 ngx_null_command
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75 };
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78 static ngx_http_module_t ngx_http_referer_module_ctx = {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79 NULL, /* preconfiguration */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80 NULL, /* postconfiguration */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82 NULL, /* create main configuration */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83 NULL, /* init main configuration */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
84
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85 NULL, /* create server configuration */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86 NULL, /* merge server configuration */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
88 ngx_http_referer_create_conf, /* create location configuration */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
89 ngx_http_referer_merge_conf /* merge location configuration */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90 };
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
91
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
93 ngx_module_t ngx_http_referer_module = {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94 NGX_MODULE_V1,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
95 &ngx_http_referer_module_ctx, /* module context */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96 ngx_http_referer_commands, /* module directives */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
97 NGX_HTTP_MODULE, /* module type */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98 NULL, /* init master */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99 NULL, /* init module */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100 NULL, /* init process */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
101 NULL, /* init thread */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
102 NULL, /* exit thread */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103 NULL, /* exit process */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
104 NULL, /* exit master */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105 NGX_MODULE_V1_PADDING
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
106 };
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
107
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
108
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
109 static ngx_int_t
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
110 ngx_http_referer_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111 uintptr_t data)
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112 {
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
113 u_char *p, *ref, *last;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
114 size_t len;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
115 ngx_str_t *uri;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
116 ngx_uint_t i, key;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
117 ngx_http_referer_conf_t *rlcf;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
118 u_char buf[256];
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
120 rlcf = ngx_http_get_module_loc_conf(r, ngx_http_referer_module);
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
121
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
122 if (rlcf->hash.hash.buckets == NULL
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
123 && rlcf->hash.wc_head == NULL
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
124 && rlcf->hash.wc_tail == NULL
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
125 #if (NGX_PCRE)
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
126 && rlcf->regex == NULL
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
127 #endif
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
128 )
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
129 {
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
130 goto valid;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
133 if (r->headers_in.referer == NULL) {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
134 if (rlcf->no_referer) {
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
135 goto valid;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
136 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
137
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
138 goto invalid;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141 len = r->headers_in.referer->value.len;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142 ref = r->headers_in.referer->value.data;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143
3459
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
144 if (len >= sizeof("http://i.ru") - 1) {
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
145 last = ref + len;
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
146
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
147 if (ngx_strncasecmp(ref, (u_char *) "http://", 7) == 0) {
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
148 ref += 7;
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
149 goto valid_scheme;
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
150
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
151 } else if (ngx_strncasecmp(ref, (u_char *) "https://", 8) == 0) {
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
152 ref += 8;
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
153 goto valid_scheme;
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
154 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156
3459
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
157 if (rlcf->blocked_referer) {
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
158 goto valid;
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
159 }
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
160
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
161 goto invalid;
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
162
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
163 valid_scheme:
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
164
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
165 i = 0;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
166 key = 0;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
167
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
168 for (p = ref; p < last; p++) {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
169 if (*p == '/' || *p == ':') {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
170 break;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
171 }
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
172
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
173 buf[i] = ngx_tolower(*p);
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
174 key = ngx_hash(key, buf[i++]);
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
175
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
176 if (i == 256) {
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
177 goto invalid;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
178 }
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
179 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
180
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
181 uri = ngx_hash_find_combined(&rlcf->hash, key, buf, p - ref);
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
182
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
183 if (uri) {
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
184 goto uri;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
185 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
186
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
187 #if (NGX_PCRE)
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
188
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
189 if (rlcf->regex) {
1785
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
190 ngx_int_t rc;
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
191 ngx_str_t referer;
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
192
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
193 referer.len = len - 7;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
194 referer.data = ref;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
195
1785
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
196 rc = ngx_regex_exec_array(rlcf->regex, &referer, r->connection->log);
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
197
1785
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
198 if (rc == NGX_OK) {
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
199 goto valid;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
200 }
1785
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
201
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
202 if (rc == NGX_ERROR) {
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
203 return rc;
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
204 }
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
205
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
206 /* NGX_DECLINED */
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
207 }
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
208
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
209 #endif
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
210
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
211 invalid:
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
212
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
213 *v = ngx_http_variable_true_value;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
214
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
215 return NGX_OK;
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
216
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
217 uri:
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
218
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
219 for ( /* void */ ; p < last; p++) {
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
220 if (*p == '/') {
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
221 break;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
222 }
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
223 }
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
224
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
225 len = last - p;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
226
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
227 if (uri == NGX_HTTP_REFERER_NO_URI_PART) {
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
228 goto valid;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
229 }
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
230
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
231 if (len < uri->len || ngx_strncmp(uri->data, p, uri->len) != 0) {
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
232 goto invalid;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
233 }
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
234
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
235 valid:
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
236
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
237 *v = ngx_http_variable_null_value;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
238
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
239 return NGX_OK;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
240 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
241
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
242
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
243 static void *
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244 ngx_http_referer_create_conf(ngx_conf_t *cf)
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
245 {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
246 ngx_http_referer_conf_t *conf;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
247
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
248 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_referer_conf_t));
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
249 if (conf == NULL) {
2912
c7d57b539248 return NULL instead of NGX_CONF_ERROR on a create conf failure
Igor Sysoev <igor@sysoev.ru>
parents: 1800
diff changeset
250 return NULL;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
251 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
252
1782
db07cb9d1cbc regex valid_referers were not inherited
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
253 #if (NGX_PCRE)
db07cb9d1cbc regex valid_referers were not inherited
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
254 conf->regex = NGX_CONF_UNSET_PTR;
db07cb9d1cbc regex valid_referers were not inherited
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
255 #endif
db07cb9d1cbc regex valid_referers were not inherited
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
256
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
257 conf->no_referer = NGX_CONF_UNSET;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
258 conf->blocked_referer = NGX_CONF_UNSET;
3939
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
259 conf->referer_hash_max_size = NGX_CONF_UNSET_UINT;
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
260 conf->referer_hash_bucket_size = NGX_CONF_UNSET_UINT;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
261
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
262 return conf;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
263 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
264
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
265
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
266 static char *
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
267 ngx_http_referer_merge_conf(ngx_conf_t *cf, void *parent, void *child)
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
268 {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
269 ngx_http_referer_conf_t *prev = parent;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
270 ngx_http_referer_conf_t *conf = child;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
271
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
272 ngx_hash_init_t hash;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
273
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
274 if (conf->keys == NULL) {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
275 conf->hash = prev->hash;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
276
1800
3e1c695258d3 fix building --without-pcre
Igor Sysoev <igor@sysoev.ru>
parents: 1785
diff changeset
277 #if (NGX_PCRE)
1782
db07cb9d1cbc regex valid_referers were not inherited
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
278 ngx_conf_merge_ptr_value(conf->regex, prev->regex, NULL);
1800
3e1c695258d3 fix building --without-pcre
Igor Sysoev <igor@sysoev.ru>
parents: 1785
diff changeset
279 #endif
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
280 ngx_conf_merge_value(conf->no_referer, prev->no_referer, 0);
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
281 ngx_conf_merge_value(conf->blocked_referer, prev->blocked_referer, 0);
3939
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
282 ngx_conf_merge_uint_value(conf->referer_hash_max_size,
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
283 prev->referer_hash_max_size, 2048);
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
284 ngx_conf_merge_uint_value(conf->referer_hash_bucket_size,
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
285 prev->referer_hash_bucket_size, 64);
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
286
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
287 return NGX_CONF_OK;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
288 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
289
603
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
290 if ((conf->no_referer == 1 || conf->blocked_referer == 1)
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
291 && conf->keys->keys.nelts == 0
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
292 && conf->keys->dns_wc_head.nelts == 0
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
293 && conf->keys->dns_wc_tail.nelts == 0)
603
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
294 {
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
295 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
296 "the \"none\" or \"blocked\" referers are specified "
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
297 "in the \"valid_referers\" directive "
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
298 "without any valid referer");
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
299 return NGX_CONF_ERROR;
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
300 }
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
301
3939
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
302 ngx_conf_merge_uint_value(conf->referer_hash_max_size,
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
303 prev->referer_hash_max_size, 2048);
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
304 ngx_conf_merge_uint_value(conf->referer_hash_bucket_size,
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
305 prev->referer_hash_bucket_size, 64);
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
306 conf->referer_hash_bucket_size = ngx_align(conf->referer_hash_bucket_size,
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
307 ngx_cacheline_size);
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
308
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
309 hash.key = ngx_hash_key_lc;
3939
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
310 hash.max_size = conf->referer_hash_max_size;
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
311 hash.bucket_size = conf->referer_hash_bucket_size;
4241
6afb20bf2ad5 Merging r4009, r4133, r4184, r4201, r4202, r4203, r4204, r4205:
Igor Sysoev <igor@sysoev.ru>
parents: 3939
diff changeset
312 hash.name = "referer_hash";
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
313 hash.pool = cf->pool;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
314
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
315 if (conf->keys->keys.nelts) {
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
316 hash.hash = &conf->hash.hash;
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
317 hash.temp_pool = NULL;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
318
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
319 if (ngx_hash_init(&hash, conf->keys->keys.elts, conf->keys->keys.nelts)
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
320 != NGX_OK)
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
321 {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
322 return NGX_CONF_ERROR;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
323 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
324 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
325
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
326 if (conf->keys->dns_wc_head.nelts) {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
327
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
328 ngx_qsort(conf->keys->dns_wc_head.elts,
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
329 (size_t) conf->keys->dns_wc_head.nelts,
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
330 sizeof(ngx_hash_key_t),
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
331 ngx_http_cmp_referer_wildcards);
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
332
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
333 hash.hash = NULL;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
334 hash.temp_pool = cf->temp_pool;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
335
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
336 if (ngx_hash_wildcard_init(&hash, conf->keys->dns_wc_head.elts,
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
337 conf->keys->dns_wc_head.nelts)
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
338 != NGX_OK)
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
339 {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
340 return NGX_CONF_ERROR;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
341 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
342
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
343 conf->hash.wc_head = (ngx_hash_wildcard_t *) hash.hash;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
344 }
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
345
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
346 if (conf->keys->dns_wc_tail.nelts) {
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
347
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
348 ngx_qsort(conf->keys->dns_wc_tail.elts,
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
349 (size_t) conf->keys->dns_wc_tail.nelts,
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
350 sizeof(ngx_hash_key_t),
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
351 ngx_http_cmp_referer_wildcards);
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
352
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
353 hash.hash = NULL;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
354 hash.temp_pool = cf->temp_pool;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
355
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
356 if (ngx_hash_wildcard_init(&hash, conf->keys->dns_wc_tail.elts,
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
357 conf->keys->dns_wc_tail.nelts)
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
358 != NGX_OK)
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
359 {
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
360 return NGX_CONF_ERROR;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
361 }
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
362
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
363 conf->hash.wc_tail = (ngx_hash_wildcard_t *) hash.hash;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
364 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
365
1800
3e1c695258d3 fix building --without-pcre
Igor Sysoev <igor@sysoev.ru>
parents: 1785
diff changeset
366 #if (NGX_PCRE)
1782
db07cb9d1cbc regex valid_referers were not inherited
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
367 ngx_conf_merge_ptr_value(conf->regex, prev->regex, NULL);
1800
3e1c695258d3 fix building --without-pcre
Igor Sysoev <igor@sysoev.ru>
parents: 1785
diff changeset
368 #endif
1782
db07cb9d1cbc regex valid_referers were not inherited
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
369
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
370 if (conf->no_referer == NGX_CONF_UNSET) {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
371 conf->no_referer = 0;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
372 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
373
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
374 if (conf->blocked_referer == NGX_CONF_UNSET) {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
375 conf->blocked_referer = 0;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
376 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
377
611
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 603
diff changeset
378 conf->keys = NULL;
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 603
diff changeset
379
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
380 return NGX_CONF_OK;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
381 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
382
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
383
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
384 static char *
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
385 ngx_http_valid_referers(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
386 {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
387 ngx_http_referer_conf_t *rlcf = conf;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
388
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
389 u_char *p;
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
390 ngx_str_t *value, uri, name;
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
391 ngx_uint_t i, n;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
392 ngx_http_variable_t *var;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
393 ngx_http_server_name_t *sn;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
394 ngx_http_core_srv_conf_t *cscf;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
395
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 3459
diff changeset
396 ngx_str_set(&name, "invalid_referer");
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
397
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
398 var = ngx_http_add_variable(cf, &name,
1565
4c43e25d11ea fix English grammar
Igor Sysoev <igor@sysoev.ru>
parents: 1388
diff changeset
399 NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOHASH);
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
400 if (var == NULL) {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
401 return NGX_CONF_ERROR;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
402 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
403
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
404 var->get_handler = ngx_http_referer_variable;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
405
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
406 if (rlcf->keys == NULL) {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
407 rlcf->keys = ngx_pcalloc(cf->temp_pool, sizeof(ngx_hash_keys_arrays_t));
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
408 if (rlcf->keys == NULL) {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
409 return NGX_CONF_ERROR;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
410 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
411
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
412 rlcf->keys->pool = cf->pool;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
413 rlcf->keys->temp_pool = cf->pool;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
414
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
415 if (ngx_hash_keys_array_init(rlcf->keys, NGX_HASH_SMALL) != NGX_OK) {
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
416 return NGX_CONF_ERROR;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
417 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
418 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
419
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
420 value = cf->args->elts;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
421
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
422 for (i = 1; i < cf->args->nelts; i++) {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
423 if (value[i].len == 0) {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
424 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
425 "invalid referer \"%V\"", &value[i]);
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
426 return NGX_CONF_ERROR;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
427 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
428
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
429 if (ngx_strcmp(value[i].data, "none") == 0) {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
430 rlcf->no_referer = 1;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
431 continue;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
432 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
433
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
434 if (ngx_strcmp(value[i].data, "blocked") == 0) {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
435 rlcf->blocked_referer = 1;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
436 continue;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
437 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
438
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 3459
diff changeset
439 ngx_str_null(&uri);
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
440
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
441 if (ngx_strcmp(value[i].data, "server_names") == 0) {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
442
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
443 cscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_core_module);
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
444
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
445 sn = cscf->server_names.elts;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
446 for (n = 0; n < cscf->server_names.nelts; n++) {
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
447
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
448 #if (NGX_PCRE)
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
449 if (sn[n].regex) {
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
450
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
451 if (ngx_http_add_regex_referer(cf, rlcf, &sn[n].name,
3325
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
452 sn[n].regex->regex)
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
453 != NGX_OK)
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
454 {
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
455 return NGX_CONF_ERROR;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
456 }
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
457
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
458 continue;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
459 }
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
460 #endif
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
461
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
462 if (ngx_http_add_referer(cf, rlcf->keys, &sn[n].name, &uri)
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
463 != NGX_OK)
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
464 {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
465 return NGX_CONF_ERROR;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
466 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
467 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
468
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
469 continue;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
470 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
471
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
472 if (value[i].data[0] == '~') {
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
473 if (ngx_http_add_regex_referer(cf, rlcf, &value[i], NULL) != NGX_OK)
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
474 {
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
475 return NGX_CONF_ERROR;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
476 }
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
477
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
478 continue;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
479 }
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
480
1242
ae555e0549ca strstr() -> strchr()
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
481 p = (u_char *) ngx_strchr(value[i].data, '/');
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
482
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
483 if (p) {
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
484 uri.len = (value[i].data + value[i].len) - p;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
485 uri.data = p;
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
486 value[i].len = p - value[i].data;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
487 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
488
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
489 if (ngx_http_add_referer(cf, rlcf->keys, &value[i], &uri) != NGX_OK) {
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
490 return NGX_CONF_ERROR;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
491 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
492 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
493
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
494 return NGX_CONF_OK;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
495 }
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
496
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
497
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
498 static char *
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
499 ngx_http_add_referer(ngx_conf_t *cf, ngx_hash_keys_arrays_t *keys,
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
500 ngx_str_t *value, ngx_str_t *uri)
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
501 {
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
502 ngx_int_t rc;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
503 ngx_str_t *u;
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
504
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
505 if (uri->len == 0) {
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
506 u = NGX_HTTP_REFERER_NO_URI_PART;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
507
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
508 } else {
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
509 u = ngx_palloc(cf->pool, sizeof(ngx_str_t));
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
510 if (u == NULL) {
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
511 return NGX_CONF_ERROR;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
512 }
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
513
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
514 *u = *uri;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
515 }
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
516
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
517 rc = ngx_hash_add_key(keys, value, u, NGX_HASH_WILDCARD_KEY);
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
518
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
519 if (rc == NGX_OK) {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
520 return NGX_CONF_OK;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
521 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
522
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
523 if (rc == NGX_DECLINED) {
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
524 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
525 "invalid hostname or wildcard \"%V\"", value);
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
526 }
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
527
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
528 if (rc == NGX_BUSY) {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
529 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
530 "conflicting parameter \"%V\"", value);
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
531 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
532
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
533 return NGX_CONF_ERROR;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
534 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
535
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
536
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
537 static char *
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
538 ngx_http_add_regex_referer(ngx_conf_t *cf, ngx_http_referer_conf_t *rlcf,
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
539 ngx_str_t *name, ngx_regex_t *regex)
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
540 {
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
541 #if (NGX_PCRE)
3325
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
542 ngx_regex_elt_t *re;
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
543 ngx_regex_compile_t rc;
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
544 u_char errstr[NGX_MAX_CONF_ERRSTR];
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
545
3122
3e994ac670dc test space between "~" and regex in server_name and invalid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
546 if (name->len == 1) {
3e994ac670dc test space between "~" and regex in server_name and invalid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
547 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "empty regex in \"%V\"", name);
3e994ac670dc test space between "~" and regex in server_name and invalid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
548 return NGX_CONF_ERROR;
3e994ac670dc test space between "~" and regex in server_name and invalid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
549 }
3e994ac670dc test space between "~" and regex in server_name and invalid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
550
1782
db07cb9d1cbc regex valid_referers were not inherited
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
551 if (rlcf->regex == NGX_CONF_UNSET_PTR) {
1785
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
552 rlcf->regex = ngx_array_create(cf->pool, 2, sizeof(ngx_regex_elt_t));
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
553 if (rlcf->regex == NULL) {
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
554 return NGX_CONF_ERROR;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
555 }
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
556 }
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
557
1785
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
558 re = ngx_array_push(rlcf->regex);
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
559 if (re == NULL) {
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
560 return NGX_CONF_ERROR;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
561 }
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
562
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
563 if (regex) {
1785
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
564 re->regex = regex;
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
565 re->name = name->data;
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
566
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
567 return NGX_CONF_OK;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
568 }
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
569
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
570 name->len--;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
571 name->data++;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
572
3325
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
573 ngx_memzero(&rc, sizeof(ngx_regex_compile_t));
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
574
3325
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
575 rc.pattern = *name;
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
576 rc.pool = cf->pool;
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
577 rc.options = NGX_REGEX_CASELESS;
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
578 rc.err.len = NGX_MAX_CONF_ERRSTR;
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
579 rc.err.data = errstr;
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
580
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
581 if (ngx_regex_compile(&rc) != NGX_OK) {
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
582 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
583 return NGX_CONF_ERROR;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
584 }
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
585
3325
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
586 re->regex = rc.regex;
1785
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
587 re->name = name->data;
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
588
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
589 return NGX_CONF_OK;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
590
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
591 #else
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
592
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
593 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
594 "the using of the regex \"%V\" requires PCRE library",
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
595 name);
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
596
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
597 return NGX_CONF_ERROR;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
598
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
599 #endif
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
600 }
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
601
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
602
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
603 static int ngx_libc_cdecl
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
604 ngx_http_cmp_referer_wildcards(const void *one, const void *two)
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
605 {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
606 ngx_hash_key_t *first, *second;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
607
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
608 first = (ngx_hash_key_t *) one;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
609 second = (ngx_hash_key_t *) two;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
610
3116
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
611 return ngx_dns_strcmp(first->key.data, second->key.data);
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
612 }