X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fzoom-sru.c;h=f688749e3c2e86de8955b769b78a39efc8a7d95d;hp=b997eebf98cdbaa1edf8c29882d49d1c74c7e611;hb=eeb3f9f3eb2b41f75341f5d93d0583bda80e5a07;hpb=047d6669724619dd486a9bfa62cde1b909951491 diff --git a/src/zoom-sru.c b/src/zoom-sru.c index b997eeb..f688749 100644 --- a/src/zoom-sru.c +++ b/src/zoom-sru.c @@ -62,8 +62,29 @@ static zoom_ret send_srw(ZOOM_connection c, Z_SRW_PDU *sr) static Z_SRW_PDU *ZOOM_srw_get_pdu(ZOOM_connection c, int type) { Z_SRW_PDU *sr = yaz_srw_get_pdu(c->odr_out, type, c->sru_version); - sr->username = c->user; - sr->password = c->password; + if (c->url_authentication && c->user) + { + Z_SRW_extra_arg **ea = &sr->extra_args; + while (*ea) + ea = &(*ea)->next; + *ea = (Z_SRW_extra_arg *) odr_malloc(c->odr_out, sizeof(**ea)); + (*ea)->name = "x-username"; + (*ea)->value = c->user; + ea = &(*ea)->next; + if (c->password) + { + *ea = (Z_SRW_extra_arg *) odr_malloc(c->odr_out, sizeof(**ea)); + (*ea)->name = "x-password"; + (*ea)->value = c->password; + ea = &(*ea)->next; + } + *ea = 0; + } + else + { + sr->username = c->user; + sr->password = c->password; + } return sr; } #endif @@ -87,15 +108,15 @@ zoom_ret ZOOM_connection_srw_send_scan(ZOOM_connection c) /* SRU scan can only carry CQL and PQF */ if (z_query->which == Z_Query_type_104) { - sr->u.scan_request->query_type = Z_SRW_query_type_cql; - sr->u.scan_request->scanClause.cql = + sr->u.scan_request->queryType = "cql"; + sr->u.scan_request->scanClause = odr_strdup(c->odr_out, ZOOM_query_get_query_string(scan->query)); } else if (z_query->which == Z_Query_type_1 || z_query->which == Z_Query_type_101) { - sr->u.scan_request->query_type = Z_SRW_query_type_pqf; - sr->u.scan_request->scanClause.pqf = + sr->u.scan_request->queryType = "pqf"; + sr->u.scan_request->scanClause = odr_strdup(c->odr_out, ZOOM_query_get_query_string(scan->query)); } else @@ -194,13 +215,13 @@ zoom_ret ZOOM_connection_srw_send_search(ZOOM_connection c) if (z_query->which == Z_Query_type_104 && z_query->u.type_104->which == Z_External_CQL) { - sr->u.request->query_type = Z_SRW_query_type_cql; - sr->u.request->query.cql = z_query->u.type_104->u.cql; + sr->u.request->queryType = "cql"; + sr->u.request->query = z_query->u.type_104->u.cql; } else if (z_query->which == Z_Query_type_1 && z_query->u.type_1) { - sr->u.request->query_type = Z_SRW_query_type_pqf; - sr->u.request->query.pqf = + sr->u.request->queryType = "pqf"; + sr->u.request->query = odr_strdup(c->odr_out, ZOOM_query_get_query_string(resultset->query)); } @@ -247,7 +268,7 @@ static zoom_ret handle_srw_response(ZOOM_connection c, NMEM nmem; ZOOM_Event event; int *start, *count; - const char *syntax, *elementSetName; + const char *syntax, *elementSetName, *schema; if (!c->tasks) return zoom_complete; @@ -260,7 +281,7 @@ static zoom_ret handle_srw_response(ZOOM_connection c, count = &c->tasks->u.search.count; syntax = c->tasks->u.search.syntax; elementSetName = c->tasks->u.search.elementSetName; - + schema = c->tasks->u.search.schema; /* Required not for reporting client hit count multiple times into session */ if (!c->tasks->u.search.recv_search_fired) { yaz_log(YLOG_DEBUG, "posting ZOOM_EVENT_RECV_SEARCH"); @@ -277,6 +298,7 @@ static zoom_ret handle_srw_response(ZOOM_connection c, count = &c->tasks->u.retrieve.count; syntax = c->tasks->u.retrieve.syntax; elementSetName = c->tasks->u.retrieve.elementSetName; + schema = c->tasks->u.retrieve.schema; break; default: return zoom_complete; @@ -328,14 +350,10 @@ static zoom_ret handle_srw_response(ZOOM_connection c, npr->u.databaseRecord->indirect_reference = 0; npr->u.databaseRecord->which = Z_External_octet; - npr->u.databaseRecord->u.octet_aligned = (Odr_oct *) - odr_malloc(c->odr_in, sizeof(Odr_oct)); - npr->u.databaseRecord->u.octet_aligned->buf = (unsigned char*) - sru_rec->recordData_buf; - npr->u.databaseRecord->u.octet_aligned->len = - npr->u.databaseRecord->u.octet_aligned->size = - sru_rec->recordData_len; - + npr->u.databaseRecord->u.octet_aligned = + odr_create_Odr_oct(c->odr_in, + sru_rec->recordData_buf, + sru_rec->recordData_len); if (sru_rec->recordSchema && !strcmp(sru_rec->recordSchema, "info:srw/schema/1/diagnostics-v1.1")) @@ -346,7 +364,7 @@ static zoom_ret handle_srw_response(ZOOM_connection c, resultset->odr); } ZOOM_record_cache_add(resultset, npr, pos, syntax, elementSetName, - sru_rec->recordSchema, diag); + schema, diag); } *count -= i; *start += i; @@ -417,9 +435,10 @@ int ZOOM_handle_sru(ZOOM_connection c, Z_HTTP_Response *hres, { Z_SOAP *soap_package = 0; ODR o = c->odr_in; - Z_SOAP_Handler soap_handlers[3] = { + Z_SOAP_Handler soap_handlers[4] = { {YAZ_XMLNS_SRU_v1_response, 0, (Z_SOAP_fun) yaz_srw_codec}, - {YAZ_XMLNS_SRU_v2_response, 0, (Z_SOAP_fun) yaz_srw_codec}, + {YAZ_XMLNS_SRU_v2_mask, 0, (Z_SOAP_fun) yaz_srw_codec}, + {"searchRetrieveResponse", 0, (Z_SOAP_fun) yaz_srw_codec}, {0, 0, 0} }; ret = z_soap_codec(o, &soap_package,