if (cl->http_code == 204 || cl->http_code == 304)
return false;
- return true;
+ return !cl->request.disable_chunked;
}
void uh_chunk_write(struct client *cl, const void *data, int len)
{
- bool chunked = cl->request.respond_chunked;
+ bool chunked = uh_use_chunked(cl);
if (cl->state == CLIENT_STATE_CLEANUP)
return;
return;
uloop_timeout_set(&cl->timeout, conf.network_timeout * 1000);
- if (!cl->request.respond_chunked) {
+ if (!uh_use_chunked(cl)) {
ustream_vprintf(cl->us, format, arg);
return;
}
void uh_chunk_eof(struct client *cl)
{
- if (!cl->request.respond_chunked)
+ if (!uh_use_chunked(cl))
return;
if (cl->state == CLIENT_STATE_CLEANUP)
{
int len = strlen(prefix);
+ /* A prefix of "/" will - by definition - match any url */
+ if (prefix[0] == '/' && len == 1)
+ return true;
+
if (strncmp(url, prefix, len) != 0)
return false;
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 len;
+ char *p, *copy;
+
+ for (p = str, len = 1; *p; p++)
+ if (is_html_special_char(*p))
+ len += 6; /* &#x??; */
+ else
+ len++;
+
+ copy = calloc(1, len);
+
+ if (!copy)
+ return NULL;
+
+ for (p = copy; *str; str++)
+ if (is_html_special_char(*str))
+ p += sprintf(p, "&#x%02x;", (unsigned int)*str);
+ else
+ *p++ = *str;
+
+ return copy;
+}