/*
- * $Id: http.c,v 1.1 2006-12-20 20:47:16 quinn Exp $
+ * $Id: http.c,v 1.8 2007-01-10 10:04:23 adam Exp $
*/
#include <stdio.h>
#include <errno.h>
#include <assert.h>
+#if HAVE_CONFIG_H
+#include <cconfig.h>
+#endif
+
#include <yaz/yaz-util.h>
#include <yaz/comstack.h>
#include <netdb.h>
-#include "command.h"
#include "util.h"
#include "eventl.h"
#include "pazpar2.h"
while (len)
{
- *p = http_buf_create();
int tocopy = len;
if (tocopy > HTTP_BUF_SIZE)
tocopy = HTTP_BUF_SIZE;
+ *p = http_buf_create();
memcpy((*p)->buf, b, tocopy);
(*p)->len = tocopy;
len -= tocopy;
if (http_buf_read(queue, buf, len) < len)
return 0;
+ r->search = "";
r->channel = c;
r->arguments = 0;
r->headers = 0;
r->path = nmem_strdup(c->nmem, buf);
if (p2)
{
+ r->search = nmem_strdup(c->nmem, p2);
// Parse Arguments
while (*p2)
{
static struct http_buf *http_serialize_response(struct http_channel *c,
struct http_response *r)
{
- wrbuf_rewind(c->wrbuf);
struct http_header *h;
+ wrbuf_rewind(c->wrbuf);
wrbuf_printf(c->wrbuf, "HTTP/1.1 %s %s\r\n", r->code, r->msg);
for (h = r->headers; h; h = h->next)
wrbuf_printf(c->wrbuf, "%s: %s\r\n", h->name, h->value);
static struct http_buf *http_serialize_request(struct http_request *r)
{
struct http_channel *c = r->channel;
- wrbuf_rewind(c->wrbuf);
struct http_header *h;
struct http_argument *a;
+ wrbuf_rewind(c->wrbuf);
wrbuf_printf(c->wrbuf, "%s %s", r->method, r->path);
if (r->arguments)
void http_send_response(struct http_channel *ch)
{
struct http_response *rs = ch->response;
+ struct http_buf *hb;
+
assert(rs);
- struct http_buf *hb = http_serialize_response(ch, rs);
+ hb = http_serialize_response(ch, rs);
if (!hb)
{
yaz_log(YLOG_WARN, "Failed to serialize HTTP response");
case EVENT_INPUT:
htbuf = http_buf_create();
res = read(iochan_getfd(i), htbuf->buf, HTTP_BUF_SIZE -1);
- if (res <= 0 && errno != EAGAIN)
+ if (res == -1 && errno == EAGAIN)
+ {
+ http_buf_destroy(htbuf);
+ return;
+ }
+ if (res <= 0)
{
http_buf_destroy(htbuf);
http_destroy(i);
if (hc->state == Http_Busy)
return;
-
if ((reqlen = request_check(hc->iqueue)) <= 2)
return;
return;
}
hc->response = 0;
- yaz_log(YLOG_LOG, "Request: %s %s v %s", hc->request->method,
- hc->request->path, hc->request->http_version);
+ yaz_log(YLOG_LOG, "Request: %s %s%s%s", hc->request->method,
+ hc->request->path,
+ *hc->request->search ? "?" : "",
+ hc->request->search);
if (http_weshouldproxy(hc->request))
http_proxy(hc->request);
else
if (fcntl(s, F_SETFL, flags | O_NONBLOCK) < 0)
yaz_log(YLOG_FATAL|YLOG_ERRNO, "fcntl2");
- yaz_log(YLOG_LOG, "New command connection");
+ yaz_log(YLOG_DEBUG, "New command connection");
c = iochan_create(s, http_io, EVENT_INPUT | EVENT_EXCEPT);
ch = http_create();
yaz_log(YLOG_LOG, "HTTP listener is %s", addr);
- bzero(&myaddr, sizeof myaddr);
+ memset(&myaddr, 0, sizeof myaddr);
myaddr.sin_family = AF_INET;
pp = strchr(addr, ':');
if (pp)