comparison src/http/ngx_http_variables.c @ 2137:76d5af541412

$arg_... variable
author Igor Sysoev <igor@sysoev.ru>
date Mon, 04 Aug 2008 11:10:52 +0000
parents 8c6521eedf84
children 74477ea8074f
comparison
equal deleted inserted replaced
2136:7a7c9e9024dd 2137:76d5af541412
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,
475 } 477 }
476 478
477 return NULL; 479 return NULL;
478 } 480 }
479 481
482 if (ngx_strncmp(name->data, "arg_", 4) == 0) {
483
484 if (ngx_http_variable_argument(r, vv, (uintptr_t) name) == NGX_OK) {
485 return vv;
486 }
487
488 return NULL;
489 }
490
480 vv->not_found = 1; 491 vv->not_found = 1;
481 492
482 if (nowarn == 0) { 493 if (nowarn == 0) {
483 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, 494 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
484 "unknown \"%V\" variable", name); 495 "unknown \"%V\" variable", name);
694 v->len = header[i].value.len; 705 v->len = header[i].value.len;
695 v->valid = 1; 706 v->valid = 1;
696 v->no_cacheable = 0; 707 v->no_cacheable = 0;
697 v->not_found = 0; 708 v->not_found = 0;
698 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;
699 766
700 return NGX_OK; 767 return NGX_OK;
701 } 768 }
702 } 769 }
703 770
1390 v[i].flags = NGX_HTTP_VAR_NOCACHEABLE; 1457 v[i].flags = NGX_HTTP_VAR_NOCACHEABLE;
1391 1458
1392 continue; 1459 continue;
1393 } 1460 }
1394 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
1395 ngx_log_error(NGX_LOG_EMERG, cf->log, 0, 1469 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
1396 "unknown \"%V\" variable", &v[i].name); 1470 "unknown \"%V\" variable", &v[i].name);
1397 1471
1398 return NGX_ERROR; 1472 return NGX_ERROR;
1399 1473