Mercurial > hg > nginx-vendor-0-8
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, |