comparison src/http/modules/ngx_http_ssi_filter_module.c @ 100:d6800bbe720e NGINX_0_2_4

nginx 0.2.4 *) Feature: the ngx_http_ssi_module supports "$var=text", "$var!=text", "$var=/text/", and "$var!=/text/" expressions in the "if" command. *) Bugfix: in proxying location without trailing slash; bug appeared in 0.1.44. *) Bugfix: the segmentation fault may occurred if the "rtsig" method was used; bug appeared in 0.2.0.
author Igor Sysoev <http://sysoev.ru>
date Mon, 03 Oct 2005 00:00:00 +0400
parents ca4f70b3ccc6
children f63280c59dd5
comparison
equal deleted inserted replaced
99:942ae8bb3ece 100:d6800bbe720e
1601 1601
1602 static ngx_int_t 1602 static ngx_int_t
1603 ngx_http_ssi_if(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx, 1603 ngx_http_ssi_if(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,
1604 ngx_str_t **params) 1604 ngx_str_t **params)
1605 { 1605 {
1606 ngx_str_t *expr, var; 1606 u_char *p, *last;
1607 ngx_uint_t i; 1607 ngx_str_t *expr, var, left, right;
1608 ngx_int_t rc;
1609 ngx_uint_t negative, noregex;
1608 ngx_http_variable_value_t *vv; 1610 ngx_http_variable_value_t *vv;
1611 #if (NGX_PCRE)
1612 ngx_str_t err;
1613 ngx_regex_t *regex;
1614 u_char errstr[NGX_MAX_CONF_ERRSTR];
1615 #endif
1609 1616
1610 expr = params[NGX_HTTP_SSI_IF_EXPR]; 1617 expr = params[NGX_HTTP_SSI_IF_EXPR];
1611 1618
1612 if (expr->data[0] != '$') { 1619 if (expr->data[0] != '$') {
1613 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, 1620 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
1614 "invalid variable name in \"%V\"", expr); 1621 "invalid variable name in \"%V\"", expr);
1615 return NGX_HTTP_SSI_ERROR; 1622 return NGX_HTTP_SSI_ERROR;
1616 } 1623 }
1617 1624
1618 var.len = expr->len - 1;
1619 var.data = expr->data + 1; 1625 var.data = expr->data + 1;
1620 1626 last = expr->data + expr->len;
1621 for (i = 0; i < var.len; i++) { 1627
1622 var.data[i] = ngx_tolower(var.data[i]); 1628 for (p = var.data; p < last; p++) {
1629 if (*p >= 'A' && *p <= 'Z') {
1630 *p |= 0x20;
1631 continue;
1632 }
1633
1634 if ((*p >= 'a' && *p <= 'z') || (*p >= '0' && *p <= '9') || *p == '_') {
1635 continue;
1636 }
1637
1638 break;
1639 }
1640
1641 var.len = p - var.data;
1642
1643 while (p < last && *p == ' ') {
1644 p++;
1623 } 1645 }
1624 1646
1625 vv = ngx_http_get_variable(r, &var); 1647 vv = ngx_http_get_variable(r, &var);
1626 1648
1627 if (vv == NULL) { 1649 if (vv == NULL) {
1628 return NGX_HTTP_SSI_ERROR; 1650 return NGX_HTTP_SSI_ERROR;
1629 } 1651 }
1630 1652
1631 if (vv != NGX_HTTP_VAR_NOT_FOUND && vv->text.len != 0) { 1653 if (p == last) {
1654 if (vv != NGX_HTTP_VAR_NOT_FOUND && vv->text.len != 0) {
1655 ctx->output = 1;
1656
1657 } else {
1658 ctx->output = 0;
1659 }
1660
1661 return NGX_OK;
1662 }
1663
1664 if (p < last && *p == '=') {
1665 negative = 0;
1666 p++;
1667
1668 } else if (p + 1 < last && *p == '!' && *(p + 1) == '=') {
1669 negative = 1;
1670 p += 2;
1671
1672 } else {
1673 goto invalid_expression;
1674 }
1675
1676 while (p < last && *p == ' ') {
1677 p++;
1678 }
1679
1680 if (p < last && *p == '/') {
1681 if (*(last - 1) != '/') {
1682 goto invalid_expression;
1683 }
1684
1685 noregex = 0;
1686 last--;
1687 p++;
1688
1689 } else {
1690 noregex = 1;
1691 }
1692
1693 right.len = last - p;
1694 right.data = p;
1695
1696 if (vv == NGX_HTTP_VAR_NOT_FOUND) {
1697 left.len = 0;
1698 left.data = (u_char *) "";
1699
1700 } else {
1701 left = vv->text;
1702 }
1703
1704 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1705 "left: \"%V\" right: \"%V\"", &left, &right);
1706
1707 if (noregex) {
1708 if (left.len != right.len) {
1709 rc = -1;
1710
1711 } else {
1712 rc = ngx_strncmp(left.data, right.data, right.len);
1713 }
1714
1715 } else {
1716 #if (NGX_PCRE)
1717 err.len = NGX_MAX_CONF_ERRSTR;
1718 err.data = errstr;
1719
1720 right.data[right.len] = '\0';
1721
1722 regex = ngx_regex_compile(&right, 0, r->pool, &err);
1723
1724 if (regex == NULL) {
1725 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "%s", err.data);
1726 return NGX_HTTP_SSI_ERROR;
1727 }
1728
1729 rc = ngx_regex_exec(regex, &left, NULL, 0);
1730
1731 if (rc != NGX_REGEX_NO_MATCHED && rc < 0) {
1732 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
1733 ngx_regex_exec_n " failed: %d on \"%V\" using \"%V\"",
1734 rc, &left, &right);
1735 return NGX_HTTP_SSI_ERROR;
1736 }
1737 #else
1738 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
1739 "the using of the regex \"%V\" in SSI "
1740 "requires PCRE library", &right);
1741
1742 return NGX_HTTP_SSI_ERROR;
1743 #endif
1744 }
1745
1746 if ((rc == 0 && !negative) || (rc != 0 && negative)) {
1632 ctx->output = 1; 1747 ctx->output = 1;
1633 1748
1634 } else { 1749 } else {
1635 ctx->output = 0; 1750 ctx->output = 0;
1636 } 1751 }
1637 1752
1638 return NGX_OK; 1753 return NGX_OK;
1754
1755 invalid_expression:
1756
1757 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
1758 "invalid expression in \"%V\"", expr);
1759
1760 return NGX_HTTP_SSI_ERROR;
1639 } 1761 }
1640 1762
1641 1763
1642 static ngx_int_t 1764 static ngx_int_t
1643 ngx_http_ssi_else(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx, 1765 ngx_http_ssi_else(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,