2 * Copyright (C) 1995-2005, Index Data ApS
3 * See the file LICENSE for details.
5 * $Id: srwutil.c,v 1.36 2006-03-01 23:24:25 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 void yaz_array_to_uri(char **path, ODR o, char **name, char **value)
46 size_t i, szp = 0, sz = 0;
47 for(i = 0; name[i]; i++)
48 sz += strlen(name[i]) + 3 + strlen(value[i]) * 3;
49 *path = odr_malloc(o, sz);
51 for(i = 0; name[i]; i++)
56 ilen = strlen(name[i]);
57 memcpy(*path+szp, name[i], ilen);
60 for (j = 0; value[i][j]; j++)
64 encode_uri_char(vstr, value[i][j]);
66 memcpy(*path+szp, vstr, vlen);
73 int yaz_uri_array(const char *path, ODR o, char ***name, char ***val)
83 while ((cp = strchr(cp, '&')))
88 *name = odr_malloc(o, no * sizeof(char*));
89 *val = odr_malloc(o, no * sizeof(char*));
91 for (no = 0; *path; no++)
93 const char *p1 = strchr(path, '=');
99 (*name)[no] = odr_malloc(o, (p1-path)+1);
100 memcpy((*name)[no], path, p1-path);
101 (*name)[no][p1-path] = '\0';
104 p1 = strchr(path, '&');
106 p1 = strlen(path) + path;
107 (*val)[no] = ret = odr_malloc(o, p1 - path + 1);
108 while (*path && *path != '&')
115 else if (*path == '%' && path[1] && path[2])
117 ret[i++] = hex_digit (path[1])*16 + hex_digit (path[2]);
133 char *yaz_uri_val(const char *path, const char *name, ODR o)
135 size_t nlen = strlen(name);
139 while (path && *path)
141 const char *p1 = strchr(path, '=');
144 if ((size_t)(p1 - path) == nlen && !memcmp(path, name, nlen))
150 p1 = strchr(path, '&');
152 p1 = strlen(path) + path;
153 ret = (char *) odr_malloc(o, p1 - path + 1);
154 while (*path && *path != '&')
161 else if (*path == '%' && path[1] && path[2])
163 ret[i++] = hex_digit (path[1])*16 + hex_digit (path[2]);
172 path = strchr(p1, '&');
179 void yaz_uri_val_int(const char *path, const char *name, ODR o, int **intp)
181 const char *v = yaz_uri_val(path, name, o);
183 *intp = odr_intdup(o, atoi(v));
186 void yaz_mk_srw_diagnostic(ODR o, Z_SRW_diagnostic *d,
187 const char *uri, const char *message,
190 d->uri = odr_strdup(o, uri);
192 d->message = odr_strdup(o, message);
196 d->details = odr_strdup(o, details);
201 void yaz_mk_std_diagnostic(ODR o, Z_SRW_diagnostic *d,
202 int code, const char *details)
206 sprintf(uri, "info:srw/diagnostic/1/%d", code);
207 yaz_mk_srw_diagnostic(o, d, uri, 0, details);
210 void yaz_add_srw_diagnostic_uri(ODR o, Z_SRW_diagnostic **d,
211 int *num, const char *uri,
212 const char *message, const char *details)
214 Z_SRW_diagnostic *d_new;
215 d_new = (Z_SRW_diagnostic *) odr_malloc (o, (*num + 1)* sizeof(**d));
217 memcpy (d_new, *d, *num *sizeof(**d));
220 yaz_mk_srw_diagnostic(o, *d + *num, uri, message, details);
224 void yaz_add_srw_diagnostic(ODR o, Z_SRW_diagnostic **d,
225 int *num, int code, const char *addinfo)
229 sprintf(uri, "info:srw/diagnostic/1/%d", code);
230 yaz_add_srw_diagnostic_uri(o, d, num, uri, 0, addinfo);
233 int yaz_srw_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu,
234 Z_SOAP **soap_package, ODR decode, char **charset)
236 if (!strcmp(hreq->method, "POST"))
238 const char *content_type = z_HTTP_header_lookup(hreq->headers,
241 (!yaz_strcmp_del("text/xml", content_type, "; ") ||
242 !yaz_strcmp_del("text/plain", content_type, "; ")))
244 char *db = "Default";
245 const char *p0 = hreq->path, *p1;
247 const char *charset_p = 0;
249 static Z_SOAP_Handler soap_handlers[4] = {
251 {"http://www.loc.gov/zing/srw/", 0,
252 (Z_SOAP_fun) yaz_srw_codec},
253 {"http://www.loc.gov/zing/srw/v1.0/", 0,
254 (Z_SOAP_fun) yaz_srw_codec},
255 {"http://www.loc.gov/zing/srw/update/", 0,
256 (Z_SOAP_fun) yaz_ucp_codec},
263 p1 = strchr(p0, '?');
265 p1 = p0 + strlen(p0);
268 db = (char*) odr_malloc(decode, p1 - p0 + 1);
269 memcpy (db, p0, p1 - p0);
273 if (charset && (charset_p = strstr(content_type, "; charset=")))
277 while (i < 20 && charset_p[i] &&
278 !strchr("; \n\r", charset_p[i]))
280 *charset = (char*) odr_malloc(decode, i+1);
281 memcpy(*charset, charset_p, i);
282 (*charset)[i] = '\0';
284 ret = z_soap_codec(decode, soap_package,
285 &hreq->content_buf, &hreq->content_len,
287 if (ret == 0 && (*soap_package)->which == Z_SOAP_generic)
289 *srw_pdu = (Z_SRW_PDU*) (*soap_package)->u.generic->p;
291 if ((*srw_pdu)->which == Z_SRW_searchRetrieve_request &&
292 (*srw_pdu)->u.request->database == 0)
293 (*srw_pdu)->u.request->database = db;
295 if ((*srw_pdu)->which == Z_SRW_explain_request &&
296 (*srw_pdu)->u.explain_request->database == 0)
297 (*srw_pdu)->u.explain_request->database = db;
299 if ((*srw_pdu)->which == Z_SRW_scan_request &&
300 (*srw_pdu)->u.scan_request->database == 0)
301 (*srw_pdu)->u.scan_request->database = db;
303 if ((*srw_pdu)->which == Z_SRW_update_request &&
304 (*srw_pdu)->u.update_request->database == 0)
305 (*srw_pdu)->u.update_request->database = db;
316 http://www.loc.gov/z3950/agency/zing/srw/service.html
318 int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu,
319 Z_SOAP **soap_package, ODR decode, char **charset,
320 Z_SRW_diagnostic **diag, int *num_diag)
323 static Z_SOAP_Handler soap_handlers[2] = {
324 {"http://www.loc.gov/zing/srw/", 0,
325 (Z_SOAP_fun) yaz_srw_codec},
329 const char *content_type = z_HTTP_header_lookup(hreq->headers,
332 SRU GET: allow any content type.
333 SRU POST: we support "application/x-www-form-urlencoded";
334 not "multipart/form-data" .
336 if (!strcmp(hreq->method, "GET")
338 (!strcmp(hreq->method, "POST")
340 !yaz_strcmp_del("application/x-www-form-urlencoded",
345 char *db = "Default";
346 const char *p0 = hreq->path, *p1;
348 const char *operation = 0;
353 char *stylesheet = 0;
354 char *scanClause = 0;
355 char *pScanClause = 0;
356 char *recordXPath = 0;
357 char *recordSchema = 0;
358 char *recordPacking = "xml"; /* xml packing is default for SRU */
359 char *maximumRecords = 0;
360 char *startRecord = 0;
361 char *maximumTerms = 0;
362 char *responsePosition = 0;
363 char *extraRequestData = 0;
372 p1 = strchr(p0, '?');
374 p1 = p0 + strlen(p0);
377 db = (char*) odr_malloc(decode, p1 - p0 + 1);
378 memcpy (db, p0, p1 - p0);
381 if (!strcmp(hreq->method, "POST"))
382 p1 = hreq->content_buf;
383 yaz_uri_array(p1, decode, &uri_name, &uri_val);
388 for (i = 0; uri_name[i]; i++)
390 char *n = uri_name[i];
391 char *v = uri_val[i];
392 if (!strcmp(n, "query"))
394 else if (!strcmp(n, "x-pquery"))
396 else if (!strcmp(n, "operation"))
398 else if (!strcmp(n, "stylesheet"))
400 else if (!strcmp(n, "sortKeys"))
402 else if (!strcmp(n, "recordXPath"))
404 else if (!strcmp(n, "recordSchema"))
406 else if (!strcmp(n, "recordPacking"))
408 else if (!strcmp(n, "version"))
410 else if (!strcmp(n, "scanClause"))
412 else if (!strcmp(n, "x-pScanClause"))
414 else if (!strcmp(n, "maximumRecords"))
416 else if (!strcmp(n, "startRecord"))
418 else if (!strcmp(n, "maximumTerms"))
420 else if (!strcmp(n, "responsePosition"))
421 responsePosition = v;
422 else if (!strcmp(n, "extraRequestData"))
423 extraRequestData = v;
425 yaz_add_srw_diagnostic(decode, diag, num_diag, 8, n);
431 yaz_add_srw_diagnostic(decode, diag, num_diag, 7, "version");
434 if (strcmp(version, "1.1"))
435 yaz_add_srw_diagnostic(decode, diag, num_diag, 5, "1.1");
439 yaz_add_srw_diagnostic(decode, diag, num_diag, 7, "operation");
440 operation = "explain";
442 if (!strcmp(operation, "searchRetrieve"))
444 Z_SRW_PDU *sr = yaz_srw_get(decode, Z_SRW_searchRetrieve_request);
446 sr->srw_version = version;
450 sr->u.request->query_type = Z_SRW_query_type_cql;
451 sr->u.request->query.cql = query;
455 sr->u.request->query_type = Z_SRW_query_type_pqf;
456 sr->u.request->query.pqf = pQuery;
459 yaz_add_srw_diagnostic(decode, diag, num_diag, 7, "query");
463 sr->u.request->sort_type = Z_SRW_sort_type_sort;
464 sr->u.request->sort.sortKeys = sortKeys;
466 sr->u.request->recordXPath = recordXPath;
467 sr->u.request->recordSchema = recordSchema;
468 sr->u.request->recordPacking = recordPacking;
469 sr->u.request->stylesheet = stylesheet;
472 sr->u.request->maximumRecords =
473 odr_intdup(decode, atoi(maximumRecords));
475 sr->u.request->startRecord =
476 odr_intdup(decode, atoi(startRecord));
478 sr->u.request->database = db;
480 (*soap_package) = odr_malloc(decode, sizeof(**soap_package));
481 (*soap_package)->which = Z_SOAP_generic;
483 (*soap_package)->u.generic =
484 odr_malloc(decode, sizeof(*(*soap_package)->u.generic));
486 (*soap_package)->u.generic->p = sr;
487 (*soap_package)->u.generic->ns = soap_handlers[0].ns;
488 (*soap_package)->u.generic->no = 0;
490 (*soap_package)->ns = "SRU";
494 else if (!strcmp(operation, "explain"))
496 /* Transfer SRU explain parameters to common struct */
497 /* http://www.loc.gov/z3950/agency/zing/srw/explain.html */
498 Z_SRW_PDU *sr = yaz_srw_get(decode, Z_SRW_explain_request);
500 sr->srw_version = version;
502 sr->u.explain_request->recordPacking = recordPacking;
503 sr->u.explain_request->database = db;
505 sr->u.explain_request->stylesheet = stylesheet;
507 (*soap_package) = odr_malloc(decode, sizeof(**soap_package));
508 (*soap_package)->which = Z_SOAP_generic;
510 (*soap_package)->u.generic =
511 odr_malloc(decode, sizeof(*(*soap_package)->u.generic));
513 (*soap_package)->u.generic->p = sr;
514 (*soap_package)->u.generic->ns = soap_handlers[0].ns;
515 (*soap_package)->u.generic->no = 0;
517 (*soap_package)->ns = "SRU";
521 else if (!strcmp(operation, "scan"))
523 /* Transfer SRU scan parameters to common struct */
524 /* http://www.loc.gov/z3950/agency/zing/srw/scan.html */
525 Z_SRW_PDU *sr = yaz_srw_get(decode, Z_SRW_scan_request);
527 sr->srw_version = version;
532 sr->u.scan_request->query_type = Z_SRW_query_type_cql;
533 sr->u.scan_request->scanClause.cql = scanClause;
535 else if (pScanClause)
537 sr->u.scan_request->query_type = Z_SRW_query_type_pqf;
538 sr->u.scan_request->scanClause.pqf = pScanClause;
541 yaz_add_srw_diagnostic(decode, diag, num_diag, 7,
543 sr->u.scan_request->database = db;
546 sr->u.scan_request->maximumTerms =
547 odr_intdup(decode, atoi(maximumTerms));
548 if (responsePosition)
549 sr->u.scan_request->responsePosition =
550 odr_intdup(decode, atoi(responsePosition));
552 sr->u.scan_request->stylesheet = stylesheet;
554 (*soap_package) = odr_malloc(decode, sizeof(**soap_package));
555 (*soap_package)->which = Z_SOAP_generic;
557 (*soap_package)->u.generic =
558 odr_malloc(decode, sizeof(*(*soap_package)->u.generic));
560 (*soap_package)->u.generic->p = sr;
561 (*soap_package)->u.generic->ns = soap_handlers[0].ns;
562 (*soap_package)->u.generic->no = 0;
564 (*soap_package)->ns = "SRU";
570 /* unsupported operation ... */
571 /* Act as if we received a explain request and throw diagnostic. */
573 Z_SRW_PDU *sr = yaz_srw_get(decode, Z_SRW_explain_request);
575 sr->srw_version = version;
577 sr->u.explain_request->recordPacking = recordPacking;
578 sr->u.explain_request->database = db;
580 sr->u.explain_request->stylesheet = stylesheet;
582 (*soap_package) = odr_malloc(decode, sizeof(**soap_package));
583 (*soap_package)->which = Z_SOAP_generic;
585 (*soap_package)->u.generic =
586 odr_malloc(decode, sizeof(*(*soap_package)->u.generic));
588 (*soap_package)->u.generic->p = sr;
589 (*soap_package)->u.generic->ns = soap_handlers[0].ns;
590 (*soap_package)->u.generic->no = 0;
592 (*soap_package)->ns = "SRU";
594 yaz_add_srw_diagnostic(decode, diag, num_diag, 4, operation);
603 Z_SRW_extra_record *yaz_srw_get_extra_record(ODR o)
605 Z_SRW_extra_record *res = (Z_SRW_extra_record *)
606 odr_malloc(o, sizeof(*res));
608 res->recordReviewCode = 0;
609 res->recordReviewNote = 0;
611 res->nonDupRecordId = 0;
612 res->recordLockStatus = 0;
613 res->recordOldVersion = 0;
617 Z_SRW_PDU *yaz_srw_get(ODR o, int which)
619 Z_SRW_PDU *sr = (Z_SRW_PDU *) odr_malloc(o, sizeof(*o));
621 sr->srw_version = odr_strdup(o, "1.1");
625 case Z_SRW_searchRetrieve_request:
626 sr->u.request = (Z_SRW_searchRetrieveRequest *)
627 odr_malloc(o, sizeof(*sr->u.request));
628 sr->u.request->query_type = Z_SRW_query_type_cql;
629 sr->u.request->query.cql = 0;
630 sr->u.request->sort_type = Z_SRW_sort_type_none;
631 sr->u.request->sort.none = 0;
632 sr->u.request->startRecord = 0;
633 sr->u.request->maximumRecords = 0;
634 sr->u.request->recordSchema = 0;
635 sr->u.request->recordPacking = 0;
636 sr->u.request->recordXPath = 0;
637 sr->u.request->database = 0;
638 sr->u.request->resultSetTTL = 0;
639 sr->u.request->stylesheet = 0;
641 case Z_SRW_searchRetrieve_response:
642 sr->u.response = (Z_SRW_searchRetrieveResponse *)
643 odr_malloc(o, sizeof(*sr->u.response));
644 sr->u.response->numberOfRecords = 0;
645 sr->u.response->resultSetId = 0;
646 sr->u.response->resultSetIdleTime = 0;
647 sr->u.response->records = 0;
648 sr->u.response->num_records = 0;
649 sr->u.response->diagnostics = 0;
650 sr->u.response->num_diagnostics = 0;
651 sr->u.response->nextRecordPosition = 0;
652 sr->u.response->extra_records = 0;
654 case Z_SRW_explain_request:
655 sr->u.explain_request = (Z_SRW_explainRequest *)
656 odr_malloc(o, sizeof(*sr->u.explain_request));
657 sr->u.explain_request->recordPacking = 0;
658 sr->u.explain_request->database = 0;
659 sr->u.explain_request->stylesheet = 0;
661 case Z_SRW_explain_response:
662 sr->u.explain_response = (Z_SRW_explainResponse *)
663 odr_malloc(o, sizeof(*sr->u.explain_response));
664 sr->u.explain_response->record.recordData_buf = 0;
665 sr->u.explain_response->record.recordData_len = 0;
666 sr->u.explain_response->record.recordSchema = 0;
667 sr->u.explain_response->record.recordPosition = 0;
668 sr->u.explain_response->record.recordPacking =
669 Z_SRW_recordPacking_string;
670 sr->u.explain_response->diagnostics = 0;
671 sr->u.explain_response->num_diagnostics = 0;
672 sr->u.explain_response->extra_record = 0;
674 case Z_SRW_scan_request:
675 sr->u.scan_request = (Z_SRW_scanRequest *)
676 odr_malloc(o, sizeof(*sr->u.scan_request));
677 sr->u.scan_request->database = 0;
678 sr->u.scan_request->stylesheet = 0;
679 sr->u.scan_request->maximumTerms = 0;
680 sr->u.scan_request->responsePosition = 0;
681 sr->u.scan_request->query_type = Z_SRW_query_type_cql;
682 sr->u.scan_request->scanClause.cql = 0;
684 case Z_SRW_scan_response:
685 sr->u.scan_response = (Z_SRW_scanResponse *)
686 odr_malloc(o, sizeof(*sr->u.scan_response));
687 sr->u.scan_response->terms = 0;
688 sr->u.scan_response->num_terms = 0;
689 sr->u.scan_response->diagnostics = 0;
690 sr->u.scan_response->num_diagnostics = 0;
691 case Z_SRW_update_request:
692 sr->u.update_request = (Z_SRW_updateRequest *)
693 odr_malloc(o, sizeof(*sr->u.update_request));
694 sr->u.update_request->database = 0;
695 sr->u.update_request->stylesheet = 0;
696 sr->u.update_request->record.recordSchema = 0;
697 sr->u.update_request->record.recordPacking = Z_SRW_recordPacking_XML;
698 sr->u.update_request->recordId = 0;
699 sr->u.update_request->recordVersion = 0;
700 sr->u.update_request->recordOldVersion = 0;
701 sr->u.update_request->record.recordData_buf = 0;
702 sr->u.update_request->record.recordData_len = 0;
703 sr->u.update_request->extra_record = 0;
704 sr->u.update_request->extraRequestData = 0;
705 sr->u.request->database = 0;
707 case Z_SRW_update_response:
708 sr->u.update_response = (Z_SRW_updateResponse *)
709 odr_malloc(o, sizeof(*sr->u.update_response));
710 sr->u.update_response->operationStatus = 0;
711 sr->u.update_response->recordId = 0;
712 sr->u.update_response->recordVersion = 0;
713 sr->u.update_response->recordChecksum = 0;
714 sr->u.update_response->record.recordData_buf = 0;
715 sr->u.update_response->record.recordData_len = 0;
716 sr->u.update_response->record.recordSchema = 0;
717 sr->u.update_response->record.recordPacking =
718 Z_SRW_recordPacking_XML;
719 sr->u.update_response->extra_record = 0;
720 sr->u.update_response->extraResponseData = 0;
721 sr->u.update_response->diagnostics = 0;
722 sr->u.update_response->num_diagnostics = 0;
728 static int srw_bib1_map[] = {
738 108, 10, /* Malformed query : Syntax error */
768 100, 1, /* bad map */
816 205, 1, /* bad map */
817 206, 1, /* bad map */
819 208, 1, /* bad map */
830 218, 1, /* bad map */
831 219, 1, /* bad map */
832 220, 1, /* bad map */
833 221, 1, /* bad map */
835 223, 1, /* bad map */
836 224, 1, /* bad map */
837 225, 1, /* bad map */
838 226, 1, /* bad map */
840 228, 1, /* bad map */
845 233, 1, /* bad map */
846 234, 1, /* bad map */
852 240, 1, /* bad map */
853 241, 1, /* bad map */
855 243, 1, /* bad map */
860 1001, 1, /* bad map */
861 1002, 1, /* bad map */
862 1003, 1, /* bad map */
863 1004, 1, /* bad map */
864 1005, 1, /* bad map */
865 1006, 1, /* bad map */
897 int yaz_diag_bib1_to_srw (int code)
899 const int *p = srw_bib1_map;
909 int yaz_diag_srw_to_bib1(int code)
911 const int *p = srw_bib1_map;
921 static void add_val_int(ODR o, char **name, char **value, int *i,
922 char *a_name, int *val)
927 value[*i] = odr_malloc(o, 30);
928 sprintf(value[*i], "%d", *val);
933 static void add_val_str(ODR o, char **name, char **value, int *i,
934 char *a_name, char *val)
944 static int yaz_get_sru_parms(const Z_SRW_PDU *srw_pdu, ODR encode,
945 char **name, char **value)
948 add_val_str(encode, name, value, &i, "version", srw_pdu->srw_version);
949 name[i] = "operation";
950 switch(srw_pdu->which)
952 case Z_SRW_searchRetrieve_request:
953 value[i++] = "searchRetrieve";
954 switch(srw_pdu->u.request->query_type)
956 case Z_SRW_query_type_cql:
957 add_val_str(encode, name, value, &i, "query",
958 srw_pdu->u.request->query.cql);
960 case Z_SRW_query_type_pqf:
961 add_val_str(encode, name, value, &i, "x-pquery",
962 srw_pdu->u.request->query.pqf);
964 case Z_SRW_query_type_xcql:
965 add_val_str(encode, name, value, &i, "x-cql",
966 srw_pdu->u.request->query.xcql);
969 switch(srw_pdu->u.request->sort_type)
971 case Z_SRW_sort_type_none:
973 case Z_SRW_sort_type_sort:
974 add_val_str(encode, name, value, &i, "sortKeys",
975 srw_pdu->u.request->sort.sortKeys);
978 add_val_int(encode, name, value, &i, "startRecord",
979 srw_pdu->u.request->startRecord);
980 add_val_int(encode, name, value, &i, "maximumRecords",
981 srw_pdu->u.request->maximumRecords);
982 add_val_str(encode, name, value, &i, "recordSchema",
983 srw_pdu->u.request->recordSchema);
984 add_val_str(encode, name, value, &i, "recordPacking",
985 srw_pdu->u.request->recordPacking);
986 add_val_str(encode, name, value, &i, "recordXPath",
987 srw_pdu->u.request->recordXPath);
988 add_val_str(encode, name, value, &i, "stylesheet",
989 srw_pdu->u.request->stylesheet);
990 add_val_int(encode, name, value, &i, "resultSetTTL",
991 srw_pdu->u.request->resultSetTTL);
993 case Z_SRW_explain_request:
994 value[i++] = "explain";
995 add_val_str(encode, name, value, &i, "stylesheet",
996 srw_pdu->u.explain_request->stylesheet);
998 case Z_SRW_scan_request:
1001 switch(srw_pdu->u.scan_request->query_type)
1003 case Z_SRW_query_type_cql:
1004 add_val_str(encode, name, value, &i, "scanClause",
1005 srw_pdu->u.scan_request->scanClause.cql);
1007 case Z_SRW_query_type_pqf:
1008 add_val_str(encode, name, value, &i, "x-pScanClause",
1009 srw_pdu->u.scan_request->scanClause.pqf);
1011 case Z_SRW_query_type_xcql:
1012 add_val_str(encode, name, value, &i, "x-cqlScanClause",
1013 srw_pdu->u.scan_request->scanClause.xcql);
1016 add_val_int(encode, name, value, &i, "responsePosition",
1017 srw_pdu->u.scan_request->responsePosition);
1018 add_val_int(encode, name, value, &i, "maximumTerms",
1019 srw_pdu->u.scan_request->maximumTerms);
1020 add_val_str(encode, name, value, &i, "stylesheet",
1021 srw_pdu->u.scan_request->stylesheet);
1023 case Z_SRW_update_request:
1024 value[i++] = "update";
1033 int yaz_sru_get_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu,
1034 ODR encode, char *charset)
1036 char *name[30], *value[30]; /* definite upper limit for SRU params */
1040 if (yaz_get_sru_parms(srw_pdu, encode, name, value))
1042 yaz_array_to_uri(&uri_args, encode, name, value);
1044 hreq->method = "GET";
1046 path = odr_malloc(encode, strlen(hreq->path) + strlen(uri_args) + 3);
1047 sprintf(path, "%s?%s", hreq->path, uri_args);
1050 z_HTTP_header_add_content_type(encode, &hreq->headers,
1051 "text/xml", charset);
1055 int yaz_sru_post_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu,
1056 ODR encode, char *charset)
1058 char *name[30], *value[30]; /* definite upper limit for SRU params */
1061 if (yaz_get_sru_parms(srw_pdu, encode, name, value))
1064 yaz_array_to_uri(&uri_args, encode, name, value);
1066 hreq->method = "POST";
1068 hreq->content_buf = uri_args;
1069 hreq->content_len = strlen(uri_args);
1071 z_HTTP_header_add_content_type(encode, &hreq->headers,
1072 "application/x-www-form-urlencoded",
1080 * indent-tabs-mode: nil
1082 * vim: shiftwidth=4 tabstop=8 expandtab