X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Fhttp_command.c;h=aa73f9149e70e89ed56216a58b713798e838077d;hb=e22e7b20d6fa0731db95e3bf17c66f002784828b;hp=d4b4a77672c6c49acfe48790d9530e7ec5218287;hpb=c7dba339191653dfa15e2dc76fb5b1dcaa339f5b;p=pazpar2-moved-to-github.git diff --git a/src/http_command.c b/src/http_command.c index d4b4a77..aa73f91 100644 --- a/src/http_command.c +++ b/src/http_command.c @@ -470,6 +470,8 @@ static void cmd_init(struct http_channel *c) wrbuf_puts(c->wrbuf, "" "" PAZPAR2_PROTOCOL_VERSION ""); + wrbuf_printf(c->wrbuf, "%d\n", 1000 * ((s->psession->service->session_timeout >= 20) ? + (s->psession->service->session_timeout - 10) : 50)); response_close(c, "init"); } @@ -498,6 +500,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); @@ -505,10 +508,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) { @@ -868,10 +875,14 @@ static void write_subrecord(struct record *r, WRBUF w, wrbuf_puts(w, "client)); - wrbuf_puts(w, "\" "); + wrbuf_puts(w, "\"\n"); - wrbuf_puts(w, "name=\""); + wrbuf_puts(w, " name=\""); wrbuf_xmlputs(w, *name ? name : "Unknown"); + wrbuf_puts(w, "\" "); + + wrbuf_puts(w, "checksum=\""); + wrbuf_printf(w, "%u", r->checksum); wrbuf_puts(w, "\">"); write_metadata(w, service, r->metadata, show_details); @@ -932,11 +943,11 @@ static void show_record(struct http_channel *c, struct http_session *s) struct http_response *rs = c->response; struct http_request *rq = c->request; struct record_cluster *rec, *prev_r, *next_r; - struct record *r; struct conf_service *service; const char *idstr = http_argbyname(rq, "id"); const char *offsetstr = http_argbyname(rq, "offset"); const char *binarystr = http_argbyname(rq, "binary"); + const char *checksumstr = http_argbyname(rq, "checksum"); if (!s) return; @@ -960,9 +971,8 @@ static void show_record(struct http_channel *c, struct http_session *s) } return; } - if (offsetstr) + if (offsetstr || checksumstr) { - int offset = atoi(offsetstr); const char *syntax = http_argbyname(rq, "syntax"); const char *esn = http_argbyname(rq, "esn"); int i; @@ -973,14 +983,25 @@ static void show_record(struct http_channel *c, struct http_session *s) if (binarystr && *binarystr != '0') binary = 1; - for (i = 0; i < offset && r; r = r->next, i++) - ; - if (!r) + if (checksumstr) { - error(rs, PAZPAR2_RECORD_FAIL, "no record at offset given"); + long v = atol(checksumstr); + for (i = 0; r; r = r->next) + if (v == r->checksum) + break; + if (!r) + error(rs, PAZPAR2_RECORD_FAIL, "no record"); } else { + int offset = atoi(offsetstr); + for (i = 0; i < offset && r; r = r->next, i++) + ; + if (!r) + error(rs, PAZPAR2_RECORD_FAIL, "no record at offset given"); + } + if (r) + { http_channel_observer_t obs = http_add_observer(c, r->client, show_raw_reset); int ret = client_show_raw_begin(r->client, r->position, @@ -1001,6 +1022,7 @@ static void show_record(struct http_channel *c, struct http_session *s) } else { + struct record *r; response_open_no_status(c, "record"); wrbuf_puts(c->wrbuf, "\n"); wrbuf_xmlputs(c->wrbuf, rec->recid); @@ -1166,7 +1188,8 @@ static void cmd_show(struct http_channel *c) release_session(c, s); return; } - session_sort(s->psession, sp->name, sp->increasing); + session_sort(s->psession, sp->name, sp->increasing, + sp->type == Metadata_sortkey_position); status = session_active_clients(s->psession);