* Copyright (c) 1998-2004, Index Data.
* See the file LICENSE for details.
*
- * $Id: yaz-proxy.cpp,v 1.87 2004-01-12 21:02:42 adam Exp $
+ * $Id: yaz-proxy.cpp,v 1.91 2004-01-15 23:44:58 adam Exp $
*/
#include <assert.h>
m_marcxml_flag = 0;
m_stylesheet_schema = 0;
m_s2z_stylesheet = 0;
+ m_s2z_database = 0;
m_schema = 0;
m_initRequest_apdu = 0;
m_initRequest_mem = 0;
+ m_initRequest_options = 0;
+ m_initRequest_version = 0;
m_apdu_invalid_session = 0;
m_mem_invalid_session = 0;
m_s2z_odr_init = 0;
{
if (apdu->which != Z_APDU_initRequest)
{
- yaz_log (LOG_LOG, "no first INIT!");
+ yaz_log (LOG_LOG, "%sno init request as first PDU", m_session_str);
return 0;
}
Z_InitRequest *initRequest = apdu->u.initRequest;
odr_strdup (odr_encode(), m_proxy_authentication);
}
}
-
// go through list of clients - and find the lowest/oldest one.
Yaz_ProxyClient *c_min = 0;
int min_seq = -1;
xmlChar *out_buf;
int out_len;
- xmlDocDumpMemory (res, &out_buf, &out_len);
+ xmlDocDumpFormatMemory (res, &out_buf, &out_len, 1);
+
p->records[i]->u.databaseRecord =
z_ext_record(odr_encode(), VAL_TEXT_XML,
(char*) out_buf, out_len);
int Yaz_Proxy::send_srw_explain_response(Z_SRW_diagnostic *diagnostics,
int num_diagnostics)
{
- Z_SRW_PDU *res = yaz_srw_get(odr_encode(), Z_SRW_explain_response);
- Z_SRW_explainResponse *er = res->u.explain_response;
-
Yaz_ProxyConfig *cfg = check_reconfigure();
if (cfg)
{
int len;
char *b = cfg->get_explain(odr_encode(), 0 /* target */,
- 0 /* db */, &len);
+ m_s2z_database, &len);
if (b)
{
+ Z_SRW_PDU *res = yaz_srw_get(odr_encode(), Z_SRW_explain_response);
+ Z_SRW_explainResponse *er = res->u.explain_response;
+
er->record.recordData_buf = b;
er->record.recordData_len = len;
er->record.recordPacking = m_s2z_packing;
+
+ er->diagnostics = diagnostics;
+ er->num_diagnostics = num_diagnostics;
+ return send_srw_response(res);
}
}
- er->diagnostics = diagnostics;
- er->num_diagnostics = num_diagnostics;
- return send_srw_response(res);
+ return send_http_response(404);
}
int Yaz_Proxy::send_PDU_convert(Z_APDU *apdu, int *len)
{
send_to_srw_client_ok(0, res->records, 1);
}
- else if (m_s2z_present_apdu)
+ else if (m_s2z_present_apdu && m_s2z_hit_count > 0)
{
// adjust
Z_PresentRequest *pr = m_s2z_present_apdu->u.presentRequest;
}
else
{
+ m_s2z_present_apdu = 0;
send_to_srw_client_ok(m_s2z_hit_count, res->records, 1);
}
}
convert_xsl(p->u.databaseOrSurDiagnostics);
}
}
+ else if (apdu->which == Z_APDU_initResponse)
+ {
+ if (m_initRequest_options)
+ {
+ Z_Options *nopt =
+ (Odr_bitmask *)odr_malloc(odr_encode(),
+ sizeof(Odr_bitmask));
+ ODR_MASK_ZERO(nopt);
+
+ int i;
+ for (i = 0; i<24; i++)
+ if (ODR_MASK_GET(m_initRequest_options, i) &&
+ ODR_MASK_GET(apdu->u.initResponse->options, i))
+ ODR_MASK_SET(nopt, i);
+ apdu->u.initResponse->options = nopt;
+ }
+ if (m_initRequest_version)
+ {
+ Z_ProtocolVersion *nopt =
+ (Odr_bitmask *)odr_malloc(odr_encode(),
+ sizeof(Odr_bitmask));
+ ODR_MASK_ZERO(nopt);
+
+ int i;
+ for (i = 0; i<8; i++)
+ if (ODR_MASK_GET(m_initRequest_version, i) &&
+ ODR_MASK_GET(apdu->u.initResponse->protocolVersion, i))
+ ODR_MASK_SET(nopt, i);
+ apdu->u.initResponse->protocolVersion = nopt;
+ }
+ }
int r = send_PDU_convert(apdu, &len);
if (r)
return r;
void Yaz_Proxy::handle_incoming_HTTP(Z_HTTP_Request *hreq)
{
-
if (m_s2z_odr_init)
{
odr_destroy(m_s2z_odr_init);
{
Z_SRW_searchRetrieveRequest *srw_req = srw_pdu->u.request;
+ m_s2z_database = odr_strdup(m_s2z_odr_init, srw_req->database);
// recordXPath unsupported.
if (srw_req->recordXPath)
{
{
Z_SRW_explainRequest *srw_req = srw_pdu->u.explain_request;
+ m_s2z_database = odr_strdup(m_s2z_odr_init, srw_req->database);
+
// save stylesheet
if (srw_req->stylesheet)
m_s2z_stylesheet =
}
else if (srw_pdu->which == Z_SRW_scan_request)
{
+ 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");
}
else
{
+ m_s2z_database = 0;
+
send_to_srw_client_error(4, 0);
}
}
nmem_destroy(m_initRequest_mem);
m_initRequest_apdu = apdu;
m_initRequest_mem = odr_extract_mem(odr_decode());
+
+ // save init options for the response..
+ m_initRequest_options = apdu->u.initRequest->options;
+
+ apdu->u.initRequest->options =
+ (Odr_bitmask *)nmem_malloc(m_initRequest_mem,
+ sizeof(Odr_bitmask));
+ ODR_MASK_ZERO(apdu->u.initRequest->options);
+ int i;
+ for (i = 0; i<= 24; i++)
+ ODR_MASK_SET(apdu->u.initRequest->options, i);
+ ODR_MASK_CLEAR(apdu->u.initRequest->options,
+ Z_Options_negotiationModel);
+
+ // make new version
+ m_initRequest_version = apdu->u.initRequest->protocolVersion;
+ apdu->u.initRequest->protocolVersion =
+ (Odr_bitmask *)nmem_malloc(m_initRequest_mem,
+ sizeof(Odr_bitmask));
+ ODR_MASK_ZERO(apdu->u.initRequest->protocolVersion);
+
+ for (i = 0; i<= 8; i++)
+ ODR_MASK_SET(apdu->u.initRequest->protocolVersion, i);
}
if (m_client->m_init_flag)
{
m_client->m_cookie);
apdu2->u.initResponse->referenceId =
apdu->u.initRequest->referenceId;
+ apdu2->u.initResponse->options = m_client->m_initResponse_options;
+ apdu2->u.initResponse->protocolVersion =
+ m_client->m_initResponse_version;
+
send_to_client(apdu2);
return;
}
Z_APDU *apdu = create_Z_PDU(Z_APDU_initRequest);
Z_InitRequest *req = apdu->u.initRequest;
- ODR_MASK_SET(req->options, Z_Options_search);
- ODR_MASK_SET(req->options, Z_Options_present);
- ODR_MASK_SET(req->options, Z_Options_namedResultSets);
- ODR_MASK_SET(req->options, Z_Options_triggerResourceCtrl);
- ODR_MASK_SET(req->options, Z_Options_scan);
- ODR_MASK_SET(req->options, Z_Options_sort);
- ODR_MASK_SET(req->options, Z_Options_extendedServices);
- ODR_MASK_SET(req->options, Z_Options_delSet);
-
- ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_1);
- ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_2);
- ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_3);
-
+ int i;
+ for (i = 0; i<= 24; i++)
+ ODR_MASK_SET(req->options, i);
+ ODR_MASK_CLEAR(apdu->u.initRequest->options,
+ Z_Options_negotiationModel);
+ for (i = 0; i<= 10; i++)
+ ODR_MASK_SET(req->protocolVersion, i);
+
if (send_to_target(apdu) < 0)
{
delete this;
}
}
+void Yaz_Proxy::markInvalid()
+{
+ m_client = 0;
+ m_invalid_session = 1;
+}
+
void Yaz_ProxyClient::timeoutNotify()
{
if (m_server)
get_hostname());
m_waiting = 1;
m_root->pre_init();
+ if (m_server && m_init_flag)
+ {
+ // target timed out in a session that was properly initialized
+ // server object stay alive but we mark it as invalid so it
+ // gets initialized again
+ m_server->markInvalid();
+ m_server = 0;
+ }
shutdown();
}
m_waiting = 0;
m_init_odr = odr_createmem (ODR_DECODE);
m_initResponse = 0;
+ m_initResponse_options = 0;
+ m_initResponse_version = 0;
m_resultSetStartPoint = 0;
m_bytes_sent = m_bytes_recv = 0;
m_pdu_recv = 0;
odr_reset (m_init_odr);
nmem_transfer (m_init_odr->mem, nmem);
m_initResponse = apdu;
+ m_initResponse_options = apdu->u.initResponse->options;
+ m_initResponse_version = apdu->u.initResponse->protocolVersion;
Z_InitResponse *ir = apdu->u.initResponse;
char *im0 = ir->implementationName;