22#define MAX_SRU_PARAMETERS 30
25 const char *n,
const char *v)
27 if (n && v && *v !=
'\0')
66 char *dst =
odr_malloc(out, 3 * strlen(db) + 2);
73 const char *node_name,
74 const char *attribute_name)
76 struct _xmlAttr *attr;
77 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;
110 char *username,
char *password,
ODR decode)
123 char ubuf[256] =
"", pbuf[256] =
"", *p;
124 if (strncmp(basic,
"Basic ", 6))
128 if (!len || len > 256)
133 if ((p = strchr(ubuf,
':')))
147 const char *uri,
const char *message,
162 int code,
const char *details)
166 yaz_snprintf(uri,
sizeof uri,
"info:srw/diagnostic/1/%d", code);
171 int *num,
const char *uri,
172 const char *message,
const char *details)
177 memcpy(d_new, *d, *num *
sizeof(**d));
185 int *num,
int code,
const char *addinfo)
189 yaz_snprintf(uri,
sizeof uri,
"info:srw/diagnostic/1/%d", code);
195 int *num,
int code,
const char *addinfo)
199 yaz_snprintf(uri,
sizeof uri,
"info:srw/diagnostic/12/%d", code);
205 int code,
const char *details)
210 len += strlen(message);
212 len += strlen(details);
217 "xmlns=\"http://www.loc.gov/zing/srw/diagnostic/\">\n"
218 " <uri>info:srw/diagnostic/1/%d</uri>\n", code);
221 len - strlen(record->
recordData_buf),
" <details>%s</details>\n", details);
224 len - strlen(record->
recordData_buf),
" <message>%s</message>\n", message);
229 record->
recordSchema =
"info:srw/schema/1/diagnostics-v1.1";
236 const char *charset_p = 0;
237 if (content_type && (charset_p = strstr(content_type,
"; charset=")))
242 if (charset_p[i] ==
'"' || charset_p[i] ==
'\'')
243 sep = charset_p[i++];
245 while (charset_p[i] && charset_p[i] != sep)
247 if (!sep && strchr(
"; \n\r", charset_p[i]))
249 if (charset_p[i] ==
'\\' && charset_p[i+1])
251 (*charset)[j++] = charset_p[i++];
253 (*charset)[j] =
'\0';
259 Z_SOAP **soap_package,
ODR decode,
char **charset)
261 if (!strcmp(hreq->
method,
"POST"))
270 char *db =
"Default";
271 const char *p0 = hreq->
path, *p1;
286 p1 = strchr(p0,
'?');
288 p1 = p0 + strlen(p0);
297 *srw_pdu = (
Z_SRW_PDU*) (*soap_package)->
u.generic->p;
302 if ((*soap_package)->u.generic->no == 3)
303 (*soap_package)->u.generic->no = 0;
305 (*srw_pdu)->u.request->database == 0)
306 (*srw_pdu)->u.request->database = db;
309 (*srw_pdu)->u.explain_request->database == 0)
310 (*srw_pdu)->u.explain_request->database = db;
313 (*srw_pdu)->u.scan_request->database == 0)
314 (*srw_pdu)->u.scan_request->database = db;
317 (*srw_pdu)->u.update_request->database == 0)
318 (*srw_pdu)->u.update_request->database = db;
330 const char *valstr,
Odr_int **valp,
337 if (sscanf(valstr,
"%d", &ival) != 1)
343 if (min_value >= 0 && ival < min_value)
358 Z_SOAP **soap_package,
ODR decode,
char **charset,
375 if (!strcmp(hreq->
method,
"GET")
377 (!strcmp(hreq->
method,
"POST") && content_type &&
379 content_type,
"; ")))
381 char *db =
"Default";
382 const char *p0 = hreq->
path, *p1;
384 const char *operation = 0;
387 char *queryType =
"cql";
391 char *stylesheet = 0;
392 char *scanClause = 0;
393 char *recordXPath = 0;
394 char *recordSchema = 0;
395 char *recordXMLEscaping = 0;
396 char *recordPacking = 0;
397 char *maximumRecords = 0;
398 char *startRecord = 0;
399 char *maximumTerms = 0;
400 char *responsePosition = 0;
401 const char *facetLimit = 0;
402 const char *facetStart = 0;
403 const char *facetSort = 0;
410 if (charset && *charset == 0 && !strcmp(hreq->
method,
"GET"))
415 p1 = strchr(p0,
'?');
417 p1 = p0 + strlen(p0);
427 for (i = 0; uri_name[i]; i++)
429 char *n = uri_name[i];
430 char *v = uri_val[i];
431 if (!strcmp(n,
"query"))
433 else if (!strcmp(n,
"x-pquery"))
438 else if (!strcmp(n,
"queryType"))
440 else if (!strcmp(n,
"x-username"))
442 else if (!strcmp(n,
"x-password"))
444 else if (!strcmp(n,
"operation"))
446 else if (!strcmp(n,
"stylesheet"))
448 else if (!strcmp(n,
"sortKeys"))
450 else if (!strcmp(n,
"recordXPath"))
452 else if (!strcmp(n,
"recordSchema"))
454 else if (!strcmp(n,
"recordPacking"))
456 else if (!strcmp(n,
"recordXMLEscaping"))
457 recordXMLEscaping = v;
458 else if (!strcmp(n,
"version"))
460 else if (!strcmp(n,
"scanClause"))
462 else if (!strcmp(n,
"x-pScanClause"))
467 else if (!strcmp(n,
"maximumRecords"))
469 else if (!strcmp(n,
"startRecord"))
471 else if (!strcmp(n,
"maximumTerms"))
473 else if (!strcmp(n,
"responsePosition"))
474 responsePosition = v;
475 else if (!strcmp(n,
"facetLimit"))
477 else if (!strcmp(n,
"facetStart"))
479 else if (!strcmp(n,
"facetSort"))
481 else if (!strcmp(n,
"extraRequestData"))
483 else if (n[0] ==
'x' && n[1] ==
'-')
498 operation =
"searchRetrieve";
502 operation =
"explain";
516 decode, diag, num_diag,
518 operation =
"explain";
520 if (strcmp(version,
"2.0"))
522 if (recordXMLEscaping)
526 "recordXMLEscaping");
529 recordXMLEscaping = recordPacking;
530 recordPacking =
"packed";
532 if (!recordXMLEscaping)
533 recordXMLEscaping =
"xml";
534 if (!strcmp(operation,
"searchRetrieve"))
548 decode, diag, num_diag,
562 &facetLimit, &facetStart, &facetSort);
574 (*soap_package) = (
Z_SOAP *)
579 odr_malloc(decode,
sizeof(*(*soap_package)->u.generic));
581 (*soap_package)->u.generic->p = sr;
582 (*soap_package)->
u.generic->ns = soap_handlers[0].
ns;
583 (*soap_package)->u.generic->no = 0;
585 (*soap_package)->ns =
"SRU";
589 else if (!strcmp(operation,
"explain"))
606 (*soap_package) = (
Z_SOAP *)
611 odr_malloc(decode,
sizeof(*(*soap_package)->u.generic));
613 (*soap_package)->u.generic->p = sr;
614 (*soap_package)->
u.generic->ns = soap_handlers[0].
ns;
615 (*soap_package)->u.generic->no = 0;
617 (*soap_package)->ns =
"SRU";
621 else if (!strcmp(operation,
"scan"))
637 decode, diag, num_diag,
653 (*soap_package) = (
Z_SOAP *)
658 odr_malloc(decode,
sizeof(*(*soap_package)->u.generic));
660 (*soap_package)->u.generic->p = sr;
661 (*soap_package)->
u.generic->ns = soap_handlers[0].
ns;
662 (*soap_package)->u.generic->no = 0;
664 (*soap_package)->ns =
"SRU";
682 (*soap_package) = (
Z_SOAP *)
687 odr_malloc(decode,
sizeof(*(*soap_package)->u.generic));
689 (*soap_package)->u.generic->p = sr;
690 (*soap_package)->
u.generic->ns = soap_handlers[0].
ns;
691 (*soap_package)->u.generic->no = 0;
693 (*soap_package)->ns =
"SRU";
723 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,
'#');
1124 hreq->
path, strchr(hreq->
path,
'?') ?
'&' :
'?', uri_args);
1129 "text/xml", charset);
1134 ODR encode,
const char *charset)
1152 "application/x-www-form-urlencoded",
1158 ODR odr,
const char *charset)
1176 "SOAPAction",
"\"\"");
1182 p->
ns =
"http://schemas.xmlsoap.org/soap/envelope/";
1200 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
void z_HTTP_header_add_basic_auth(ODR o, Z_HTTP_Header **hp, const char *username, const char *password)
const char * z_HTTP_header_lookup(const Z_HTTP_Header *hp, const char *n)
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 * nmem_printf(NMEM nmem, const char *fmt,...)
formats and prints a string into NMEM allocated memory
Odr_int * odr_intdup(ODR o, Odr_int v)
void * odr_malloc(ODR o, size_t size)
char * odr_strdupn(ODR o, const char *str, size_t n)
char * odr_strdup(ODR o, const char *str)
void yaz_snprintf(char *buf, size_t size, const char *fmt,...)
Header for config file reading utilities.
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)
char * yaz_negotiate_sru_version(char *input_ver)
void yaz_sru_facet_request(ODR, Z_FacetList **facetList, const char **limit, const char **start, const char **sort)
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)
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)
void yaz_encode_sru_extra(Z_SRW_PDU *sr, ODR odr, const char *extra_args)
Z_SRW_PDU * yaz_srw_get_pdu(ODR o, int which, 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)
static Z_SRW_extra_arg ** append_extra_arg(ODR odr, Z_SRW_extra_arg **l, const char *n, const char *v)
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
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)
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)
char * yaz_encode_sru_dbpath_odr(ODR out, const char *db)
encode SRU database for HTTP path
void yaz_mk_sru_surrogate(ODR o, Z_SRW_record *record, int pos, int code, const char *details)
static char * yaz_decode_sru_dbpath_odr(ODR n, const char *uri, size_t len)
const char * yaz_element_attribute_value_get(xmlNodePtr ptr, const char *node_name, const char *attribute_name)
#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_recordVersion * yaz_srw_get_record_versions(ODR odr, int num)
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)
void yaz_add_name_value_str(ODR o, char **name, char **value, int *i, char *a_name, char *val)
Z_SRW_record * yaz_srw_get_record(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)
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)
const char * yaz_srw_pack_to_str(int pack)
void yaz_add_srw_diagnostic(ODR o, Z_SRW_diagnostic **d, int *num, int code, const char *addinfo)
Z_SRW_PDU * yaz_srw_get_core_v_2_0(ODR o)
Z_SRW_extra_record * yaz_srw_get_extra_record(ODR o)
Z_SRW_record * yaz_srw_get_records(ODR o, int n)
Z_SRW_PDU * yaz_srw_get(ODR o, int which)
union Z_SOAP::@376262347373245141365154145051227323112037301017 u
Z_SRW_explainRequest * explain_request
union Z_SRW_PDU::@153265143164032275136020372035363167301151223027 u
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::@240121103265220276224106134266143351075177324020 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.