21 #define MAX_SRU_PARAMETERS 30
37 char *dst =
odr_malloc(out, 3 * strlen(db) + 2);
71 const char *node_name,
72 const char *attribute_name)
74 struct _xmlAttr *attr;
76 if (strcmp((
const char*) ptr->name, node_name))
79 for (attr = ptr->properties; attr; attr = attr->next)
80 if (attr->children && attr->children->type == XML_TEXT_NODE)
82 if (!strcmp((
const char *) attr->name, attribute_name))
83 return (
const char *) attr->children->content;
108 char *username,
char *password,
ODR decode)
121 char ubuf[256] =
"", pbuf[256] =
"", *p;
122 if (strncmp(basic,
"Basic ", 6))
126 if (!len || len > 256)
131 if ((p = strchr(ubuf,
':')))
152 const char *uri,
const char *message,
167 int code,
const char *details)
171 sprintf(uri,
"info:srw/diagnostic/1/%d", code);
176 int *num,
const char *uri,
177 const char *message,
const char *details)
182 memcpy(d_new, *d, *num *
sizeof(**d));
190 int *num,
int code,
const char *addinfo)
194 sprintf(uri,
"info:srw/diagnostic/1/%d", code);
200 int *num,
int code,
const char *addinfo)
204 sprintf(uri,
"info:srw/diagnostic/12/%d", code);
210 int code,
const char *details)
215 len += strlen(message);
217 len += strlen(details);
222 "xmlns=\"http://www.loc.gov/zing/srw/diagnostic/\">\n"
223 " <uri>info:srw/diagnostic/1/%d</uri>\n", code);
226 " <details>%s</details>\n", details);
229 " <message>%s</message>\n", message);
234 record->
recordSchema =
"info:srw/schema/1/diagnostics-v1.1";
241 const char *charset_p = 0;
242 if (content_type && (charset_p = strstr(content_type,
"; charset=")))
246 while (i < 20 && charset_p[i] &&
247 !strchr(
"; \n\r", charset_p[i]))
250 memcpy(*charset, charset_p, i);
251 (*charset)[i] =
'\0';
257 Z_SOAP **soap_package,
ODR decode,
char **charset)
259 if (!strcmp(hreq->
method,
"POST"))
268 char *db =
"Default";
269 const char *p0 = hreq->
path, *p1;
283 p1 = strchr(p0,
'?');
285 p1 = p0 + strlen(p0);
295 *srw_pdu = (
Z_SRW_PDU*) (*soap_package)->
u.generic->p;
299 (*srw_pdu)->u.request->database == 0)
300 (*srw_pdu)->u.request->database = db;
303 (*srw_pdu)->u.explain_request->database == 0)
304 (*srw_pdu)->u.explain_request->database = db;
307 (*srw_pdu)->u.scan_request->database == 0)
308 (*srw_pdu)->u.scan_request->database = db;
311 (*srw_pdu)->u.update_request->database == 0)
312 (*srw_pdu)->u.update_request->database = db;
324 const char *valstr,
Odr_int **valp,
331 if (sscanf(valstr,
"%d", &ival) != 1)
337 if (min_value >= 0 && ival < min_value)
352 Z_SOAP **soap_package,
ODR decode,
char **charset,
369 if (!strcmp(hreq->
method,
"GET")
371 (!strcmp(hreq->
method,
"POST") && content_type &&
373 content_type,
"; ")))
375 char *db =
"Default";
376 const char *p0 = hreq->
path, *p1;
378 const char *operation = 0;
385 char *stylesheet = 0;
386 char *scanClause = 0;
387 char *pScanClause = 0;
388 char *recordXPath = 0;
389 char *recordSchema = 0;
390 char *recordPacking =
"xml";
391 char *maximumRecords = 0;
392 char *startRecord = 0;
393 char *maximumTerms = 0;
394 char *responsePosition = 0;
401 if (charset && *charset == 0 && !strcmp(hreq->
method,
"GET"))
406 p1 = strchr(p0,
'?');
408 p1 = p0 + strlen(p0);
411 if (!strcmp(hreq->
method,
"POST"))
418 for (i = 0; uri_name[i]; i++)
420 char *n = uri_name[i];
421 char *v = uri_val[i];
422 if (!strcmp(n,
"query"))
424 else if (!strcmp(n,
"x-pquery"))
426 else if (!strcmp(n,
"x-username"))
428 else if (!strcmp(n,
"x-password"))
430 else if (!strcmp(n,
"operation"))
432 else if (!strcmp(n,
"stylesheet"))
434 else if (!strcmp(n,
"sortKeys"))
436 else if (!strcmp(n,
"recordXPath"))
438 else if (!strcmp(n,
"recordSchema"))
440 else if (!strcmp(n,
"recordPacking"))
442 else if (!strcmp(n,
"version"))
444 else if (!strcmp(n,
"scanClause"))
446 else if (!strcmp(n,
"x-pScanClause"))
448 else if (!strcmp(n,
"maximumRecords"))
450 else if (!strcmp(n,
"startRecord"))
452 else if (!strcmp(n,
"maximumTerms"))
454 else if (!strcmp(n,
"responsePosition"))
455 responsePosition = v;
456 else if (!strcmp(n,
"extraRequestData"))
458 else if (n[0] ==
'x' && n[1] ==
'-')
480 decode, diag, num_diag,
498 decode, diag, num_diag,
500 operation =
"explain";
502 if (!strcmp(operation,
"searchRetrieve"))
522 decode, diag, num_diag,
545 (*soap_package) = (
Z_SOAP *)
550 odr_malloc(decode,
sizeof(*(*soap_package)->u.generic));
552 (*soap_package)->u.generic->p = sr;
553 (*soap_package)->
u.generic->ns = soap_handlers[0].
ns;
554 (*soap_package)->u.generic->no = 0;
556 (*soap_package)->ns =
"SRU";
560 else if (!strcmp(operation,
"explain"))
575 (*soap_package) = (
Z_SOAP *)
580 odr_malloc(decode,
sizeof(*(*soap_package)->u.generic));
582 (*soap_package)->u.generic->p = sr;
583 (*soap_package)->
u.generic->ns = soap_handlers[0].
ns;
584 (*soap_package)->u.generic->no = 0;
586 (*soap_package)->ns =
"SRU";
590 else if (!strcmp(operation,
"scan"))
606 else if (pScanClause)
613 decode, diag, num_diag,
629 (*soap_package) = (
Z_SOAP *)
634 odr_malloc(decode,
sizeof(*(*soap_package)->u.generic));
636 (*soap_package)->u.generic->p = sr;
637 (*soap_package)->
u.generic->ns = soap_handlers[0].
ns;
638 (*soap_package)->u.generic->no = 0;
640 (*soap_package)->ns =
"SRU";
658 (*soap_package) = (
Z_SOAP *)
663 odr_malloc(decode,
sizeof(*(*soap_package)->u.generic));
665 (*soap_package)->u.generic->p = sr;
666 (*soap_package)->
u.generic->ns = soap_handlers[0].
ns;
667 (*soap_package)->u.generic->no = 0;
669 (*soap_package)->ns =
"SRU";
699 for (i = 0; i<n; i++)
858 char *a_name,
char *val)
869 char **
name,
char **value,
int max_names)
873 name[i] =
"operation";
874 switch(srw_pdu->
which)
877 value[i++] =
"searchRetrieve";
918 value[i++] =
"explain";
948 value[i++] =
"update";
956 for (; ea && i < max_names-1; ea = ea->
next)
959 value[i] = ea->
value;
969 ODR encode,
const char *charset)
986 sprintf(path,
"%s?%s", hreq->
path, uri_args);
991 "text/xml", charset);
996 ODR encode,
const char *charset)
1014 "application/x-www-form-urlencoded",
1020 ODR odr,
const char *charset)
1035 "text/xml", charset);
1038 "SOAPAction",
"\"\"");
1044 p->
ns =
"http://schemas.xmlsoap.org/soap/envelope/";
1062 for (i = 0; i < num; ++i)
1107 (*ea)->name = *
name;
1108 (*ea)->value = *val;