From: Adam Dickmeiss Date: Wed, 22 Jan 2014 13:32:06 +0000 (+0100) Subject: Merge branch 'master' into yaz-728 X-Git-Tag: v5.0.13~49 X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=commitdiff_plain;h=a741500ee64cc5009f82d94585ea389e1c5e6613;hp=32790840d73b1f4a4bde1478e6b14699aac00e94 Merge branch 'master' into yaz-728 --- diff --git a/IDMETA b/IDMETA index e12f1ff..7f1b7af 100755 --- a/IDMETA +++ b/IDMETA @@ -1,4 +1,4 @@ DEBIAN_DIST="jessie wheezy squeeze" UBUNTU_DIST="saucy raring quantal precise oneiric lucid" CENTOS_DIST="centos5 centos6" -VERSION=5.0.11 +VERSION=5.0.12 diff --git a/NEWS b/NEWS index 18450cc..cfcf996 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,18 @@ +--- 5.0.12 2014/01/22 + +Prefix URL with http:// if sru setting hints SRU/Solr mode YAZ-731 + +SRU GET/Solr base URLs may hold additional ?args YAZ-729 +ZOOM option extraArgs already does this, though. It seems useful +when dealing with Solr targets to limit by filter, eg. + http://lui.indexdata.com:8080/solr4/select?fq=database:3902 + +Remove #fragment for HTTP request encoding YAZ-730 + +Doc: Update list of DLLs/LIBs + +Doc: update href link to Unix utils and Git. + --- 5.0.11 2014/01/15 ZOOM: fix "lost connection" problem with servers that uses both squid diff --git a/client/client.c b/client/client.c index 97d8e4c..596b76a 100644 --- a/client/client.c +++ b/client/client.c @@ -146,7 +146,7 @@ static int z3950_version = 3; static int scan_stepSize = 0; static char scan_position[64]; static int scan_size = 20; -static char cur_host[200]; +static WRBUF cur_host = 0; static Odr_int last_hit_count = 0; static int pretty_xml = 0; static Odr_int sru_maximumRecords = 0; @@ -739,7 +739,7 @@ static int session_connect_base(const char *arg, const char **basep) return 0; } -static int session_connect(const char *arg) +static int session_connect(void) { int r; const char *basep = 0; @@ -747,7 +747,7 @@ static int session_connect(const char *arg) yaz_cookies_destroy(yaz_cookies); yaz_cookies = yaz_cookies_create(); - r = session_connect_base(arg, &basep); + r = session_connect_base(wrbuf_cstr(cur_host), &basep); if (basep && *basep) set_base(basep); else if (protocol == PROTO_Z3950) @@ -760,15 +760,16 @@ static int cmd_open(const char *arg) int r; if (arg) { - strncpy(cur_host, arg, sizeof(cur_host)-1); - cur_host[sizeof(cur_host)-1] = 0; + wrbuf_rewind(cur_host); + if (!strstr(arg, "://") && strcmp(sru_method, "soap")) + wrbuf_puts(cur_host, "http://"); + wrbuf_puts(cur_host, arg); } set_base(""); - r = session_connect(cur_host); + r = session_connect(); if (conn && conn->protocol == PROTO_HTTP) queryType = QueryType_CQL; - return r; } @@ -1363,7 +1364,7 @@ static int send_srw_host_path(Z_SRW_PDU *sr, const char *host_port, static int send_srw(Z_SRW_PDU *sr) { char *path = yaz_encode_sru_dbpath_odr(out, databaseNames[0]); - return send_srw_host_path(sr, cur_host, path); + return send_srw_host_path(sr, wrbuf_cstr(cur_host), path); } static int send_SRW_redirect(const char *uri) @@ -2387,7 +2388,7 @@ static int send_SRW_update(int action_no, const char *recid, char *rec_buf, int rec_len) { if (!conn) - session_connect(cur_host); + session_connect(); if (!conn) return 0; else @@ -2649,7 +2650,7 @@ static int cmd_explain(const char *arg) return 0; #if YAZ_HAVE_XML2 if (!conn) - session_connect(cur_host); + session_connect(); if (conn) { Z_SRW_PDU *sr = 0; @@ -2672,12 +2673,14 @@ static int cmd_init(const char *arg) { if (*arg) { - strncpy(cur_host, arg, sizeof(cur_host)-1); - cur_host[sizeof(cur_host)-1] = 0; + wrbuf_rewind(cur_host); + if (!strstr(arg, "://") && strcmp(sru_method, "soap")) + wrbuf_puts(cur_host, "http://"); + wrbuf_puts(cur_host, arg); } if (only_z3950()) return 1; - send_Z3950_initRequest(cur_host); + send_Z3950_initRequest(wrbuf_cstr(cur_host)); return 2; } @@ -2848,7 +2851,7 @@ static int cmd_find(const char *arg) { #if YAZ_HAVE_XML2 if (!conn) - session_connect(cur_host); + session_connect(); if (!conn) return 0; if (!send_SRW_searchRequest(arg)) @@ -2859,7 +2862,7 @@ static int cmd_find(const char *arg) } else { - if (*cur_host && auto_reconnect) + if (wrbuf_len(cur_host) && auto_reconnect) { int i = 0; for (;;) @@ -2877,7 +2880,7 @@ static int cmd_find(const char *arg) printf("Unable to reconnect\n"); break; } - session_connect(cur_host); + session_connect(); wait_and_handle_response(0); } return 0; @@ -3220,7 +3223,7 @@ static int cmd_show(const char *arg) { #if YAZ_HAVE_XML2 if (!conn) - session_connect(cur_host); + session_connect(); if (!conn) return 0; if (!send_SRW_presentRequest(arg)) @@ -3244,10 +3247,15 @@ static int cmd_show(const char *arg) static void exit_client(int code) { + odr_destroy(in); + odr_destroy(out); + odr_destroy(print); + ccl_qual_rm(&bibset); yaz_cookies_destroy(yaz_cookies); file_history_save(file_history); file_history_destroy(&file_history); nmem_destroy(nmem_auth); + wrbuf_destroy(cur_host); exit(code); } @@ -3609,7 +3617,7 @@ static int cmd_scan_common(const char *set, const char *arg) { #if YAZ_HAVE_XML2 if (!conn) - session_connect(cur_host); + session_connect(); if (!conn) return 0; if (send_SRW_scanRequest(scan_query, pos_p, scan_size) < 0) @@ -3621,9 +3629,9 @@ static int cmd_scan_common(const char *set, const char *arg) } else { - if (*cur_host && !conn && auto_reconnect) + if (wrbuf_len(cur_host) && !conn && auto_reconnect) { - session_connect(cur_host); + session_connect(); wait_and_handle_response(0); } if (!conn) @@ -4254,6 +4262,8 @@ static void initialize(const char *rc_file) FILE *inf; int i; + cur_host = wrbuf_alloc(); + if (!(out = odr_createmem(ODR_ENCODE)) || !(in = odr_createmem(ODR_DECODE)) || !(print = odr_createmem(ODR_PRINT))) @@ -4531,7 +4541,7 @@ static void wait_and_handle_response(int one_response_only) { cs_close(conn); conn = 0; - session_connect(cur_host); + session_connect(); reconnect_ok = 0; if (conn) { @@ -4655,7 +4665,7 @@ static void wait_and_handle_response(int one_response_only) { const char *base_tmp; int host_change = 0; - location = yaz_check_location(in, cur_host, + location = yaz_check_location(in, wrbuf_cstr(cur_host), location, &host_change); if (host_change) session_connect_base(location, &base_tmp); @@ -4836,9 +4846,9 @@ static int cmd_list_all(const char* args) /* connection options */ if (conn) - printf("Connected to : %s\n", cur_host); - else if (*cur_host) - printf("Not connected to : %s\n", cur_host); + printf("Connected to : %s\n", wrbuf_cstr(cur_host)); + else if (cur_host && wrbuf_len(cur_host)) + printf("Not connected to : %s\n", wrbuf_cstr(cur_host)); else printf("Not connected : \n"); if (yazProxy) printf("using proxy : %s\n",yazProxy); diff --git a/debian/changelog b/debian/changelog index ad00905..08f4f11 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +yaz (5.0.12-1.indexdata) unstable; urgency=medium + + * Upstream. + + -- Adam Dickmeiss Wed, 22 Jan 2014 10:20:47 +0100 + yaz (5.0.11-1.indexdata) unstable; urgency=medium * Upstream. diff --git a/src/http.c b/src/http.c index 0f17df5..54521b1 100644 --- a/src/http.c +++ b/src/http.c @@ -610,11 +610,13 @@ int yaz_encode_http_response(ODR o, Z_HTTP_Response *hr) int yaz_encode_http_request(ODR o, Z_HTTP_Request *hr) { Z_HTTP_Header *h; + char *cp; int top0 = o->op->top; odr_write(o, hr->method, strlen(hr->method)); odr_write(o, " ", 1); - odr_write(o, hr->path, strlen(hr->path)); + cp = strchr(hr->path, '#'); + odr_write(o, hr->path, cp ? (cp - hr->path) : strlen(hr->path)); odr_write(o, " HTTP/", 6); odr_write(o, hr->version, strlen(hr->version)); odr_write(o, "\r\n", 2); diff --git a/src/solr.c b/src/solr.c index 4c77e6f..99a9519 100644 --- a/src/solr.c +++ b/src/solr.c @@ -482,6 +482,7 @@ int yaz_solr_encode_request(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, char *q; char *pos; char *cp; + const char *path_args = 0; int i = 0; z_HTTP_header_add_basic_auth(encode, &hreq->headers, @@ -580,8 +581,17 @@ int yaz_solr_encode_request(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, path = (char *) odr_malloc(encode, strlen(hreq->path) + - strlen(uri_args) + strlen(solr_op) + 4); + strlen(uri_args) + strlen(solr_op) + 5); + cp = strchr(hreq->path, '#'); + if (cp) + *cp = '\0'; + cp = strchr(hreq->path, '?'); + if (cp) + { + *cp = '\0'; /* args in path */ + path_args = cp + 1; + } strcpy(path, hreq->path); cp = strrchr(path, '/'); if (cp) @@ -592,6 +602,11 @@ int yaz_solr_encode_request(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, strcat(path, "/"); strcat(path, solr_op); strcat(path, "?"); + if (path_args) + { + strcat(path, path_args); + strcat(path, "&"); + } strcat(path, uri_args); hreq->path = path; diff --git a/src/srwutil.c b/src/srwutil.c index 7be212a..cb00278 100644 --- a/src/srwutil.c +++ b/src/srwutil.c @@ -1052,6 +1052,7 @@ int yaz_sru_get_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, char *name[MAX_SRU_PARAMETERS], *value[MAX_SRU_PARAMETERS]; /* definite upper limit for SRU params */ char *uri_args; char *path; + char *cp; z_HTTP_header_add_basic_auth(encode, &hreq->headers, srw_pdu->username, srw_pdu->password); @@ -1061,10 +1062,15 @@ int yaz_sru_get_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, hreq->method = "GET"; + cp = strchr(hreq->path, '#'); + if (cp) + *cp = '\0'; + path = (char *) odr_malloc(encode, strlen(hreq->path) + strlen(uri_args) + 4); - sprintf(path, "%s?%s", hreq->path, uri_args); + sprintf(path, "%s%c%s", hreq->path, strchr(hreq->path, '?') ? '&' : '?', + uri_args); hreq->path = path; z_HTTP_header_add_content_type(encode, &hreq->headers, diff --git a/src/zoom-c.c b/src/zoom-c.c index f2363b6..8a9b344 100644 --- a/src/zoom-c.c +++ b/src/zoom-c.c @@ -374,6 +374,7 @@ ZOOM_API(void) const char *host, int portnum) { const char *val; + const char *http_lead; initlog(); @@ -440,17 +441,25 @@ ZOOM_API(void) else c->lang = 0; + val = ZOOM_options_get(c->options, "sru"); + if (val && *val && !strstr(host, "://")) + http_lead = "http://"; + else + http_lead = ""; + c->sru_mode = get_sru_mode_from_string(val); + if (host) { + char hostn[128]; xfree(c->host_port); if (portnum) { - char hostn[128]; sprintf(hostn, "%.80s:%d", host, portnum); - c->host_port = xstrdup(hostn); + host = hostn; } - else - c->host_port = xstrdup(host); + c->host_port = xmalloc(strlen(host) + strlen(http_lead) + 1); + strcpy(c->host_port, http_lead); + strcat(c->host_port, host); } { @@ -486,9 +495,6 @@ ZOOM_API(void) } } - val = ZOOM_options_get(c->options, "sru"); - c->sru_mode = get_sru_mode_from_string(val); - xfree(c->sru_version); val = ZOOM_options_get(c->options, "sru_version"); c->sru_version = xstrdup(val ? val : "1.2"); diff --git a/win/makefile b/win/makefile index eaabe22..ac38182 100644 --- a/win/makefile +++ b/win/makefile @@ -190,7 +190,7 @@ iconv: !endif !if $(HAVE_ICU) -ICU_DEF= +ICU_DEF= \ /D YAZ_HAVE_ICU=1 /D HAVE_ICU_H=1 /I"$(ICU_INCLUDE)" ICU_LIBS= \ $(ICU_LIB)\icudt.lib $(ICU_LIB)\icuin.lib $(ICU_LIB)\icuuc.lib