comparison src/http/ngx_http_variables.c @ 392:34fb3a573548 NGINX_0_7_8

nginx 0.7.8 *) Feature: the ngx_http_xslt_module. *) Feature: the "$arg_..." variables. *) Feature: Solaris directio support. Thanks to Ivan Debnar. *) Bugfix: now if FastCGI server sends a "Location" header line without status line, then nginx uses 302 status code. Thanks to Maxim Dounin.
author Igor Sysoev <http://sysoev.ru>
date Mon, 04 Aug 2008 00:00:00 +0400
parents 984bb0b1399b
children 6ebbca3d5ed7
comparison
equal deleted inserted replaced
391:4ec606a899d3 392:34fb3a573548
23 ngx_http_variable_value_t *v, uintptr_t data); 23 ngx_http_variable_value_t *v, uintptr_t data);
24 24
25 static ngx_int_t ngx_http_variable_unknown_header_in(ngx_http_request_t *r, 25 static ngx_int_t ngx_http_variable_unknown_header_in(ngx_http_request_t *r,
26 ngx_http_variable_value_t *v, uintptr_t data); 26 ngx_http_variable_value_t *v, uintptr_t data);
27 static ngx_int_t ngx_http_variable_unknown_header_out(ngx_http_request_t *r, 27 static ngx_int_t ngx_http_variable_unknown_header_out(ngx_http_request_t *r,
28 ngx_http_variable_value_t *v, uintptr_t data);
29 static ngx_int_t ngx_http_variable_argument(ngx_http_request_t *r,
28 ngx_http_variable_value_t *v, uintptr_t data); 30 ngx_http_variable_value_t *v, uintptr_t data);
29 31
30 static ngx_int_t ngx_http_variable_host(ngx_http_request_t *r, 32 static ngx_int_t ngx_http_variable_host(ngx_http_request_t *r,
31 ngx_http_variable_value_t *v, uintptr_t data); 33 ngx_http_variable_value_t *v, uintptr_t data);
32 static ngx_int_t ngx_http_variable_binary_remote_addr(ngx_http_request_t *r, 34 static ngx_int_t ngx_http_variable_binary_remote_addr(ngx_http_request_t *r,
275 v->name.data = ngx_pnalloc(cf->pool, name->len); 277 v->name.data = ngx_pnalloc(cf->pool, name->len);
276 if (v->name.data == NULL) { 278 if (v->name.data == NULL) {
277 return NULL; 279 return NULL;
278 } 280 }
279 281
280 for (i = 0; i < name->len; i++) { 282 ngx_strlow(v->name.data, name->data, name->len);
281 v->name.data[i] = ngx_tolower(name->data[i]);
282 }
283 283
284 v->set_handler = NULL; 284 v->set_handler = NULL;
285 v->get_handler = NULL; 285 v->get_handler = NULL;
286 v->data = 0; 286 v->data = 0;
287 v->flags = flags; 287 v->flags = flags;
342 v->name.data = ngx_pnalloc(cf->pool, name->len); 342 v->name.data = ngx_pnalloc(cf->pool, name->len);
343 if (v->name.data == NULL) { 343 if (v->name.data == NULL) {
344 return NGX_ERROR; 344 return NGX_ERROR;
345 } 345 }
346 346
347 for (i = 0; i < name->len; i++) { 347 ngx_strlow(v->name.data, name->data, name->len);
348 v->name.data[i] = ngx_tolower(name->data[i]);
349 }
350 348
351 v->set_handler = NULL; 349 v->set_handler = NULL;
352 v->get_handler = NULL; 350 v->get_handler = NULL;
353 v->data = 0; 351 v->data = 0;
354 v->flags = 0; 352 v->flags = 0;
473 if (ngx_strncmp(name->data, "upstream_http_", 10) == 0) { 471 if (ngx_strncmp(name->data, "upstream_http_", 10) == 0) {
474 472
475 if (ngx_http_upstream_header_variable(r, vv, (uintptr_t) name) 473 if (ngx_http_upstream_header_variable(r, vv, (uintptr_t) name)
476 == NGX_OK) 474 == NGX_OK)
477 { 475 {
476 return vv;
477 }
478
479 return NULL;
480 }
481
482 if (ngx_strncmp(name->data, "arg_", 4) == 0) {
483
484 if (ngx_http_variable_argument(r, vv, (uintptr_t) name) == NGX_OK) {
478 return vv; 485 return vv;
479 } 486 }
480 487
481 return NULL; 488 return NULL;
482 } 489 }
698 v->len = header[i].value.len; 705 v->len = header[i].value.len;
699 v->valid = 1; 706 v->valid = 1;
700 v->no_cacheable = 0; 707 v->no_cacheable = 0;
701 v->not_found = 0; 708 v->not_found = 0;
702 v->data = header[i].value.data; 709 v->data = header[i].value.data;
710
711 return NGX_OK;
712 }
713 }
714
715 v->not_found = 1;
716
717 return NGX_OK;
718 }
719
720
721 static ngx_int_t
722 ngx_http_variable_argument(ngx_http_request_t *r, ngx_http_variable_value_t *v,
723 uintptr_t data)
724 {
725 ngx_str_t *name = (ngx_str_t *) data;
726
727 u_char *p, *arg;
728 size_t len;
729
730 if (r->args.len == 0) {
731 v->not_found = 1;
732 return NGX_OK;
733 }
734
735 len = name->len - 1 - (sizeof("arg_") - 1);
736 arg = name->data + sizeof("arg_") - 1;
737
738 for (p = r->args.data; *p && *p != ' '; p++) {
739
740 /*
741 * although r->args.data is not null-terminated by itself,
742 * however, there is null in the end of request line
743 */
744
745 p = ngx_strcasestrn(p, (char *) arg, len);
746
747 if (p == NULL) {
748 v->not_found = 1;
749 return NGX_OK;
750 }
751
752 if ((p == r->args.data || *(p - 1) == '&') && *(p + len + 1) == '=') {
753
754 v->data = p + len + 2;
755
756 p = (u_char *) ngx_strchr(p, '&');
757
758 if (p == NULL) {
759 p = r->args.data + r->args.len;
760 }
761
762 v->len = p - v->data;
763 v->valid = 1;
764 v->no_cacheable = 0;
765 v->not_found = 0;
703 766
704 return NGX_OK; 767 return NGX_OK;
705 } 768 }
706 } 769 }
707 770
1394 v[i].flags = NGX_HTTP_VAR_NOCACHEABLE; 1457 v[i].flags = NGX_HTTP_VAR_NOCACHEABLE;
1395 1458
1396 continue; 1459 continue;
1397 } 1460 }
1398 1461
1462 if (ngx_strncmp(v[i].name.data, "arg_", 4) == 0) {
1463 v[i].get_handler = ngx_http_variable_argument;
1464 v[i].data = (uintptr_t) &v[i].name;
1465
1466 continue;
1467 }
1468
1399 ngx_log_error(NGX_LOG_EMERG, cf->log, 0, 1469 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
1400 "unknown \"%V\" variable", &v[i].name); 1470 "unknown \"%V\" variable", &v[i].name);
1401 1471
1402 return NGX_ERROR; 1472 return NGX_ERROR;
1403 1473