POST of target settings.
[pazpar2-moved-to-github.git] / src / http_command.c
index 616a48c..e9d1ff8 100644 (file)
@@ -249,9 +249,10 @@ static void cmd_init(struct http_channel *c)
     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;
@@ -263,8 +264,14 @@ static void cmd_init(struct http_channel *c)
         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);
@@ -293,15 +300,42 @@ static void cmd_init(struct http_channel *c)
     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>";