X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Fhttp.c;h=05b2119a00d22e0998a9972c33ad7a03c56df8e7;hb=f75dc6076c0d4846d80929c40894bb4fdd678dc2;hp=2df17064540d17e9806f55b986da36823248237f;hpb=a604a6212609e9b809abd09f91e9f60111f25df7;p=pazpar2-moved-to-github.git diff --git a/src/http.c b/src/http.c index 2df1706..05b2119 100644 --- a/src/http.c +++ b/src/http.c @@ -1,5 +1,5 @@ /* This file is part of Pazpar2. - Copyright (C) 2006-2011 Index Data + Copyright (C) 2006-2012 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 @@ -70,6 +70,7 @@ typedef int socklen_t; #include "ppmutex.h" #include "session.h" #include "http.h" +#include "parameters.h" #define MAX_HTTP_HEADER 4096 @@ -649,6 +650,12 @@ static struct http_buf *http_serialize_response(struct http_channel *c, if (r->payload) wrbuf_puts(c->wrbuf, r->payload); + if (global_parameters.dump_records > 1) + { + FILE *lf = yaz_log_file(); + yaz_log(YLOG_LOG, "Response:"); + fwrite(wrbuf_buf(c->wrbuf), 1, wrbuf_len(c->wrbuf), lf); + } return http_buf_bywrbuf(c->http_server, c->wrbuf); } @@ -689,12 +696,12 @@ static int http_weshouldproxy(struct http_request *rq) } -struct http_header * http_header_append(struct http_channel *ch, - struct http_header * hp, - const char *name, +struct http_header * http_header_append(struct http_channel *ch, + struct http_header * hp, + const char *name, const char *value) { - struct http_header *hpnew = 0; + struct http_header *hpnew = 0; if (!hp | !ch) return 0; @@ -706,18 +713,18 @@ struct http_header * http_header_append(struct http_channel *ch, hpnew = nmem_malloc(ch->nmem, sizeof *hpnew); hpnew->name = nmem_strdup(ch->nmem, name); hpnew->value = nmem_strdup(ch->nmem, value); - + hpnew->next = 0; hp->next = hpnew; hp = hp->next; - + return hpnew; } return hp; } - + static int is_inprogress(void) { #ifdef WIN32 @@ -728,7 +735,7 @@ static int is_inprogress(void) return 1; #endif return 0; -} +} static void enable_nonblock(int sock) { @@ -738,7 +745,7 @@ static void enable_nonblock(int sock) if (ioctlsocket(sock, FIONBIO, &flags) < 0) yaz_log(YLOG_FATAL|YLOG_ERRNO, "ioctlsocket"); #else - if ((flags = fcntl(sock, F_GETFL, 0)) < 0) + if ((flags = fcntl(sock, F_GETFL, 0)) < 0) yaz_log(YLOG_FATAL|YLOG_ERRNO, "fcntl"); if (fcntl(sock, F_SETFL, flags | O_NONBLOCK) < 0) yaz_log(YLOG_FATAL|YLOG_ERRNO, "fcntl2"); @@ -773,10 +780,10 @@ static int http_proxy(struct http_request *rq) abort(); enable_nonblock(sock); if (connect(sock, (struct sockaddr *) - c->server->http_server->proxy_addr, + c->server->http_server->proxy_addr, sizeof(*c->server->http_server->proxy_addr)) < 0) { - if (!is_inprogress()) + if (!is_inprogress()) { yaz_log(YLOG_WARN|YLOG_ERRNO, "Proxy connect"); return -1; @@ -801,27 +808,27 @@ static int http_proxy(struct http_request *rq) yaz_log(YLOG_WARN, "Failed to find Host header in proxy"); return -1; } - + // Add new header about paraz2 version, host, remote client address, etc. { char server_via[128]; hp = rq->headers; - hp = http_header_append(c, hp, + hp = http_header_append(c, hp, "X-Pazpar2-Version", PACKAGE_VERSION); - hp = http_header_append(c, hp, + hp = http_header_append(c, hp, "X-Pazpar2-Server-Host", ser->host); sprintf(server_port, "%d", ser->port); - hp = http_header_append(c, hp, + hp = http_header_append(c, hp, "X-Pazpar2-Server-Port", server_port); - yaz_snprintf(server_via, sizeof(server_via), - "1.1 %s:%s (%s/%s)", + yaz_snprintf(server_via, sizeof(server_via), + "1.1 %s:%s (%s/%s)", ser->host ? ser->host : "@", server_port, PACKAGE_NAME, PACKAGE_VERSION); hp = http_header_append(c, hp, "Via" , server_via); hp = http_header_append(c, hp, "X-Forwarded-For", c->addr); } - + requestbuf = http_serialize_request(rq); http_buf_enqueue(&p->oqueue, requestbuf); @@ -874,7 +881,7 @@ static void http_io(IOCHAN i, int event) { int res, reqlen; struct http_buf *htbuf; - + htbuf = http_buf_create(hc->http_server); res = recv(iochan_getfd(i), htbuf->buf, HTTP_BUF_SIZE -1, 0); if (res == -1 && errno == EAGAIN) @@ -926,6 +933,7 @@ static void http_io(IOCHAN i, int event) (long long) iochan_getfd(i), sz); for (hb = hc->iqueue; hb; hb = hb->next) fwrite(hb->buf, 1, hb->len, hc->http_server->record_file); + fflush(hc->http_server->record_file); } #endif if (!(hc->request = http_parse_request(hc, &hc->iqueue, reqlen))) @@ -979,6 +987,8 @@ static void http_io(IOCHAN i, int event) (long long) iochan_getfd(i), sz); fwrite(wb->buf, 1, wb->offset + wb->len, hc->http_server->record_file); + fputc('\n', hc->http_server->record_file); + fflush(hc->http_server->record_file); } #endif hc->oqueue = hc->oqueue->next; @@ -1004,7 +1014,7 @@ static void http_io(IOCHAN i, int event) } } } - if (!hc->oqueue && hc->proxy && !hc->proxy->iochan) + if (!hc->oqueue && hc->proxy && !hc->proxy->iochan) http_channel_destroy(i); // Server closed; we're done } else @@ -1076,7 +1086,7 @@ static void proxy_io(IOCHAN pi, int event) return; } if (res == htbuf->len) - { + { struct http_buf *np = htbuf->next; http_buf_destroy(hc->http_server, htbuf); pc->oqueue = np; @@ -1094,6 +1104,7 @@ static void proxy_io(IOCHAN pi, int event) default: yaz_log(YLOG_WARN, "Unexpected event on connection"); http_channel_destroy(hc->iochan); + break; } } @@ -1194,7 +1205,7 @@ static void http_accept(IOCHAN i, int event) yaz_log(YLOG_DEBUG, "New command connection"); c = iochan_create(s, http_io, EVENT_INPUT | EVENT_EXCEPT, "http_session_socket"); - + ch = http_channel_create(server->http_server, inet_ntoa(addr.sin_addr), server); ch->iochan = c; @@ -1266,12 +1277,12 @@ int http_init(const char *addr, struct conf_server *server, &one, sizeof(one)) < 0) return 1; - if (bind(l, (struct sockaddr *) &myaddr, sizeof myaddr) < 0) + if (bind(l, (struct sockaddr *) &myaddr, sizeof myaddr) < 0) { yaz_log(YLOG_FATAL|YLOG_ERRNO, "bind"); return 1; } - if (listen(l, SOMAXCONN) < 0) + if (listen(l, SOMAXCONN) < 0) { yaz_log(YLOG_FATAL|YLOG_ERRNO, "listen"); return 1;