/* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2013 Index Data
+ * Copyright (C) Index Data
* See the file LICENSE for details.
*/
/**
}
}
-void yaz_uri_val_int(const char *path, const char *name, ODR o, Odr_int **intp)
-{
- const char *v = yaz_uri_val(path, name, o);
- if (v)
- *intp = odr_intdup(o, atoi(v));
-}
-
void yaz_mk_srw_diagnostic(ODR o, Z_SRW_diagnostic *d,
const char *uri, const char *message,
const char *details)
const char *charset_p = 0;
if (content_type && (charset_p = strstr(content_type, "; charset=")))
{
- int i = 0;
- charset_p += 10;
- while (i < 20 && charset_p[i] &&
- !strchr("; \n\r", charset_p[i]))
- i++;
- *charset = (char*) odr_malloc(o, i+1);
- memcpy(*charset, charset_p, i);
- (*charset)[i] = '\0';
+ int j = 0, i = 0;
+ int sep = 0;
+ charset_p += 10; /* skip ; charset= */
+ if (charset_p[i] == '"' || charset_p[i] == '\'')
+ sep = charset_p[i++];
+ *charset = odr_strdup(o, charset_p);
+ while (charset_p[i] && charset_p[i] != sep)
+ {
+ if (!sep && strchr("; \n\r", charset_p[i]))
+ break;
+ if (charset_p[i] == '\\' && charset_p[i+1])
+ i++;
+ (*charset)[j++] = charset_p[i++];
+ }
+ (*charset)[j] = '\0';
}
}
}
p1 = p0 + strlen(p0);
if (p1 != p0)
db = yaz_decode_sru_dbpath_odr(decode, p0, p1 - p0);
- grab_charset(decode, content_type, charset);
ret = z_soap_codec(decode, soap_package,
&hreq->content_buf, &hreq->content_len,
char *startRecord = 0;
char *maximumTerms = 0;
char *responsePosition = 0;
+ const char *facetLimit = 0;
+ const char *facetStart = 0;
+ const char *facetSort = 0;
Z_SRW_extra_arg *extra_args = 0;
#endif
char **uri_name;
maximumTerms = v;
else if (!strcmp(n, "responsePosition"))
responsePosition = v;
+ else if (!strcmp(n, "facetLimit"))
+ facetLimit = v;
+ else if (!strcmp(n, "facetStart"))
+ facetStart = v;
+ else if (!strcmp(n, "facetSort"))
+ facetSort = v;
else if (!strcmp(n, "extraRequestData"))
; /* ignoring extraRequestData */
else if (n[0] == 'x' && n[1] == '-')
}
}
}
- if (!operation && query)
- operation = "searchRetrieve";
+ if (!operation)
+ {
+ if (query)
+ operation = "searchRetrieve";
+ else if (scanClause)
+ operation = "scan";
+ }
version = yaz_negotiate_sru_version(version);
if (!version)
sr->u.request->recordPacking = recordXMLEscaping;
sr->u.request->packing = recordPacking;
sr->u.request->stylesheet = stylesheet;
+ yaz_sru_facet_request(decode , &sr->u.request->facetList,
+ &facetLimit, &facetStart, &facetSort);
yaz_sru_decode_integer(decode, "maximumRecords", maximumRecords,
&sr->u.request->maximumRecords,
int version2 = strcmp(srw_pdu->srw_version, "2.") > 0;
int i = 0;
char *queryType;
- if (!version2)
- yaz_add_name_value_str(encode, name, value, &i, "version", srw_pdu->srw_version);
+ yaz_add_name_value_str(encode, name, value, &i, "version",
+ srw_pdu->srw_version);
name[i] = "operation";
switch (srw_pdu->which)
{
case Z_SRW_searchRetrieve_request:
- if (!version2)
- value[i++] = "searchRetrieve";
+ value[i++] = "searchRetrieve";
queryType = srw_pdu->u.request->queryType;
if (version2)
{
- yaz_add_name_value_str(encode, name, value, &i, "queryType",
- queryType);
+ if (queryType && strcmp(queryType, "cql"))
+ yaz_add_name_value_str(encode, name, value, &i, "queryType",
+ queryType);
yaz_add_name_value_str(encode, name, value, &i, "query",
srw_pdu->u.request->query);
}
srw_pdu->u.request->stylesheet);
yaz_add_name_value_int(encode, name, value, &i, "resultSetTTL",
srw_pdu->u.request->resultSetTTL);
+ {
+ const char *facetLimit = 0;
+ const char *facetStart = 0;
+ const char *facetSort = 0;
+ yaz_sru_facet_request(encode, &srw_pdu->u.request->facetList,
+ &facetLimit, &facetStart, &facetSort);
+ yaz_add_name_value_str(encode, name, value, &i, "facetLimit",
+ (char *) facetLimit);
+ yaz_add_name_value_str(encode, name, value, &i, "facetStart",
+ (char *) facetStart);
+ yaz_add_name_value_str(encode, name, value, &i, "facetSort",
+ (char *) facetSort);
+ }
break;
case Z_SRW_explain_request:
value[i++] = "explain";
odr_malloc(encode, strlen(hreq->path) + strlen(uri_args) + 4);
sprintf(path, "%s?%s", hreq->path, uri_args);
- yaz_log(YLOG_DEBUG, "SRU HTTP Get Request %s", path);
hreq->path = path;
z_HTTP_header_add_content_type(encode, &hreq->headers,
srw_pdu->username, srw_pdu->password);
z_HTTP_header_add_content_type(odr,
&hreq->headers,
- "text/xml", charset);
+ "text/xml", 0 /* no charset in MIME */);
z_HTTP_header_add(odr, &hreq->headers,
"SOAPAction", "\"\"");
Z_SRW_extra_arg **ea = &sr->extra_args;
yaz_uri_to_array(extra_args, odr, &name, &val);
+ /** append rather than override */
+ while (*ea)
+ ea = &(*ea)->next;
while (*name)
{
*ea = (Z_SRW_extra_arg *) odr_malloc(odr, sizeof(**ea));