comparison src/http/modules/ngx_http_ssi_filter_module.c @ 200:d2ae1c9f1fd3 NGINX_0_3_47

nginx 0.3.47 *) Feature: the "upstream" directive. *) Change: now the "\" escape symbol in the "\"" and "\'" pairs in the SSI command is always removed.
author Igor Sysoev <http://sysoev.ru>
date Tue, 23 May 2006 00:00:00 +0400
parents 003bd800ec2a
children 3866d57d9cfd
comparison
equal deleted inserted replaced
199:869664706c09 200:d2ae1c9f1fd3
1222 break; 1222 break;
1223 1223
1224 case ssi_quoted_symbol_state: 1224 case ssi_quoted_symbol_state:
1225 state = ctx->saved_state; 1225 state = ctx->saved_state;
1226 1226
1227 if (ch == '\\') {
1228 break;
1229 }
1230
1231 if (ch == '"' && state == ssi_double_quoted_value_state) {
1232 ctx->param->value.data[ctx->param->value.len - 1] = ch;
1233 break;
1234 }
1235
1236 if (ch == '\'' && state == ssi_quoted_value_state) {
1237 ctx->param->value.data[ctx->param->value.len - 1] = ch;
1238 break;
1239 }
1240
1241 if (ctx->param->value.len == ctx->value_len) {
1242 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
1243 "too long \"%V%c...\" value of \"%V\" "
1244 "parameter in \"%V\" SSI command",
1245 &ctx->param->value, ch, &ctx->param->key,
1246 &ctx->command);
1247 state = ssi_error_state;
1248 break;
1249 }
1250
1251 ctx->param->value.data[ctx->param->value.len++] = ch; 1227 ctx->param->value.data[ctx->param->value.len++] = ch;
1252 1228
1253 break; 1229 break;
1254 1230
1255 case ssi_postparam_state: 1231 case ssi_postparam_state:
1256 1232
1257 if (ctx->param->value.len < ctx->value_len / 2) { 1233 if (ctx->param->value.len + 1 < ctx->value_len / 2) {
1258 value = ngx_palloc(r->pool, ctx->param->value.len); 1234 value = ngx_palloc(r->pool, ctx->param->value.len + 1);
1259 if (value == NULL) { 1235 if (value == NULL) {
1260 return NGX_ERROR; 1236 return NGX_ERROR;
1261 } 1237 }
1262 1238
1263 ngx_memcpy(value, ctx->param->value.data, 1239 ngx_memcpy(value, ctx->param->value.data,
1431 { 1407 {
1432 u_char ch, *p, **value, *data, *part_data; 1408 u_char ch, *p, **value, *data, *part_data;
1433 size_t *size, len, prefix, part_len; 1409 size_t *size, len, prefix, part_len;
1434 ngx_str_t var, *val; 1410 ngx_str_t var, *val;
1435 ngx_int_t key; 1411 ngx_int_t key;
1436 ngx_uint_t i, j, n, bracket; 1412 ngx_uint_t i, j, n, bracket, quoted;
1437 ngx_array_t lengths, values; 1413 ngx_array_t lengths, values;
1438 ngx_http_variable_value_t *vv; 1414 ngx_http_variable_value_t *vv;
1439 1415
1440 n = ngx_http_script_variables_count(text); 1416 n = ngx_http_script_variables_count(text);
1441 1417
1565 part_len = val->len; 1541 part_len = val->len;
1566 } 1542 }
1567 1543
1568 } else { 1544 } else {
1569 part_data = &text->data[i]; 1545 part_data = &text->data[i];
1546 quoted = 0;
1570 1547
1571 for (p = part_data; i < text->len; i++) { 1548 for (p = part_data; i < text->len; i++) {
1572 ch = text->data[i]; 1549 ch = text->data[i];
1573 1550
1574 if (ch == '$') { 1551 if (!quoted) {
1575 if (text->data[i - 1] != '\\') { 1552
1553 if (ch == '\\') {
1554 quoted = 1;
1555 continue;
1556 }
1557
1558 if (ch == '$') {
1576 break; 1559 break;
1577 } 1560 }
1578 1561
1579 *(p - 1) = ch; 1562 } else {
1580 1563 quoted = 0;
1581 continue; 1564
1565 if (ch != '\\' && ch != '\'' && ch != '"' && ch != '$') {
1566 *p++ = '\\';
1567 }
1582 } 1568 }
1583 1569
1584 *p++ = ch; 1570 *p++ = ch;
1585 } 1571 }
1586 1572
2014 } else { 2000 } else {
2015 noregex = 1; 2001 noregex = 1;
2016 flags = 0; 2002 flags = 0;
2017 2003
2018 if (p < last - 1 && p[0] == '\\' && p[1] == '/') { 2004 if (p < last - 1 && p[0] == '\\' && p[1] == '/') {
2019 p++; 2005 p++;
2020 } 2006 }
2021 } 2007 }
2022 2008
2023 right.len = last - p; 2009 right.len = last - p;
2024 right.data = p; 2010 right.data = p;