X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Fhttp.c;h=1ce0aa4fc9f0d5a2926c8d23d3673db429b5528b;hb=457c6599b5dae1fb9e06b1c1a2f58a0922de5851;hp=7c69871905ff640d89fd55ec6ed456fe5c7072f9;hpb=8df7977676dd0909eceba9bc2a82c4e9523b1bed;p=pazpar2-moved-to-github.git diff --git a/src/http.c b/src/http.c index 7c69871..1ce0aa4 100644 --- a/src/http.c +++ b/src/http.c @@ -21,6 +21,10 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #endif +#if HAVE_SYS_TIME_H +#include +#endif + #include #ifdef WIN32 #include @@ -106,6 +110,7 @@ struct http_server int ref_count; http_sessions_t http_sessions; struct sockaddr_in *proxy_addr; + FILE *record_file; }; struct http_channel_observer_s { @@ -149,17 +154,21 @@ static struct http_buf *http_buf_create(http_server_t hs) static void http_buf_destroy(http_server_t hs, struct http_buf *b) { yaz_mutex_enter(hs->mutex); - if (hs->http_buf_freelist_max > 0 && hs->http_buf_freelist_count > hs->http_buf_freelist_max) { + if (hs->http_buf_freelist_max > 0 && hs->http_buf_freelist_count >= hs->http_buf_freelist_max) { xfree(b); - while (b = hs->http_buf_freelist) { + while ((b = hs->http_buf_freelist)) { xfree(b); hs->http_buf_freelist = hs->http_buf_freelist->next; } + hs->http_buf_freelist_count = 0; } else { b->next = hs->http_buf_freelist; hs->http_buf_freelist = b; hs->http_buf_freelist_count++; +#if 0 + yaz_log(YLOG_DEBUG, "Free %d http buffers on server.", hs->http_buf_freelist_count); +#endif } yaz_mutex_leave(hs->mutex); } @@ -910,7 +919,18 @@ static void http_io(IOCHAN i, int event) } if (res <= 0) { +#if HAVE_SYS_TIME_H + if (hc->http_server->record_file) + { + struct timeval tv; + gettimeofday(&tv, 0); + fprintf(hc->http_server->record_file, "%lld %lld %lld 0\n", + (long long) tv.tv_sec, (long long) tv.tv_usec, + (long long) iochan_getfd(i)); + } +#endif http_buf_destroy(hc->http_server, htbuf); + fflush(hc->http_server->record_file); http_channel_destroy(i); return; } @@ -927,6 +947,22 @@ static void http_io(IOCHAN i, int event) return; // we have a complete HTTP request nmem_reset(hc->nmem); +#if HAVE_SYS_TIME_H + if (hc->http_server->record_file) + { + struct timeval tv; + int sz = 0; + struct http_buf *hb; + for (hb = hc->iqueue; hb; hb = hb->next) + sz += hb->len; + gettimeofday(&tv, 0); + fprintf(hc->http_server->record_file, "%lld %lld %lld %d\n", + (long long) tv.tv_sec, (long long) tv.tv_usec, + (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); + } + #endif if (!(hc->request = http_parse_request(hc, &hc->iqueue, reqlen))) { yaz_log(YLOG_WARN, "Failed to parse request"); @@ -1114,18 +1150,20 @@ static void http_channel_destroy(IOCHAN i) http_server = s->http_server; /* save it for destroy (decref) */ yaz_mutex_enter(s->http_server->mutex); - if (s->http_server->http_channel_freelist_max > 0 && s->http_server->http_channel_freelist_count > s->http_server->http_channel_freelist_max) { + if (s->http_server->http_channel_freelist_max > 0 && s->http_server->http_channel_freelist_count >= s->http_server->http_channel_freelist_max) { while ((s->next = s->http_server->http_channel_freelist)) { nmem_destroy(s->next->nmem); wrbuf_destroy(s->next->wrbuf); xfree(s->next); s->http_server->http_channel_freelist = s->http_server->http_channel_freelist->next; } + s->http_server->http_channel_freelist_count = 0; } else { s->next = s->http_server->http_channel_freelist; s->http_server->http_channel_freelist = s; s->http_server->http_channel_freelist_count++; + yaz_log(YLOG_DEBUG, "Free %d channels on server.", s->http_server->http_channel_freelist_count); } yaz_mutex_leave(s->http_server->mutex); @@ -1217,7 +1255,8 @@ static void http_accept(IOCHAN i, int event) } /* Create a http-channel listener, syntax [host:]port */ -int http_init(const char *addr, struct conf_server *server) +int http_init(const char *addr, struct conf_server *server, + const char *record_fname) { IOCHAN c; int l; @@ -1226,9 +1265,21 @@ int http_init(const char *addr, struct conf_server *server) int one = 1; const char *pp; short port; + FILE *record_file = 0; yaz_log(YLOG_LOG, "HTTP listener %s", addr); + + if (record_fname) + { + record_file = fopen(record_fname, "wb"); + if (!record_file) + { + yaz_log(YLOG_FATAL|YLOG_ERRNO, "fopen %s", record_fname); + return 1; + } + } + memset(&myaddr, 0, sizeof myaddr); myaddr.sin_family = AF_INET; pp = strchr(addr, ':'); @@ -1280,6 +1331,7 @@ int http_init(const char *addr, struct conf_server *server) server->http_server = http_server_create(); + server->http_server->record_file = record_file; server->http_server->listener_socket = l; c = iochan_create(l, http_accept, EVENT_INPUT | EVENT_EXCEPT, "http_server"); @@ -1402,11 +1454,14 @@ http_server_t http_server_create(void) hs->http_channel_freelist = 0; hs->http_channel_freelist_count = 0; - hs->http_channel_freelist_max = 10; + /* Disable max check */ + hs->http_channel_freelist_max = 0; hs->http_buf_freelist = 0; hs->http_buf_freelist_count = 0; - hs->http_buf_freelist_max = 10; + /* Disable max check */ + hs->http_buf_freelist_max = 0; + hs->record_file = 0; return hs; } @@ -1441,6 +1496,8 @@ void http_server_destroy(http_server_t hs) http_sessions_destroy(hs->http_sessions); xfree(hs->proxy_addr); yaz_mutex_destroy(&hs->mutex); + if (hs->record_file) + fclose(hs->record_file); xfree(hs); } }