X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Fhttp_command.c;h=567189e2254ec4f093ebb743a37423a1ac76d16f;hb=1db48a73126beef112e9a3de775832173fa317f3;hp=595f9cf3ffaacaec3a4fbb521be4d0d5895885a3;hpb=93224ba0160c80676567032f69c253e439f369e2;p=pazpar2-moved-to-github.git diff --git a/src/http_command.c b/src/http_command.c index 595f9cf..567189e 100644 --- a/src/http_command.c +++ b/src/http_command.c @@ -93,6 +93,16 @@ struct http_sessions { static YAZ_MUTEX g_http_session_mutex = 0; static int g_http_sessions = 0; +int get_version(struct http_request *rq) { + const char *version = http_argbyname(rq, "version"); + int version_no = 0; + if (version && strcmp(version, "")) { + version_no = atoi(version); + } + return version_no; +} + + int http_session_use(int delta) { int sessions; @@ -488,6 +498,7 @@ static void cmd_settings(struct http_channel *c) { xmlDoc *doc = xmlParseMemory(rq->content_buf, rq->content_len); xmlNode *root_n; + int ret; if (!doc) { error(rs, PAZPAR2_MALFORMED_SETTING, 0); @@ -495,10 +506,14 @@ static void cmd_settings(struct http_channel *c) return; } root_n = xmlDocGetRootElement(doc); - - settings_read_node_x(root_n, s->psession, apply_local_setting); - + ret = settings_read_node_x(root_n, s->psession, apply_local_setting); xmlFreeDoc(doc); + if (ret) + { + error(rs, PAZPAR2_MALFORMED_SETTING, 0); + release_session(c,s); + return; + } } if (process_settings(s->psession, rq, rs) < 0) { @@ -513,8 +528,9 @@ static void cmd_settings(struct http_channel *c) static void termlist_response(struct http_channel *c, struct http_session *s, const char *cmd_status) { struct http_request *rq = c->request; - const char *name = http_argbyname(rq, "name"); - const char *nums = http_argbyname(rq, "num"); + const char *name = http_argbyname(rq, "name"); + const char *nums = http_argbyname(rq, "num"); + int version = get_version(rq); int num = 15; int status; @@ -530,7 +546,7 @@ static void termlist_response(struct http_channel *c, struct http_session *s, co } wrbuf_printf(c->wrbuf, "%d\n", status); - perform_termlist(c, s->psession, name, num); + perform_termlist(c, s->psession, name, num, version); response_close(c, "termlist"); } @@ -541,9 +557,9 @@ static void termlist_result_ready(void *data) struct http_request *rq = c->request; const char *report = http_argbyname(rq, "report"); const char *status = 0; + struct http_session *s = locate_session(c); if (report && !strcmp("status", report)) status = "OK"; - struct http_session *s = locate_session(c); if (s) { yaz_log(c->http_sessions->log_level, "Session %u termlist watch released", s->session_id); termlist_response(c, s, status); @@ -586,9 +602,12 @@ static void cmd_termlist(struct http_channel *c) release_session(c, s); return; } - if (report_status) { + else if (report_status) { status_message = "WARNING (Already blocked on termlist)"; } + else { + yaz_log(YLOG_WARN, "Session %u: Ignoring termlist block. Return current result", s->session_id); + } } else { @@ -673,7 +692,7 @@ static void bytarget_response(struct http_channel *c, struct http_session *s, co struct hitsbytarget *ht; struct http_request *rq = c->request; const char *settings = http_argbyname(rq, "settings"); - + int version = get_version(rq); ht = get_hitsbytarget(s->psession, &count, c->nmem); if (!cmd_status) /* Old protocol, always ok */ @@ -711,8 +730,11 @@ static void bytarget_response(struct http_channel *c, struct http_session *s, co wrbuf_puts(c->wrbuf, "\n"); } - wrbuf_printf(c->wrbuf, "%d\n", ht[i].records); - + wrbuf_printf(c->wrbuf, "%d\n", ht[i].records - ht[i].filtered); + if (version >= 2) { + wrbuf_printf(c->wrbuf, "%d\n", ht[i].filtered); + wrbuf_printf(c->wrbuf, "" ODR_INT_PRINTF "\n", ht[i].approximation); + } wrbuf_puts(c->wrbuf, ""); wrbuf_xmlputs(c->wrbuf, ht[i].state); wrbuf_puts(c->wrbuf, "\n"); @@ -755,18 +777,18 @@ static void cmd_bytarget(struct http_channel *c) struct http_session *s = locate_session(c); const char *block = http_argbyname(rq, "block"); const char *report = http_argbyname(rq, "report"); - int block_error = 0; + int report_error = 0; int report_status = 0; const char *status_message = "OK"; + int no_active; + if (report && !strcmp("error", report)) { - block_error = 1; + report_error = 1; } if (report && !strcmp("status", report)) { report_status = 1; } - int no_active; - if (!s) return; @@ -778,14 +800,17 @@ static void cmd_bytarget(struct http_channel *c) bytarget_result_ready, c, c) != 0) { yaz_log(YLOG_WARN, "Session %u: Attempt to block multiple times on bytarget block. Not supported!", s->session_id); - if (block_error) { + if (report_error) { error(rs, PAZPAR2_ALREADY_BLOCKED, "bytarget"); release_session(c, s); return; } - if (report_status) { + else if (report_status) { status_message = "WARNING (Already blocked on bytarget)"; } + else { + yaz_log(YLOG_WARN, "Session %u: Ignoring bytarget block. Return current result.", s->session_id); + } } else { @@ -1037,10 +1062,13 @@ static void show_records(struct http_channel *c, struct http_session *s, int act const char *start = http_argbyname(rq, "start"); const char *num = http_argbyname(rq, "num"); const char *sort = http_argbyname(rq, "sort"); + int version = get_version(rq); + int startn = 0; int numn = 20; int total; Odr_int total_hits; + Odr_int approx_hits; int i; if (!s) @@ -1063,12 +1091,15 @@ static void show_records(struct http_channel *c, struct http_session *s, int act } - rl = show_range_start(s->psession, sp, startn, &numn, &total, &total_hits); + rl = show_range_start(s->psession, sp, startn, &numn, &total, &total_hits, &approx_hits); response_open(c, "show"); wrbuf_printf(c->wrbuf, "\n%d\n", active); wrbuf_printf(c->wrbuf, "%d\n", total); wrbuf_printf(c->wrbuf, "" ODR_INT_PRINTF "\n", total_hits); + if (version >= 2) { + wrbuf_printf(c->wrbuf, "" ODR_INT_PRINTF "\n", approx_hits); + } wrbuf_printf(c->wrbuf, "%d\n", startn); wrbuf_printf(c->wrbuf, "%d\n", numn); @@ -1120,10 +1151,14 @@ static void cmd_show(struct http_channel *c) struct http_session *s = locate_session(c); const char *block = http_argbyname(rq, "block"); const char *sort = http_argbyname(rq, "sort"); - const char *block_error = http_argbyname(rq, "error"); + const char *block_error = http_argbyname(rq, "report"); + struct reclist_sortparms *sp; int status; - + int report_error = 0; + if (block_error && !strcmp("1", block_error)) { + report_error = 1; + } if (!s) return; @@ -1155,12 +1190,16 @@ static void cmd_show(struct http_channel *c) } else { - yaz_log(YLOG_WARN, "Attempt to block multiple times on show (preferred targets) block. Not supported!"); - if (block_error && !strcmp("1", block_error)) { + yaz_log(YLOG_WARN, "Session %u: Attempt to block multiple times on show (preferred targets) block. Not supported!", + s->session_id); + if (report_error) { error(rs, PAZPAR2_ALREADY_BLOCKED, "show (preferred targets)"); release_session(c, s); return; } + else { + yaz_log(YLOG_WARN, "Session %u: Ignoring show(preferred) block. Returning current result.", s->session_id); + } } } @@ -1170,12 +1209,15 @@ static void cmd_show(struct http_channel *c) if (session_set_watch(s->psession, SESSION_WATCH_SHOW, show_records_ready, c, c) != 0) { - yaz_log(YLOG_WARN, "Attempt to block multiple times on show block. Not supported!"); - if (block_error && !strcmp("1", block_error)) { + yaz_log(YLOG_WARN, "Session %u: Attempt to block multiple times on show block. Not supported!", s->session_id); + if (report_error) { error(rs, PAZPAR2_ALREADY_BLOCKED, "show"); release_session(c, s); return; } + else { + yaz_log(YLOG_WARN, "Session %u: Ignoring show block. Returning current result.", s->session_id); + } } else {