* Copyright (c) 1995-2003, Index Data
* See the file LICENSE for details.
*
- * $Id: seshigh.c,v 1.135 2003-02-14 18:49:24 adam Exp $
+ * $Id: seshigh.c,v 1.139 2003-02-17 22:35:48 adam Exp $
*/
/*
#include <io.h>
#define S_ISREG(x) (x & _S_IFREG)
#include <process.h>
+#include <sys/stat.h>
#else
#include <sys/stat.h>
#include <unistd.h>
xfree(h);
xmalloc_trav("session closed");
if (control_block && control_block->one_shot)
+ {
exit (0);
+ }
}
static void do_close_req(association *a, int reason, char *message,
*cls->closeReason = reason;
cls->diagnosticInformation = message;
process_z_response(a, req, &apdu);
- iochan_settimeout(a->client_chan, 60);
+ iochan_settimeout(a->client_chan, 20);
}
else
{
{ /* restore mask for cs_get operation ... */
iochan_clearflag(h, EVENT_OUTPUT|EVENT_INPUT);
iochan_setflag(h, assoc->cs_get_mask);
- yaz_log(LOG_LOG, "queue empty mask=%d", assoc->cs_get_mask);
if (assoc->state == ASSOC_DEAD)
iochan_setevent(assoc->client_chan, EVENT_TIMEOUT);
}
else
{
assoc->cs_put_mask = EVENT_OUTPUT;
- yaz_log(LOG_LOG, "queue not empty");
}
break;
default:
rr.comp->u.complex->generic = (Z_Specification *)
odr_malloc(assoc->decode, sizeof(Z_Specification));
- rr.comp->u.complex->generic->which = Z_Specification_uri;
- rr.comp->u.complex->generic->u.uri = srw_req->recordSchema;
+ rr.comp->u.complex->generic->which = Z_Schema_uri;
+ rr.comp->u.complex->generic->schema.uri = srw_req->recordSchema;
rr.comp->u.complex->generic->elementSpec = 0;
rr.stream = assoc->encode;
record->recordData_buf = rr.record;
record->recordData_len = rr.len;
record->recordPosition = odr_intdup(o, pos);
- record->recordSchema = odr_strdup(o, srw_req->recordSchema);
+ record->recordSchema = 0;
+ if (srw_req->recordSchema)
+ record->recordSchema = odr_strdup(o, srw_req->recordSchema);
}
}
rr.setname = "default";
rr.replace_set = 1;
rr.num_bases = 1;
- rr.basenames = &base;
+ rr.basenames = &srw_req->database;
rr.referenceId = 0;
ext = (Z_External *) odr_malloc(assoc->decode, sizeof(*ext));
rr.errcode = 0;
rr.errstring = 0;
rr.search_info = 0;
+ yaz_log_zquery(rr.query);
(assoc->init->bend_search)(assoc->backend, &rr);
srw_res->numberOfRecords = odr_intdup(assoc->encode, rr.hits);
if (rr.errcode)
odr_malloc(assoc->encode, sizeof(*srw_res->diagnostics));
srw_res->diagnostics[0].code =
odr_intdup(assoc->encode, rr.errcode);
+ srw_res->diagnostics[0].details = rr.errstring;
}
else
{
#endif
if (!strcmp(hreq->path, "/"))
{
+#ifdef DOCDIR
struct stat sbuf;
+#endif
const char *doclink = "";
p = z_get_HTTP_Response(o, 200);
hres = p->u.HTTP_Response;
}
else if (!strcmp(hreq->method, "POST"))
{
-#if HAVE_XSLT
+#if HAVE_XML2
const char *content_type = z_HTTP_header_lookup(hreq->headers,
"Content-Type");
const char *soap_action = z_HTTP_header_lookup(hreq->headers,
Z_SRW_searchRetrieve *res =
yaz_srw_get(assoc->encode,
Z_SRW_searchRetrieve_response);
-
- srw_bend_search(assoc, req, sr->u.request, res->u.response);
+
+ if (!sr->u.request->database)
+ {
+ const char *p0 = hreq->path, *p1;
+ if (*p0 == '/')
+ p0++;
+ p1 = strchr(p0, '?');
+ if (!p1)
+ p1 = p0 + strlen(p0);
+ if (p1 != p0)
+ {
+ sr->u.request->database =
+ odr_malloc(assoc->decode, p1 - p0 + 1);
+ memcpy (sr->u.request->database, p0, p1 - p0);
+ sr->u.request->database[p1 - p0] = '\0';
+ }
+ else
+ sr->u.request->database = "Default";
+ }
+ srw_bend_search(assoc, req, sr->u.request,
+ res->u.response);
soap_package->u.generic->p = res;
http_code = 200;
&hres->content_buf, &hres->content_len,
soap_handlers);
hres->code = http_code;
+ z_HTTP_header_add(o, &hres->headers, "Content-Type", "text/xml");
}
#endif
if (!p) /* still no response ? */
}
else
{
+ int t;
+ const char *alive = z_HTTP_header_lookup(hreq->headers, "Keep-Alive");
+
+ if (alive && isdigit(*alive))
+ t = atoi(alive);
+ else
+ t = 30;
+ if (t < 0 || t > 3600)
+ t = 3600;
+ iochan_settimeout(assoc->client_chan,t);
z_HTTP_header_add(o, &hres->headers, "Connection", "Keep-Alive");
}
process_gdu_response(assoc, req, p);
switch (req->apdu_request->which)
{
case Z_APDU_initRequest:
+ iochan_settimeout(assoc->client_chan,
+ statserv_getcontrol()->idle_timeout * 60);
res = process_initRequest(assoc, req); break;
case Z_APDU_searchRequest:
res = process_searchRequest(assoc, req, &fd); break;