X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Ffilter_z3950_client.cpp;h=b988728d789726b481284e2e28567436020144ff;hb=66aef53c5b85935ead2400a648bbe5486a6a277f;hp=fe3049e4e650f80569d71d53d7d5cda4ca6346fe;hpb=f7a44b23d29c36ada743bbdb2898b3a81e7deaf9;p=metaproxy-moved-to-github.git diff --git a/src/filter_z3950_client.cpp b/src/filter_z3950_client.cpp index fe3049e..b988728 100644 --- a/src/filter_z3950_client.cpp +++ b/src/filter_z3950_client.cpp @@ -56,6 +56,7 @@ namespace metaproxy_1 { void timeoutNotify(); void recv_GDU(Z_GDU *gdu, int len); void fixup_nsd(ODR odr, Z_Records *records); + void fixup_init(ODR odr, Z_InitResponse *initrs); yazpp_1::IPDU_Observer* sessionNotify( yazpp_1::IPDU_Observable *the_PDU_Observable, int fd); @@ -178,10 +179,10 @@ void yf::Z3950Client::Assoc::fixup_nsd(ODR odr, Z_Records *records) // should really check for nsd->which.. But union has two members // containing almost same data - // char *v2Addinfo; + const char *v2Addinfo = nsd->u.v2Addinfo; // Z_InternationalString *v3Addinfo; - if (nsd->u.v2Addinfo) + if (v2Addinfo && *v2Addinfo) { addinfo.assign(nsd->u.v2Addinfo); addinfo += " "; @@ -191,6 +192,53 @@ void yf::Z3950Client::Assoc::fixup_nsd(ODR odr, Z_Records *records) } } +void yf::Z3950Client::Assoc::fixup_init(ODR odr, Z_InitResponse *initrs) +{ + Z_External *uif = initrs->userInformationField; + + if (uif && uif->which == Z_External_userInfo1) + { + Z_OtherInformation *ui = uif->u.userInfo1; + int i; + for (i = 0; i < ui->num_elements; i++) + { + Z_OtherInformationUnit *unit = ui->list[i]; + if (unit->which == Z_OtherInfo_externallyDefinedInfo && + unit->information.externallyDefinedInfo && + unit->information.externallyDefinedInfo->which == + Z_External_diag1) + { + Z_DiagnosticFormat *diag = + unit->information.externallyDefinedInfo->u.diag1; + int j; + for (j = 0; j < diag->num; j++) + { + Z_DiagnosticFormat_s *ds = diag->elements[j]; + if (ds->which == Z_DiagnosticFormat_s_defaultDiagRec) + { + Z_DefaultDiagFormat *r = ds->u.defaultDiagRec; + char *oaddinfo = r->u.v2Addinfo; + char *naddinfo = (char *) odr_malloc( + odr, + (oaddinfo ? strlen(oaddinfo) : 0) + 20 + + m_host.length()); + if (oaddinfo && *oaddinfo) + { + strcpy(naddinfo, oaddinfo); + strcat(naddinfo, " "); + } + strcat(naddinfo, "(backend="); + strcat(naddinfo, m_host.c_str()); + strcat(naddinfo, ")"); + + r->u.v2Addinfo = naddinfo; + } + } + } + } + } +} + void yf::Z3950Client::Assoc::recv_GDU(Z_GDU *gdu, int len) { m_waiting = false; @@ -209,6 +257,9 @@ void yf::Z3950Client::Assoc::recv_GDU(Z_GDU *gdu, int len) case Z_APDU_presentResponse: fixup_nsd(odr, apdu->u.presentResponse->records); break; + case Z_APDU_initResponse: + fixup_init(odr, apdu->u.initResponse); + break; } } m_package->response() = gdu; @@ -246,8 +297,6 @@ yf::Z3950Client::Assoc *yf::Z3950Client::Rep::get_assoc(Package &package) if (max_sockets == 0) max_sockets = m_max_sockets; - std::string host; - it = m_clients.find(package.session()); if (it != m_clients.end()) { @@ -333,14 +382,6 @@ yf::Z3950Client::Assoc *yf::Z3950Client::Rep::get_assoc(Package &package) } } - std::list dblist; - mp::util::split_zurl(target, host, dblist); - - if (dblist.size()) - { - ; // z3950_client: Databases in vhost ignored - } - // see if we have reached max number of clients (max-sockets) while (max_sockets) @@ -351,7 +392,7 @@ yf::Z3950Client::Assoc *yf::Z3950Client::Rep::get_assoc(Package &package) for (; it != m_clients.end(); it++) { yf::Z3950Client::Assoc *as = it->second; - if (!strcmp(as->m_host.c_str(), host.c_str())) + if (!strcmp(as->m_host.c_str(), target.c_str())) { number++; if (!as->m_in_use) @@ -359,7 +400,7 @@ yf::Z3950Client::Assoc *yf::Z3950Client::Rep::get_assoc(Package &package) } } yaz_log(YLOG_LOG, "Found %d/%d connections for %s", number, max_sockets, - host.c_str()); + target.c_str()); if (number < max_sockets) break; if (no_not_in_use == 0) // all in use.. @@ -389,7 +430,7 @@ yf::Z3950Client::Assoc *yf::Z3950Client::Rep::get_assoc(Package &package) yazpp_1::SocketManager *sm = new yazpp_1::SocketManager; yazpp_1::PDU_Assoc *pdu_as = new yazpp_1::PDU_Assoc(sm); yf::Z3950Client::Assoc *as = new yf::Z3950Client::Assoc(sm, pdu_as, - host.c_str(), + target.c_str(), m_timeout_sec); m_clients[package.session()] = as; return as;