/* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2009 Index Data
+ * Copyright (C) 1995-2010 Index Data
* See the file LICENSE for details.
*/
/**
*/
#include <stdlib.h>
+#include <assert.h>
#include <yaz/srw.h>
#include <yaz/matchstr.h>
#include <yaz/yaz-iconv.h>
+#include "sru-p.h"
+
+static char *yaz_decode_sru_dbpath_odr(ODR n, const char *uri, size_t len)
+{
+ return odr_strdupn(n, uri, len);
+}
+
+void yaz_encode_sru_dbpath_buf(char *dst, const char *db)
+{
+ assert(db);
+ *dst = '/';
+ strcpy(dst+1, db);
+}
+
+char *yaz_encode_sru_dbpath_odr(ODR out, const char *db)
+{
+ char *dst = odr_malloc(out, 3 * strlen(db) + 2);
+ yaz_encode_sru_dbpath_buf(dst, db);
+ return dst;
+}
#if YAZ_HAVE_XML2
static int yaz_base64decode(const char *in, char *out)
if (!p1)
p1 = p0 + strlen(p0);
if (p1 != p0)
- {
- db = (char*) odr_malloc(decode, p1 - p0 + 1);
- memcpy (db, p0, p1 - p0);
- db[p1 - p0] = '\0';
- }
-
+ db = yaz_decode_sru_dbpath_odr(decode, p0, p1 - p0);
grab_charset(decode, content_type, charset);
ret = z_soap_codec(decode, soap_package,
#endif
/**
- http://www.loc.gov/z3950/agency/zing/srw/service.html
+ http://www.loc.gov/z3950/agency/zing/srw/service.html
*/
int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu,
Z_SOAP **soap_package, ODR decode, char **charset,
};
#endif
const char *content_type = z_HTTP_header_lookup(hreq->headers,
- "Content-Type");
+ "Content-Type");
/*
SRU GET: ignore content type.
*/
if (!strcmp(hreq->method, "GET")
||
- (!strcmp(hreq->method, "POST") && content_type &&
- !yaz_strcmp_del("application/x-www-form-urlencoded",
- content_type, "; ")))
+ (!strcmp(hreq->method, "POST") && content_type &&
+ !yaz_strcmp_del("application/x-www-form-urlencoded",
+ content_type, "; ")))
{
char *db = "Default";
const char *p0 = hreq->path, *p1;
if (!p1)
p1 = p0 + strlen(p0);
if (p1 != p0)
- {
- db = (char*) odr_malloc(decode, p1 - p0 + 1);
- memcpy (db, p0, p1 - p0);
- db[p1 - p0] = '\0';
- }
+ db = yaz_decode_sru_dbpath_odr(decode, p0, p1 - p0);
if (!strcmp(hreq->method, "POST"))
p1 = hreq->content_buf;
yaz_uri_to_array(p1, decode, &uri_name, &uri_val);
return 1;
}
-static void add_val_int(ODR o, char **name, char **value, int *i,
- char *a_name, Odr_int *val)
+void yaz_add_name_value_int(ODR o, char **name, char **value, int *i,
+ char *a_name, Odr_int *val)
{
if (val)
{
}
}
-static void add_val_str(ODR o, char **name, char **value, int *i,
- char *a_name, char *val)
+void yaz_add_name_value_str(ODR o, char **name, char **value, int *i,
+ char *a_name, char *val)
{
if (val)
{
char **name, char **value, int max_names)
{
int i = 0;
- add_val_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)
{
switch(srw_pdu->u.request->query_type)
{
case Z_SRW_query_type_cql:
- add_val_str(encode, name, value, &i, "query",
- srw_pdu->u.request->query.cql);
+ yaz_add_name_value_str(encode, name, value, &i, "query",
+ srw_pdu->u.request->query.cql);
break;
case Z_SRW_query_type_pqf:
- add_val_str(encode, name, value, &i, "x-pquery",
- srw_pdu->u.request->query.pqf);
+ yaz_add_name_value_str(encode, name, value, &i, "x-pquery",
+ srw_pdu->u.request->query.pqf);
break;
case Z_SRW_query_type_xcql:
- add_val_str(encode, name, value, &i, "x-cql",
- srw_pdu->u.request->query.xcql);
+ yaz_add_name_value_str(encode, name, value, &i, "x-cql",
+ srw_pdu->u.request->query.xcql);
break;
}
switch(srw_pdu->u.request->sort_type)
case Z_SRW_sort_type_none:
break;
case Z_SRW_sort_type_sort:
- add_val_str(encode, name, value, &i, "sortKeys",
- srw_pdu->u.request->sort.sortKeys);
+ yaz_add_name_value_str(encode, name, value, &i, "sortKeys",
+ srw_pdu->u.request->sort.sortKeys);
break;
}
- add_val_int(encode, name, value, &i, "startRecord",
- srw_pdu->u.request->startRecord);
- add_val_int(encode, name, value, &i, "maximumRecords",
- srw_pdu->u.request->maximumRecords);
- add_val_str(encode, name, value, &i, "recordSchema",
- srw_pdu->u.request->recordSchema);
- add_val_str(encode, name, value, &i, "recordPacking",
- srw_pdu->u.request->recordPacking);
- add_val_str(encode, name, value, &i, "recordXPath",
- srw_pdu->u.request->recordXPath);
- add_val_str(encode, name, value, &i, "stylesheet",
- srw_pdu->u.request->stylesheet);
- add_val_int(encode, name, value, &i, "resultSetTTL",
- srw_pdu->u.request->resultSetTTL);
+ yaz_add_name_value_int(encode, name, value, &i, "startRecord",
+ srw_pdu->u.request->startRecord);
+ yaz_add_name_value_int(encode, name, value, &i, "maximumRecords",
+ srw_pdu->u.request->maximumRecords);
+ yaz_add_name_value_str(encode, name, value, &i, "recordSchema",
+ srw_pdu->u.request->recordSchema);
+ yaz_add_name_value_str(encode, name, value, &i, "recordPacking",
+ srw_pdu->u.request->recordPacking);
+ yaz_add_name_value_str(encode, name, value, &i, "recordXPath",
+ srw_pdu->u.request->recordXPath);
+ yaz_add_name_value_str(encode, name, value, &i, "stylesheet",
+ srw_pdu->u.request->stylesheet);
+ yaz_add_name_value_int(encode, name, value, &i, "resultSetTTL",
+ srw_pdu->u.request->resultSetTTL);
break;
case Z_SRW_explain_request:
value[i++] = "explain";
- add_val_str(encode, name, value, &i, "stylesheet",
- srw_pdu->u.explain_request->stylesheet);
+ yaz_add_name_value_str(encode, name, value, &i, "stylesheet",
+ srw_pdu->u.explain_request->stylesheet);
break;
case Z_SRW_scan_request:
value[i++] = "scan";
switch(srw_pdu->u.scan_request->query_type)
{
case Z_SRW_query_type_cql:
- add_val_str(encode, name, value, &i, "scanClause",
- srw_pdu->u.scan_request->scanClause.cql);
+ yaz_add_name_value_str(encode, name, value, &i, "scanClause",
+ srw_pdu->u.scan_request->scanClause.cql);
break;
case Z_SRW_query_type_pqf:
- add_val_str(encode, name, value, &i, "x-pScanClause",
- srw_pdu->u.scan_request->scanClause.pqf);
+ yaz_add_name_value_str(encode, name, value, &i, "x-pScanClause",
+ srw_pdu->u.scan_request->scanClause.pqf);
break;
case Z_SRW_query_type_xcql:
- add_val_str(encode, name, value, &i, "x-cqlScanClause",
- srw_pdu->u.scan_request->scanClause.xcql);
+ yaz_add_name_value_str(encode, name, value, &i, "x-cqlScanClause",
+ srw_pdu->u.scan_request->scanClause.xcql);
break;
}
- add_val_int(encode, name, value, &i, "responsePosition",
- srw_pdu->u.scan_request->responsePosition);
- add_val_int(encode, name, value, &i, "maximumTerms",
- srw_pdu->u.scan_request->maximumTerms);
- add_val_str(encode, name, value, &i, "stylesheet",
- srw_pdu->u.scan_request->stylesheet);
+ yaz_add_name_value_int(encode, name, value, &i, "responsePosition",
+ srw_pdu->u.scan_request->responsePosition);
+ yaz_add_name_value_int(encode, name, value, &i, "maximumTerms",
+ srw_pdu->u.scan_request->maximumTerms);
+ yaz_add_name_value_str(encode, name, value, &i, "stylesheet",
+ srw_pdu->u.scan_request->stylesheet);
break;
case Z_SRW_update_request:
value[i++] = "update";
}
-
/*
* Local variables:
* c-basic-offset: 4