21 #define MAX_SRU_PARAMETERS 30
24 const char *n,
const char *v)
26 if (n && v && *v !=
'\0')
65 char *dst =
odr_malloc(out, 3 * strlen(db) + 2);
72 const char *node_name,
73 const char *attribute_name)
75 struct _xmlAttr *attr;
76 if (strcmp((
const char*) ptr->name, node_name))
78 for (attr = ptr->properties; attr; attr = attr->next)
79 if (attr->children && attr->children->type == XML_TEXT_NODE)
81 if (!strcmp((
const char *) attr->name, attribute_name))
82 return (
const char *) attr->children->content;
109 char *username,
char *password,
ODR decode)
122 char ubuf[256] =
"", pbuf[256] =
"", *p;
123 if (strncmp(basic,
"Basic ", 6))
127 if (!len || len > 256)
132 if ((p = strchr(ubuf,
':')))
146 const char *uri,
const char *message,
161 int code,
const char *details)
165 sprintf(uri,
"info:srw/diagnostic/1/%d", code);
170 int *num,
const char *uri,
171 const char *message,
const char *details)
176 memcpy(d_new, *d, *num *
sizeof(**d));
184 int *num,
int code,
const char *addinfo)
188 sprintf(uri,
"info:srw/diagnostic/1/%d", code);
194 int *num,
int code,
const char *addinfo)
198 sprintf(uri,
"info:srw/diagnostic/12/%d", code);
204 int code,
const char *details)
209 len += strlen(message);
211 len += strlen(details);
216 "xmlns=\"http://www.loc.gov/zing/srw/diagnostic/\">\n"
217 " <uri>info:srw/diagnostic/1/%d</uri>\n", code);
220 " <details>%s</details>\n", details);
223 " <message>%s</message>\n", message);
228 record->
recordSchema =
"info:srw/schema/1/diagnostics-v1.1";
235 const char *charset_p = 0;
236 if (content_type && (charset_p = strstr(content_type,
"; charset=")))
241 if (charset_p[i] ==
'"' || charset_p[i] ==
'\'')
242 sep = charset_p[i++];
244 while (charset_p[i] && charset_p[i] != sep)
246 if (!sep && strchr(
"; \n\r", charset_p[i]))
248 if (charset_p[i] ==
'\\' && charset_p[i+1])
250 (*charset)[j++] = charset_p[i++];
252 (*charset)[j] =
'\0';
258 Z_SOAP **soap_package,
ODR decode,
char **charset)
260 if (!strcmp(hreq->
method,
"POST"))
269 char *db =
"Default";
270 const char *p0 = hreq->
path, *p1;
285 p1 = strchr(p0,
'?');
287 p1 = p0 + strlen(p0);
296 *srw_pdu = (
Z_SRW_PDU*) (*soap_package)->
u.generic->p;
301 if ((*soap_package)->u.generic->no == 3)
302 (*soap_package)->u.generic->no = 0;
304 (*srw_pdu)->u.request->database == 0)
305 (*srw_pdu)->u.request->database = db;
308 (*srw_pdu)->u.explain_request->database == 0)
309 (*srw_pdu)->u.explain_request->database = db;
312 (*srw_pdu)->u.scan_request->database == 0)
313 (*srw_pdu)->u.scan_request->database = db;
316 (*srw_pdu)->u.update_request->database == 0)
317 (*srw_pdu)->u.update_request->database = db;
329 const char *valstr,
Odr_int **valp,
336 if (sscanf(valstr,
"%d", &ival) != 1)
342 if (min_value >= 0 && ival < min_value)
357 Z_SOAP **soap_package,
ODR decode,
char **charset,
374 if (!strcmp(hreq->
method,
"GET")
376 (!strcmp(hreq->
method,
"POST") && content_type &&
378 content_type,
"; ")))
380 char *db =
"Default";
381 const char *p0 = hreq->
path, *p1;
383 const char *operation = 0;
386 char *queryType =
"cql";
390 char *stylesheet = 0;
391 char *scanClause = 0;
392 char *recordXPath = 0;
393 char *recordSchema = 0;
394 char *recordXMLEscaping = 0;
395 char *recordPacking = 0;
396 char *maximumRecords = 0;
397 char *startRecord = 0;
398 char *maximumTerms = 0;
399 char *responsePosition = 0;
400 const char *facetLimit = 0;
401 const char *facetStart = 0;
402 const char *facetSort = 0;
409 if (charset && *charset == 0 && !strcmp(hreq->
method,
"GET"))
414 p1 = strchr(p0,
'?');
416 p1 = p0 + strlen(p0);
426 for (i = 0; uri_name[i]; i++)
428 char *n = uri_name[i];
429 char *v = uri_val[i];
430 if (!strcmp(n,
"query"))
432 else if (!strcmp(n,
"x-pquery"))
437 else if (!strcmp(n,
"queryType"))
439 else if (!strcmp(n,
"x-username"))
441 else if (!strcmp(n,
"x-password"))
443 else if (!strcmp(n,
"operation"))
445 else if (!strcmp(n,
"stylesheet"))
447 else if (!strcmp(n,
"sortKeys"))
449 else if (!strcmp(n,
"recordXPath"))
451 else if (!strcmp(n,
"recordSchema"))
453 else if (!strcmp(n,
"recordPacking"))
455 else if (!strcmp(n,
"recordXMLEscaping"))
456 recordXMLEscaping = v;
457 else if (!strcmp(n,
"version"))
459 else if (!strcmp(n,
"scanClause"))
461 else if (!strcmp(n,
"x-pScanClause"))
466 else if (!strcmp(n,
"maximumRecords"))
468 else if (!strcmp(n,
"startRecord"))
470 else if (!strcmp(n,
"maximumTerms"))
472 else if (!strcmp(n,
"responsePosition"))
473 responsePosition = v;
474 else if (!strcmp(n,
"facetLimit"))
476 else if (!strcmp(n,
"facetStart"))
478 else if (!strcmp(n,
"facetSort"))
480 else if (!strcmp(n,
"extraRequestData"))
482 else if (n[0] ==
'x' && n[1] ==
'-')
497 operation =
"searchRetrieve";
501 operation =
"explain";
515 decode, diag, num_diag,
517 operation =
"explain";
519 if (strcmp(version,
"2.0"))
521 if (recordXMLEscaping)
525 "recordXMLEscaping");
528 recordXMLEscaping = recordPacking;
529 recordPacking =
"packed";
531 if (!recordXMLEscaping)
532 recordXMLEscaping =
"xml";
533 if (!strcmp(operation,
"searchRetrieve"))
547 decode, diag, num_diag,
561 &facetLimit, &facetStart, &facetSort);
573 (*soap_package) = (
Z_SOAP *)
578 odr_malloc(decode,
sizeof(*(*soap_package)->u.generic));
580 (*soap_package)->u.generic->p = sr;
581 (*soap_package)->
u.generic->ns = soap_handlers[0].
ns;
582 (*soap_package)->u.generic->no = 0;
584 (*soap_package)->ns =
"SRU";
588 else if (!strcmp(operation,
"explain"))
605 (*soap_package) = (
Z_SOAP *)
610 odr_malloc(decode,
sizeof(*(*soap_package)->u.generic));
612 (*soap_package)->u.generic->p = sr;
613 (*soap_package)->
u.generic->ns = soap_handlers[0].
ns;
614 (*soap_package)->u.generic->no = 0;
616 (*soap_package)->ns =
"SRU";
620 else if (!strcmp(operation,
"scan"))
636 decode, diag, num_diag,
652 (*soap_package) = (
Z_SOAP *)
657 odr_malloc(decode,
sizeof(*(*soap_package)->u.generic));
659 (*soap_package)->u.generic->p = sr;
660 (*soap_package)->
u.generic->ns = soap_handlers[0].
ns;
661 (*soap_package)->u.generic->no = 0;
663 (*soap_package)->ns =
"SRU";
681 (*soap_package) = (
Z_SOAP *)
686 odr_malloc(decode,
sizeof(*(*soap_package)->u.generic));
688 (*soap_package)->u.generic->p = sr;
689 (*soap_package)->
u.generic->ns = soap_handlers[0].
ns;
690 (*soap_package)->u.generic->no = 0;
692 (*soap_package)->ns =
"SRU";
722 for (i = 0; i<n; i++)
940 char *a_name,
char *val)
951 char **
name,
char **value,
int max_names)
953 int version2 = strcmp(srw_pdu->
srw_version,
"2.") > 0;
958 name[i] =
"operation";
959 switch (srw_pdu->
which)
962 value[i++] =
"searchRetrieve";
966 if (queryType && strcmp(queryType,
"cql"))
974 if (!strcmp(queryType,
"cql"))
979 else if (!strcmp(queryType,
"pqf"))
984 else if (!strcmp(queryType,
"xcql"))
1022 const char *facetLimit = 0;
1023 const char *facetStart = 0;
1024 const char *facetSort = 0;
1026 &facetLimit, &facetStart, &facetSort);
1028 (
char *) facetLimit);
1030 (
char *) facetStart);
1032 (
char *) facetSort);
1036 value[i++] =
"explain";
1052 value[i++] =
"scan";
1056 if (queryType && strcmp(queryType,
"cql"))
1064 if (!queryType || !strcmp(queryType,
"cql"))
1067 else if (!strcmp(queryType,
"pqf"))
1070 else if (!strcmp(queryType,
"xcql"))
1083 value[i++] =
"update";
1091 for (; ea && i < max_names-1; ea = ea->
next)
1094 value[i] = ea->
value;
1104 ODR encode,
const char *charset)
1119 cp = strchr(hreq->
path,
'#');
1126 sprintf(path,
"%s%c%s", hreq->
path, strchr(hreq->
path,
'?') ?
'&' :
'?',
1131 "text/xml", charset);
1136 ODR encode,
const char *charset)
1154 "application/x-www-form-urlencoded",
1160 ODR odr,
const char *charset)
1178 "SOAPAction",
"\"\"");
1184 p->
ns =
"http://schemas.xmlsoap.org/soap/envelope/";
1202 for (i = 0; i < num; ++i)
int yaz_base64decode(const char *in, char *out)
decodes Base64 string
Header for Base64 utilities.
const char * yaz_diag_srw_str(int code)
#define YAZ_SRW_UNSUPP_VERSION
#define YAZ_SRW_UNSUPP_PARAMETER_VALUE
#define YAZ_SRW_UNSUPP_OPERATION
#define YAZ_SRW_UNSUPP_PARAMETER
#define YAZ_SRW_MANDATORY_PARAMETER_NOT_SUPPLIED
const char * z_HTTP_header_lookup(const Z_HTTP_Header *hp, const char *n)
void z_HTTP_header_add_basic_auth(ODR o, Z_HTTP_Header **hp, const char *username, const char *password)
void z_HTTP_header_add(ODR o, Z_HTTP_Header **hp, const char *n, const char *v)
void z_HTTP_header_add_content_type(ODR o, Z_HTTP_Header **hp, const char *content_type, const char *charset)
int yaz_strcmp_del(const char *a, const char *b, const char *b_del)
match a and b with some delimitor for b
int yaz_matchstr(const char *s1, const char *s2)
match strings - independent of case and '-'
Header for YAZ iconv interface.
char * odr_strdupn(ODR o, const char *str, size_t n)
char * odr_strdup(ODR o, const char *str)
Odr_int * odr_intdup(ODR o, Odr_int v)
void * odr_malloc(ODR o, size_t size)
int z_soap_codec(ODR o, Z_SOAP **pp, char **content_buf, int *content_len, Z_SOAP_Handler *handlers)
int z_soap_codec_enc(ODR o, Z_SOAP **pp, char **content_buf, int *content_len, Z_SOAP_Handler *handlers, const char *encoding)
int(* Z_SOAP_fun)(ODR o, void *ptr, void **handler_data, void *client_data, const char *ns)
void yaz_sru_facet_request(ODR, Z_FacetList **facetList, const char **limit, const char **start, const char **sort)
char * yaz_negotiate_sru_version(char *input_ver)
int yaz_ucp_codec(ODR o, void *vptr, Z_SRW_PDU **handler_data, void *client_data, const char *ns_ucp_str)
int yaz_srw_codec(ODR o, void *vptr, Z_SRW_PDU **handler_data, void *client_data, const char *ns)
#define YAZ_XMLNS_SRU_v2_mask
#define Z_SRW_recordPacking_XML
#define Z_SRW_searchRetrieve_response
#define Z_SRW_explain_request
#define Z_SRW_update_request
#define Z_SRW_scan_request
#define YAZ_XMLNS_SRU_v1_1
#define Z_SRW_sort_type_none
#define Z_SRW_recordPacking_string
#define Z_SRW_recordPacking_URL
#define Z_SRW_update_response
#define Z_SRW_sort_type_sort
#define Z_SRW_explain_response
#define YAZ_XMLNS_SRU_v1_0
#define Z_SRW_scan_response
#define Z_SRW_searchRetrieve_request
#define YAZ_XMLNS_UPDATE_v0_9
int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, Z_SOAP **soap_package, ODR decode, char **charset, Z_SRW_diagnostic **diag, int *num_diag)
void yaz_encode_sru_extra(Z_SRW_PDU *sr, ODR odr, const char *extra_args)
char * yaz_encode_sru_dbpath_odr(ODR out, const char *db)
encode SRU database for HTTP path
static int yaz_get_sru_parms(const Z_SRW_PDU *srw_pdu, ODR encode, char **name, char **value, int max_names)
static int yaz_sru_decode_integer(ODR odr, const char *pname, const char *valstr, Odr_int **valp, Z_SRW_diagnostic **diag, int *num_diag, int min_value)
int yaz_srw_check_content_type(Z_HTTP_Response *hres)
void yaz_encode_sru_dbpath_buf(char *dst, const char *db)
encode SRU database for HTTP path
Z_SRW_PDU * yaz_srw_get_pdu_e(ODR o, int which, Z_SRW_PDU *req)
static Z_SRW_PDU * yaz_srw_get_core_ver(ODR o, const char *version)
static Z_SRW_extra_arg ** append_extra_arg_int(ODR odr, Z_SRW_extra_arg **l, const char *n, Odr_int *v)
void yaz_add_sru_update_diagnostic(ODR o, Z_SRW_diagnostic **d, int *num, int code, const char *addinfo)
int yaz_srw_str_to_pack(const char *str)
Z_SRW_extra_record * yaz_srw_get_extra_record(ODR o)
void yaz_add_srw_diagnostic_uri(ODR o, Z_SRW_diagnostic **d, int *num, const char *uri, const char *message, const char *details)
void yaz_add_name_value_int(ODR o, char **name, char **value, int *i, char *a_name, Odr_int *val)
int yaz_sru_get_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, ODR encode, const char *charset)
void yaz_mk_sru_surrogate(ODR o, Z_SRW_record *record, int pos, int code, const char *details)
#define MAX_SRU_PARAMETERS
int yaz_srw_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, Z_SOAP **soap_package, ODR decode, char **charset)
Z_SRW_PDU * yaz_srw_get_pdu(ODR o, int which, const char *version)
Z_SRW_record * yaz_srw_get_records(ODR o, int n)
int yaz_sru_post_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, ODR encode, const char *charset)
static void grab_charset(ODR o, const char *content_type, char **charset)
const char * yaz_element_attribute_value_get(xmlNodePtr ptr, const char *node_name, const char *attribute_name)
const char * yaz_srw_pack_to_str(int pack)
void yaz_add_name_value_str(ODR o, char **name, char **value, int *i, char *a_name, char *val)
Z_SRW_PDU * yaz_srw_get_core_v_2_0(ODR o)
void yaz_mk_srw_diagnostic(ODR o, Z_SRW_diagnostic *d, const char *uri, const char *message, const char *details)
static void yaz_srw_decodeauth(Z_SRW_PDU *sr, Z_HTTP_Request *hreq, char *username, char *password, ODR decode)
Z_SRW_recordVersion * yaz_srw_get_record_versions(ODR odr, int num)
int yaz_sru_soap_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, ODR odr, const char *charset)
void yaz_mk_std_diagnostic(ODR o, Z_SRW_diagnostic *d, int code, const char *details)
static Z_SRW_extra_arg ** append_extra_arg(ODR odr, Z_SRW_extra_arg **l, const char *n, const char *v)
static char * yaz_decode_sru_dbpath_odr(ODR n, const char *uri, size_t len)
Z_SRW_PDU * yaz_srw_get(ODR o, int which)
void yaz_add_srw_diagnostic(ODR o, Z_SRW_diagnostic **d, int *num, int code, const char *addinfo)
Z_SRW_record * yaz_srw_get_record(ODR o)
Z_SRW_explainRequest * explain_request
Z_SRW_updateRequest * update_request
Z_SRW_updateResponse * update_response
Z_SRW_scanRequest * scan_request
Z_SRW_searchRetrieveResponse * response
Z_SRW_extra_arg * extra_args
Z_SRW_scanResponse * scan_response
Z_SRW_explainResponse * explain_response
Z_SRW_searchRetrieveRequest * request
char * extraResponseData_buf
int extraResponseData_len
Z_SRW_diagnostic * diagnostics
Z_SRW_extra_record * extra_record
Odr_int * responsePosition
Z_SRW_diagnostic * diagnostics
union Z_SRW_searchRetrieveRequest::@29 sort
Odr_int * numberOfRecords
Z_SRW_diagnostic * diagnostics
char * resultCountPrecision
Odr_int * nextRecordPosition
Odr_int * resultSetIdleTime
Z_SRW_extra_record ** extra_records
Z_SRW_extra_record * extra_record
Z_SRW_recordVersion * recordVersions
char * extraRequestData_buf
Z_SRW_diagnostic * diagnostics
int extraResponseData_len
Z_SRW_recordVersion * recordVersions
char * extraResponseData_buf
Z_SRW_extra_record * extra_record
int yaz_uri_to_array(const char *path, ODR o, char ***name, char ***val)
void yaz_array_to_uri(char **path, ODR o, char **name, char **value)
Header for YAZ iconv interface.