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