Mercurial > hg > nginx
comparison src/http/ngx_http_core_module.c @ 2589:859f6675a553
use complex value in error_page
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Sun, 22 Mar 2009 09:40:04 +0000 |
parents | 41a965fba141 |
children | 7162ac8d564f |
comparison
equal
deleted
inserted
replaced
2588:a6954ce88b80 | 2589:859f6675a553 |
---|---|
3789 static char * | 3789 static char * |
3790 ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) | 3790 ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) |
3791 { | 3791 { |
3792 ngx_http_core_loc_conf_t *lcf = conf; | 3792 ngx_http_core_loc_conf_t *lcf = conf; |
3793 | 3793 |
3794 u_char *args; | 3794 u_char *p; |
3795 ngx_int_t overwrite; | 3795 ngx_int_t overwrite; |
3796 ngx_str_t *value, uri; | 3796 ngx_str_t *value, uri, args; |
3797 ngx_uint_t i, n, nvar; | 3797 ngx_uint_t i, n; |
3798 ngx_array_t *uri_lengths, *uri_values; | 3798 ngx_http_err_page_t *err; |
3799 ngx_http_err_page_t *err; | 3799 ngx_http_complex_value_t cv; |
3800 ngx_http_script_compile_t sc; | 3800 ngx_http_compile_complex_value_t ccv; |
3801 | 3801 |
3802 if (lcf->error_pages == NULL) { | 3802 if (lcf->error_pages == NULL) { |
3803 lcf->error_pages = ngx_array_create(cf->pool, 4, | 3803 lcf->error_pages = ngx_array_create(cf->pool, 4, |
3804 sizeof(ngx_http_err_page_t)); | 3804 sizeof(ngx_http_err_page_t)); |
3805 if (lcf->error_pages == NULL) { | 3805 if (lcf->error_pages == NULL) { |
3837 overwrite = -1; | 3837 overwrite = -1; |
3838 n = 1; | 3838 n = 1; |
3839 } | 3839 } |
3840 | 3840 |
3841 uri = value[cf->args->nelts - 1]; | 3841 uri = value[cf->args->nelts - 1]; |
3842 uri_lengths = NULL; | 3842 |
3843 uri_values = NULL; | 3843 ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); |
3844 | 3844 |
3845 nvar = ngx_http_script_variables_count(&uri); | 3845 ccv.cf = cf; |
3846 | 3846 ccv.value = &uri; |
3847 if (nvar) { | 3847 ccv.complex_value = &cv; |
3848 ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); | 3848 |
3849 | 3849 if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { |
3850 sc.cf = cf; | 3850 return NGX_CONF_ERROR; |
3851 sc.source = &uri; | 3851 } |
3852 sc.lengths = &uri_lengths; | 3852 |
3853 sc.values = &uri_values; | 3853 args.len = 0; |
3854 sc.variables = nvar; | 3854 args.data = NULL; |
3855 sc.complete_lengths = 1; | 3855 |
3856 sc.complete_values = 1; | 3856 if (cv.lengths == NULL) { |
3857 | 3857 p = (u_char *) ngx_strchr(uri.data, '?'); |
3858 if (ngx_http_script_compile(&sc) != NGX_OK) { | 3858 |
3859 return NGX_CONF_ERROR; | 3859 if (p) { |
3860 } | 3860 cv.value.len = p - uri.data; |
3861 } | 3861 cv.value.data = uri.data; |
3862 | 3862 p++; |
3863 args = (u_char *) ngx_strchr(uri.data, '?'); | 3863 args.len = (uri.data + uri.len) - p; |
3864 args.data = p; | |
3865 } | |
3866 } | |
3864 | 3867 |
3865 for (i = 1; i < cf->args->nelts - n; i++) { | 3868 for (i = 1; i < cf->args->nelts - n; i++) { |
3866 err = ngx_array_push(lcf->error_pages); | 3869 err = ngx_array_push(lcf->error_pages); |
3867 if (err == NULL) { | 3870 if (err == NULL) { |
3868 return NGX_CONF_ERROR; | 3871 return NGX_CONF_ERROR; |
3898 err->overwrite = err->status; | 3901 err->overwrite = err->status; |
3899 break; | 3902 break; |
3900 } | 3903 } |
3901 } | 3904 } |
3902 | 3905 |
3903 if (args) { | 3906 err->value = cv; |
3904 err->uri.len = args - uri.data; | 3907 err->args = args; |
3905 err->uri.data = uri.data; | |
3906 args++; | |
3907 err->args.len = (uri.data + uri.len) - args; | |
3908 err->args.data = args; | |
3909 | |
3910 } else { | |
3911 err->uri = uri; | |
3912 err->args.len = 0; | |
3913 err->args.data = NULL; | |
3914 } | |
3915 | |
3916 err->uri_lengths = uri_lengths; | |
3917 err->uri_values = uri_values; | |
3918 } | 3908 } |
3919 | 3909 |
3920 return NGX_CONF_OK; | 3910 return NGX_CONF_OK; |
3921 } | 3911 } |
3922 | 3912 |