Hi,

this patch provides simple possibility to return http error code from within XSLT transformation result. This is simple way to quickly and correctly return i.e. 404 error codes instead of producing dummy soft-404 pages.

Sample XSLT:
<xsl:template match="/">
<html xmlns:http="http://www.w3.org/http"; status="400">
        <xsl:copy-of select="."/>
</html>
</xsl:template>


Thanks
   Sam


 src/http/modules/ngx_http_xslt_filter_module.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/src/http/modules/ngx_http_xslt_filter_module.c b/src/http/modules/ngx_http_xslt_filter_module.c
index a6ae1ce..c5710d5 100644
--- a/src/http/modules/ngx_http_xslt_filter_module.c
+++ b/src/http/modules/ngx_http_xslt_filter_module.c
@@ -27,6 +27,9 @@
 #endif


+#define NGX_HTTP_XSLT_NS "http://www.w3.org/http";
+
+
 typedef struct {
     u_char                    *name;
     void                      *data;
@@ -477,6 +480,7 @@ ngx_http_xslt_apply_stylesheet(ngx_http_request_t *r,
     ngx_uint_t                        i;
     xmlChar                          *buf;
     xmlDocPtr                         doc, res;
+    xmlNodePtr                        node;
     ngx_http_xslt_sheet_t            *sheet;
     ngx_http_xslt_filter_loc_conf_t  *conf;

@@ -551,6 +555,24 @@ ngx_http_xslt_apply_stylesheet(ngx_http_request_t *r,
                    doc_type, type ? type : (u_char *) "(null)",
                    encoding ? encoding : (u_char *) "(null)");

+    node = xmlDocGetRootElement(doc);
+    if (node != NULL) {
+        xmlChar *attr = NULL;
+
+ attr = xmlGetNsProp(node, (const xmlChar *)"status", (const xmlChar *)NGX_HTTP_XSLT_NS);
+        if (attr != NULL
+            && attr[0] != '\0') {
+
+            ngx_uint_t status = strtoul((const char *)attr, NULL, 10);
+
+            if (status > 0
+               && r->headers_out.status != status) {
+                r->headers_out.status = status;
+                r->headers_out.status_line.len = 0;
+            }
+        }
+    }
+
     rc = xsltSaveResultToString(&buf, &len, doc, sheet[i - 1].stylesheet);

     xmlFreeDoc(doc);

_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel

Reply via email to