annotate src/http/modules/ngx_http_browser_module.c @ 7676:d225b70d38b6

Proxy: detection of data after final chunk. Previously, additional data after final chunk was either ignored (in the same buffer, or during unbuffered proxying) or sent to the client (in the next buffer already if it was already read from the socket). Now additional data are properly detected and ignored in all cases. Additionally, a warning is now logged and keepalive is disabled in the connection.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 06 Jul 2020 18:36:20 +0300
parents 2a288909abc6
children
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_array_t *modern_browsers;
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
42 ngx_array_t *ancient_browsers;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
43 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
44 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
45
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
46 unsigned modern_unlisted_browsers:1;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
47 unsigned netscape4:1;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48 } ngx_http_browser_conf_t;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
50
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51 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
52 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
53 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
54 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
55
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
56 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
57 ngx_http_browser_conf_t *cf);
754
4ac89c5aa10d style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 718
diff changeset
58
7076
1b82e86dd3e7 Browser: style.
Ruslan Ermilov <ru@nginx.com>
parents: 4581
diff changeset
59 static ngx_int_t ngx_http_browser_add_variables(ngx_conf_t *cf);
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60 static void *ngx_http_browser_create_conf(ngx_conf_t *cf);
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61 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
62 void *child);
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63 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
64 const void *two);
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
65 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
66 void *conf);
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
67 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
68 void *conf);
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
69 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
70 void *conf);
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
71 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
72 void *conf);
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
73
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75 static ngx_command_t ngx_http_browser_commands[] = {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77 { ngx_string("modern_browser"),
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
78 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
79 ngx_http_modern_browser,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80 NGX_HTTP_LOC_CONF_OFFSET,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81 0,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82 NULL },
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
84 { ngx_string("ancient_browser"),
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_1MORE,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
86 ngx_http_ancient_browser,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
87 NGX_HTTP_LOC_CONF_OFFSET,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
88 0,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
89 NULL },
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
90
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
91 { ngx_string("modern_browser_value"),
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92 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
93 ngx_http_modern_browser_value,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94 NGX_HTTP_LOC_CONF_OFFSET,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
95 0,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96 NULL },
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
97
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
98 { ngx_string("ancient_browser_value"),
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
99 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
100 ngx_http_ancient_browser_value,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
101 NGX_HTTP_LOC_CONF_OFFSET,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
102 0,
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
103 NULL },
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
104
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105 ngx_null_command
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
106 };
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
107
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
108
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
109 static ngx_http_module_t ngx_http_browser_module_ctx = {
7076
1b82e86dd3e7 Browser: style.
Ruslan Ermilov <ru@nginx.com>
parents: 4581
diff changeset
110 ngx_http_browser_add_variables, /* preconfiguration */
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111 NULL, /* postconfiguration */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
113 NULL, /* create main configuration */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114 NULL, /* init main configuration */
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 NULL, /* create server configuration */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117 NULL, /* merge server configuration */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119 ngx_http_browser_create_conf, /* create location configuration */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120 ngx_http_browser_merge_conf /* merge location configuration */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
121 };
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
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
124 ngx_module_t ngx_http_browser_module = {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
125 NGX_MODULE_V1,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
126 &ngx_http_browser_module_ctx, /* module context */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
127 ngx_http_browser_commands, /* module directives */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128 NGX_HTTP_MODULE, /* module type */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129 NULL, /* init master */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130 NULL, /* init module */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131 NULL, /* init process */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132 NULL, /* init thread */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
133 NULL, /* exit thread */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134 NULL, /* exit process */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135 NULL, /* exit master */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136 NGX_MODULE_V1_PADDING
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
137 };
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140 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
141
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142 /* Opera must be the first browser to check */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143
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 * "Opera/7.50 (X11; FreeBSD i386; U) [en]"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146 * "Mozilla/5.0 (X11; FreeBSD i386; U) Opera 7.50 [en]"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147 * "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
148 * "Opera/8.0 (Windows NT 5.1; U; ru)"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
149 * "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
150 * "Opera/9.01 (X11; FreeBSD 6 i386; U; en)"
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
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
153 { "opera",
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
154 0,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155 sizeof("Opera ") - 1,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156 "Opera"},
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
157
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
158 /* "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" */
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 { "msie",
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
161 sizeof("Mozilla/4.0 (compatible; ") - 1,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
162 sizeof("MSIE ") - 1,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
163 "MSIE "},
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 /*
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
166 * "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
167 * "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
168 * "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
169 * Firefox/0.8"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
170 * "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
171 * Gecko/20050511 Firefox/1.0.4"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
172 * "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
173 * Firefox/1.5.0.5"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174 */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
175
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
176 { "gecko",
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
177 sizeof("Mozilla/5.0 (") - 1,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
178 sizeof("rv:") - 1,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179 "rv:"},
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
180
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 * "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
183 * (KHTML, like Gecko) Safari/125.7"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
184 * "Mozilla/5.0 (SymbianOS/9.1; U; en-us) AppleWebKit/413
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
185 * (KHTML, like Gecko) Safari/413"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
186 * "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
187 * (KHTML, like Gecko) Safari/417.9.3"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
188 * "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
189 * (KHTML, like Gecko) Safari/419.3"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
190 */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
191
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192 { "safari",
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193 sizeof("Mozilla/5.0 (") - 1,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
194 sizeof("Safari/") - 1,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
195 "Safari/"},
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
196
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 * "Mozilla/5.0 (compatible; Konqueror/3.1; Linux)"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
199 * "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
200 * "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
201 * (like Gecko)"
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
202 */
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 { "konqueror",
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
205 sizeof("Mozilla/5.0 (compatible; ") - 1,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
206 sizeof("Konqueror/") - 1,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
207 "Konqueror/"},
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
208
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
209 { "", 0, 0, "" }
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 };
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
212
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
213
7076
1b82e86dd3e7 Browser: style.
Ruslan Ermilov <ru@nginx.com>
parents: 4581
diff changeset
214 static ngx_http_variable_t ngx_http_browser_vars[] = {
1b82e86dd3e7 Browser: style.
Ruslan Ermilov <ru@nginx.com>
parents: 4581
diff changeset
215
1b82e86dd3e7 Browser: style.
Ruslan Ermilov <ru@nginx.com>
parents: 4581
diff changeset
216 { ngx_string("msie"), NULL, ngx_http_msie_variable,
1b82e86dd3e7 Browser: style.
Ruslan Ermilov <ru@nginx.com>
parents: 4581
diff changeset
217 0, NGX_HTTP_VAR_CHANGEABLE, 0 },
1b82e86dd3e7 Browser: style.
Ruslan Ermilov <ru@nginx.com>
parents: 4581
diff changeset
218
1b82e86dd3e7 Browser: style.
Ruslan Ermilov <ru@nginx.com>
parents: 4581
diff changeset
219 { ngx_string("modern_browser"), NULL, ngx_http_browser_variable,
1b82e86dd3e7 Browser: style.
Ruslan Ermilov <ru@nginx.com>
parents: 4581
diff changeset
220 NGX_HTTP_MODERN_BROWSER, NGX_HTTP_VAR_CHANGEABLE, 0 },
1b82e86dd3e7 Browser: style.
Ruslan Ermilov <ru@nginx.com>
parents: 4581
diff changeset
221
1b82e86dd3e7 Browser: style.
Ruslan Ermilov <ru@nginx.com>
parents: 4581
diff changeset
222 { ngx_string("ancient_browser"), NULL, ngx_http_browser_variable,
1b82e86dd3e7 Browser: style.
Ruslan Ermilov <ru@nginx.com>
parents: 4581
diff changeset
223 NGX_HTTP_ANCIENT_BROWSER, NGX_HTTP_VAR_CHANGEABLE, 0 },
1b82e86dd3e7 Browser: style.
Ruslan Ermilov <ru@nginx.com>
parents: 4581
diff changeset
224
7077
2a288909abc6 Variables: macros for null variables.
Ruslan Ermilov <ru@nginx.com>
parents: 7076
diff changeset
225 ngx_http_null_variable
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
226 };
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
227
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 static ngx_int_t
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
230 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
231 uintptr_t data)
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
232 {
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
233 ngx_uint_t rc;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
234 ngx_http_browser_conf_t *cf;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
235
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
236 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
237
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
238 rc = ngx_http_browser(r, cf);
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
239
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
240 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
241 *v = *cf->modern_browser_value;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
242 return NGX_OK;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
243 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
245 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
246 *v = *cf->ancient_browser_value;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
247 return NGX_OK;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
248 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
249
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
250 *v = ngx_http_variable_null_value;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
251 return NGX_OK;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
252 }
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
253
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
254
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
255 static ngx_uint_t
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
256 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
257 {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
258 size_t len;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
259 u_char *name, *ua, *last, c;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
260 ngx_str_t *ancient;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
261 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
262 ngx_http_modern_browser_t *modern;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
263
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
264 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
265 if (cf->modern_unlisted_browsers) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
266 return NGX_HTTP_MODERN_BROWSER;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
267 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
268
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
269 return NGX_HTTP_ANCIENT_BROWSER;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
270 }
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
271
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
272 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
273 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
274 last = ua + len;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
275
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
276 if (cf->modern_browsers) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
277 modern = cf->modern_browsers->elts;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
278
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
279 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
280 name = ua + modern[i].skip;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
281
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
282 if (name >= last) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
283 continue;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
284 }
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
285
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
286 name = (u_char *) ngx_strstr(name, modern[i].name);
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 if (name == NULL) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
289 continue;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
290 }
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
291
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
292 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
293 "browser: \"%s\"", name);
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
294
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
295 name += modern[i].add;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
296
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
297 if (name >= last) {
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
298 continue;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
299 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
300
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
301 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
302 "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
303
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
304 version = 0;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
305 ver = 0;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
306 scale = 1000000;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
307
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
308 while (name < last) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
309
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
310 c = *name++;
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 if (c >= '0' && c <= '9') {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
313 ver = ver * 10 + (c - '0');
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
314 continue;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
315 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
316
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
317 if (c == '.') {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
318 version += ver * scale;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
319
2510
fa03c3846ca4 add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 2509
diff changeset
320 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
fa03c3846ca4 add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 2509
diff changeset
321 "version: \"%ui\" \"%ui\"",
fa03c3846ca4 add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 2509
diff changeset
322 modern[i].version, version);
fa03c3846ca4 add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 2509
diff changeset
323
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
324 if (version > modern[i].version) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
325 return NGX_HTTP_MODERN_BROWSER;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
326 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
327
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
328 ver = 0;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
329 scale /= 100;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
330 continue;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
331 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
332
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
333 break;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
334 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
335
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
336 version += ver * scale;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
337
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
338 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
339 "version: \"%ui\" \"%ui\"",
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
340 modern[i].version, version);
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
341
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
342 if (version >= modern[i].version) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
343 return NGX_HTTP_MODERN_BROWSER;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
344 }
2509
b4661481f198 the $ancient_browser variables did not treat as an ancient browser
Igor Sysoev <igor@sysoev.ru>
parents: 1565
diff changeset
345
b4661481f198 the $ancient_browser variables did not treat as an ancient browser
Igor Sysoev <igor@sysoev.ru>
parents: 1565
diff changeset
346 return NGX_HTTP_ANCIENT_BROWSER;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
347 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
348
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
349 if (!cf->modern_unlisted_browsers) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
350 return NGX_HTTP_ANCIENT_BROWSER;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
351 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
352 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
353
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
354 if (cf->netscape4) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
355 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
356 && 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
357 && ua[8] > '0' && ua[8] < '5')
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
358 {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
359 return NGX_HTTP_ANCIENT_BROWSER;
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 }
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 if (cf->ancient_browsers) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
364 ancient = cf->ancient_browsers->elts;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
365
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
366 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
367 if (len >= ancient[i].len
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
368 && 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
369 {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
370 return NGX_HTTP_ANCIENT_BROWSER;
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 }
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 if (cf->modern_unlisted_browsers) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
376 return NGX_HTTP_MODERN_BROWSER;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
377 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
378
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
379 return NGX_HTTP_ANCIENT_BROWSER;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
380 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
381
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 static ngx_int_t
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
384 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
385 uintptr_t data)
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
386 {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
387 if (r->headers_in.msie) {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
388 *v = ngx_http_variable_true_value;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
389 return NGX_OK;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
390 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
391
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
392 *v = ngx_http_variable_null_value;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
393 return NGX_OK;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
394 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
395
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 static ngx_int_t
7076
1b82e86dd3e7 Browser: style.
Ruslan Ermilov <ru@nginx.com>
parents: 4581
diff changeset
398 ngx_http_browser_add_variables(ngx_conf_t *cf)
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
399 {
7076
1b82e86dd3e7 Browser: style.
Ruslan Ermilov <ru@nginx.com>
parents: 4581
diff changeset
400 ngx_http_variable_t *var, *v;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
401
7076
1b82e86dd3e7 Browser: style.
Ruslan Ermilov <ru@nginx.com>
parents: 4581
diff changeset
402 for (v = ngx_http_browser_vars; v->name.len; v++) {
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
403
7076
1b82e86dd3e7 Browser: style.
Ruslan Ermilov <ru@nginx.com>
parents: 4581
diff changeset
404 var = ngx_http_add_variable(cf, &v->name, v->flags);
1b82e86dd3e7 Browser: style.
Ruslan Ermilov <ru@nginx.com>
parents: 4581
diff changeset
405 if (var == NULL) {
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
406 return NGX_ERROR;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
407 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
408
7076
1b82e86dd3e7 Browser: style.
Ruslan Ermilov <ru@nginx.com>
parents: 4581
diff changeset
409 var->get_handler = v->get_handler;
1b82e86dd3e7 Browser: style.
Ruslan Ermilov <ru@nginx.com>
parents: 4581
diff changeset
410 var->data = v->data;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
411 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
412
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
413 return NGX_OK;
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
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
417 static void *
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
418 ngx_http_browser_create_conf(ngx_conf_t *cf)
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 ngx_http_browser_conf_t *conf;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
421
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
422 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_browser_conf_t));
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
423 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
424 return NULL;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
425 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
426
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
427 /*
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
428 * set by ngx_pcalloc():
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
429 *
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
430 * conf->modern_browsers = NULL;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
431 * conf->ancient_browsers = NULL;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
432 * conf->modern_browser_value = NULL;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
433 * conf->ancient_browser_value = NULL;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
434 *
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
435 * conf->modern_unlisted_browsers = 0;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
436 * conf->netscape4 = 0;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
437 */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
438
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
439 return conf;
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
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
443 static char *
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
444 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
445 {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
446 ngx_http_browser_conf_t *prev = parent;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
447 ngx_http_browser_conf_t *conf = 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_uint_t i, n;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
450 ngx_http_modern_browser_t *browsers, *opera;
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 /*
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
453 * 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
454 * it will be used in sorting and then will overwritten
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
455 * with a real skip value. The zero value means Opera.
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
456 */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
457
4581
f84a98a03d0d Fixed directives inheritance.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
458 if (conf->modern_browsers == NULL && conf->modern_unlisted_browsers == 0) {
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
459 conf->modern_browsers = prev->modern_browsers;
4581
f84a98a03d0d Fixed directives inheritance.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
460 conf->modern_unlisted_browsers = prev->modern_unlisted_browsers;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
461
4581
f84a98a03d0d Fixed directives inheritance.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
462 } else if (conf->modern_browsers != NULL) {
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
463 browsers = conf->modern_browsers->elts;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
464
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
465 for (i = 0; i < conf->modern_browsers->nelts; i++) {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
466 if (browsers[i].skip == 0) {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
467 goto found;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
468 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
469 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
470
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 * Opera may contain MSIE string, so if Opera was not enumerated
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
473 * as modern browsers, then add it and set a unreachable version
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
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
476 opera = ngx_array_push(conf->modern_browsers);
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
477 if (opera == NULL) {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
478 return NGX_CONF_ERROR;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
479 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
480
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
481 opera->skip = 0;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
482 opera->version = 4001000000U;
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 browsers = conf->modern_browsers->elts;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
485
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
486 found:
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
487
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
488 ngx_qsort(browsers, (size_t) conf->modern_browsers->nelts,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
489 sizeof(ngx_http_modern_browser_t),
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
490 ngx_http_modern_browser_sort);
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
491
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
492 for (i = 0; i < conf->modern_browsers->nelts; i++) {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
493 n = browsers[i].skip;
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 browsers[i].skip = ngx_http_modern_browser_masks[n].skip;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
496 browsers[i].add = ngx_http_modern_browser_masks[n].add;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
497 (void) ngx_cpystrn(browsers[i].name,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
498 ngx_http_modern_browser_masks[n].name, 12);
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
499 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
500 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
501
4581
f84a98a03d0d Fixed directives inheritance.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
502 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
503 conf->ancient_browsers = prev->ancient_browsers;
4581
f84a98a03d0d Fixed directives inheritance.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
504 conf->netscape4 = prev->netscape4;
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
505 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
506
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
507 if (conf->modern_browser_value == NULL) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
508 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
509 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
510
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
511 if (conf->modern_browser_value == NULL) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
512 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
513 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
514
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
515 if (conf->ancient_browser_value == NULL) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
516 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
517 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
518
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
519 if (conf->ancient_browser_value == NULL) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
520 conf->ancient_browser_value = &ngx_http_variable_true_value;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
521 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
522
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
523 return NGX_CONF_OK;
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
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
527 static int ngx_libc_cdecl
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
528 ngx_http_modern_browser_sort(const void *one, const void *two)
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 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
531 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
532
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
533 return (first->skip - second->skip);
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
534 }
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
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
537 static char *
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
538 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
539 {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
540 ngx_http_browser_conf_t *bcf = conf;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
541
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
542 u_char c;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
543 ngx_str_t *value;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
544 ngx_uint_t i, n, version, ver, scale;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
545 ngx_http_modern_browser_t *browser;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
546 ngx_http_modern_browser_mask_t *mask;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
547
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
548 value = cf->args->elts;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
549
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
550 if (cf->args->nelts == 2) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
551 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
552 bcf->modern_unlisted_browsers = 1;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
553 return NGX_CONF_OK;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
554 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
555
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
556 return NGX_CONF_ERROR;
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
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
559 if (bcf->modern_browsers == NULL) {
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
560 bcf->modern_browsers = ngx_array_create(cf->pool, 5,
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
561 sizeof(ngx_http_modern_browser_t));
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
562 if (bcf->modern_browsers == NULL) {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
563 return NGX_CONF_ERROR;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
564 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
565 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
566
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
567 browser = ngx_array_push(bcf->modern_browsers);
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
568 if (browser == NULL) {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
569 return NGX_CONF_ERROR;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
570 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
571
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
572 mask = ngx_http_modern_browser_masks;
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 for (n = 0; mask[n].browser[0] != '\0'; n++) {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
575 if (ngx_strcasecmp(mask[n].browser, value[1].data) == 0) {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
576 goto found;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
577 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
578 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
579
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
580 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
581 "unknown browser name \"%V\"", &value[1]);
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 return NGX_CONF_ERROR;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
584
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
585 found:
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
586
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 * 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
589 * 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
590 * with a real value
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
591 */
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
592
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
593 browser->skip = n;
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 version = 0;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
596 ver = 0;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
597 scale = 1000000;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
598
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
599 for (i = 0; i < value[2].len; i++) {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
600
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
601 c = value[2].data[i];
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
602
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
603 if (c >= '0' && c <= '9') {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
604 ver = ver * 10 + (c - '0');
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
605 continue;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
606 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
607
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
608 if (c == '.') {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
609 version += ver * scale;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
610 ver = 0;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
611 scale /= 100;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
612 continue;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
613 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
614
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
615 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
616 "invalid browser version \"%V\"", &value[2]);
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 return NGX_CONF_ERROR;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
619 }
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 version += ver * scale;
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 browser->version = version;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
624
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
625 return NGX_CONF_OK;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
626 }
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
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
629 static char *
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
630 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
631 {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
632 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
633
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
634 ngx_str_t *value, *browser;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
635 ngx_uint_t i;
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 value = cf->args->elts;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
638
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
639 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
640 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
641 bcf->netscape4 = 1;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
642 continue;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
643 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
644
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
645 if (bcf->ancient_browsers == NULL) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
646 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
647 sizeof(ngx_str_t));
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 return NGX_CONF_ERROR;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
650 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
651 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
652
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
653 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
654 if (browser == NULL) {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
655 return NGX_CONF_ERROR;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
656 }
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
657
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
658 *browser = value[i];
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 return NGX_CONF_OK;
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
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
665 static char *
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
666 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
667 {
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
668 ngx_http_browser_conf_t *bcf = conf;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
669
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
670 ngx_str_t *value;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
671
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
672 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
673 sizeof(ngx_http_variable_value_t));
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
674 if (bcf->modern_browser_value == NULL) {
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
675 return NGX_CONF_ERROR;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
676 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
677
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
678 value = cf->args->elts;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
679
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
680 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
681 bcf->modern_browser_value->valid = 1;
1565
4c43e25d11ea fix English grammar
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
682 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
683 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
684 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
685
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
686 return NGX_CONF_OK;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
687 }
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
688
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
689
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
690 static char *
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
691 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
692 {
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
693 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
694
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
695 ngx_str_t *value;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
696
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
697 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
698 sizeof(ngx_http_variable_value_t));
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
699 if (bcf->ancient_browser_value == NULL) {
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
700 return NGX_CONF_ERROR;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
701 }
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
702
718
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
703 value = cf->args->elts;
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
704
d488926182ea ancient browsers support in ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents: 713
diff changeset
705 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
706 bcf->ancient_browser_value->valid = 1;
1565
4c43e25d11ea fix English grammar
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
707 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
708 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
709 bcf->ancient_browser_value->data = value[1].data;
700
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
710
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
711 return NGX_CONF_OK;
c1104f701926 ngx_http_browser_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
712 }