+ s = http_session_create(service, c->http_sessions, sesid);
+
+ yaz_log(c->http_sessions->log_level, "%p Session init %u ", s, sesid);
+ if (!clear || *clear == '0')
+ session_init_databases(s->psession);
+ else
+ yaz_log(YLOG_LOG, "HTTP Session %u init: No databases preloaded", sesid);
+
+ if (process_settings(s->psession, c->request, c->response) < 0)
+ return;
+
+ response_open(c, "init");
+ wrbuf_printf(c->wrbuf, "<session>%d", sesid);
+ if (c->server->server_id)
+ {
+ wrbuf_puts(c->wrbuf, ".");
+ wrbuf_puts(c->wrbuf, c->server->server_id);
+ }
+ wrbuf_puts(c->wrbuf, "</session>"
+ "<protocol>" PAZPAR2_PROTOCOL_VERSION "</protocol>");
+
+ response_close(c, "init");
+}
+
+static void apply_local_setting(void *client_data,
+ struct setting *set)
+{
+ struct session *se = (struct session *) client_data;
+
+ session_apply_setting(se, nmem_strdup(se->session_nmem, set->target),
+ nmem_strdup(se->session_nmem, set->name),
+ nmem_strdup(se->session_nmem, set->value));
+}
+
+static void cmd_settings(struct http_channel *c)
+{
+ struct http_response *rs = c->response;
+ struct http_request *rq = c->request;
+ struct http_session *s = locate_session(c);
+ const char *content_type = http_lookup_header(rq->headers, "Content-Type");
+
+ if (!s)
+ return;
+
+ if (rq->content_len && content_type &&
+ !yaz_strcmp_del("text/xml", content_type, "; "))
+ {
+ xmlDoc *doc = xmlParseMemory(rq->content_buf, rq->content_len);
+ xmlNode *root_n;
+ if (!doc)
+ {
+ error(rs, PAZPAR2_MALFORMED_SETTING, 0);
+ return;
+ }
+ root_n = xmlDocGetRootElement(doc);
+
+ settings_read_node_x(root_n, s->psession, apply_local_setting);
+
+ xmlFreeDoc(doc);
+ }
+ if (process_settings(s->psession, rq, rs) < 0)
+ {
+ release_session(c, s);
+ return;
+ }
+ response_open(c, "settings");
+ response_close(c, "settings");
+ release_session(c, s);
+}
+
+static void termlist_response(struct http_channel *c)
+{
+ struct http_request *rq = c->request;
+ struct http_session *s = locate_session(c);
+ const char *name = http_argbyname(rq, "name");
+ const char *nums = http_argbyname(rq, "num");
+ int num = 15;
+ int status;
+
+ if (nums)
+ num = atoi(nums);
+
+ status = session_active_clients(s->psession);
+
+ response_open_no_status(c, "termlist");
+ wrbuf_printf(c->wrbuf, "<activeclients>%d</activeclients>\n", status);
+
+ perform_termlist(c, s->psession, name, num);
+
+ response_close(c, "termlist");
+ release_session(c, s);
+}
+
+static void termlist_result_ready(void *data)
+{
+ struct http_channel *c = (struct http_channel *) data;
+ yaz_log(c->http_sessions->log_level, "termlist watch released");
+ termlist_response(c);