20 #define NGX_HTTP_MODERN_BROWSER 0
21 #define NGX_HTTP_ANCIENT_BROWSER 1
53 unsigned modern_unlisted_browsers:1;
67 static void *ngx_http_browser_create_conf(
ngx_conf_t *cf);
68 static char *ngx_http_browser_merge_conf(
ngx_conf_t *cf,
void *parent,
70 static int ngx_libc_cdecl ngx_http_modern_browser_sort(
const void *one,
86 ngx_http_modern_browser,
93 ngx_http_ancient_browser,
100 ngx_http_modern_browser_value,
107 ngx_http_ancient_browser_value,
117 ngx_http_browser_add_variable,
126 ngx_http_browser_create_conf,
127 ngx_http_browser_merge_conf
133 &ngx_http_browser_module_ctx,
134 ngx_http_browser_commands,
162 sizeof(
"Opera ") - 1,
168 sizeof(
"Mozilla/4.0 (compatible; ") - 1,
184 sizeof(
"Mozilla/5.0 (") - 1,
200 sizeof(
"Mozilla/5.0 (") - 1,
201 sizeof(
"Safari/") - 1,
212 sizeof(
"Mozilla/5.0 (compatible; ") - 1,
213 sizeof(
"Konqueror/") - 1,
222 {
ngx_string(
"msie"), ngx_http_msie_variable, 0 },
223 {
ngx_string(
"modern_browser"), ngx_http_browser_variable,
225 {
ngx_string(
"ancient_browser"), ngx_http_browser_variable,
240 rc = ngx_http_browser(r, cf);
261 u_char *name, *ua, *last, c;
282 name = ua + modern[
i].
skip;
288 name = (u_char *)
ngx_strstr(name, modern[i].name);
295 "browser: \"%s\"", name);
297 name += modern[
i].
add;
304 "version: \"%ui\" \"%s\"", modern[i].
version, name);
310 while (name < last) {
314 if (c >=
'0' && c <=
'9') {
315 ver = ver * 10 + (c -
'0');
320 version += ver * scale;
323 "version: \"%ui\" \"%ui\"",
326 if (version > modern[i].version) {
338 version += ver * scale;
341 "version: \"%ui\" \"%ui\"",
344 if (version >= modern[i].version) {
357 if (len >
sizeof(
"Mozilla/4.72 ") - 1
358 &&
ngx_strncmp(ua,
"Mozilla/",
sizeof(
"Mozilla/") - 1) == 0
359 && ua[8] >
'0' && ua[8] <
'5')
369 if (len >= ancient[i].len
405 for (var = ngx_http_browsers; var->
name.
len; var++) {
447 ngx_http_browser_merge_conf(
ngx_conf_t *cf,
void *parent,
void *child)
469 if (browsers[i].skip == 0) {
493 ngx_http_modern_browser_sort);
496 n = browsers[
i].
skip;
498 browsers[
i].
skip = ngx_http_modern_browser_masks[n].
skip;
499 browsers[
i].
add = ngx_http_modern_browser_masks[n].
add;
501 ngx_http_modern_browser_masks[n].name, 12);
531 ngx_http_modern_browser_sort(
const void *one,
const void *two)
536 return (first->
skip - second->
skip);
554 if (
ngx_strcmp(value[1].data,
"unlisted") == 0) {
571 if (browser == NULL) {
575 mask = ngx_http_modern_browser_masks;
577 for (n = 0; mask[n].
browser[0] !=
'\0'; n++) {
584 "unknown browser name \"%V\"", &value[1]);
602 for (i = 0; i < value[2].
len; i++) {
604 c = value[2].
data[
i];
606 if (c >=
'0' && c <=
'9') {
607 ver = ver * 10 + (c -
'0');
612 version += ver * scale;
619 "invalid browser version \"%V\"", &value[2]);
624 version += ver * scale;
643 if (
ngx_strcmp(value[i].data,
"netscape4") == 0) {
657 if (browser == NULL) {