2 * Copyright (C) 1995-2006, Index Data ApS
3 * See the file LICENSE for details.
5 * $Id: srwutil.c,v 1.48 2006-09-06 13:15:49 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 return 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_integer_decode(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 *valp = odr_intdup(odr, ival);
432 http://www.loc.gov/z3950/agency/zing/srw/service.html
434 int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu,
435 Z_SOAP **soap_package, ODR decode, char **charset,
436 Z_SRW_diagnostic **diag, int *num_diag)
439 static Z_SOAP_Handler soap_handlers[2] = {
440 {"http://www.loc.gov/zing/srw/", 0,
441 (Z_SOAP_fun) yaz_srw_codec},
445 const char *content_type = z_HTTP_header_lookup(hreq->headers,
448 SRU GET: allow any content type.
449 SRU POST: we support "application/x-www-form-urlencoded";
450 not "multipart/form-data" .
452 if (!strcmp(hreq->method, "GET")
454 (!strcmp(hreq->method, "POST")
456 !yaz_strcmp_del("application/x-www-form-urlencoded",
461 char *db = "Default";
462 const char *p0 = hreq->path, *p1;
464 const char *operation = 0;
470 char *stylesheet = 0;
471 char *scanClause = 0;
472 char *recordXPath = 0;
473 char *recordSchema = 0;
474 char *recordPacking = "xml"; /* xml packing is default for SRU */
475 char *maximumRecords = 0;
476 char *startRecord = 0;
477 char *maximumTerms = 0;
478 char *responsePosition = 0;
479 char *extraRequestData = 0;
483 int querytype = Z_SRW_query_type_cql;
489 p1 = strchr(p0, '?');
491 p1 = p0 + strlen(p0);
494 db = (char*) odr_malloc(decode, p1 - p0 + 1);
495 memcpy (db, p0, p1 - p0);
498 if (!strcmp(hreq->method, "POST"))
499 p1 = hreq->content_buf;
500 yaz_uri_array(p1, decode, &uri_name, &uri_val);
505 for (i = 0; uri_name[i]; i++)
507 char *n = uri_name[i];
508 char *v = uri_val[i];
509 if (!strcmp(n, "query"))
511 else if (!strcmp(n, "x-pquery")) /* deprecated */
514 querytype = Z_SRW_query_type_pqf;
516 else if (!strcmp(n, "x-querytype"))
518 if (!strcmp(v, "cql"))
519 querytype = Z_SRW_query_type_cql;
520 else if (!strcmp(v, "pqf"))
521 querytype = Z_SRW_query_type_pqf;
524 yaz_add_srw_diagnostic(
525 decode, diag, num_diag,
526 YAZ_SRW_UNSUPP_PARAMETER_VALUE, v);
529 else if (!strcmp(n, "x-username"))
531 else if (!strcmp(n, "x-password"))
533 else if (!strcmp(n, "operation"))
535 else if (!strcmp(n, "stylesheet"))
537 else if (!strcmp(n, "sortKeys"))
539 else if (!strcmp(n, "recordXPath"))
541 else if (!strcmp(n, "recordSchema"))
543 else if (!strcmp(n, "recordPacking"))
545 else if (!strcmp(n, "version"))
547 else if (!strcmp(n, "scanClause"))
549 else if (!strcmp(n, "x-pScanClause"))
551 querytype = Z_SRW_query_type_pqf;
554 else if (!strcmp(n, "maximumRecords"))
556 else if (!strcmp(n, "startRecord"))
558 else if (!strcmp(n, "maximumTerms"))
560 else if (!strcmp(n, "responsePosition"))
561 responsePosition = v;
562 else if (!strcmp(n, "extraRequestData"))
563 extraRequestData = v;
565 yaz_add_srw_diagnostic(decode, diag, num_diag,
566 YAZ_SRW_UNSUPP_PARAMETER, n);
572 yaz_add_srw_diagnostic(
573 decode, diag, num_diag,
574 YAZ_SRW_MANDATORY_PARAMETER_NOT_SUPPLIED, "version");
577 if (strcmp(version, "1.1"))
578 yaz_add_srw_diagnostic(decode, diag, num_diag,
579 YAZ_SRW_UNSUPP_VERSION, "1.1");
583 yaz_add_srw_diagnostic(
584 decode, diag, num_diag,
585 YAZ_SRW_MANDATORY_PARAMETER_NOT_SUPPLIED, "operation");
586 operation = "explain";
588 if (!strcmp(operation, "searchRetrieve"))
590 Z_SRW_PDU *sr = yaz_srw_get(decode, Z_SRW_searchRetrieve_request);
592 sr->srw_version = version;
594 yaz_srw_decodeauth(sr, hreq, username, password, decode);
597 sr->u.request->query_type = querytype;
598 sr->u.request->query.cql = query;
601 yaz_add_srw_diagnostic(
602 decode, diag, num_diag,
603 YAZ_SRW_MANDATORY_PARAMETER_NOT_SUPPLIED, "query");
607 sr->u.request->sort_type = Z_SRW_sort_type_sort;
608 sr->u.request->sort.sortKeys = sortKeys;
610 sr->u.request->recordXPath = recordXPath;
611 sr->u.request->recordSchema = recordSchema;
612 sr->u.request->recordPacking = recordPacking;
613 sr->u.request->stylesheet = stylesheet;
615 yaz_sru_integer_decode(decode, "maximumRecords", maximumRecords,
616 &sr->u.request->maximumRecords,
619 yaz_sru_integer_decode(decode, "startRecord", startRecord,
620 &sr->u.request->startRecord,
623 sr->u.request->database = db;
625 (*soap_package) = odr_malloc(decode, sizeof(**soap_package));
626 (*soap_package)->which = Z_SOAP_generic;
628 (*soap_package)->u.generic =
629 odr_malloc(decode, sizeof(*(*soap_package)->u.generic));
631 (*soap_package)->u.generic->p = sr;
632 (*soap_package)->u.generic->ns = soap_handlers[0].ns;
633 (*soap_package)->u.generic->no = 0;
635 (*soap_package)->ns = "SRU";
639 else if (!strcmp(operation, "explain"))
641 /* Transfer SRU explain parameters to common struct */
642 /* http://www.loc.gov/z3950/agency/zing/srw/explain.html */
643 Z_SRW_PDU *sr = yaz_srw_get(decode, Z_SRW_explain_request);
645 sr->srw_version = version;
646 yaz_srw_decodeauth(sr, hreq, username, password, decode);
648 sr->u.explain_request->recordPacking = recordPacking;
649 sr->u.explain_request->database = db;
651 sr->u.explain_request->stylesheet = stylesheet;
653 (*soap_package) = odr_malloc(decode, sizeof(**soap_package));
654 (*soap_package)->which = Z_SOAP_generic;
656 (*soap_package)->u.generic =
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";
667 else if (!strcmp(operation, "scan"))
669 /* Transfer SRU scan parameters to common struct */
670 /* http://www.loc.gov/z3950/agency/zing/srw/scan.html */
671 Z_SRW_PDU *sr = yaz_srw_get(decode, Z_SRW_scan_request);
673 sr->srw_version = version;
675 yaz_srw_decodeauth(sr, hreq, username, password, decode);
679 sr->u.scan_request->query_type = querytype;
680 sr->u.scan_request->scanClause.cql = scanClause;
683 yaz_add_srw_diagnostic(
684 decode, diag, num_diag,
685 YAZ_SRW_MANDATORY_PARAMETER_NOT_SUPPLIED, "scanClause");
686 sr->u.scan_request->database = db;
688 yaz_sru_integer_decode(decode, "maximumTerms",
690 &sr->u.scan_request->maximumTerms,
693 yaz_sru_integer_decode(decode, "responsePosition",
695 &sr->u.scan_request->responsePosition,
698 sr->u.scan_request->stylesheet = stylesheet;
700 (*soap_package) = odr_malloc(decode, sizeof(**soap_package));
701 (*soap_package)->which = Z_SOAP_generic;
703 (*soap_package)->u.generic =
704 odr_malloc(decode, sizeof(*(*soap_package)->u.generic));
706 (*soap_package)->u.generic->p = sr;
707 (*soap_package)->u.generic->ns = soap_handlers[0].ns;
708 (*soap_package)->u.generic->no = 0;
710 (*soap_package)->ns = "SRU";
716 /* unsupported operation ... */
717 /* Act as if we received a explain request and throw diagnostic. */
719 Z_SRW_PDU *sr = yaz_srw_get(decode, Z_SRW_explain_request);
721 sr->srw_version = version;
723 sr->u.explain_request->recordPacking = recordPacking;
724 sr->u.explain_request->database = db;
726 sr->u.explain_request->stylesheet = stylesheet;
728 (*soap_package) = odr_malloc(decode, sizeof(**soap_package));
729 (*soap_package)->which = Z_SOAP_generic;
731 (*soap_package)->u.generic =
732 odr_malloc(decode, sizeof(*(*soap_package)->u.generic));
734 (*soap_package)->u.generic->p = sr;
735 (*soap_package)->u.generic->ns = soap_handlers[0].ns;
736 (*soap_package)->u.generic->no = 0;
738 (*soap_package)->ns = "SRU";
740 yaz_add_srw_diagnostic(decode, diag, num_diag,
741 YAZ_SRW_UNSUPP_OPERATION, operation);
750 Z_SRW_extra_record *yaz_srw_get_extra_record(ODR o)
752 Z_SRW_extra_record *res = (Z_SRW_extra_record *)
753 odr_malloc(o, sizeof(*res));
755 res->recordReviewCode = 0;
756 res->recordReviewNote = 0;
758 res->nonDupRecordId = 0;
759 res->recordLockStatus = 0;
760 res->recordOldVersion = 0;
764 Z_SRW_PDU *yaz_srw_get_core_v_1_1(ODR o)
766 Z_SRW_PDU *p = (Z_SRW_PDU *) odr_malloc(o, sizeof(*p));
767 p->srw_version = odr_strdup(o, "1.1");
774 Z_SRW_PDU *yaz_srw_get(ODR o, int which)
776 Z_SRW_PDU *sr = yaz_srw_get_core_v_1_1(o);
780 case Z_SRW_searchRetrieve_request:
781 sr->u.request = (Z_SRW_searchRetrieveRequest *)
782 odr_malloc(o, sizeof(*sr->u.request));
783 sr->u.request->query_type = Z_SRW_query_type_cql;
784 sr->u.request->query.cql = 0;
785 sr->u.request->sort_type = Z_SRW_sort_type_none;
786 sr->u.request->sort.none = 0;
787 sr->u.request->startRecord = 0;
788 sr->u.request->maximumRecords = 0;
789 sr->u.request->recordSchema = 0;
790 sr->u.request->recordPacking = 0;
791 sr->u.request->recordXPath = 0;
792 sr->u.request->database = 0;
793 sr->u.request->resultSetTTL = 0;
794 sr->u.request->stylesheet = 0;
796 case Z_SRW_searchRetrieve_response:
797 sr->u.response = (Z_SRW_searchRetrieveResponse *)
798 odr_malloc(o, sizeof(*sr->u.response));
799 sr->u.response->numberOfRecords = 0;
800 sr->u.response->resultSetId = 0;
801 sr->u.response->resultSetIdleTime = 0;
802 sr->u.response->records = 0;
803 sr->u.response->num_records = 0;
804 sr->u.response->diagnostics = 0;
805 sr->u.response->num_diagnostics = 0;
806 sr->u.response->nextRecordPosition = 0;
807 sr->u.response->extra_records = 0;
809 case Z_SRW_explain_request:
810 sr->u.explain_request = (Z_SRW_explainRequest *)
811 odr_malloc(o, sizeof(*sr->u.explain_request));
812 sr->u.explain_request->recordPacking = 0;
813 sr->u.explain_request->database = 0;
814 sr->u.explain_request->stylesheet = 0;
816 case Z_SRW_explain_response:
817 sr->u.explain_response = (Z_SRW_explainResponse *)
818 odr_malloc(o, sizeof(*sr->u.explain_response));
819 sr->u.explain_response->record.recordData_buf = 0;
820 sr->u.explain_response->record.recordData_len = 0;
821 sr->u.explain_response->record.recordSchema = 0;
822 sr->u.explain_response->record.recordPosition = 0;
823 sr->u.explain_response->record.recordPacking =
824 Z_SRW_recordPacking_string;
825 sr->u.explain_response->diagnostics = 0;
826 sr->u.explain_response->num_diagnostics = 0;
827 sr->u.explain_response->extra_record = 0;
829 case Z_SRW_scan_request:
830 sr->u.scan_request = (Z_SRW_scanRequest *)
831 odr_malloc(o, sizeof(*sr->u.scan_request));
832 sr->u.scan_request->database = 0;
833 sr->u.scan_request->stylesheet = 0;
834 sr->u.scan_request->maximumTerms = 0;
835 sr->u.scan_request->responsePosition = 0;
836 sr->u.scan_request->query_type = Z_SRW_query_type_cql;
837 sr->u.scan_request->scanClause.cql = 0;
839 case Z_SRW_scan_response:
840 sr->u.scan_response = (Z_SRW_scanResponse *)
841 odr_malloc(o, sizeof(*sr->u.scan_response));
842 sr->u.scan_response->terms = 0;
843 sr->u.scan_response->num_terms = 0;
844 sr->u.scan_response->diagnostics = 0;
845 sr->u.scan_response->num_diagnostics = 0;
847 case Z_SRW_update_request:
848 sr->u.update_request = (Z_SRW_updateRequest *)
849 odr_malloc(o, sizeof(*sr->u.update_request));
850 sr->u.update_request->database = 0;
851 sr->u.update_request->stylesheet = 0;
852 sr->u.update_request->record.recordSchema = 0;
853 sr->u.update_request->record.recordPacking = Z_SRW_recordPacking_XML;
854 sr->u.update_request->recordId = 0;
855 sr->u.update_request->recordVersion = 0;
856 sr->u.update_request->recordOldVersion = 0;
857 sr->u.update_request->record.recordData_buf = 0;
858 sr->u.update_request->record.recordData_len = 0;
859 sr->u.update_request->extra_record = 0;
860 sr->u.update_request->extraRequestData = 0;
861 sr->u.request->database = 0;
863 case Z_SRW_update_response:
864 sr->u.update_response = (Z_SRW_updateResponse *)
865 odr_malloc(o, sizeof(*sr->u.update_response));
866 sr->u.update_response->operationStatus = 0;
867 sr->u.update_response->recordId = 0;
868 sr->u.update_response->recordVersion = 0;
869 sr->u.update_response->recordChecksum = 0;
870 sr->u.update_response->record.recordData_buf = 0;
871 sr->u.update_response->record.recordData_len = 0;
872 sr->u.update_response->record.recordSchema = 0;
873 sr->u.update_response->record.recordPacking =
874 Z_SRW_recordPacking_XML;
875 sr->u.update_response->extra_record = 0;
876 sr->u.update_response->extraResponseData = 0;
877 sr->u.update_response->diagnostics = 0;
878 sr->u.update_response->num_diagnostics = 0;
884 static int srw_bib1_map[] = {
894 108, 10, /* Malformed query : Syntax error */
924 100, 1, /* bad map */
972 205, 1, /* bad map */
973 206, 1, /* bad map */
975 208, 1, /* bad map */
986 218, 1, /* bad map */
987 219, 1, /* bad map */
988 220, 1, /* bad map */
989 221, 1, /* bad map */
991 223, 1, /* bad map */
992 224, 1, /* bad map */
993 225, 1, /* bad map */
994 226, 1, /* bad map */
996 228, 1, /* bad map */
1001 233, 1, /* bad map */
1002 234, 1, /* bad map */
1008 240, 1, /* bad map */
1009 241, 1, /* bad map */
1011 243, 1, /* bad map */
1016 1001, 1, /* bad map */
1017 1002, 1, /* bad map */
1018 1003, 1, /* bad map */
1019 1004, 1, /* bad map */
1020 1005, 1, /* bad map */
1021 1006, 1, /* bad map */
1053 int yaz_diag_bib1_to_srw (int code)
1055 const int *p = srw_bib1_map;
1065 int yaz_diag_srw_to_bib1(int code)
1067 const int *p = srw_bib1_map;
1077 static void add_val_int(ODR o, char **name, char **value, int *i,
1078 char *a_name, int *val)
1083 value[*i] = odr_malloc(o, 30);
1084 sprintf(value[*i], "%d", *val);
1089 static void add_val_str(ODR o, char **name, char **value, int *i,
1090 char *a_name, char *val)
1100 static int yaz_get_sru_parms(const Z_SRW_PDU *srw_pdu, ODR encode,
1101 char **name, char **value)
1104 add_val_str(encode, name, value, &i, "version", srw_pdu->srw_version);
1105 name[i] = "operation";
1106 switch(srw_pdu->which)
1108 case Z_SRW_searchRetrieve_request:
1109 value[i++] = "searchRetrieve";
1110 switch(srw_pdu->u.request->query_type)
1112 case Z_SRW_query_type_cql:
1113 add_val_str(encode, name, value, &i, "query",
1114 srw_pdu->u.request->query.cql);
1116 case Z_SRW_query_type_pqf:
1117 add_val_str(encode, name, value, &i, "query",
1118 srw_pdu->u.request->query.pqf);
1119 add_val_str(encode, name, value, &i, "x-querytype", "pqf");
1121 case Z_SRW_query_type_xcql:
1122 add_val_str(encode, name, value, &i, "query",
1123 srw_pdu->u.request->query.xcql);
1124 add_val_str(encode, name, value, &i, "x-querytype", "xcql");
1127 switch(srw_pdu->u.request->sort_type)
1129 case Z_SRW_sort_type_none:
1131 case Z_SRW_sort_type_sort:
1132 add_val_str(encode, name, value, &i, "sortKeys",
1133 srw_pdu->u.request->sort.sortKeys);
1136 add_val_int(encode, name, value, &i, "startRecord",
1137 srw_pdu->u.request->startRecord);
1138 add_val_int(encode, name, value, &i, "maximumRecords",
1139 srw_pdu->u.request->maximumRecords);
1140 add_val_str(encode, name, value, &i, "recordSchema",
1141 srw_pdu->u.request->recordSchema);
1142 add_val_str(encode, name, value, &i, "recordPacking",
1143 srw_pdu->u.request->recordPacking);
1144 add_val_str(encode, name, value, &i, "recordXPath",
1145 srw_pdu->u.request->recordXPath);
1146 add_val_str(encode, name, value, &i, "stylesheet",
1147 srw_pdu->u.request->stylesheet);
1148 add_val_int(encode, name, value, &i, "resultSetTTL",
1149 srw_pdu->u.request->resultSetTTL);
1151 case Z_SRW_explain_request:
1152 value[i++] = "explain";
1153 add_val_str(encode, name, value, &i, "stylesheet",
1154 srw_pdu->u.explain_request->stylesheet);
1156 case Z_SRW_scan_request:
1157 value[i++] = "scan";
1159 switch(srw_pdu->u.scan_request->query_type)
1161 case Z_SRW_query_type_cql:
1162 add_val_str(encode, name, value, &i, "scanClause",
1163 srw_pdu->u.scan_request->scanClause.cql);
1165 case Z_SRW_query_type_pqf:
1166 add_val_str(encode, name, value, &i, "scanClause",
1167 srw_pdu->u.scan_request->scanClause.pqf);
1168 add_val_str(encode, name, value, &i, "x-querytype", "pqf");
1170 case Z_SRW_query_type_xcql:
1171 add_val_str(encode, name, value, &i, "scanClause",
1172 srw_pdu->u.scan_request->scanClause.xcql);
1173 add_val_str(encode, name, value, &i, "x-querytype", "xcql");
1176 add_val_int(encode, name, value, &i, "responsePosition",
1177 srw_pdu->u.scan_request->responsePosition);
1178 add_val_int(encode, name, value, &i, "maximumTerms",
1179 srw_pdu->u.scan_request->maximumTerms);
1180 add_val_str(encode, name, value, &i, "stylesheet",
1181 srw_pdu->u.scan_request->stylesheet);
1183 case Z_SRW_update_request:
1184 value[i++] = "update";
1193 int yaz_sru_get_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu,
1194 ODR encode, const char *charset)
1196 char *name[30], *value[30]; /* definite upper limit for SRU params */
1200 if (yaz_get_sru_parms(srw_pdu, encode, name, value))
1202 yaz_array_to_uri_ex(&uri_args, encode, name, value, srw_pdu->extra_args);
1204 hreq->method = "GET";
1206 path = odr_malloc(encode, strlen(hreq->path) + strlen(uri_args) + 4
1207 +(srw_pdu->extra_args ? strlen(srw_pdu->extra_args) : 0)
1209 sprintf(path, "%s?%s", hreq->path, uri_args);
1212 z_HTTP_header_add_content_type(encode, &hreq->headers,
1213 "text/xml", charset);
1217 int yaz_sru_post_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu,
1218 ODR encode, const char *charset)
1220 char *name[30], *value[30]; /* definite upper limit for SRU params */
1223 if (yaz_get_sru_parms(srw_pdu, encode, name, value))
1226 yaz_array_to_uri_ex(&uri_args, encode, name, value, srw_pdu->extra_args);
1228 hreq->method = "POST";
1230 hreq->content_buf = uri_args;
1231 hreq->content_len = strlen(uri_args);
1233 z_HTTP_header_add_content_type(encode, &hreq->headers,
1234 "application/x-www-form-urlencoded",
1239 int yaz_sru_soap_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu,
1240 ODR odr, const char *charset)
1242 Z_SOAP_Handler handlers[2] = {
1244 {"http://www.loc.gov/zing/srw/", 0, (Z_SOAP_fun) yaz_srw_codec},
1248 Z_SOAP *p = (Z_SOAP*) odr_malloc(odr, sizeof(*p));
1249 z_HTTP_header_add_content_type(odr,
1251 "text/xml", charset);
1253 z_HTTP_header_add(odr, &hreq->headers,
1254 "SOAPAction", "\"\"");
1255 p->which = Z_SOAP_generic;
1256 p->u.generic = (Z_SOAP_Generic *) odr_malloc(odr, sizeof(*p->u.generic));
1257 p->u.generic->no = 0;
1258 p->u.generic->ns = 0;
1259 p->u.generic->p = srw_pdu;
1260 p->ns = "http://schemas.xmlsoap.org/soap/envelope/";
1262 return z_soap_codec_enc(odr, &p,
1264 &hreq->content_len, handlers,
1271 * indent-tabs-mode: nil
1273 * vim: shiftwidth=4 tabstop=8 expandtab