/*
- * $Id: http.c,v 1.10 2007-02-05 16:15:41 quinn Exp $
+ * $Id: http.c,v 1.12 2007-03-15 16:50:56 quinn Exp $
*/
#include <stdio.h>
return rd;
}
-void static urldecode(char *i, char *o)
+// Buffers may overlap.
+static void urldecode(char *i, char *o)
{
while (*i)
{
*o = '\0';
}
+// Warning: Buffers may not overlap
+void urlencode(const char *i, char *o)
+{
+ while (*i)
+ {
+ if (strchr(" /:", *i))
+ {
+ sprintf(o, "%%%.2X", (int) *i);
+ o += 3;
+ }
+ else
+ *(o++) = *i;
+ i++;
+ }
+ *o = '\0';
+}
+
void http_addheader(struct http_response *r, const char *name, const char *value)
{
struct http_channel *c = r->channel;
else
{
htbuf->buf[res] = '\0';
+ htbuf->offset = 0;
htbuf->len = res;
- int offset = 0;
if (pc->first_response) // Check if this is a redirect
{
int len;
struct http_buf *buf;
h->value = sub_hostname(hc, h->value);
buf = http_serialize_response(hc, res);
+ yaz_log(YLOG_LOG, "Proxy rewrite");
http_buf_enqueue(&hc->oqueue, buf);
- offset = len;
+ htbuf->offset = len;
break;
}
}
pc->first_response = 0;
}
// Write any remaining payload
- if (htbuf->len - offset > 0)
- {
- if (offset > 0)
- {
- memmove(htbuf->buf, htbuf->buf + offset, htbuf->len - offset);
- htbuf->len -= offset;
- }
- http_buf_enqueue(&hc->oqueue, htbuf + offset);
- }
+ if (htbuf->len - htbuf->offset > 0)
+ http_buf_enqueue(&hc->oqueue, htbuf);
}
iochan_setflag(hc->iochan, EVENT_OUTPUT);
break;