X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fyaz-proxy.cpp;h=476e045aa7955e27456869e8c8f3aac86f6abeaa;hb=068845aaefa709c1729137b36b46688e1acc498e;hp=adc52086ef16a1554f71727e0d614bd04370280d;hpb=700507bf7216c231697bbb600ccea74f186dff2a;p=yazproxy-moved-to-github.git diff --git a/src/yaz-proxy.cpp b/src/yaz-proxy.cpp index adc5208..476e045 100644 --- a/src/yaz-proxy.cpp +++ b/src/yaz-proxy.cpp @@ -1,4 +1,4 @@ -/* $Id: yaz-proxy.cpp,v 1.56 2006-04-13 00:41:11 adam Exp $ +/* $Id: yaz-proxy.cpp,v 1.61 2006-04-22 07:03:34 adam Exp $ Copyright (c) 1998-2006, Index Data. This file is part of the yazproxy. @@ -438,6 +438,7 @@ IPDU_Observer *Yaz_Proxy::sessionNotify(IPDU_Observable else sprintf(session_str, "%ld:%d %d ", (long) time(0), m_session_no, 0); + m_session_no++; yaz_log (YLOG_LOG, "%sNew session %s", session_str, peername); @@ -1610,8 +1611,21 @@ Z_APDU *Yaz_Proxy::result_set_optimize(Z_APDU *apdu) { Z_APDU *new_apdu = create_Z_PDU(Z_APDU_presentResponse); new_apdu->u.presentResponse->records = - create_nonSurrogateDiagnostics(odr_encode(), 30, - pr->resultSetId); + create_nonSurrogateDiagnostics( + odr_encode(), + YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST, + pr->resultSetId); + send_to_client(new_apdu); + return 0; + } + if (start < 1 || toget < 0) + { + Z_APDU *new_apdu = create_Z_PDU(Z_APDU_presentResponse); + new_apdu->u.presentResponse->records = + create_nonSurrogateDiagnostics( + odr_encode(), + YAZ_BIB1_PRESENT_REQUEST_OUT_OF_RANGE, + 0); send_to_client(new_apdu); return 0; } @@ -1621,7 +1635,10 @@ Z_APDU *Yaz_Proxy::result_set_optimize(Z_APDU *apdu) { Z_APDU *new_apdu = create_Z_PDU(Z_APDU_presentResponse); new_apdu->u.presentResponse->records = - create_nonSurrogateDiagnostics(odr_encode(), 13, 0); + create_nonSurrogateDiagnostics( + odr_encode(), + YAZ_BIB1_PRESENT_REQUEST_OUT_OF_RANGE, + 0); send_to_client(new_apdu); return 0; } @@ -1667,6 +1684,21 @@ Z_APDU *Yaz_Proxy::result_set_optimize(Z_APDU *apdu) this_query->set_Z_Query(sr->query); + // Check for non-negative piggyback params. + if (*sr->smallSetUpperBound < 0 + || *sr->largeSetLowerBound < 0 + || *sr->mediumSetPresentNumber < 0) + { + Z_APDU *new_apdu = create_Z_PDU(Z_APDU_searchResponse); + // Not a present request.. But can't find better diagnostic + new_apdu->u.searchResponse->records = + create_nonSurrogateDiagnostics( + odr_encode(), + YAZ_BIB1_PRESENT_REQUEST_OUT_OF_RANGE, 0); + send_to_client(new_apdu); + return 0; + } + char query_str[120]; this_query->print(query_str, sizeof(query_str)-1); yaz_log(YLOG_LOG, "%sSearch %s", m_session_str, query_str); @@ -1687,7 +1719,7 @@ Z_APDU *Yaz_Proxy::result_set_optimize(Z_APDU *apdu) if (toget > m_client->m_last_resultCount) toget = m_client->m_last_resultCount; - + if (sr->mediumSetElementSetNames) { comp = (Z_RecordComposition *) @@ -1847,6 +1879,25 @@ void Yaz_Proxy::recv_GDU(Z_GDU *apdu, int len) yaz_log (YLOG_LOG, "%sReceiving %s from client %d bytes", m_session_str, gdu_name(apdu), len); +#if 0 + // try to make a _bad_ attribute set ID .. Don't enable this in prod. + if (apdu->which == Z_GDU_Z3950 + && apdu->u.z3950->which == Z_APDU_searchRequest) + { + Z_SearchRequest *req = apdu->u.z3950->u.searchRequest; + if (req->query && req->query->which == Z_Query_type_1) + { + Z_RPNQuery *rpnquery = req->query->u.type_1; + if (rpnquery->attributeSetId) + { + rpnquery->attributeSetId[0] = -2; + rpnquery->attributeSetId[1] = -1; + yaz_log(YLOG_WARN, "%sBAD FIXUP TEST", m_session_str); + } + } + } +#endif + #if HAVE_GETTIMEOFDAY gettimeofday((struct timeval *) m_time_tv, 0); #endif @@ -1854,8 +1905,16 @@ void Yaz_Proxy::recv_GDU(Z_GDU *apdu, int len) m_pdu_stat.add_bytes(1); GDU *gdu = new GDU(apdu); - m_in_queue.enqueue(gdu); + if (gdu->get() == 0) + { + delete gdu; + yaz_log(YLOG_LOG, "%sUnable to encode package", m_session_str); + m_in_queue.clear(); + dec_ref(true); + return; + } + m_in_queue.enqueue(gdu); recv_GDU_more(false); } @@ -1981,7 +2040,10 @@ void Yaz_Proxy::recv_GDU_more(bool normal) while (m_timeout_mode == timeout_normal && (g = m_in_queue.dequeue())) { m_timeout_mode = timeout_busy; + inc_ref(); recv_GDU_reduce(g); + if (dec_ref(false)) + break; } } @@ -3241,10 +3303,10 @@ void Yaz_Proxy::releaseClient() bool Yaz_Proxy::dec_ref(bool main_ptr) { + main_ptr = false; assert(m_ref_count > 0); if (main_ptr) { - yaz_log(YLOG_LOG, "%sdec_ref", m_session_str); if (m_main_ptr_dec) return false; m_main_ptr_dec = true; @@ -3276,7 +3338,7 @@ void Yaz_ProxyClient::shutdown() if (m_server) { - m_waiting = 1; // ensure it's released from Proxy in releaseClient + m_waiting = 1; // ensure it's released from Yaz_Proxy::releaseClient m_server->dec_ref(true); } else @@ -3286,8 +3348,7 @@ void Yaz_ProxyClient::shutdown() void Yaz_Proxy::failNotify() { inc_request_no(); - yaz_log (YLOG_LOG, "%sConnection closed by client", - get_session_str()); + yaz_log (YLOG_LOG, "%sConnection closed by client", get_session_str()); dec_ref(true); }