annotate src/http/modules/ngx_http_referer_module.c @ 5204:a64c8a5da336

PCRE: retain input pattern for all regular expressions. Previously, input pattern was kept only for regular expressions with named captures, which resulted in error log entries without input pattern for PCRE errors that occured while processing regular expressions without them. Signed-off-by: Piotr Sikora <piotr@cloudflare.com>
author Piotr Sikora <piotr@cloudflare.com>
date Thu, 02 May 2013 03:26:36 -0700
parents d620f497c50f
children 8f74cf107137
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
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 4008
diff changeset
4 * Copyright (C) Nginx, Inc.
577
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
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_http.h>
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
13 #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
14
1785
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
15 #if !(NGX_PCRE)
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
16
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
17 #define ngx_regex_t void
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
18
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
19 #endif
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
20
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
21
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
22 typedef struct {
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
23 ngx_hash_combined_t hash;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
24
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
25 #if (NGX_PCRE)
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
26 ngx_array_t *regex;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
27 #endif
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
28
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
29 ngx_flag_t no_referer;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
30 ngx_flag_t blocked_referer;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
32 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
33
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_max_size;
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
35 ngx_uint_t referer_hash_bucket_size;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36 } ngx_http_referer_conf_t;
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
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39 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
40 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
41 void *child);
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
42 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
43 void *conf);
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
44 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
45 ngx_str_t *value, ngx_str_t *uri);
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
46 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
47 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
48 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
49 const void *two);
577
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
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52 static ngx_command_t ngx_http_referer_commands[] = {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
53
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
54 { ngx_string("valid_referers"),
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55 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
56 ngx_http_valid_referers,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57 NGX_HTTP_LOC_CONF_OFFSET,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 0,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59 NULL },
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60
3939
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
61 { 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
62 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
63 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
64 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
65 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
66 NULL },
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
67
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
68 { 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
69 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
70 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
71 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
72 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
73 NULL },
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
74
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75 ngx_null_command
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
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79 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
80 NULL, /* preconfiguration */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81 NULL, /* postconfiguration */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83 NULL, /* create main configuration */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
84 NULL, /* init main configuration */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86 NULL, /* create server configuration */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87 NULL, /* merge server configuration */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
88
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
89 ngx_http_referer_create_conf, /* create location configuration */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90 ngx_http_referer_merge_conf /* merge location configuration */
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
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94 ngx_module_t ngx_http_referer_module = {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
95 NGX_MODULE_V1,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96 &ngx_http_referer_module_ctx, /* module context */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
97 ngx_http_referer_commands, /* module directives */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98 NGX_HTTP_MODULE, /* module type */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99 NULL, /* init master */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100 NULL, /* init module */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
101 NULL, /* init process */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
102 NULL, /* init thread */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103 NULL, /* exit thread */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
104 NULL, /* exit process */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105 NULL, /* exit master */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
106 NGX_MODULE_V1_PADDING
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
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
110 static ngx_int_t
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111 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
112 uintptr_t data)
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
113 {
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
114 u_char *p, *ref, *last;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
115 size_t len;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
116 ngx_str_t *uri;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
117 ngx_uint_t i, key;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
118 ngx_http_referer_conf_t *rlcf;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
119 u_char buf[256];
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
121 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
122
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
123 if (rlcf->hash.hash.buckets == NULL
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
124 && rlcf->hash.wc_head == NULL
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
125 && rlcf->hash.wc_tail == NULL
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
126 #if (NGX_PCRE)
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
127 && rlcf->regex == NULL
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
128 #endif
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
129 )
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
130 {
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
131 goto valid;
577
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
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134 if (r->headers_in.referer == NULL) {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
135 if (rlcf->no_referer) {
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
136 goto valid;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
137 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
139 goto invalid;
577
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
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142 len = r->headers_in.referer->value.len;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143 ref = r->headers_in.referer->value.data;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144
3459
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
145 if (len >= sizeof("http://i.ru") - 1) {
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
146 last = ref + len;
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
147
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
148 if (ngx_strncasecmp(ref, (u_char *) "http://", 7) == 0) {
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
149 ref += 7;
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
150 goto valid_scheme;
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
151
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
152 } else if (ngx_strncasecmp(ref, (u_char *) "https://", 8) == 0) {
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
153 ref += 8;
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
154 goto valid_scheme;
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
155 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
157
3459
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
158 if (rlcf->blocked_referer) {
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
159 goto valid;
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
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
162 goto invalid;
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
163
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
164 valid_scheme:
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
165
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
166 i = 0;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
167 key = 0;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
168
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
169 for (p = ref; p < last; p++) {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
170 if (*p == '/' || *p == ':') {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
171 break;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
172 }
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
173
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
174 buf[i] = ngx_tolower(*p);
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
175 key = ngx_hash(key, buf[i++]);
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
176
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
177 if (i == 256) {
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
178 goto invalid;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
179 }
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
180 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
182 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
183
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
184 if (uri) {
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
185 goto uri;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
186 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
187
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
188 #if (NGX_PCRE)
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
189
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
190 if (rlcf->regex) {
1785
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
191 ngx_int_t rc;
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
192 ngx_str_t referer;
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
193
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
194 referer.len = len - 7;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
195 referer.data = ref;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
196
1785
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
197 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
198
1785
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
199 if (rc == NGX_OK) {
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
200 goto valid;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
201 }
1785
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
202
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
203 if (rc == NGX_ERROR) {
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
204 return rc;
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
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
207 /* NGX_DECLINED */
1388
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
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
210 #endif
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
211
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
212 invalid:
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
213
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
214 *v = ngx_http_variable_true_value;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
215
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
216 return NGX_OK;
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
217
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
218 uri:
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
219
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
220 for ( /* void */ ; p < last; p++) {
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
221 if (*p == '/') {
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
222 break;
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
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
226 len = last - p;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
227
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
228 if (uri == NGX_HTTP_REFERER_NO_URI_PART) {
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
229 goto valid;
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
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
232 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
233 goto invalid;
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
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
236 valid:
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
237
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
238 *v = ngx_http_variable_null_value;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
239
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
240 return NGX_OK;
577
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
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244 static void *
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
245 ngx_http_referer_create_conf(ngx_conf_t *cf)
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
246 {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
247 ngx_http_referer_conf_t *conf;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
248
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
249 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
250 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
251 return NULL;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
252 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
253
1782
db07cb9d1cbc regex valid_referers were not inherited
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
254 #if (NGX_PCRE)
db07cb9d1cbc regex valid_referers were not inherited
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
255 conf->regex = NGX_CONF_UNSET_PTR;
db07cb9d1cbc regex valid_referers were not inherited
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
256 #endif
db07cb9d1cbc regex valid_referers were not inherited
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
257
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
258 conf->no_referer = NGX_CONF_UNSET;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
259 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
260 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
261 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
262
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
263 return conf;
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
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
267 static char *
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
268 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
269 {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
270 ngx_http_referer_conf_t *prev = parent;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
271 ngx_http_referer_conf_t *conf = child;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
272
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
273 ngx_hash_init_t hash;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
274
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
275 if (conf->keys == NULL) {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
276 conf->hash = prev->hash;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
277
1800
3e1c695258d3 fix building --without-pcre
Igor Sysoev <igor@sysoev.ru>
parents: 1785
diff changeset
278 #if (NGX_PCRE)
1782
db07cb9d1cbc regex valid_referers were not inherited
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
279 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
280 #endif
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
281 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
282 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
283 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
284 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
285 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
286 prev->referer_hash_bucket_size, 64);
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
287
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
288 return NGX_CONF_OK;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
289 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
290
603
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
291 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
292 && conf->keys->keys.nelts == 0
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
293 && conf->keys->dns_wc_head.nelts == 0
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
294 && conf->keys->dns_wc_tail.nelts == 0)
603
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
295 {
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
296 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
297 "the \"none\" or \"blocked\" referers are specified "
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
298 "in the \"valid_referers\" directive "
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
299 "without any valid referer");
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
300 return NGX_CONF_ERROR;
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
301 }
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
302
3939
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
303 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
304 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
305 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
306 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
307 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
308 ngx_cacheline_size);
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
309
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
310 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
311 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
312 hash.bucket_size = conf->referer_hash_bucket_size;
4008
debb2f235aa3 Fix names of the referer hash size directives introduced in r3940.
Igor Sysoev <igor@sysoev.ru>
parents: 3939
diff changeset
313 hash.name = "referer_hash";
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
314 hash.pool = cf->pool;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
315
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
316 if (conf->keys->keys.nelts) {
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
317 hash.hash = &conf->hash.hash;
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
318 hash.temp_pool = NULL;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
319
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
320 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
321 != NGX_OK)
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
322 {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
323 return NGX_CONF_ERROR;
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 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
326
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
327 if (conf->keys->dns_wc_head.nelts) {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
328
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
329 ngx_qsort(conf->keys->dns_wc_head.elts,
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
330 (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
331 sizeof(ngx_hash_key_t),
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
332 ngx_http_cmp_referer_wildcards);
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
333
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
334 hash.hash = NULL;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
335 hash.temp_pool = cf->temp_pool;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
336
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
337 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
338 conf->keys->dns_wc_head.nelts)
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
339 != NGX_OK)
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
340 {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
341 return NGX_CONF_ERROR;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
342 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
343
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
344 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
345 }
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
346
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
347 if (conf->keys->dns_wc_tail.nelts) {
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
348
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
349 ngx_qsort(conf->keys->dns_wc_tail.elts,
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
350 (size_t) conf->keys->dns_wc_tail.nelts,
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
351 sizeof(ngx_hash_key_t),
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
352 ngx_http_cmp_referer_wildcards);
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
353
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
354 hash.hash = NULL;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
355 hash.temp_pool = cf->temp_pool;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
356
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
357 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
358 conf->keys->dns_wc_tail.nelts)
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
359 != NGX_OK)
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
360 {
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
361 return NGX_CONF_ERROR;
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
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
364 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
365 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
366
1800
3e1c695258d3 fix building --without-pcre
Igor Sysoev <igor@sysoev.ru>
parents: 1785
diff changeset
367 #if (NGX_PCRE)
1782
db07cb9d1cbc regex valid_referers were not inherited
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
368 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
369 #endif
1782
db07cb9d1cbc regex valid_referers were not inherited
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
370
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
371 if (conf->no_referer == NGX_CONF_UNSET) {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
372 conf->no_referer = 0;
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
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
375 if (conf->blocked_referer == NGX_CONF_UNSET) {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
376 conf->blocked_referer = 0;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
377 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
378
611
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 603
diff changeset
379 conf->keys = NULL;
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 603
diff changeset
380
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
381 return NGX_CONF_OK;
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
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
385 static char *
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
386 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
387 {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
388 ngx_http_referer_conf_t *rlcf = conf;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
389
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
390 u_char *p;
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
391 ngx_str_t *value, uri, name;
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
392 ngx_uint_t i, n;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
393 ngx_http_variable_t *var;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
394 ngx_http_server_name_t *sn;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
395 ngx_http_core_srv_conf_t *cscf;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
396
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 3459
diff changeset
397 ngx_str_set(&name, "invalid_referer");
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
398
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
399 var = ngx_http_add_variable(cf, &name,
1565
4c43e25d11ea fix English grammar
Igor Sysoev <igor@sysoev.ru>
parents: 1388
diff changeset
400 NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOHASH);
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
401 if (var == NULL) {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
402 return NGX_CONF_ERROR;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
403 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
404
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
405 var->get_handler = ngx_http_referer_variable;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
406
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
407 if (rlcf->keys == NULL) {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
408 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
409 if (rlcf->keys == NULL) {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
410 return NGX_CONF_ERROR;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
411 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
412
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
413 rlcf->keys->pool = cf->pool;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
414 rlcf->keys->temp_pool = cf->pool;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
415
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
416 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
417 return NGX_CONF_ERROR;
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
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
421 value = cf->args->elts;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
422
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
423 for (i = 1; i < cf->args->nelts; i++) {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
424 if (value[i].len == 0) {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
425 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
426 "invalid referer \"%V\"", &value[i]);
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
427 return NGX_CONF_ERROR;
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
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
430 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
431 rlcf->no_referer = 1;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
432 continue;
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
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
435 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
436 rlcf->blocked_referer = 1;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
437 continue;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
438 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
439
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 3459
diff changeset
440 ngx_str_null(&uri);
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
441
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
442 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
443
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
444 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
445
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
446 sn = cscf->server_names.elts;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
447 for (n = 0; n < cscf->server_names.nelts; n++) {
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
448
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
449 #if (NGX_PCRE)
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
450 if (sn[n].regex) {
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
451
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
452 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
453 sn[n].regex->regex)
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
454 != NGX_OK)
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
455 {
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
456 return NGX_CONF_ERROR;
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
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
459 continue;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
460 }
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
461 #endif
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
462
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
463 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
464 != NGX_OK)
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
465 {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
466 return NGX_CONF_ERROR;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
467 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
468 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
469
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
470 continue;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
471 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
472
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
473 if (value[i].data[0] == '~') {
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
474 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
475 {
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
476 return NGX_CONF_ERROR;
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
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
479 continue;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
480 }
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
481
1242
ae555e0549ca strstr() -> strchr()
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
482 p = (u_char *) ngx_strchr(value[i].data, '/');
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
483
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
484 if (p) {
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
485 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
486 uri.data = p;
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
487 value[i].len = p - value[i].data;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
488 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
489
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
490 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
491 return NGX_CONF_ERROR;
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
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
495 return NGX_CONF_OK;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
496 }
593
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
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
499 static char *
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
500 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
501 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
502 {
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
503 ngx_int_t rc;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
504 ngx_str_t *u;
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
505
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
506 if (uri->len == 0) {
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
507 u = NGX_HTTP_REFERER_NO_URI_PART;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
508
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
509 } else {
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
510 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
511 if (u == NULL) {
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
512 return NGX_CONF_ERROR;
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
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
515 *u = *uri;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
516 }
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
517
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
518 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
519
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
520 if (rc == NGX_OK) {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
521 return NGX_CONF_OK;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
522 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
523
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
524 if (rc == NGX_DECLINED) {
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
525 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
526 "invalid hostname or wildcard \"%V\"", value);
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
527 }
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
528
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
529 if (rc == NGX_BUSY) {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
530 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
531 "conflicting parameter \"%V\"", value);
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
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
534 return NGX_CONF_ERROR;
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
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
537
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
538 static char *
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
539 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
540 ngx_str_t *name, ngx_regex_t *regex)
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
541 {
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
542 #if (NGX_PCRE)
3325
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
543 ngx_regex_elt_t *re;
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
544 ngx_regex_compile_t rc;
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
545 u_char errstr[NGX_MAX_CONF_ERRSTR];
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
546
3122
3e994ac670dc test space between "~" and regex in server_name and invalid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
547 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
548 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
549 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
550 }
3e994ac670dc test space between "~" and regex in server_name and invalid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
551
1782
db07cb9d1cbc regex valid_referers were not inherited
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
552 if (rlcf->regex == NGX_CONF_UNSET_PTR) {
1785
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
553 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
554 if (rlcf->regex == NULL) {
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
555 return NGX_CONF_ERROR;
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 }
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
558
1785
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
559 re = ngx_array_push(rlcf->regex);
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
560 if (re == NULL) {
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
561 return NGX_CONF_ERROR;
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
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
564 if (regex) {
1785
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
565 re->regex = regex;
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
566 re->name = name->data;
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
567
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
568 return NGX_CONF_OK;
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
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
571 name->len--;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
572 name->data++;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
573
3325
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
574 ngx_memzero(&rc, sizeof(ngx_regex_compile_t));
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
575
3325
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
576 rc.pattern = *name;
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
577 rc.pool = cf->pool;
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
578 rc.options = NGX_REGEX_CASELESS;
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
579 rc.err.len = NGX_MAX_CONF_ERRSTR;
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
580 rc.err.data = errstr;
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
581
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
582 if (ngx_regex_compile(&rc) != NGX_OK) {
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
583 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
584 return NGX_CONF_ERROR;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
585 }
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
586
3325
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
587 re->regex = rc.regex;
1785
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
588 re->name = name->data;
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
589
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
590 return NGX_CONF_OK;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
591
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
592 #else
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
593
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
594 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
595 "the using of the regex \"%V\" requires PCRE library",
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
596 name);
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
597
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
598 return NGX_CONF_ERROR;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
599
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
600 #endif
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
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
603
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
604 static int ngx_libc_cdecl
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
605 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
606 {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
607 ngx_hash_key_t *first, *second;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
608
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
609 first = (ngx_hash_key_t *) one;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
610 second = (ngx_hash_key_t *) two;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
611
3116
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
612 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
613 }