src/server/webdav/xml.c

branch
webdav
changeset 233
c5985d2fc19a
parent 232
499711b2a970
child 318
60870dbac94f
--- a/src/server/webdav/xml.c	Sat Jan 18 13:48:59 2020 +0100
+++ b/src/server/webdav/xml.c	Sat Jan 18 16:31:52 2020 +0100
@@ -344,19 +344,30 @@
 /*
  * Serialize an XML text node
  * This replaces some special characters with entity refs
+ * type: 0 = element text, 1 = attribute text
  */
-static void xml_ser_text(Writer *out, const char *text) {
+static void xml_ser_text(Writer *out, int type, const char *text) {
     size_t start = 0;
     size_t i;
     sstr_t entityref = { NULL, 0 };
     for(i=0;text[i]!='\0';i++) {
-        switch(text[i]) {
-            case '<': entityref = S("&lt;"); break;
-            case '>': entityref = S("&gt;"); break;
-            case '&': entityref = S("&amp;"); break;
-            case '\"': entityref = S("&quot;"); break;
-            case '\'': entityref = S("&apos;"); break;
+        char c = text[i];
+        if(c == '&') {
+            entityref = S("&amp;");
+        } else if(type == 0) {
+            if(c == '<') {
+                entityref = S("&lt;");
+            } else if(c == '>') {
+                entityref = S("&gt;");
+            }
+        } else {
+            if(c == '\"') {
+                entityref = S("&quot;");
+            } else if(c == '\'') {
+                entityref = S("&apos;");
+            }
         }
+        
         if(entityref.ptr) {
             size_t len = i-start;
             if(len > 0) {
@@ -436,7 +447,7 @@
         xmlNode *value = attr->children;
         while(value) {
             if(value->content) {
-                xml_ser_text(out, (const char*)value->content);
+                xml_ser_text(out, 1, (const char*)value->content);
             }
             value = value->next;
         }
@@ -459,7 +470,7 @@
         case XML_ELEMENT_NODE: xml_ser_element(xw, node); break;
         case XML_ATTRIBUTE_NODE: break;
         case XML_TEXT_NODE: {
-            xml_ser_text(xw->out, (const char*)node->content);
+            xml_ser_text(xw->out, 0, (const char*)node->content);
             break;
         }
         case XML_CDATA_SECTION_NODE: {

mercurial