unsigned int sesid;
struct http_session *s;
struct http_response *rs = c->response;
- struct conf_service *service;
+ struct conf_service *service = 0; /* no service (yet) */
- if (content_type && !yaz_strcmp_del("text/xml", content_type, "; "))
+ if (r->content_len && content_type &&
+ !yaz_strcmp_del("text/xml", content_type, "; "))
{
xmlDoc *doc = xmlParseMemory(r->content_buf, r->content_len);
xmlNode *root_n;
root_n = xmlDocGetRootElement(doc);
service = service_create(c->server, root_n);
xmlFreeDoc(doc);
+ if (!service)
+ {
+ error(rs, PAZPAR2_MALFORMED_SETTING, 0);
+ return;
+ }
}
- else
+
+ if (!service)
{
const char *service_name = http_argbyname(c->request, "service");
service = locate_service(c->server, service_name);
http_send_response(c);
}
+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(rq, rs);
+ 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)
return;
rs->payload = "<settings><status>OK</status></settings>";