/* This file is part of YAZ proxy
- Copyright (C) 1998-2009 Index Data
+ Copyright (C) 1998-2011 Index Data
YAZ proxy is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
{
Yaz_ProxyConfig *cfg = check_reconfigure();
if (cfg)
- cfg->target_authentication(m_default_target, odr_encode(),
+ cfg->target_authentication(m_default_target, odr_encode(),
apdu->u.initRequest);
}
handle_incoming_Z_PDU_2(apdu);
m_mem_invalid_session = 0;
m_s2z_odr_init = 0;
m_s2z_odr_search = 0;
+ m_s2z_odr_scan = 0;
m_s2z_init_apdu = 0;
m_s2z_search_apdu = 0;
m_s2z_present_apdu = 0;
+ m_s2z_scan_apdu = 0;
m_http_keepalive = 0;
m_http_version = 0;
m_soap_ns = 0;
m_usemarcon = new Yaz_usemarcon();
if (!m_parent)
low_socket_open();
+ m_backend_elementset = 0;
m_my_thread = 0;
m_ref_count = 1;
m_main_ptr_dec = false;
xfree(m_backend_charset);
xfree(m_usemarcon_ini_stage1);
xfree(m_usemarcon_ini_stage2);
+ xfree(m_backend_elementset);
delete m_usemarcon;
if (m_s2z_odr_init)
odr_destroy(m_s2z_odr_init);
if (m_s2z_odr_search)
odr_destroy(m_s2z_odr_search);
+ if (m_s2z_odr_scan)
+ odr_destroy(m_s2z_odr_scan);
if (!m_parent)
low_socket_close();
if (!m_parent)
const char *default_charset)
{
yaz_log(YLOG_DEBUG, "%sSet the proxy negotiation: charset to '%s', "
- "default charset to '%s', language to '%s'", m_session_str,
+ "default charset to '%s', language to '%s'", m_session_str,
charset?charset:"none",
default_charset?default_charset:"none",
lang?lang:"none");
{
Z_OtherInformationUnit *oi =
update_otherInformation(otherInfo, 0, yaz_oid_userinfo_cookie, 1, 1);
-
+
if (oi && oi->which == Z_OtherInfo_characterInfo)
return oi->information.characterInfo;
return 0;
{
Z_OtherInformationUnit *oi =
update_otherInformation(otherInfo, 0, yaz_oid_userinfo_proxy, 1, 1);
-
+
if (oi && oi->which == Z_OtherInfo_characterInfo)
return oi->information.characterInfo;
return 0;
}
}
int min_use = 100000;
- int spare_for_min = 0;
int max_spare = 0;
const char *ret_min = 0;
- const char *ret_spare = 0;
for (i = 0; url[i]; i++)
{
yaz_log(YLOG_DEBUG, "%szurl=%s use=%d spare=%d",
{
ret_min = url[i];
min_use = zurl_in_use[i];
- spare_for_min = zurl_in_spare[i];
}
if (max_spare < zurl_in_spare[i])
{
- ret_spare = url[i];
max_spare = zurl_in_spare[i];
}
}
timeout(m_client_idletime);
}
- // get those FILE descriptors available
+ // get those FILE descriptors available
m_parent->low_socket_close();
if (cql2rpn_fname)
m_cql2rpn.set_pqf_file(cql2rpn_fname);
// reserve them again
m_parent->low_socket_open();
-
+
if (negotiation_charset || negotiation_lang || default_client_query_charset)
{
set_proxy_negotiation(negotiation_charset,
{
assert(c->m_prev);
assert(*c->m_prev == c);
- if (c->m_server == 0 && c->m_cookie == 0 && c->m_waiting == 0
+ if (c->m_server == 0 && c->m_cookie == 0 && c->m_waiting == 0
&& c->compare_idAuthentication(apdu)
&& c->compare_charset(apdu)
&& !strcmp(m_proxyTarget, c->get_hostname()))
// found it in cache
yaz_log(YLOG_LOG, "%sREUSE %d %s",
m_session_str, parent->m_seqno, c->get_hostname());
-
+
c->m_seqno = parent->m_seqno;
assert(c->m_server == 0);
c->m_server = this;
else
timeout(0);
if (code == 401)
- z_HTTP_header_add(o, &hres->headers, "WWW-Authenticate",
+ z_HTTP_header_add(o, &hres->headers, "WWW-Authenticate",
"Basic realm=\"YAZ Proxy\"");
return 0;
}
+int Yaz_Proxy::z_to_srw_diag(ODR o, Z_SRW_scanResponse *srw_res,
+ Z_DiagRec *dr)
+{
+ if (dr->which == Z_DiagRec_defaultFormat)
+ {
+ int bib1_code = *dr->u.defaultFormat->condition;
+ if (bib1_code == 109)
+ return 404;
+ srw_res->num_diagnostics = 1;
+ srw_res->diagnostics = (Z_SRW_diagnostic *)
+ odr_malloc(o, sizeof(*srw_res->diagnostics));
+ yaz_mk_std_diagnostic(o, srw_res->diagnostics,
+ yaz_diag_bib1_to_srw(*dr->u.defaultFormat->condition),
+ dr->u.defaultFormat->u.v2Addinfo);
+ }
+ return 0;
+}
+
#if YAZ_HAS_MK_SURROGATE
#else
static void yazproxy_mk_sru_surrogate(ODR o, Z_SRW_record *record, int pos,
len += strlen(message);
if (details)
len += strlen(details);
-
+
record->recordData_buf = (char *) odr_malloc(o, len);
-
+
sprintf(record->recordData_buf, "<diagnostic "
"xmlns=\"http://www.loc.gov/zing/srw/diagnostic/\">\n"
" <uri>info:srw/diagnostic/1/%d</uri>\n", code);
{
#if YAZ_HAS_MK_SURROGATE
yaz_mk_sru_surrogate(
- o, srw_res->records + i, i+start,
+ o, srw_res->records + i, i+start,
YAZ_SRW_RECORD_NOT_AVAILABLE_IN_THIS_SCHEMA, 0);
#else
yazproxy_mk_sru_surrogate(
- o, srw_res->records + i, i+start,
+ o, srw_res->records + i, i+start,
YAZ_SRW_RECORD_NOT_AVAILABLE_IN_THIS_SCHEMA, 0);
#endif
continue;
}
Z_External *r = npr->u.databaseRecord;
- if (r->which == Z_External_octet
+ if (r->which == Z_External_octet
&& !oid_oidcmp(r->direct_reference, yaz_oid_recsyn_xml))
{
srw_res->records[i].recordSchema = m_schema;
{
#if YAZ_HAS_MK_SURROGATE
yaz_mk_sru_surrogate(
- o, srw_res->records + i, i+start,
+ o, srw_res->records + i, i+start,
YAZ_SRW_RECORD_NOT_AVAILABLE_IN_THIS_SCHEMA, 0);
#else
yazproxy_mk_sru_surrogate(
- o, srw_res->records + i, i+start,
+ o, srw_res->records + i, i+start,
YAZ_SRW_RECORD_NOT_AVAILABLE_IN_THIS_SCHEMA, 0);
#endif
}
}
+int Yaz_Proxy::send_to_srw_client_ok(Z_ListEntries *entries)
+{
+ ODR o = odr_encode();
+ Z_SRW_PDU *srw_pdu = yaz_srw_get(o, Z_SRW_scan_response);
+ Z_SRW_scanResponse *srw_res = srw_pdu->u.scan_response;
+
+ if (entries && entries->num_entries > 0)
+ {
+ srw_res->num_terms = entries->num_entries;
+ int i;
+ srw_res->terms = (Z_SRW_scanTerm *)
+ odr_malloc(o, srw_res->num_terms * sizeof(Z_SRW_scanTerm));
+ for (i = 0; i < srw_res->num_terms; i++)
+ {
+ if (entries->entries[i]->which == Z_Entry_termInfo)
+ {
+ switch(entries->entries[i]->u.termInfo->term->which)
+ {
+ case Z_Term_general:
+ srw_res->terms[i].value = odr_strdupn(o,
+ (char *) entries->entries[i]->u.termInfo->term->u.general->buf,
+ entries->entries[i]->u.termInfo->term->u.general->len);
+ break;
+ default:
+ srw_res->terms[i].value = NULL;
+ }
+ if (entries->entries[i]->u.termInfo->globalOccurrences != NULL)
+ srw_res->terms[i].numberOfRecords = odr_intdup(o,
+ *entries->entries[i]->u.termInfo->globalOccurrences);
+ else
+ srw_res->terms[i].numberOfRecords = NULL;
+ if (entries->entries[i]->u.termInfo->displayTerm != NULL)
+ srw_res->terms[i].displayTerm = odr_strdup(o,
+ entries->entries[i]->u.termInfo->displayTerm);
+ else
+ srw_res->terms[i].displayTerm = NULL;
+ srw_res->terms[i].whereInList = NULL;
+ }
+ }
+ }
+ if (entries && entries->num_nonsurrogateDiagnostics > 0)
+ {
+ int http_code;
+ http_code = z_to_srw_diag(odr_encode(), srw_res,
+ entries->nonsurrogateDiagnostics[0]);
+ if (http_code)
+ return send_http_response(http_code);
+ }
+ return send_srw_response(srw_pdu);
+
+}
+
int Yaz_Proxy::send_srw_search_response(Z_SRW_diagnostic *diagnostics,
int num_diagnostics, int http_code /* = 200 */)
{
return send_srw_response(srw_pdu, http_code);
}
+int Yaz_Proxy::send_srw_scan_response(Z_SRW_diagnostic *diagnostics,
+ int num_diagnostics, int http_code /* = 200 */)
+{
+ ODR o = odr_encode();
+ Z_SRW_PDU *srw_pdu = yaz_srw_get(o, Z_SRW_scan_response);
+ Z_SRW_scanResponse *srw_res = srw_pdu->u.scan_response;
+
+ srw_res->num_diagnostics = num_diagnostics;
+ srw_res->diagnostics = diagnostics;
+ return send_srw_response(srw_pdu, http_code);
+}
+
int Yaz_Proxy::send_srw_explain_response(Z_SRW_diagnostic *diagnostics,
int num_diagnostics)
{
{
send_to_srw_client_error(3, 0);
}
- else if (!m_s2z_search_apdu)
+ else if (m_s2z_search_apdu)
{
- send_srw_explain_response(0, 0);
+ handle_incoming_Z_PDU(m_s2z_search_apdu);
+ }
+ else if (m_s2z_scan_apdu)
+ {
+ handle_incoming_Z_PDU(m_s2z_scan_apdu);
}
else
{
- handle_incoming_Z_PDU(m_s2z_search_apdu);
+ send_srw_explain_response(0, 0);
}
}
else if (m_s2z_search_apdu && apdu->which == Z_APDU_searchResponse)
Z_PresentResponse *res = apdu->u.presentResponse;
send_to_srw_client_ok(m_s2z_hit_count, res->records, start);
}
+ else if (m_s2z_scan_apdu && apdu->which == Z_APDU_scanResponse)
+ {
+ Z_ScanResponse *res = apdu->u.scanResponse;
+ send_to_srw_client_ok(res->entries);
+ }
}
else
{
void Yaz_ProxyClient::set_idAuthentication(Z_APDU *apdu)
{
Z_IdAuthentication *t = apdu->u.initRequest->idAuthentication;
-
+
odr_reset(m_idAuthentication_odr);
z_IdAuthentication(m_idAuthentication_odr, &t, 1, 0);
m_idAuthentication_ber_buf =
- odr_getbuf(m_idAuthentication_odr,
+ odr_getbuf(m_idAuthentication_odr,
&m_idAuthentication_ber_size, 0);
}
Z_APDU *new_apdu = create_Z_PDU(Z_APDU_presentResponse);
new_apdu->u.presentResponse->records =
create_nonSurrogateDiagnostics(
- odr_encode(),
+ odr_encode(),
YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST,
pr->resultSetId);
send_to_client(new_apdu);
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,
+ odr_encode(),
+ YAZ_BIB1_PRESENT_REQUEST_OUT_OF_RANGE,
0);
send_to_client(new_apdu);
return 0;
Z_APDU *new_apdu = create_Z_PDU(Z_APDU_presentResponse);
new_apdu->u.presentResponse->records =
create_nonSurrogateDiagnostics(
- odr_encode(),
+ odr_encode(),
YAZ_BIB1_PRESENT_REQUEST_OUT_OF_RANGE,
0);
send_to_client(new_apdu);
// Not a present request.. But can't find better diagnostic
new_apdu->u.searchResponse->records =
create_nonSurrogateDiagnostics(
- odr_encode(),
+ odr_encode(),
YAZ_BIB1_PRESENT_REQUEST_OUT_OF_RANGE, 0);
send_to_client(new_apdu);
return 0;
if (toget > m_client->m_last_resultCount)
toget = m_client->m_last_resultCount;
-
+
if (sr->mediumSetElementSetNames)
{
comp = (Z_RecordComposition *)
#if 0
// try to make a _bad_ attribute set ID .. Don't enable this in prod.
- if (apdu->which == Z_GDU_Z3950
+ if (apdu->which == Z_GDU_Z3950
&& apdu->u.z3950->which == Z_APDU_searchRequest)
{
Z_SearchRequest *req = apdu->u.z3950->u.searchRequest;
xfree(m_peername);
m_peername = (char*) xmalloc(strlen(x_forwarded_for)+5);
sprintf(m_peername, "tcp:%s", x_forwarded_for);
-
+
yaz_log(YLOG_LOG, "%sHTTP Forwarded from %s", m_session_str,
m_peername);
if (m_log_mask & PROXY_LOG_IP_CLIENT)
m_session_str, connect_total, max_connect);
block = true;
}
- else
+ else
block = false;
yaz_log(YLOG_LOG, "%sconnect accepted total=%d", m_session_str,
connect_total);
-
+
int limit_connect = m_parent->m_limit_connect;
if (limit_connect)
reduce = connect_total / limit_connect;
HTTP_Forwarded(gdu->get());
int reduce = 0;
-
+
if (m_request_no == 1)
{
bool block = false;
-
+
connect_stat(block, reduce);
if (block)
Z_InitResponse *initResponse = apdu->u.initResponse;
Z_OtherInformation **otherInfo;
get_otherInfoAPDU(apdu, &otherInfo);
-
+
Z_CharSetandLanguageNegotiation *charneg = 0;
- if (otherInfo && *otherInfo &&
+ if (otherInfo && *otherInfo &&
ODR_MASK_GET(initResponse->options, Z_Options_negotiationModel)
&& (charneg = yaz_get_charneg_record(*otherInfo)))
{
if (m_initRequest_options)
ODR_MASK_SET(m_initRequest_options,
Z_Options_negotiationModel);
-
- oi->which = Z_OtherInfo_externallyDefinedInfo;
+
+ oi->which = Z_OtherInfo_externallyDefinedInfo;
oi->information.externallyDefinedInfo =
yaz_set_response_charneg(
odr_encode(),
return rec;
}
+Z_ListEntries *Yaz_Proxy::create_nonSurrogateDiagnostics2(ODR odr,
+ int error,
+ const char *addinfo)
+{
+ Z_ListEntries *rec = (Z_ListEntries *)
+ odr_malloc (odr, sizeof(*rec));
+ Odr_int *err = (Odr_int *)
+ odr_malloc (odr, sizeof(*err));
+ Z_DiagRec *drec = (Z_DiagRec *)
+ odr_malloc (odr, sizeof(*drec));
+ Z_DefaultDiagFormat *dr = (Z_DefaultDiagFormat *)
+ odr_malloc (odr, sizeof(*dr));
+ *err = error;
+ drec->which = Z_DiagRec_defaultFormat;
+ drec->u.defaultFormat = dr;
+ rec->num_entries = 0;
+ rec->entries = NULL;
+ rec->num_nonsurrogateDiagnostics = 1;
+ rec->nonsurrogateDiagnostics =
+ (Z_DiagRec **)odr_malloc(odr, sizeof(Z_DiagRec *));
+ rec->nonsurrogateDiagnostics[0] = drec;
+ dr->diagnosticSetId = odr_oiddup(odr, yaz_oid_diagset_bib_1);
+ dr->condition = err;
+ dr->which = Z_DefaultDiagFormat_v2Addinfo;
+ dr->u.v2Addinfo = odr_strdup (odr, addinfo ? addinfo : "");
+ return rec;
+}
+
Z_APDU *Yaz_Proxy::handle_query_transformation(Z_APDU *apdu)
{
if (apdu->which == Z_APDU_searchRequest &&
}
return apdu;
}
+ else if (apdu->which == Z_APDU_scanRequest)
+ {
+ Z_RPNQuery *rpnquery = 0;
+ Z_ScanRequest *sr = apdu->u.scanRequest;
+ char *addinfo = 0;
+
+ yaz_log(YLOG_LOG, "%sCQL: %s", m_session_str,
+ sr->termListAndStartPoint->term->u.characterString);
+
+ int r = m_cql2rpn.query_transform(sr->termListAndStartPoint->term->u.characterString,
+ &rpnquery, odr_encode(),
+ &addinfo);
+ if (r == -3)
+ yaz_log(YLOG_LOG, "%sNo CQL to RPN table", m_session_str);
+ else if (r)
+ {
+ yaz_log(YLOG_LOG, "%sCQL Conversion error %d", m_session_str, r);
+ Z_APDU *new_apdu = create_Z_PDU(Z_APDU_scanResponse);
+
+ new_apdu->u.scanResponse->referenceId = sr->referenceId;
+ new_apdu->u.scanResponse->entries =
+ create_nonSurrogateDiagnostics2(odr_encode(),
+ yaz_diag_srw_to_bib1(r),
+ addinfo);
+ *new_apdu->u.scanResponse->scanStatus = Z_Scan_failure;
+
+ send_to_client(new_apdu);
+
+ return 0;
+ }
+ else
+ {
+ sr->attributeSet = rpnquery->attributeSetId;
+ if (rpnquery->RPNStructure->which == Z_RPNStructure_simple)
+ sr->termListAndStartPoint = rpnquery->RPNStructure->u.simple->u.attributesPlusTerm;
+ }
+ return apdu;
+ }
return apdu;
}
m_charset_converter->convert_type_1(rpnquery, odr_encode());
}
}
+ else if (apdu->which == Z_APDU_scanRequest &&
+ apdu->u.scanRequest->termListAndStartPoint)
+ {
+ if (apdu->u.scanRequest->termListAndStartPoint->term)
+ if (m_http_version)
+ m_charset_converter->set_client_query_charset("UTF-8");
+ Z_Term *term = apdu->u.scanRequest->termListAndStartPoint->term;
+ m_charset_converter->convert_term(term, odr_encode());
+ }
return apdu;
}
return 0;
}
}
+ else if (apdu->which == Z_APDU_scanRequest)
+ {
+ Z_ScanRequest *sr = apdu->u.scanRequest;
+ int err = 0;
+ char *addinfo = 0;
+
+#if 0
+ Yaz_ProxyConfig *cfg = check_reconfigure();
+// Something like this needs to be implemented later:
+ if (cfg)
+ err = cfg->check_type_1_attributes(odr_encode(), m_default_target,
+ sr->termListAndStartPoint->attributes, &addinfo);
+#endif
+ if (err)
+ {
+ Z_APDU *new_apdu = create_Z_PDU(Z_APDU_scanResponse);
+
+ new_apdu->u.scanResponse->referenceId = sr->referenceId;
+ new_apdu->u.scanResponse->entries =
+ create_nonSurrogateDiagnostics2(odr_encode(), err, addinfo);
+ *new_apdu->u.scanResponse->scanStatus = Z_Scan_failure;
+
+ send_to_client(new_apdu);
+
+ return 0;
+ }
+ }
+
return apdu;
}
&addinfo, &stylesheet_name, &m_schema,
&m_backend_type, &m_backend_charset,
&m_usemarcon_ini_stage1,
- &m_usemarcon_ini_stage2);
+ &m_usemarcon_ini_stage2,
+ &m_backend_elementset);
if (stylesheet_name)
{
m_parent->low_socket_close();
sr->preferredRecordSyntax =
yaz_string_to_oid_odr(
yaz_oid_std(), CLASS_RECSYN,
- m_backend_type ? m_backend_type : "usmarc",
+ m_backend_type ? m_backend_type : "usmarc",
odr_encode());
}
else if (err)
else if (m_backend_type)
{
sr->preferredRecordSyntax =
- yaz_string_to_oid_odr(yaz_oid_std(), CLASS_RECSYN,
+ yaz_string_to_oid_odr(yaz_oid_std(), CLASS_RECSYN,
m_backend_type, odr_encode());
}
+ if (m_backend_elementset)
+ {
+ Z_ElementSetNames *esn =
+ mk_esn_from_schema(
+ odr_encode(),
+ *m_backend_elementset ? m_backend_elementset : 0);
+ sr->smallSetElementSetNames = esn;
+ sr->mediumSetElementSetNames = esn;
+ }
}
else if (apdu->which == Z_APDU_presentRequest)
{
&addinfo, &stylesheet_name, &m_schema,
&m_backend_type, &m_backend_charset,
&m_usemarcon_ini_stage1,
- &m_usemarcon_ini_stage2
- );
+ &m_usemarcon_ini_stage2,
+ &m_backend_elementset);
if (stylesheet_name)
{
m_parent->low_socket_close();
pr->preferredRecordSyntax =
yaz_string_to_oid_odr(
yaz_oid_std(), CLASS_RECSYN,
- m_backend_type ? m_backend_type : "usmarc",
+ m_backend_type ? m_backend_type : "usmarc",
odr_encode());
}
else if (err)
{
pr->preferredRecordSyntax =
yaz_string_to_oid_odr(yaz_oid_std(),
- CLASS_RECSYN, m_backend_type,
+ CLASS_RECSYN, m_backend_type,
odr_encode());
}
+ if (m_backend_elementset)
+ {
+ Z_ElementSetNames *esn =
+ mk_esn_from_schema(
+ odr_encode(),
+ *m_backend_elementset ? m_backend_elementset : 0);
+ Z_RecordComposition *comp = (Z_RecordComposition *)
+ odr_malloc(odr_encode(), sizeof(Z_RecordComposition));
+ comp->which = Z_RecordComp_simple;
+ comp->u.simple = esn;
+ pr->recordComposition = comp;
+ }
}
return apdu;
}
odr_destroy(m_s2z_odr_search);
m_s2z_odr_search = 0;
}
+ if (m_s2z_odr_scan)
+ {
+ odr_destroy(m_s2z_odr_scan);
+ m_s2z_odr_scan = 0;
+ }
m_http_keepalive = 0;
m_http_version = 0;
{
m_s2z_odr_init = odr_createmem(ODR_ENCODE);
m_s2z_odr_search = odr_createmem(ODR_ENCODE);
+ m_s2z_odr_scan = odr_createmem(ODR_ENCODE);
m_soap_ns = odr_strdup(m_s2z_odr_search, soap_package->ns);
m_s2z_init_apdu = 0;
m_s2z_search_apdu = 0;
m_s2z_present_apdu = 0;
+ m_s2z_scan_apdu = 0;
m_s2z_stylesheet = 0;
-
+
Z_IdAuthentication *auth = NULL;
if (srw_pdu->username && !srw_pdu->password)
{
}
auth->u.idPass->userId = odr_strdup(m_s2z_odr_init, authorization_str);
}
- }
-
+ }
+
if (srw_pdu->which == Z_SRW_searchRetrieve_request)
{
m_s2z_init_apdu = zget_APDU(m_s2z_odr_init,
Z_APDU_initRequest);
+ ODR_MASK_SET(m_s2z_init_apdu->u.initRequest->options, Z_Options_scan);
m_s2z_init_apdu->u.initRequest->idAuthentication = auth;
// prevent m_initRequest_apdu memory from being grabbed
m_s2z_init_apdu = zget_APDU(m_s2z_odr_init,
Z_APDU_initRequest);
+ ODR_MASK_SET(m_s2z_init_apdu->u.initRequest->options, Z_Options_scan);
m_s2z_init_apdu->u.initRequest->idAuthentication = auth;
-
+
// prevent m_initRequest_apdu memory from being grabbed
// in Yaz_Proxy::handle_incoming_Z_PDU
m_initRequest_apdu = m_s2z_init_apdu;
}
else if (srw_pdu->which == Z_SRW_scan_request)
{
+ Z_SRW_scanRequest *srw_req = srw_pdu->u.scan_request;
+
+ const char *backend_db = srw_req->database;
+ srw_get_client(srw_req->database, &backend_db);
+
m_s2z_database = odr_strdup(m_s2z_odr_init,
- srw_pdu->u.scan_request->database);
-
- yaz_add_srw_diagnostic(odr_decode(),
- &diagnostic, &num_diagnostic,
- 4, "scan");
- Z_SRW_PDU *srw_pdu =
- yaz_srw_get(odr_encode(),
- Z_SRW_scan_response);
- Z_SRW_scanResponse *srw_res = srw_pdu->u.scan_response;
-
- srw_res->diagnostics = diagnostic;
- srw_res->num_diagnostics = num_diagnostic;
- send_srw_response(srw_pdu);
- return;
+ srw_req->database);
+ // save stylesheet
+ if (srw_req->stylesheet)
+ m_s2z_stylesheet =
+ odr_strdup(m_s2z_odr_init, srw_req->stylesheet);
+
+ // prepare scan PDU
+ m_s2z_scan_apdu = zget_APDU(m_s2z_odr_scan,
+ Z_APDU_scanRequest);
+ Z_ScanRequest *z_scanRequest =
+ m_s2z_scan_apdu->u.scanRequest;
+
+ z_scanRequest->num_databaseNames = 1;
+ z_scanRequest->databaseNames = (char**)
+ odr_malloc(m_s2z_odr_scan, sizeof(char *));
+ z_scanRequest->databaseNames[0] = odr_strdup(m_s2z_odr_scan,
+ backend_db);
+
+ // query transformation
+ if (srw_req->query_type == Z_SRW_query_type_cql)
+ {
+ z_scanRequest->termListAndStartPoint =
+ (Z_AttributesPlusTerm *)odr_malloc(m_s2z_odr_scan, sizeof(Z_AttributesPlusTerm));
+ z_scanRequest->termListAndStartPoint->attributes = NULL;
+ z_scanRequest->termListAndStartPoint->term =
+ (Z_Term *)odr_malloc(m_s2z_odr_scan, sizeof(Z_Term));
+ z_scanRequest->termListAndStartPoint->term->which =
+ Z_Term_characterString;
+ z_scanRequest->termListAndStartPoint->term->u.characterString =
+ odr_strdup(m_s2z_odr_scan, srw_req->scanClause.cql);
+ }
+
+ if (srw_req->responsePosition)
+ z_scanRequest->preferredPositionInResponse =
+ odr_intdup(m_s2z_odr_scan, *srw_req->responsePosition);
+ if (srw_req->maximumTerms)
+ *z_scanRequest->numberOfTermsRequested = *srw_req->maximumTerms;
+
+ if (!m_client)
+ {
+ m_s2z_init_apdu = zget_APDU(m_s2z_odr_init,
+ Z_APDU_initRequest);
+
+ ODR_MASK_SET(m_s2z_init_apdu->u.initRequest->options, Z_Options_scan);
+ m_s2z_init_apdu->u.initRequest->idAuthentication = auth;
+
+ // prevent m_initRequest_apdu memory from being grabbed
+ // in Yaz_Proxy::handle_incoming_Z_PDU
+ m_initRequest_apdu = m_s2z_init_apdu;
+ handle_incoming_Z_PDU(m_s2z_init_apdu);
+ return;
+ }
+ else
+ {
+ handle_incoming_Z_PDU(m_s2z_scan_apdu);
+ return;
+ }
}
else
{
m_initRequest_preferredMessageSize = *apdu->u.initRequest->
preferredMessageSize;
- *apdu->u.initRequest->preferredMessageSize = 1024*1024;
+ *apdu->u.initRequest->preferredMessageSize = 64*1024*1024;
m_initRequest_maximumRecordSize = *apdu->u.initRequest->
maximumRecordSize;
- *apdu->u.initRequest->maximumRecordSize = 1024*1024;
+ *apdu->u.initRequest->maximumRecordSize = 64*1024*1024;
Z_CharSetandLanguageNegotiation *charSetandLangRecord =
yaz_get_charneg_record(*oi);
Z_APDU *apdu2 = m_client->m_initResponse;
apdu2->u.initResponse->otherInfo = 0;
if (m_client->m_cookie && *m_client->m_cookie)
- set_otherInformationString(apdu2, yaz_oid_userinfo_cookie,
+ set_otherInformationString(apdu2, yaz_oid_userinfo_cookie,
1, m_client->m_cookie);
apdu2->u.initResponse->referenceId =
apdu->u.initRequest->referenceId;
m->m_apdu_buf = (char*) nmem_malloc(m->m_nmem, m->m_apdu_len);
memcpy(m->m_apdu_buf, apdu_buf, m->m_apdu_len);
odr_reset(odr_encode());
-
+
inc_ref();
m_my_thread->put(m);
}
{
Z_SRW_diagnostic *diagnostic = 0;
int num_diagnostic = 0;
-
+
yaz_add_srw_diagnostic(odr_encode(),
&diagnostic, &num_diagnostic,
YAZ_SRW_SYSTEM_TEMPORARILY_UNAVAILABLE, addr);
if (m_s2z_search_apdu)
send_srw_search_response(diagnostic, num_diagnostic);
+ else if (m_s2z_scan_apdu)
+ send_srw_scan_response(diagnostic, num_diagnostic);
else
send_srw_explain_response(diagnostic, num_diagnostic);
- }
+ }
}
void Yaz_ProxyClient::failNotify()
const char *zurl_in_use[MAX_ZURL_PLEX];
int limit_bw, limit_pdu, limit_req, limit_search;
int target_idletime, client_idletime;
- int max_sockets;
+ int max_sockets = m_max_sockets;
int max_clients;
int keepalive_limit_bw, keepalive_limit_pdu;
int pre_init;
*apdu->u.initResponse->maximumRecordSize;
Z_InitResponse *ir = apdu->u.initResponse;
-
+
// apply YAZ Proxy version
char *imv0 = ir->implementationVersion;
char *imv1 = (char*)
strcat(imv1, "/" VERSION);
#endif
ir->implementationVersion = imv1;
-
+
// apply YAZ Proxy implementation name
char *im0 = ir->implementationName;
char *im1 = (char*)