2 * Copyright (C) 1995-2006, Index Data ApS
3 * See the file LICENSE for details.
5 * $Id: srwutil.c,v 1.51 2006-10-05 15:19:33 adam Exp $
9 * \brief Implements SRW/SRU utilities.
14 #include <yaz/yaz-iconv.h>
16 static int hex_digit (int ch)
18 if (ch >= '0' && ch <= '9')
20 else if (ch >= 'a' && ch <= 'f')
22 else if (ch >= 'A' && ch <= 'F')
27 void encode_uri_char(char *dst, char ch)
31 else if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') ||
32 (ch >= '0' && ch <= '9'))
40 sprintf(dst+1, "%02X", (unsigned char ) ch);
44 static void yaz_array_to_uri_ex(char **path, ODR o, char **name, char **value,
45 const char *extra_args)
47 size_t i, szp = 0, sz = extra_args ? 1+strlen(extra_args) : 1;
48 for(i = 0; name[i]; i++)
49 sz += strlen(name[i]) + 3 + strlen(value[i]) * 3;
50 *path = odr_malloc(o, sz);
52 for(i = 0; name[i]; i++)
57 ilen = strlen(name[i]);
58 memcpy(*path+szp, name[i], ilen);
61 for (j = 0; value[i][j]; j++)
65 encode_uri_char(vstr, value[i][j]);
67 memcpy(*path+szp, vstr, vlen);
75 memcpy(*path + szp, extra_args, strlen(extra_args));
76 szp += strlen(extra_args);
81 void yaz_array_to_uri(char **path, ODR o, char **name, char **value)
83 yaz_array_to_uri_ex(path, o, name, value, 0);
86 int yaz_uri_array(const char *path, ODR o, char ***name, char ***val)
96 while ((cp = strchr(cp, '&')))
101 *name = odr_malloc(o, no * sizeof(char*));
102 *val = odr_malloc(o, no * sizeof(char*));
104 for (no = 0; *path; no++)
106 const char *p1 = strchr(path, '=');
112 (*name)[no] = odr_malloc(o, (p1-path)+1);
113 memcpy((*name)[no], path, p1-path);
114 (*name)[no][p1-path] = '\0';
117 p1 = strchr(path, '&');
119 p1 = strlen(path) + path;
120 (*val)[no] = ret = odr_malloc(o, p1 - path + 1);
121 while (*path && *path != '&')
128 else if (*path == '%' && path[1] && path[2])
130 ret[i++] = hex_digit (path[1])*16 + hex_digit (path[2]);
146 char *yaz_uri_val(const char *path, const char *name, ODR o)
148 size_t nlen = strlen(name);
152 while (path && *path)
154 const char *p1 = strchr(path, '=');
157 if ((size_t)(p1 - path) == nlen && !memcmp(path, name, nlen))
163 p1 = strchr(path, '&');
165 p1 = strlen(path) + path;
166 ret = (char *) odr_malloc(o, p1 - path + 1);
167 while (*path && *path != '&')
174 else if (*path == '%' && path[1] && path[2])
176 ret[i++] = hex_digit (path[1])*16 + hex_digit (path[2]);
185 path = strchr(p1, '&');
192 static int yaz_base64decode(const char *in, char *out)
194 const char *map = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
195 "abcdefghijklmnopqrstuvwxyz0123456789+/";
197 int len = strlen(in);
204 if (!(p = strchr(map, in[0])))
208 if (!(p = strchr(map, in[1])))
212 *(out++) = i0 << 2 | i1 >> 4;
216 if (!(p = strchr(map, in[2])))
220 *(out++) = i1 << 4 | i2 >> 2;
224 if (!(p = strchr(map, in[3])))
228 *(out++) = i2 << 6 | i3;
239 * Look for authentication tokens in HTTP Basic parameters or in x-username/x-password
240 * parameters. Added by SH.
242 static void yaz_srw_decodeauth(Z_SRW_PDU *sr, Z_HTTP_Request *hreq,
243 char *username, char *password, ODR decode)
245 const char *basic = z_HTTP_header_lookup(hreq->headers, "Authorization");
248 sr->username = username;
250 sr->password = password;
255 char ubuf[256] = "", pbuf[256] = "", *p;
256 if (strncmp(basic, "Basic ", 6))
260 if (!len || len > 256)
262 olen = yaz_base64decode(basic, out);
263 /* Format of out should be username:password at this point */
265 if ((p = strchr(ubuf, ':'))) {
271 sr->username = odr_strdup(decode, ubuf);
273 sr->password = odr_strdup(decode, pbuf);
277 void yaz_uri_val_int(const char *path, const char *name, ODR o, int **intp)
279 const char *v = yaz_uri_val(path, name, o);
281 *intp = odr_intdup(o, atoi(v));
284 void yaz_mk_srw_diagnostic(ODR o, Z_SRW_diagnostic *d,
285 const char *uri, const char *message,
288 d->uri = odr_strdup(o, uri);
290 d->message = odr_strdup(o, message);
294 d->details = odr_strdup(o, details);
299 void yaz_mk_std_diagnostic(ODR o, Z_SRW_diagnostic *d,
300 int code, const char *details)
304 sprintf(uri, "info:srw/diagnostic/1/%d", code);
305 yaz_mk_srw_diagnostic(o, d, uri, 0, details);
308 void yaz_add_srw_diagnostic_uri(ODR o, Z_SRW_diagnostic **d,
309 int *num, const char *uri,
310 const char *message, const char *details)
312 Z_SRW_diagnostic *d_new;
313 d_new = (Z_SRW_diagnostic *) odr_malloc (o, (*num + 1)* sizeof(**d));
315 memcpy (d_new, *d, *num *sizeof(**d));
318 yaz_mk_srw_diagnostic(o, *d + *num, uri, message, details);
322 void yaz_add_srw_diagnostic(ODR o, Z_SRW_diagnostic **d,
323 int *num, int code, const char *addinfo)
327 sprintf(uri, "info:srw/diagnostic/1/%d", code);
328 yaz_add_srw_diagnostic_uri(o, d, num, uri, 0, addinfo);
331 int yaz_srw_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu,
332 Z_SOAP **soap_package, ODR decode, char **charset)
334 if (!strcmp(hreq->method, "POST"))
336 const char *content_type = z_HTTP_header_lookup(hreq->headers,
339 (!yaz_strcmp_del("text/xml", content_type, "; ") ||
340 !yaz_strcmp_del("application/soap+xml", content_type, "; ") ||
341 !yaz_strcmp_del("text/plain", content_type, "; ")))
343 char *db = "Default";
344 const char *p0 = hreq->path, *p1;
346 const char *charset_p = 0;
348 static Z_SOAP_Handler soap_handlers[4] = {
350 {"http://www.loc.gov/zing/srw/", 0,
351 (Z_SOAP_fun) yaz_srw_codec},
352 {"http://www.loc.gov/zing/srw/v1.0/", 0,
353 (Z_SOAP_fun) yaz_srw_codec},
354 {"http://www.loc.gov/zing/srw/update/", 0,
355 (Z_SOAP_fun) yaz_ucp_codec},
362 p1 = strchr(p0, '?');
364 p1 = p0 + strlen(p0);
367 db = (char*) odr_malloc(decode, p1 - p0 + 1);
368 memcpy (db, p0, p1 - p0);
372 if (charset && (charset_p = strstr(content_type, "; charset=")))
376 while (i < 20 && charset_p[i] &&
377 !strchr("; \n\r", charset_p[i]))
379 *charset = (char*) odr_malloc(decode, i+1);
380 memcpy(*charset, charset_p, i);
381 (*charset)[i] = '\0';
383 ret = z_soap_codec(decode, soap_package,
384 &hreq->content_buf, &hreq->content_len,
386 if (ret == 0 && (*soap_package)->which == Z_SOAP_generic)
388 *srw_pdu = (Z_SRW_PDU*) (*soap_package)->u.generic->p;
390 if ((*srw_pdu)->which == Z_SRW_searchRetrieve_request &&
391 (*srw_pdu)->u.request->database == 0)
392 (*srw_pdu)->u.request->database = db;
394 if ((*srw_pdu)->which == Z_SRW_explain_request &&
395 (*srw_pdu)->u.explain_request->database == 0)
396 (*srw_pdu)->u.explain_request->database = db;
398 if ((*srw_pdu)->which == Z_SRW_scan_request &&
399 (*srw_pdu)->u.scan_request->database == 0)
400 (*srw_pdu)->u.scan_request->database = db;
402 if ((*srw_pdu)->which == Z_SRW_update_request &&
403 (*srw_pdu)->u.update_request->database == 0)
404 (*srw_pdu)->u.update_request->database = db;
414 static int yaz_sru_decode_integer(ODR odr, const char *pname,
415 const char *valstr, int **valp,
416 Z_SRW_diagnostic **diag, int *num_diag,
422 if (sscanf(valstr, "%d", &ival) != 1)
424 yaz_add_srw_diagnostic(odr, diag, num_diag,
425 YAZ_SRW_UNSUPP_PARAMETER_VALUE, pname);
428 if (min_value >= 0 && ival < min_value)
430 yaz_add_srw_diagnostic(odr, diag, num_diag,
431 YAZ_SRW_UNSUPP_PARAMETER_VALUE, pname);
434 *valp = odr_intdup(odr, ival);
439 http://www.loc.gov/z3950/agency/zing/srw/service.html
441 int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu,
442 Z_SOAP **soap_package, ODR decode, char **charset,
443 Z_SRW_diagnostic **diag, int *num_diag)
446 static Z_SOAP_Handler soap_handlers[2] = {
447 {"http://www.loc.gov/zing/srw/", 0,
448 (Z_SOAP_fun) yaz_srw_codec},
452 const char *content_type = z_HTTP_header_lookup(hreq->headers,
455 SRU GET: allow any content type.
456 SRU POST: we support "application/x-www-form-urlencoded";
457 not "multipart/form-data" .
459 if (!strcmp(hreq->method, "GET")
461 (!strcmp(hreq->method, "POST")
463 !yaz_strcmp_del("application/x-www-form-urlencoded",
468 char *db = "Default";
469 const char *p0 = hreq->path, *p1;
471 const char *operation = 0;
478 char *stylesheet = 0;
479 char *scanClause = 0;
480 char *pScanClause = 0;
481 char *recordXPath = 0;
482 char *recordSchema = 0;
483 char *recordPacking = "xml"; /* xml packing is default for SRU */
484 char *maximumRecords = 0;
485 char *startRecord = 0;
486 char *maximumTerms = 0;
487 char *responsePosition = 0;
488 char *extraRequestData = 0;
497 p1 = strchr(p0, '?');
499 p1 = p0 + strlen(p0);
502 db = (char*) odr_malloc(decode, p1 - p0 + 1);
503 memcpy (db, p0, p1 - p0);
506 if (!strcmp(hreq->method, "POST"))
507 p1 = hreq->content_buf;
508 yaz_uri_array(p1, decode, &uri_name, &uri_val);
513 for (i = 0; uri_name[i]; i++)
515 char *n = uri_name[i];
516 char *v = uri_val[i];
517 if (!strcmp(n, "query"))
519 else if (!strcmp(n, "x-pquery"))
521 else if (!strcmp(n, "x-username"))
523 else if (!strcmp(n, "x-password"))
525 else if (!strcmp(n, "operation"))
527 else if (!strcmp(n, "stylesheet"))
529 else if (!strcmp(n, "sortKeys"))
531 else if (!strcmp(n, "recordXPath"))
533 else if (!strcmp(n, "recordSchema"))
535 else if (!strcmp(n, "recordPacking"))
537 else if (!strcmp(n, "version"))
539 else if (!strcmp(n, "scanClause"))
541 else if (!strcmp(n, "x-pScanClause"))
543 else if (!strcmp(n, "maximumRecords"))
545 else if (!strcmp(n, "startRecord"))
547 else if (!strcmp(n, "maximumTerms"))
549 else if (!strcmp(n, "responsePosition"))
550 responsePosition = v;
551 else if (!strcmp(n, "extraRequestData"))
552 extraRequestData = v;
554 yaz_add_srw_diagnostic(decode, diag, num_diag,
555 YAZ_SRW_UNSUPP_PARAMETER, n);
561 yaz_add_srw_diagnostic(
562 decode, diag, num_diag,
563 YAZ_SRW_MANDATORY_PARAMETER_NOT_SUPPLIED, "version");
566 if (strcmp(version, "1.1"))
567 yaz_add_srw_diagnostic(decode, diag, num_diag,
568 YAZ_SRW_UNSUPP_VERSION, "1.1");
572 yaz_add_srw_diagnostic(
573 decode, diag, num_diag,
574 YAZ_SRW_MANDATORY_PARAMETER_NOT_SUPPLIED, "operation");
575 operation = "explain";
577 if (!strcmp(operation, "searchRetrieve"))
579 Z_SRW_PDU *sr = yaz_srw_get(decode, Z_SRW_searchRetrieve_request);
581 sr->srw_version = version;
583 yaz_srw_decodeauth(sr, hreq, username, password, decode);
586 sr->u.request->query_type = Z_SRW_query_type_cql;
587 sr->u.request->query.cql = query;
591 sr->u.request->query_type = Z_SRW_query_type_pqf;
592 sr->u.request->query.pqf = pQuery;
595 yaz_add_srw_diagnostic(
596 decode, diag, num_diag,
597 YAZ_SRW_MANDATORY_PARAMETER_NOT_SUPPLIED, "query");
601 sr->u.request->sort_type = Z_SRW_sort_type_sort;
602 sr->u.request->sort.sortKeys = sortKeys;
604 sr->u.request->recordXPath = recordXPath;
605 sr->u.request->recordSchema = recordSchema;
606 sr->u.request->recordPacking = recordPacking;
607 sr->u.request->stylesheet = stylesheet;
609 yaz_sru_decode_integer(decode, "maximumRecords", maximumRecords,
610 &sr->u.request->maximumRecords,
613 yaz_sru_decode_integer(decode, "startRecord", startRecord,
614 &sr->u.request->startRecord,
617 sr->u.request->database = db;
619 (*soap_package) = odr_malloc(decode, sizeof(**soap_package));
620 (*soap_package)->which = Z_SOAP_generic;
622 (*soap_package)->u.generic =
623 odr_malloc(decode, sizeof(*(*soap_package)->u.generic));
625 (*soap_package)->u.generic->p = sr;
626 (*soap_package)->u.generic->ns = soap_handlers[0].ns;
627 (*soap_package)->u.generic->no = 0;
629 (*soap_package)->ns = "SRU";
633 else if (!strcmp(operation, "explain"))
635 /* Transfer SRU explain parameters to common struct */
636 /* http://www.loc.gov/z3950/agency/zing/srw/explain.html */
637 Z_SRW_PDU *sr = yaz_srw_get(decode, Z_SRW_explain_request);
639 sr->srw_version = version;
640 yaz_srw_decodeauth(sr, hreq, username, password, decode);
642 sr->u.explain_request->recordPacking = recordPacking;
643 sr->u.explain_request->database = db;
645 sr->u.explain_request->stylesheet = stylesheet;
647 (*soap_package) = odr_malloc(decode, sizeof(**soap_package));
648 (*soap_package)->which = Z_SOAP_generic;
650 (*soap_package)->u.generic =
651 odr_malloc(decode, sizeof(*(*soap_package)->u.generic));
653 (*soap_package)->u.generic->p = sr;
654 (*soap_package)->u.generic->ns = soap_handlers[0].ns;
655 (*soap_package)->u.generic->no = 0;
657 (*soap_package)->ns = "SRU";
661 else if (!strcmp(operation, "scan"))
663 /* Transfer SRU scan parameters to common struct */
664 /* http://www.loc.gov/z3950/agency/zing/srw/scan.html */
665 Z_SRW_PDU *sr = yaz_srw_get(decode, Z_SRW_scan_request);
667 sr->srw_version = version;
669 yaz_srw_decodeauth(sr, hreq, username, password, decode);
673 sr->u.scan_request->query_type = Z_SRW_query_type_cql;
674 sr->u.scan_request->scanClause.cql = scanClause;
676 else if (pScanClause)
678 sr->u.scan_request->query_type = Z_SRW_query_type_pqf;
679 sr->u.scan_request->scanClause.pqf = pScanClause;
682 yaz_add_srw_diagnostic(
683 decode, diag, num_diag,
684 YAZ_SRW_MANDATORY_PARAMETER_NOT_SUPPLIED, "scanClause");
685 sr->u.scan_request->database = db;
687 yaz_sru_decode_integer(decode, "maximumTerms",
689 &sr->u.scan_request->maximumTerms,
692 yaz_sru_decode_integer(decode, "responsePosition",
694 &sr->u.scan_request->responsePosition,
697 sr->u.scan_request->stylesheet = stylesheet;
699 (*soap_package) = odr_malloc(decode, sizeof(**soap_package));
700 (*soap_package)->which = Z_SOAP_generic;
702 (*soap_package)->u.generic =
703 odr_malloc(decode, sizeof(*(*soap_package)->u.generic));
705 (*soap_package)->u.generic->p = sr;
706 (*soap_package)->u.generic->ns = soap_handlers[0].ns;
707 (*soap_package)->u.generic->no = 0;
709 (*soap_package)->ns = "SRU";
715 /* unsupported operation ... */
716 /* Act as if we received a explain request and throw diagnostic. */
718 Z_SRW_PDU *sr = yaz_srw_get(decode, Z_SRW_explain_request);
720 sr->srw_version = version;
722 sr->u.explain_request->recordPacking = recordPacking;
723 sr->u.explain_request->database = db;
725 sr->u.explain_request->stylesheet = stylesheet;
727 (*soap_package) = odr_malloc(decode, sizeof(**soap_package));
728 (*soap_package)->which = Z_SOAP_generic;
730 (*soap_package)->u.generic =
731 odr_malloc(decode, sizeof(*(*soap_package)->u.generic));
733 (*soap_package)->u.generic->p = sr;
734 (*soap_package)->u.generic->ns = soap_handlers[0].ns;
735 (*soap_package)->u.generic->no = 0;
737 (*soap_package)->ns = "SRU";
739 yaz_add_srw_diagnostic(decode, diag, num_diag,
740 YAZ_SRW_UNSUPP_OPERATION, operation);
749 Z_SRW_extra_record *yaz_srw_get_extra_record(ODR o)
751 Z_SRW_extra_record *res = (Z_SRW_extra_record *)
752 odr_malloc(o, sizeof(*res));
754 res->recordReviewCode = 0;
755 res->recordReviewNote = 0;
757 res->nonDupRecordId = 0;
758 res->recordLockStatus = 0;
759 res->recordOldVersion = 0;
763 Z_SRW_PDU *yaz_srw_get_core_v_1_1(ODR o)
765 Z_SRW_PDU *p = (Z_SRW_PDU *) odr_malloc(o, sizeof(*p));
766 p->srw_version = odr_strdup(o, "1.1");
773 Z_SRW_PDU *yaz_srw_get(ODR o, int which)
775 Z_SRW_PDU *sr = yaz_srw_get_core_v_1_1(o);
779 case Z_SRW_searchRetrieve_request:
780 sr->u.request = (Z_SRW_searchRetrieveRequest *)
781 odr_malloc(o, sizeof(*sr->u.request));
782 sr->u.request->query_type = Z_SRW_query_type_cql;
783 sr->u.request->query.cql = 0;
784 sr->u.request->sort_type = Z_SRW_sort_type_none;
785 sr->u.request->sort.none = 0;
786 sr->u.request->startRecord = 0;
787 sr->u.request->maximumRecords = 0;
788 sr->u.request->recordSchema = 0;
789 sr->u.request->recordPacking = 0;
790 sr->u.request->recordXPath = 0;
791 sr->u.request->database = 0;
792 sr->u.request->resultSetTTL = 0;
793 sr->u.request->stylesheet = 0;
795 case Z_SRW_searchRetrieve_response:
796 sr->u.response = (Z_SRW_searchRetrieveResponse *)
797 odr_malloc(o, sizeof(*sr->u.response));
798 sr->u.response->numberOfRecords = 0;
799 sr->u.response->resultSetId = 0;
800 sr->u.response->resultSetIdleTime = 0;
801 sr->u.response->records = 0;
802 sr->u.response->num_records = 0;
803 sr->u.response->diagnostics = 0;
804 sr->u.response->num_diagnostics = 0;
805 sr->u.response->nextRecordPosition = 0;
806 sr->u.response->extra_records = 0;
808 case Z_SRW_explain_request:
809 sr->u.explain_request = (Z_SRW_explainRequest *)
810 odr_malloc(o, sizeof(*sr->u.explain_request));
811 sr->u.explain_request->recordPacking = 0;
812 sr->u.explain_request->database = 0;
813 sr->u.explain_request->stylesheet = 0;
815 case Z_SRW_explain_response:
816 sr->u.explain_response = (Z_SRW_explainResponse *)
817 odr_malloc(o, sizeof(*sr->u.explain_response));
818 sr->u.explain_response->record.recordData_buf = 0;
819 sr->u.explain_response->record.recordData_len = 0;
820 sr->u.explain_response->record.recordSchema = 0;
821 sr->u.explain_response->record.recordPosition = 0;
822 sr->u.explain_response->record.recordPacking =
823 Z_SRW_recordPacking_string;
824 sr->u.explain_response->diagnostics = 0;
825 sr->u.explain_response->num_diagnostics = 0;
826 sr->u.explain_response->extra_record = 0;
828 case Z_SRW_scan_request:
829 sr->u.scan_request = (Z_SRW_scanRequest *)
830 odr_malloc(o, sizeof(*sr->u.scan_request));
831 sr->u.scan_request->database = 0;
832 sr->u.scan_request->stylesheet = 0;
833 sr->u.scan_request->maximumTerms = 0;
834 sr->u.scan_request->responsePosition = 0;
835 sr->u.scan_request->query_type = Z_SRW_query_type_cql;
836 sr->u.scan_request->scanClause.cql = 0;
838 case Z_SRW_scan_response:
839 sr->u.scan_response = (Z_SRW_scanResponse *)
840 odr_malloc(o, sizeof(*sr->u.scan_response));
841 sr->u.scan_response->terms = 0;
842 sr->u.scan_response->num_terms = 0;
843 sr->u.scan_response->diagnostics = 0;
844 sr->u.scan_response->num_diagnostics = 0;
846 case Z_SRW_update_request:
847 sr->u.update_request = (Z_SRW_updateRequest *)
848 odr_malloc(o, sizeof(*sr->u.update_request));
849 sr->u.update_request->database = 0;
850 sr->u.update_request->stylesheet = 0;
851 sr->u.update_request->record.recordSchema = 0;
852 sr->u.update_request->record.recordPacking = Z_SRW_recordPacking_XML;
853 sr->u.update_request->recordId = 0;
854 sr->u.update_request->recordVersion = 0;
855 sr->u.update_request->recordOldVersion = 0;
856 sr->u.update_request->record.recordData_buf = 0;
857 sr->u.update_request->record.recordData_len = 0;
858 sr->u.update_request->extra_record = 0;
859 sr->u.update_request->extraRequestData = 0;
860 sr->u.request->database = 0;
862 case Z_SRW_update_response:
863 sr->u.update_response = (Z_SRW_updateResponse *)
864 odr_malloc(o, sizeof(*sr->u.update_response));
865 sr->u.update_response->operationStatus = 0;
866 sr->u.update_response->recordId = 0;
867 sr->u.update_response->recordVersion = 0;
868 sr->u.update_response->recordChecksum = 0;
869 sr->u.update_response->record.recordData_buf = 0;
870 sr->u.update_response->record.recordData_len = 0;
871 sr->u.update_response->record.recordSchema = 0;
872 sr->u.update_response->record.recordPacking =
873 Z_SRW_recordPacking_XML;
874 sr->u.update_response->extra_record = 0;
875 sr->u.update_response->extraResponseData = 0;
876 sr->u.update_response->diagnostics = 0;
877 sr->u.update_response->num_diagnostics = 0;
883 static int srw_bib1_map[] = {
893 108, 10, /* Malformed query : Syntax error */
923 100, 1, /* bad map */
971 205, 1, /* bad map */
972 206, 1, /* bad map */
974 208, 1, /* bad map */
985 218, 1, /* bad map */
986 219, 1, /* bad map */
987 220, 1, /* bad map */
988 221, 1, /* bad map */
990 223, 1, /* bad map */
991 224, 1, /* bad map */
992 225, 1, /* bad map */
993 226, 1, /* bad map */
995 228, 1, /* bad map */
1000 233, 1, /* bad map */
1001 234, 1, /* bad map */
1007 240, 1, /* bad map */
1008 241, 1, /* bad map */
1010 243, 1, /* bad map */
1015 1001, 1, /* bad map */
1016 1002, 1, /* bad map */
1017 1003, 1, /* bad map */
1018 1004, 1, /* bad map */
1019 1005, 1, /* bad map */
1020 1006, 1, /* bad map */
1052 int yaz_diag_bib1_to_srw (int code)
1054 const int *p = srw_bib1_map;
1064 int yaz_diag_srw_to_bib1(int code)
1066 const int *p = srw_bib1_map;
1076 static void add_val_int(ODR o, char **name, char **value, int *i,
1077 char *a_name, int *val)
1082 value[*i] = odr_malloc(o, 30);
1083 sprintf(value[*i], "%d", *val);
1088 static void add_val_str(ODR o, char **name, char **value, int *i,
1089 char *a_name, char *val)
1099 static int yaz_get_sru_parms(const Z_SRW_PDU *srw_pdu, ODR encode,
1100 char **name, char **value)
1103 add_val_str(encode, name, value, &i, "version", srw_pdu->srw_version);
1104 name[i] = "operation";
1105 switch(srw_pdu->which)
1107 case Z_SRW_searchRetrieve_request:
1108 value[i++] = "searchRetrieve";
1109 switch(srw_pdu->u.request->query_type)
1111 case Z_SRW_query_type_cql:
1112 add_val_str(encode, name, value, &i, "query",
1113 srw_pdu->u.request->query.cql);
1115 case Z_SRW_query_type_pqf:
1116 add_val_str(encode, name, value, &i, "x-pquery",
1117 srw_pdu->u.request->query.pqf);
1119 case Z_SRW_query_type_xcql:
1120 add_val_str(encode, name, value, &i, "x-cql",
1121 srw_pdu->u.request->query.xcql);
1124 switch(srw_pdu->u.request->sort_type)
1126 case Z_SRW_sort_type_none:
1128 case Z_SRW_sort_type_sort:
1129 add_val_str(encode, name, value, &i, "sortKeys",
1130 srw_pdu->u.request->sort.sortKeys);
1133 add_val_int(encode, name, value, &i, "startRecord",
1134 srw_pdu->u.request->startRecord);
1135 add_val_int(encode, name, value, &i, "maximumRecords",
1136 srw_pdu->u.request->maximumRecords);
1137 add_val_str(encode, name, value, &i, "recordSchema",
1138 srw_pdu->u.request->recordSchema);
1139 add_val_str(encode, name, value, &i, "recordPacking",
1140 srw_pdu->u.request->recordPacking);
1141 add_val_str(encode, name, value, &i, "recordXPath",
1142 srw_pdu->u.request->recordXPath);
1143 add_val_str(encode, name, value, &i, "stylesheet",
1144 srw_pdu->u.request->stylesheet);
1145 add_val_int(encode, name, value, &i, "resultSetTTL",
1146 srw_pdu->u.request->resultSetTTL);
1148 case Z_SRW_explain_request:
1149 value[i++] = "explain";
1150 add_val_str(encode, name, value, &i, "stylesheet",
1151 srw_pdu->u.explain_request->stylesheet);
1153 case Z_SRW_scan_request:
1154 value[i++] = "scan";
1156 switch(srw_pdu->u.scan_request->query_type)
1158 case Z_SRW_query_type_cql:
1159 add_val_str(encode, name, value, &i, "scanClause",
1160 srw_pdu->u.scan_request->scanClause.cql);
1162 case Z_SRW_query_type_pqf:
1163 add_val_str(encode, name, value, &i, "x-pScanClause",
1164 srw_pdu->u.scan_request->scanClause.pqf);
1166 case Z_SRW_query_type_xcql:
1167 add_val_str(encode, name, value, &i, "x-cqlScanClause",
1168 srw_pdu->u.scan_request->scanClause.xcql);
1171 add_val_int(encode, name, value, &i, "responsePosition",
1172 srw_pdu->u.scan_request->responsePosition);
1173 add_val_int(encode, name, value, &i, "maximumTerms",
1174 srw_pdu->u.scan_request->maximumTerms);
1175 add_val_str(encode, name, value, &i, "stylesheet",
1176 srw_pdu->u.scan_request->stylesheet);
1178 case Z_SRW_update_request:
1179 value[i++] = "update";
1188 int yaz_sru_get_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu,
1189 ODR encode, const char *charset)
1191 char *name[30], *value[30]; /* definite upper limit for SRU params */
1195 if (yaz_get_sru_parms(srw_pdu, encode, name, value))
1197 yaz_array_to_uri_ex(&uri_args, encode, name, value, srw_pdu->extra_args);
1199 hreq->method = "GET";
1201 path = odr_malloc(encode, strlen(hreq->path) + strlen(uri_args) + 4
1202 +(srw_pdu->extra_args ? strlen(srw_pdu->extra_args) : 0)
1204 sprintf(path, "%s?%s", hreq->path, uri_args);
1207 z_HTTP_header_add_content_type(encode, &hreq->headers,
1208 "text/xml", charset);
1212 int yaz_sru_post_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu,
1213 ODR encode, const char *charset)
1215 char *name[30], *value[30]; /* definite upper limit for SRU params */
1218 if (yaz_get_sru_parms(srw_pdu, encode, name, value))
1221 yaz_array_to_uri_ex(&uri_args, encode, name, value, srw_pdu->extra_args);
1223 hreq->method = "POST";
1225 hreq->content_buf = uri_args;
1226 hreq->content_len = strlen(uri_args);
1228 z_HTTP_header_add_content_type(encode, &hreq->headers,
1229 "application/x-www-form-urlencoded",
1234 int yaz_sru_soap_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu,
1235 ODR odr, const char *charset)
1237 Z_SOAP_Handler handlers[2] = {
1239 {"http://www.loc.gov/zing/srw/", 0, (Z_SOAP_fun) yaz_srw_codec},
1243 Z_SOAP *p = (Z_SOAP*) odr_malloc(odr, sizeof(*p));
1244 z_HTTP_header_add_content_type(odr,
1246 "text/xml", charset);
1248 z_HTTP_header_add(odr, &hreq->headers,
1249 "SOAPAction", "\"\"");
1250 p->which = Z_SOAP_generic;
1251 p->u.generic = (Z_SOAP_Generic *) odr_malloc(odr, sizeof(*p->u.generic));
1252 p->u.generic->no = 0;
1253 p->u.generic->ns = 0;
1254 p->u.generic->p = srw_pdu;
1255 p->ns = "http://schemas.xmlsoap.org/soap/envelope/";
1257 return z_soap_codec_enc(odr, &p,
1259 &hreq->content_len, handlers,
1266 * indent-tabs-mode: nil
1268 * vim: shiftwidth=4 tabstop=8 expandtab