log level for http is http (not HTTP)
[pazpar2-moved-to-github.git] / src / http_command.c
index 30de3d8..f109e16 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of Pazpar2.
-   Copyright (C) 2006-2013 Index Data
+   Copyright (C) Index Data
 
 Pazpar2 is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
@@ -126,7 +126,7 @@ http_sessions_t http_sessions_create(void)
     hs->session_list = 0;
     hs->mutex = 0;
     pazpar2_mutex_create(&hs->mutex, "http_sessions");
-    hs->log_level = yaz_log_module_level("HTTP");
+    hs->log_level = yaz_log_module_level("http");
     return hs;
 }
 
@@ -263,9 +263,9 @@ static const char *get_msg(enum pazpar2_error_code code)
     return "No error";
 }
 
-static void error(struct http_response *rs,
-                  enum pazpar2_error_code code,
-                  const char *addinfo)
+static void error2(struct http_response *rs,
+                   enum pazpar2_error_code code,
+                   const char *addinfo, const char *addinfo2)
 {
     struct http_channel *c = rs->channel;
     WRBUF text = wrbuf_alloc();
@@ -278,7 +278,14 @@ static void error(struct http_response *rs,
     wrbuf_printf(text, HTTP_COMMAND_RESPONSE_PREFIX
                  "<error code=\"%d\" msg=\"%s\">", (int) code, msg);
     if (addinfo)
+    {
         wrbuf_xmlputs(text, addinfo);
+        if (addinfo2)
+        {
+            wrbuf_xmlputs(text, ": ");
+            wrbuf_xmlputs(text, addinfo2);
+        }
+    }
     wrbuf_puts(text, "</error>");
 
     yaz_log(YLOG_WARN, "HTTP %s %s%s%s", http_status,
@@ -288,6 +295,13 @@ static void error(struct http_response *rs,
     http_send_response(c);
 }
 
+static void error(struct http_response *rs,
+                  enum pazpar2_error_code code,
+                  const char *addinfo)
+{
+    error2(rs, code, addinfo, 0);
+}
+
 static void response_open_command(struct http_channel *c, const char *command)
 {
     wrbuf_rewind(c->wrbuf);
@@ -387,6 +401,7 @@ static int process_settings(struct session *se, struct http_request *rq,
                             struct http_response *rs)
 {
     struct http_argument *a;
+    NMEM nmem = nmem_create();
 
     for (a = rq->arguments; a; a = a->next)
         if (strchr(a->name, '['))
@@ -397,17 +412,18 @@ static int process_settings(struct session *se, struct http_request *rq,
             char *setting;
 
             // Nmem_strsplit *rules*!!!
-            nmem_strsplit(se->session_nmem, "[]", a->name, &res, &num);
+            nmem_strsplit(nmem, "[]", a->name, &res, &num);
             if (num != 2)
             {
                 error(rs, PAZPAR2_MALFORMED_SETTING, a->name);
+                nmem_destroy(nmem);
                 return -1;
             }
             setting = res[0];
             dbname = res[1];
-            session_apply_setting(se, dbname, setting,
-                    nmem_strdup(se->session_nmem, a->value));
+            session_apply_setting(se, dbname, setting, a->value);
         }
+    nmem_destroy(nmem);
     return 0;
 }
 
@@ -493,9 +509,7 @@ static void apply_local_setting(void *client_data,
 {
     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));
+    session_apply_setting(se, set->target, set->name, set->value);
 }
 
 static void cmd_settings(struct http_channel *c)
@@ -774,9 +788,9 @@ static void bytarget_response(struct http_channel *c, struct http_session *s,
 
         wrbuf_printf(c->wrbuf, "<records>%d</records>\n",
                      ht[i].records - ht[i].filtered);
+        wrbuf_printf(c->wrbuf, "<filtered>%d</filtered>\n", ht[i].filtered);
         if (version >= 2)
         {
-            wrbuf_printf(c->wrbuf, "<filtered>%d</filtered>\n", ht[i].filtered);
             wrbuf_printf(c->wrbuf, "<approximation>" ODR_INT_PRINTF
                          "</approximation>\n", ht[i].approximation);
         }
@@ -795,6 +809,15 @@ static void bytarget_response(struct http_channel *c, struct http_session *s,
             wrbuf_puts(c->wrbuf, ht[i].suggestions_xml);
             wrbuf_puts(c->wrbuf, "</suggestions>");
         }
+        if (ht[i].query_data)
+        {
+            wrbuf_puts(c->wrbuf, "<query_type>");
+            wrbuf_xmlputs(c->wrbuf, ht[i].query_type);
+            wrbuf_puts(c->wrbuf, "</query_type>\n");
+            wrbuf_puts(c->wrbuf, "<query_data>");
+            wrbuf_xmlputs(c->wrbuf, ht[i].query_data);
+            wrbuf_puts(c->wrbuf, "</query_data>\n");
+        }
         wrbuf_puts(c->wrbuf, "</target>");
     }
     response_close(c, "bytarget");
@@ -911,6 +934,9 @@ static void write_metadata(WRBUF w, struct conf_service *service,
                     if (md->data.number.min != md->data.number.max)
                         wrbuf_printf(w, "-%d", md->data.number.max);
                     break;
+                case Metadata_type_float:
+                    wrbuf_printf(w, "%f", md->data.fnumber);
+                    break;
                 default:
                     wrbuf_puts(w, "[can't represent]");
                     break;
@@ -1271,7 +1297,7 @@ static void cmd_show(struct http_channel *c)
 
     status = session_active_clients(s->psession);
 
-    if (block)
+    if (block && reclist_get_num_records(s->psession->reclist) == 0)
     {
         if (!strcmp(block, "preferred")
             && !session_is_preferred_clients_ready(s->psession)
@@ -1361,6 +1387,7 @@ static void cmd_search(struct http_channel *c)
     const char *rank = http_argbyname(rq, "rank");
     enum pazpar2_error_code code;
     const char *addinfo = 0;
+    const char *addinfo2 = 0;
     struct reclist_sortparms *sp;
     struct conf_service *service = 0;
 
@@ -1391,10 +1418,10 @@ static void cmd_search(struct http_channel *c)
     }
 
     code = session_search(s->psession, query, startrecs, maxrecs, filter, limit,
-                          &addinfo, sp, mergekey, rank);
+                          &addinfo, &addinfo2, sp, mergekey, rank);
     if (code)
     {
-        error(rs, code, addinfo);
+        error2(rs, code, addinfo, addinfo2);
         release_session(c, s);
         return;
     }
@@ -1439,6 +1466,17 @@ static void cmd_stat(struct http_channel *c)
     release_session(c, s);
 }
 
+static void cmd_stop(struct http_channel *c)
+{
+    struct http_session *s = locate_session(c);
+    if (!s)
+        return;
+    response_open_ok(c, "stop");
+    session_stop(s->psession);
+    response_close(c, "stop");
+    release_session(c, s);
+}
+
 static void cmd_info(struct http_channel *c)
 {
     char yaz_version_str[20];
@@ -1498,6 +1536,7 @@ struct {
     { "ping", cmd_ping },
     { "record", cmd_record },
     { "info", cmd_info },
+    { "stop", cmd_stop },
     {0,0}
 };