/* This file is part of Pazpar2.
- Copyright (C) 2006-2008 Index Data
+ Copyright (C) 2006-2009 Index Data
Pazpar2 is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
return 0;
}
-static struct http_buf *http_buf_create()
+static struct http_buf *http_buf_create(void)
{
struct http_buf *r;
*(o++) = ' ';
i++;
}
- else if (*i == '%')
+ else if (*i == '%' && i[1] && i[2])
{
+ int v;
i++;
- sscanf(i, "%2hhx", o);
+ sscanf(i, "%2x", &v);
+ *o++ = v;
i += 2;
- o++;
}
else
*(o++) = *(i++);
while (*cp == ' ')
cp++;
content_len = 0;
- while (*cp && isdigit(*cp))
+ while (*cp && isdigit(*(const unsigned char *)cp))
content_len = content_len*10 + (*cp++ - '0');
if (content_len < 0) /* prevent negative offsets */
content_len = 0;
return 0;
*(value++) = '\0';
h->name = nmem_strdup(c->nmem, p);
- while (isspace(*value))
+ while (isspace(*(const unsigned char *) value))
value++;
if (value >= p2) // Empty header;
{
r->content_len = start + len - buf;
r->content_buf = buf;
- if (!strcmp(content_type, "application/x-www-form-urlencoded"))
+ if (!yaz_strcmp_del("application/x-www-form-urlencoded",
+ content_type, "; "))
{
http_parse_arguments(r, c->nmem, r->content_buf);
}
static int is_inprogress(void)
{
#ifdef WIN32
- if (WSAGetLastError() != WSAEWOULDBLOCK)
+ if (WSAGetLastError() == WSAEWOULDBLOCK)
return 1;
#else
- if (errno != EINPROGRESS)
+ if (errno == EINPROGRESS)
return 1;
#endif
return 0;
hc->request->path,
*hc->request->search ? "?" : "",
hc->request->search);
+ if (hc->request->content_buf)
+ yaz_log(YLOG_LOG, "%s", hc->request->content_buf);
if (http_weshouldproxy(hc->request))
http_proxy(hc->request);
else
pazpar2_add_channel(c);
}
+static int listener_socket = 0;
+
/* Create a http-channel listener, syntax [host:]port */
-void http_init(const char *addr)
+int http_init(const char *addr)
{
IOCHAN c;
int l;
hostname[len] = '\0';
if (!(he = gethostbyname(hostname))){
yaz_log(YLOG_FATAL, "Unable to resolve '%s'", hostname);
- exit(1);
+ return 1;
}
memcpy(&myaddr.sin_addr.s_addr, he->h_addr_list[0], he->h_length);
myaddr.sin_port = htons(port);
if (!(p = getprotobyname("tcp"))) {
- abort();
+ return 1;
}
if ((l = socket(PF_INET, SOCK_STREAM, p->p_proto)) < 0)
yaz_log(YLOG_FATAL|YLOG_ERRNO, "socket");
if (setsockopt(l, SOL_SOCKET, SO_REUSEADDR, (char*)
&one, sizeof(one)) < 0)
- abort();
+ return 1;
if (bind(l, (struct sockaddr *) &myaddr, sizeof myaddr) < 0)
{
yaz_log(YLOG_FATAL|YLOG_ERRNO, "bind");
- exit(1);
+ return 1;
}
if (listen(l, SOMAXCONN) < 0)
{
yaz_log(YLOG_FATAL|YLOG_ERRNO, "listen");
- exit(1);
+ return 1;
}
+ listener_socket = l;
+
c = iochan_create(l, http_accept, EVENT_INPUT | EVENT_EXCEPT);
pazpar2_add_channel(c);
+ return 0;
+}
+
+void http_close_server(void)
+{
+ /* break the event_loop (select) by closing down the HTTP listener sock */
+ if (listener_socket)
+ {
+#ifdef WIN32
+ closesocket(listener_socket);
+#else
+ close(listener_socket);
+#endif
+ }
}
void http_set_proxyaddr(char *host, char *base_url)