X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=src%2Fhttp.c;h=5158ddbd1929e0c2b3532b64d1ea6ed043d687b2;hb=9ecd8773a367e0fae79a2da422a0bebb0938fe1e;hp=1e73f7ce0ed03a1c6069bb0ce7f647c5174b794e;hpb=284649ed257354c2fcb2f2a6c78cf5fd7cf2283d;p=pazpar2-moved-to-github.git diff --git a/src/http.c b/src/http.c index 1e73f7c..5158ddb 100644 --- a/src/http.c +++ b/src/http.c @@ -84,10 +84,10 @@ struct http_buf static void proxy_io(IOCHAN i, int event); -static struct http_channel *http_create(http_server_t http_server, - const char *addr, - struct conf_server *server); -static void http_destroy(IOCHAN i); +static struct http_channel *http_channel_create(http_server_t http_server, + const char *addr, + struct conf_server *server); +static void http_channel_destroy(IOCHAN i); static http_server_t http_server_create(void); static void http_server_incref(http_server_t hs); @@ -98,6 +98,7 @@ struct http_server YAZ_MUTEX mutex; int listener_socket; int ref_count; + http_sessions_t http_sessions; struct sockaddr_in *proxy_addr; }; @@ -798,7 +799,8 @@ static int http_proxy(struct http_request *rq) // We will add EVENT_OUTPUT below p->iochan = iochan_create(sock, proxy_io, EVENT_INPUT); iochan_setdata(p->iochan, p); - pazpar2_add_channel(p->iochan); + + iochan_add(ser->iochan_man, p->iochan); } // Do _not_ modify Host: header, just checking it's existence @@ -846,7 +848,7 @@ void http_send_response(struct http_channel *ch) if (!hb) { yaz_log(YLOG_WARN, "Failed to serialize HTTP response"); - http_destroy(ch->iochan); + http_channel_destroy(ch->iochan); } else { @@ -892,7 +894,7 @@ static void http_io(IOCHAN i, int event) if (res <= 0) { http_buf_destroy(hc->http_server, htbuf); - http_destroy(i); + http_channel_destroy(i); return; } htbuf->buf[res] = '\0'; @@ -939,7 +941,7 @@ static void http_io(IOCHAN i, int event) if (res <= 0) { yaz_log(YLOG_WARN|YLOG_ERRNO, "write"); - http_destroy(i); + http_channel_destroy(i); return; } if (res == wb->len) @@ -955,7 +957,7 @@ static void http_io(IOCHAN i, int event) if (!hc->oqueue) { if (!hc->keep_alive) { - http_destroy(i); + http_channel_destroy(i); return; } else @@ -968,11 +970,11 @@ static void http_io(IOCHAN i, int event) } if (!hc->oqueue && hc->proxy && !hc->proxy->iochan) - http_destroy(i); // Server closed; we're done + http_channel_destroy(i); // Server closed; we're done break; default: yaz_log(YLOG_WARN, "Unexpected event on connection"); - http_destroy(i); + http_channel_destroy(i); } } @@ -1007,7 +1009,7 @@ static void proxy_io(IOCHAN pi, int event) } else { - http_destroy(hc->iochan); + http_channel_destroy(hc->iochan); return; } } @@ -1032,7 +1034,7 @@ static void proxy_io(IOCHAN pi, int event) if (res <= 0) { yaz_log(YLOG_WARN|YLOG_ERRNO, "write"); - http_destroy(hc->iochan); + http_channel_destroy(hc->iochan); return; } if (res == htbuf->len) @@ -1053,7 +1055,7 @@ static void proxy_io(IOCHAN pi, int event) break; default: yaz_log(YLOG_WARN, "Unexpected event on connection"); - http_destroy(hc->iochan); + http_channel_destroy(hc->iochan); } } @@ -1061,7 +1063,7 @@ static void http_fire_observers(struct http_channel *c); static void http_destroy_observers(struct http_channel *c); // Cleanup channel -static void http_destroy(IOCHAN i) +static void http_channel_destroy(IOCHAN i) { struct http_channel *s = iochan_getdata(i); http_server_t http_server; @@ -1102,9 +1104,9 @@ static void http_destroy(IOCHAN i) iochan_destroy(i); } -static struct http_channel *http_create(http_server_t hs, - const char *addr, - struct conf_server *server) +static struct http_channel *http_channel_create(http_server_t hs, + const char *addr, + struct conf_server *server) { struct http_channel *r; @@ -1127,6 +1129,8 @@ static struct http_channel *http_create(http_server_t hs, } http_server_incref(hs); r->http_server = hs; + r->http_sessions = hs->http_sessions; + assert(r->http_sessions); r->server = server; r->proxy = 0; r->iochan = 0; @@ -1168,11 +1172,11 @@ 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); - ch = http_create(server->http_server, inet_ntoa(addr.sin_addr), server); + ch = http_channel_create(server->http_server, inet_ntoa(addr.sin_addr), + server); ch->iochan = c; iochan_setdata(c, ch); - - pazpar2_add_channel(c); + iochan_add(server->iochan_man, c); } /* Create a http-channel listener, syntax [host:]port */ @@ -1185,7 +1189,6 @@ int http_init(const char *addr, struct conf_server *server) int one = 1; const char *pp; short port; - http_server_t http_server; yaz_log(YLOG_LOG, "HTTP listener %s", addr); @@ -1238,14 +1241,14 @@ int http_init(const char *addr, struct conf_server *server) return 1; } - http_server = http_server_create(); - server->http_server = http_server; + server->http_server = http_server_create(); - http_server->listener_socket = l; + server->http_server->listener_socket = l; c = iochan_create(l, http_accept, EVENT_INPUT | EVENT_EXCEPT); iochan_setdata(c, server); - pazpar2_add_channel(c); + + iochan_add(server->iochan_man, c); return 0; } @@ -1360,6 +1363,7 @@ http_server_t http_server_create(void) hs->ref_count = 1; hs->http_buf_freelist = 0; hs->http_channel_freelist = 0; + hs->http_sessions = 0; return hs; } @@ -1377,7 +1381,7 @@ void http_server_destroy(http_server_t hs) } else r = --(hs->ref_count); - + if (r == 0) { struct http_buf *b = hs->http_buf_freelist; @@ -1391,9 +1395,12 @@ void http_server_destroy(http_server_t hs) while (c) { struct http_channel *c_next = c->next; + nmem_destroy(c->nmem); + wrbuf_destroy(c->wrbuf); xfree(c); c = c_next; } + http_sessions_destroy(hs->http_sessions); xfree(hs->proxy_addr); yaz_mutex_destroy(&hs->mutex); xfree(hs); @@ -1415,6 +1422,7 @@ void http_mutex_init(struct conf_server *server) assert(server->http_server->mutex == 0); yaz_mutex_create(&server->http_server->mutex); + server->http_server->http_sessions = http_sessions_create(); } /*