ustream_printf(cl->us, "%X\r\n", len);
ustream_write(cl->us, data, len, true);
if (chunked)
- ustream_printf(cl->us, "\r\n", len);
+ ustream_printf(cl->us, "\r\n");
}
void uh_chunk_vprintf(struct client *cl, const char *format, va_list arg)
ustream_write(cl->us, buf, len, true);
else
ustream_vprintf(cl->us, format, arg);
- ustream_printf(cl->us, "\r\n", len);
+ ustream_printf(cl->us, "\r\n");
}
void uh_chunk_printf(struct client *cl, const char *format, ...)
return 0;
}
+
+
+static bool is_html_special_char(char c)
+{
+ switch (c)
+ {
+ case 0x22:
+ case 0x26:
+ case 0x27:
+ case 0x3C:
+ case 0x3E:
+ return true;
+
+ default:
+ return false;
+ }
+}
+
+char *uh_htmlescape(const char *str)
+{
+ size_t i, len;
+ char *p, *copy;
+
+ for (i = 0, len = 1; str[i]; i++)
+ if (is_html_special_char(str[i]))
+ len += 6; /* &#x??; */
+ else
+ len++;
+
+ copy = calloc(1, len);
+
+ if (!copy)
+ return NULL;
+
+ for (i = 0, p = copy; str[i]; i++)
+ if (is_html_special_char(str[i]))
+ p += sprintf(p, "&#x%02x;", (unsigned int)str[i]);
+ else
+ *p++ = str[i];
+
+ return copy;
+}