annotate src/http/modules/ngx_http_browser_module.c @ 6785:d1d0dd69a419

Upstream: added the ngx_http_upstream_resolved_t.name field. This fixes inconsistency in what is stored in the "host" field. Normally it would contain the "host" part of the parsed URL (e.g., proxy_pass with variables), but for the case of an implicit upstream specified with literal address it contained the text representation of the socket address (that is, host including port for IP). Now the "host" field always contains the "host" part of the URL, while the text representation of the socket address is stored in the newly added "name" field. The ngx_http_upstream_create_round_robin_peer() function was modified accordingly in a way to be compatible with the code that does not know about the new "name" field. The "stream" code was similarly modified except for not adding compatibility in ngx_stream_upstream_create_round_robin_peer(). This change is also a prerequisite for the next change.
author Ruslan Ermilov <ru@nginx.com>
date Mon, 31 Oct 2016 18:33:33 +0300
parents f84a98a03d0d
children 1b82e86dd3e7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 2912
diff changeset
4 * Copyright (C) Nginx, Inc.
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5 */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_http.h>
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13 /*
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
14 * The module can check browser versions conforming to the following formats:
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
15 * X, X.X, X.X.X, and X.X.X.X. The maximum values of each format may be
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16 * 4000, 4000.99, 4000.99.99, and 4000.99.99.99.
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
17 */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
18
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
19
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
20 #define NGX_HTTP_MODERN_BROWSER 0
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
21 #define NGX_HTTP_ANCIENT_BROWSER 1
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
22
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
23
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
24 typedef struct {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
25 u_char browser[12];
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
26 size_t skip;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
27 size_t add;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
28 u_char name[12];
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
29 } ngx_http_modern_browser_mask_t;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
32 typedef struct {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
33 ngx_uint_t version;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34 size_t skip;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
35 size_t add;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36 u_char name[12];
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
37 } ngx_http_modern_browser_t;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
38
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40 typedef struct {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
41 ngx_str_t name;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
42 ngx_http_get_variable_pt handler;
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
43 uintptr_t data;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
44 } ngx_http_browser_variable_t;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
45
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
47 typedef struct {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48 ngx_array_t *modern_browsers;
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
49 ngx_array_t *ancient_browsers;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
50 ngx_http_variable_value_t *modern_browser_value;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
51 ngx_http_variable_value_t *ancient_browser_value;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
52
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
53 unsigned modern_unlisted_browsers:1;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
54 unsigned netscape4:1;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55 } ngx_http_browser_conf_t;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 static ngx_int_t ngx_http_msie_variable(ngx_http_request_t *r,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59 ngx_http_variable_value_t *v, uintptr_t data);
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
60 static ngx_int_t ngx_http_browser_variable(ngx_http_request_t *r,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
61 ngx_http_variable_value_t *v, uintptr_t data);
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
62
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
63 static ngx_uint_t ngx_http_browser(ngx_http_request_t *r,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
64 ngx_http_browser_conf_t *cf);
754
4ac89c5aa10d style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 718
diff changeset
65
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
66 static ngx_int_t ngx_http_browser_add_variable(ngx_conf_t *cf);
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67 static void *ngx_http_browser_create_conf(ngx_conf_t *cf);
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68 static char *ngx_http_browser_merge_conf(ngx_conf_t *cf, void *parent,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
69 void *child);
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
70 static int ngx_libc_cdecl ngx_http_modern_browser_sort(const void *one,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
71 const void *two);
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72 static char *ngx_http_modern_browser(ngx_conf_t *cf, ngx_command_t *cmd,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
73 void *conf);
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
74 static char *ngx_http_ancient_browser(ngx_conf_t *cf, ngx_command_t *cmd,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
75 void *conf);
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76 static char *ngx_http_modern_browser_value(ngx_conf_t *cf, ngx_command_t *cmd,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77 void *conf);
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
78 static char *ngx_http_ancient_browser_value(ngx_conf_t *cf, ngx_command_t *cmd,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
79 void *conf);
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82 static ngx_command_t ngx_http_browser_commands[] = {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
84 { ngx_string("modern_browser"),
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
85 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86 ngx_http_modern_browser,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87 NGX_HTTP_LOC_CONF_OFFSET,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
88 0,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
89 NULL },
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
91 { ngx_string("ancient_browser"),
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
92 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
93 ngx_http_ancient_browser,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
94 NGX_HTTP_LOC_CONF_OFFSET,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
95 0,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
96 NULL },
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
97
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98 { ngx_string("modern_browser_value"),
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100 ngx_http_modern_browser_value,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
101 NGX_HTTP_LOC_CONF_OFFSET,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
102 0,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103 NULL },
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
104
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
105 { ngx_string("ancient_browser_value"),
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
106 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
107 ngx_http_ancient_browser_value,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
108 NGX_HTTP_LOC_CONF_OFFSET,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
109 0,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
110 NULL },
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
111
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112 ngx_null_command
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
113 };
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
116 static ngx_http_module_t ngx_http_browser_module_ctx = {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117 ngx_http_browser_add_variable, /* preconfiguration */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118 NULL, /* postconfiguration */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120 NULL, /* create main configuration */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
121 NULL, /* init main configuration */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
122
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
123 NULL, /* create server configuration */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
124 NULL, /* merge server configuration */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
125
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
126 ngx_http_browser_create_conf, /* create location configuration */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
127 ngx_http_browser_merge_conf /* merge location configuration */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128 };
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131 ngx_module_t ngx_http_browser_module = {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132 NGX_MODULE_V1,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
133 &ngx_http_browser_module_ctx, /* module context */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134 ngx_http_browser_commands, /* module directives */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135 NGX_HTTP_MODULE, /* module type */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136 NULL, /* init master */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
137 NULL, /* init module */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138 NULL, /* init process */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139 NULL, /* init thread */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140 NULL, /* exit thread */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141 NULL, /* exit process */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142 NULL, /* exit master */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143 NGX_MODULE_V1_PADDING
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144 };
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
145
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147 static ngx_http_modern_browser_mask_t ngx_http_modern_browser_masks[] = {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
148
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
149 /* Opera must be the first browser to check */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
150
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
151 /*
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
152 * "Opera/7.50 (X11; FreeBSD i386; U) [en]"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
153 * "Mozilla/5.0 (X11; FreeBSD i386; U) Opera 7.50 [en]"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
154 * "Mozilla/4.0 (compatible; MSIE 6.0; X11; FreeBSD i386) Opera 7.50 [en]"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155 * "Opera/8.0 (Windows NT 5.1; U; ru)"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156 * "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; en) Opera 8.0"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
157 * "Opera/9.01 (X11; FreeBSD 6 i386; U; en)"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
158 */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
159
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
160 { "opera",
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
161 0,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
162 sizeof("Opera ") - 1,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
163 "Opera"},
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
164
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
165 /* "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
166
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
167 { "msie",
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
168 sizeof("Mozilla/4.0 (compatible; ") - 1,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
169 sizeof("MSIE ") - 1,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
170 "MSIE "},
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
171
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
172 /*
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
173 * "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.0) Gecko/20020610"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174 * "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.5) Gecko/20031006"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
175 * "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.6) Gecko/20040206
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
176 * Firefox/0.8"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
177 * "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.8)
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
178 * Gecko/20050511 Firefox/1.0.4"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179 * "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.0.5) Gecko/20060729
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
180 * Firefox/1.5.0.5"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181 */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
182
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
183 { "gecko",
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
184 sizeof("Mozilla/5.0 (") - 1,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
185 sizeof("rv:") - 1,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
186 "rv:"},
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
187
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
188 /*
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
189 * "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ru-ru) AppleWebKit/125.2
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
190 * (KHTML, like Gecko) Safari/125.7"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
191 * "Mozilla/5.0 (SymbianOS/9.1; U; en-us) AppleWebKit/413
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192 * (KHTML, like Gecko) Safari/413"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193 * "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
194 * (KHTML, like Gecko) Safari/417.9.3"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
195 * "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ru-ru) AppleWebKit/418.8
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
196 * (KHTML, like Gecko) Safari/419.3"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
197 */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
198
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
199 { "safari",
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
200 sizeof("Mozilla/5.0 (") - 1,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
201 sizeof("Safari/") - 1,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
202 "Safari/"},
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
203
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
204 /*
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
205 * "Mozilla/5.0 (compatible; Konqueror/3.1; Linux)"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
206 * "Mozilla/5.0 (compatible; Konqueror/3.4; Linux) KHTML/3.4.2 (like Gecko)"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
207 * "Mozilla/5.0 (compatible; Konqueror/3.5; FreeBSD) KHTML/3.5.1
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
208 * (like Gecko)"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
209 */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
210
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
211 { "konqueror",
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
212 sizeof("Mozilla/5.0 (compatible; ") - 1,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
213 sizeof("Konqueror/") - 1,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
214 "Konqueror/"},
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
215
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
216 { "", 0, 0, "" }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
217
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
218 };
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
219
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
220
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
221 static ngx_http_browser_variable_t ngx_http_browsers[] = {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
222 { ngx_string("msie"), ngx_http_msie_variable, 0 },
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
223 { ngx_string("modern_browser"), ngx_http_browser_variable,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
224 NGX_HTTP_MODERN_BROWSER },
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
225 { ngx_string("ancient_browser"), ngx_http_browser_variable,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
226 NGX_HTTP_ANCIENT_BROWSER },
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
227 { ngx_null_string, NULL, 0 }
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
228 };
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
230
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
231 static ngx_int_t
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
232 ngx_http_browser_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
233 uintptr_t data)
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
234 {
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
235 ngx_uint_t rc;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
236 ngx_http_browser_conf_t *cf;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
237
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
238 cf = ngx_http_get_module_loc_conf(r, ngx_http_browser_module);
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
239
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
240 rc = ngx_http_browser(r, cf);
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
241
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
242 if (data == NGX_HTTP_MODERN_BROWSER && rc == NGX_HTTP_MODERN_BROWSER) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
243 *v = *cf->modern_browser_value;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244 return NGX_OK;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
245 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
246
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
247 if (data == NGX_HTTP_ANCIENT_BROWSER && rc == NGX_HTTP_ANCIENT_BROWSER) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
248 *v = *cf->ancient_browser_value;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
249 return NGX_OK;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
250 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
251
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
252 *v = ngx_http_variable_null_value;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
253 return NGX_OK;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
254 }
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
255
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
256
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
257 static ngx_uint_t
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
258 ngx_http_browser(ngx_http_request_t *r, ngx_http_browser_conf_t *cf)
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
259 {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
260 size_t len;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
261 u_char *name, *ua, *last, c;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
262 ngx_str_t *ancient;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
263 ngx_uint_t i, version, ver, scale;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
264 ngx_http_modern_browser_t *modern;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
265
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
266 if (r->headers_in.user_agent == NULL) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
267 if (cf->modern_unlisted_browsers) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
268 return NGX_HTTP_MODERN_BROWSER;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
269 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
270
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
271 return NGX_HTTP_ANCIENT_BROWSER;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
272 }
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
273
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
274 ua = r->headers_in.user_agent->value.data;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
275 len = r->headers_in.user_agent->value.len;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
276 last = ua + len;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
277
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
278 if (cf->modern_browsers) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
279 modern = cf->modern_browsers->elts;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
280
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
281 for (i = 0; i < cf->modern_browsers->nelts; i++) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
282 name = ua + modern[i].skip;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
283
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
284 if (name >= last) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
285 continue;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
286 }
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
287
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
288 name = (u_char *) ngx_strstr(name, modern[i].name);
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
289
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
290 if (name == NULL) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
291 continue;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
292 }
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
293
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
294 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
295 "browser: \"%s\"", name);
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
296
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
297 name += modern[i].add;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
298
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
299 if (name >= last) {
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
300 continue;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
301 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
302
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
303 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
304 "version: \"%ui\" \"%s\"", modern[i].version, name);
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
305
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
306 version = 0;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
307 ver = 0;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
308 scale = 1000000;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
309
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
310 while (name < last) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
311
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
312 c = *name++;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
313
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
314 if (c >= '0' && c <= '9') {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
315 ver = ver * 10 + (c - '0');
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
316 continue;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
317 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
318
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
319 if (c == '.') {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
320 version += ver * scale;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
321
2510
fa03c3846ca4 add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 2509
diff changeset
322 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
fa03c3846ca4 add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 2509
diff changeset
323 "version: \"%ui\" \"%ui\"",
fa03c3846ca4 add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 2509
diff changeset
324 modern[i].version, version);
fa03c3846ca4 add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 2509
diff changeset
325
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
326 if (version > modern[i].version) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
327 return NGX_HTTP_MODERN_BROWSER;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
328 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
329
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
330 ver = 0;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
331 scale /= 100;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
332 continue;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
333 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
334
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
335 break;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
336 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
337
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
338 version += ver * scale;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
339
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
340 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
341 "version: \"%ui\" \"%ui\"",
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
342 modern[i].version, version);
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
343
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
344 if (version >= modern[i].version) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
345 return NGX_HTTP_MODERN_BROWSER;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
346 }
2509
b4661481f198 the $ancient_browser variables did not treat as an ancient browser
Igor Sysoev <igor@sysoev.ru>
parents: 1565
diff changeset
347
b4661481f198 the $ancient_browser variables did not treat as an ancient browser
Igor Sysoev <igor@sysoev.ru>
parents: 1565
diff changeset
348 return NGX_HTTP_ANCIENT_BROWSER;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
349 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
350
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
351 if (!cf->modern_unlisted_browsers) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
352 return NGX_HTTP_ANCIENT_BROWSER;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
353 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
354 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
355
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
356 if (cf->netscape4) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
357 if (len > sizeof("Mozilla/4.72 ") - 1
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
358 && ngx_strncmp(ua, "Mozilla/", sizeof("Mozilla/") - 1) == 0
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
359 && ua[8] > '0' && ua[8] < '5')
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
360 {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
361 return NGX_HTTP_ANCIENT_BROWSER;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
362 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
363 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
364
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
365 if (cf->ancient_browsers) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
366 ancient = cf->ancient_browsers->elts;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
367
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
368 for (i = 0; i < cf->ancient_browsers->nelts; i++) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
369 if (len >= ancient[i].len
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
370 && ngx_strstr(ua, ancient[i].data) != NULL)
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
371 {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
372 return NGX_HTTP_ANCIENT_BROWSER;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
373 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
374 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
375 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
376
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
377 if (cf->modern_unlisted_browsers) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
378 return NGX_HTTP_MODERN_BROWSER;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
379 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
380
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
381 return NGX_HTTP_ANCIENT_BROWSER;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
382 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
383
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
384
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
385 static ngx_int_t
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
386 ngx_http_msie_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
387 uintptr_t data)
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
388 {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
389 if (r->headers_in.msie) {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
390 *v = ngx_http_variable_true_value;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
391 return NGX_OK;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
392 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
393
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
394 *v = ngx_http_variable_null_value;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
395 return NGX_OK;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
396 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
397
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
398
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
399 static ngx_int_t
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
400 ngx_http_browser_add_variable(ngx_conf_t *cf)
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
401 {
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
402 ngx_http_browser_variable_t *var;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
403 ngx_http_variable_t *v;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
404
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
405 for (var = ngx_http_browsers; var->name.len; var++) {
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
406
1565
4c43e25d11ea fix English grammar
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
407 v = ngx_http_add_variable(cf, &var->name, NGX_HTTP_VAR_CHANGEABLE);
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
408 if (v == NULL) {
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
409 return NGX_ERROR;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
410 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
411
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
412 v->get_handler = var->handler;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
413 v->data = var->data;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
414 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
415
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
416 return NGX_OK;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
417 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
418
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
419
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
420 static void *
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
421 ngx_http_browser_create_conf(ngx_conf_t *cf)
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
422 {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
423 ngx_http_browser_conf_t *conf;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
424
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
425 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_browser_conf_t));
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
426 if (conf == NULL) {
2912
c7d57b539248 return NULL instead of NGX_CONF_ERROR on a create conf failure
Igor Sysoev <igor@sysoev.ru>
parents: 2510
diff changeset
427 return NULL;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
428 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
429
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
430 /*
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
431 * set by ngx_pcalloc():
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
432 *
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
433 * conf->modern_browsers = NULL;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
434 * conf->ancient_browsers = NULL;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
435 * conf->modern_browser_value = NULL;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
436 * conf->ancient_browser_value = NULL;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
437 *
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
438 * conf->modern_unlisted_browsers = 0;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
439 * conf->netscape4 = 0;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
440 */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
441
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
442 return conf;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
443 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
444
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
445
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
446 static char *
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
447 ngx_http_browser_merge_conf(ngx_conf_t *cf, void *parent, void *child)
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
448 {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
449 ngx_http_browser_conf_t *prev = parent;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
450 ngx_http_browser_conf_t *conf = child;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
451
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
452 ngx_uint_t i, n;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
453 ngx_http_modern_browser_t *browsers, *opera;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
454
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
455 /*
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
456 * At the merge the skip field is used to store the browser slot,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
457 * it will be used in sorting and then will overwritten
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
458 * with a real skip value. The zero value means Opera.
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
459 */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
460
4581
f84a98a03d0d Fixed directives inheritance.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
461 if (conf->modern_browsers == NULL && conf->modern_unlisted_browsers == 0) {
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
462 conf->modern_browsers = prev->modern_browsers;
4581
f84a98a03d0d Fixed directives inheritance.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
463 conf->modern_unlisted_browsers = prev->modern_unlisted_browsers;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
464
4581
f84a98a03d0d Fixed directives inheritance.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
465 } else if (conf->modern_browsers != NULL) {
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
466 browsers = conf->modern_browsers->elts;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
467
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
468 for (i = 0; i < conf->modern_browsers->nelts; i++) {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
469 if (browsers[i].skip == 0) {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
470 goto found;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
471 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
472 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
473
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
474 /*
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
475 * Opera may contain MSIE string, so if Opera was not enumerated
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
476 * as modern browsers, then add it and set a unreachable version
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
477 */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
478
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
479 opera = ngx_array_push(conf->modern_browsers);
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
480 if (opera == NULL) {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
481 return NGX_CONF_ERROR;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
482 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
483
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
484 opera->skip = 0;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
485 opera->version = 4001000000U;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
486
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
487 browsers = conf->modern_browsers->elts;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
488
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
489 found:
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
490
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
491 ngx_qsort(browsers, (size_t) conf->modern_browsers->nelts,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
492 sizeof(ngx_http_modern_browser_t),
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
493 ngx_http_modern_browser_sort);
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
494
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
495 for (i = 0; i < conf->modern_browsers->nelts; i++) {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
496 n = browsers[i].skip;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
497
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
498 browsers[i].skip = ngx_http_modern_browser_masks[n].skip;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
499 browsers[i].add = ngx_http_modern_browser_masks[n].add;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
500 (void) ngx_cpystrn(browsers[i].name,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
501 ngx_http_modern_browser_masks[n].name, 12);
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
502 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
503 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
504
4581
f84a98a03d0d Fixed directives inheritance.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
505 if (conf->ancient_browsers == NULL && conf->netscape4 == 0) {
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
506 conf->ancient_browsers = prev->ancient_browsers;
4581
f84a98a03d0d Fixed directives inheritance.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
507 conf->netscape4 = prev->netscape4;
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
508 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
509
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
510 if (conf->modern_browser_value == NULL) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
511 conf->modern_browser_value = prev->modern_browser_value;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
512 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
513
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
514 if (conf->modern_browser_value == NULL) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
515 conf->modern_browser_value = &ngx_http_variable_true_value;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
516 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
517
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
518 if (conf->ancient_browser_value == NULL) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
519 conf->ancient_browser_value = prev->ancient_browser_value;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
520 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
521
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
522 if (conf->ancient_browser_value == NULL) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
523 conf->ancient_browser_value = &ngx_http_variable_true_value;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
524 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
525
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
526 return NGX_CONF_OK;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
527 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
528
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
529
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
530 static int ngx_libc_cdecl
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
531 ngx_http_modern_browser_sort(const void *one, const void *two)
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
532 {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
533 ngx_http_modern_browser_t *first = (ngx_http_modern_browser_t *) one;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
534 ngx_http_modern_browser_t *second = (ngx_http_modern_browser_t *) two;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
535
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
536 return (first->skip - second->skip);
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
537 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
538
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
539
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
540 static char *
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
541 ngx_http_modern_browser(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
542 {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
543 ngx_http_browser_conf_t *bcf = conf;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
544
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
545 u_char c;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
546 ngx_str_t *value;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
547 ngx_uint_t i, n, version, ver, scale;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
548 ngx_http_modern_browser_t *browser;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
549 ngx_http_modern_browser_mask_t *mask;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
550
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
551 value = cf->args->elts;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
552
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
553 if (cf->args->nelts == 2) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
554 if (ngx_strcmp(value[1].data, "unlisted") == 0) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
555 bcf->modern_unlisted_browsers = 1;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
556 return NGX_CONF_OK;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
557 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
558
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
559 return NGX_CONF_ERROR;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
560 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
561
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
562 if (bcf->modern_browsers == NULL) {
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
563 bcf->modern_browsers = ngx_array_create(cf->pool, 5,
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
564 sizeof(ngx_http_modern_browser_t));
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
565 if (bcf->modern_browsers == NULL) {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
566 return NGX_CONF_ERROR;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
567 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
568 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
569
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
570 browser = ngx_array_push(bcf->modern_browsers);
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
571 if (browser == NULL) {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
572 return NGX_CONF_ERROR;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
573 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
574
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
575 mask = ngx_http_modern_browser_masks;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
576
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
577 for (n = 0; mask[n].browser[0] != '\0'; n++) {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
578 if (ngx_strcasecmp(mask[n].browser, value[1].data) == 0) {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
579 goto found;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
580 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
581 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
582
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
583 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
584 "unknown browser name \"%V\"", &value[1]);
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
585
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
586 return NGX_CONF_ERROR;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
587
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
588 found:
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
589
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
590 /*
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
591 * at this stage the skip field is used to store the browser slot,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
592 * it will be used in sorting in merge stage and then will overwritten
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
593 * with a real value
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
594 */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
595
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
596 browser->skip = n;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
597
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
598 version = 0;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
599 ver = 0;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
600 scale = 1000000;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
601
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
602 for (i = 0; i < value[2].len; i++) {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
603
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
604 c = value[2].data[i];
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
605
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
606 if (c >= '0' && c <= '9') {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
607 ver = ver * 10 + (c - '0');
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
608 continue;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
609 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
610
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
611 if (c == '.') {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
612 version += ver * scale;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
613 ver = 0;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
614 scale /= 100;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
615 continue;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
616 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
617
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
618 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
619 "invalid browser version \"%V\"", &value[2]);
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
620
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
621 return NGX_CONF_ERROR;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
622 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
623
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
624 version += ver * scale;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
625
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
626 browser->version = version;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
627
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
628 return NGX_CONF_OK;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
629 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
630
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
631
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
632 static char *
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
633 ngx_http_ancient_browser(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
634 {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
635 ngx_http_browser_conf_t *bcf = conf;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
636
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
637 ngx_str_t *value, *browser;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
638 ngx_uint_t i;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
639
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
640 value = cf->args->elts;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
641
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
642 for (i = 1; i < cf->args->nelts; i++) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
643 if (ngx_strcmp(value[i].data, "netscape4") == 0) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
644 bcf->netscape4 = 1;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
645 continue;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
646 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
647
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
648 if (bcf->ancient_browsers == NULL) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
649 bcf->ancient_browsers = ngx_array_create(cf->pool, 4,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
650 sizeof(ngx_str_t));
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
651 if (bcf->ancient_browsers == NULL) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
652 return NGX_CONF_ERROR;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
653 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
654 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
655
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
656 browser = ngx_array_push(bcf->ancient_browsers);
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
657 if (browser == NULL) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
658 return NGX_CONF_ERROR;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
659 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
660
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
661 *browser = value[i];
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
662 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
663
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
664 return NGX_CONF_OK;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
665 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
666
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
667
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
668 static char *
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
669 ngx_http_modern_browser_value(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
670 {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
671 ngx_http_browser_conf_t *bcf = conf;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
672
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
673 ngx_str_t *value;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
674
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
675 bcf->modern_browser_value = ngx_palloc(cf->pool,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
676 sizeof(ngx_http_variable_value_t));
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
677 if (bcf->modern_browser_value == NULL) {
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
678 return NGX_CONF_ERROR;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
679 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
680
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
681 value = cf->args->elts;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
682
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
683 bcf->modern_browser_value->len = value[1].len;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
684 bcf->modern_browser_value->valid = 1;
1565
4c43e25d11ea fix English grammar
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
685 bcf->modern_browser_value->no_cacheable = 0;
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
686 bcf->modern_browser_value->not_found = 0;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
687 bcf->modern_browser_value->data = value[1].data;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
688
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
689 return NGX_CONF_OK;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
690 }
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
691
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
692
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
693 static char *
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
694 ngx_http_ancient_browser_value(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
695 {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
696 ngx_http_browser_conf_t *bcf = conf;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
697
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
698 ngx_str_t *value;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
699
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
700 bcf->ancient_browser_value = ngx_palloc(cf->pool,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
701 sizeof(ngx_http_variable_value_t));
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
702 if (bcf->ancient_browser_value == NULL) {
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
703 return NGX_CONF_ERROR;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
704 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
705
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
706 value = cf->args->elts;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
707
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
708 bcf->ancient_browser_value->len = value[1].len;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
709 bcf->ancient_browser_value->valid = 1;
1565
4c43e25d11ea fix English grammar
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
710 bcf->ancient_browser_value->no_cacheable = 0;
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
711 bcf->ancient_browser_value->not_found = 0;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
712 bcf->ancient_browser_value->data = value[1].data;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
713
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
714 return NGX_CONF_OK;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
715 }