X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fsrwutil.c;h=a04516a109d001a8c2df8a5ed561326888f9388b;hb=29b39371225c6c6eaa746d8805dd46d42b9b9668;hp=7e05318683b7c5b47b51979e550e3b920f56fc7d;hpb=43a9d38d20c1b1bcd1a03b2445a501d27526bd35;p=yaz-moved-to-github.git diff --git a/src/srwutil.c b/src/srwutil.c index 7e05318..a04516a 100644 --- a/src/srwutil.c +++ b/src/srwutil.c @@ -14,9 +14,12 @@ #include #include #include +#include #include #include "sru-p.h" +#define MAX_SRU_PARAMETERS 30 + static char *yaz_decode_sru_dbpath_odr(ODR n, const char *uri, size_t len) { return odr_strdupn(n, uri, len); @@ -36,51 +39,50 @@ char *yaz_encode_sru_dbpath_odr(ODR out, const char *db) return dst; } -#if YAZ_HAVE_XML2 -static int yaz_base64decode(const char *in, char *out) +Z_AttributeList *yaz_use_attribute_create(ODR o, const char *name) { - const char *map = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "abcdefghijklmnopqrstuvwxyz0123456789+/"; - int olen = 0; - int len = strlen(in); - - while (len >= 4) - { - char i0, i1, i2, i3; - char *p; - - if (!(p = strchr(map, in[0]))) - return 0; - i0 = p - map; - len--; - if (!(p = strchr(map, in[1]))) - return 0; - i1 = p - map; - len--; - *(out++) = i0 << 2 | i1 >> 4; - olen++; - if (in[2] == '=') - break; - if (!(p = strchr(map, in[2]))) - return 0; - i2 = p - map; - len--; - *(out++) = i1 << 4 | i2 >> 2; - olen++; - if (in[3] == '=') - break; - if (!(p = strchr(map, in[3]))) - return 0; - i3 = p - map; - len--; - *(out++) = i2 << 6 | i3; - olen++; - - in += 4; - } + Z_AttributeList *attributes= (Z_AttributeList *) + odr_malloc(o, sizeof(*attributes)); + Z_AttributeElement ** elements; + attributes->num_attributes = 1; + elements = (Z_AttributeElement**) + odr_malloc (o, attributes->num_attributes * sizeof(*elements)); + elements[0] = (Z_AttributeElement*) odr_malloc(o,sizeof(**elements)); + elements[0]->attributeType = odr_intdup(o, 1); + elements[0]->attributeSet = odr_nullval(); + elements[0]->which = Z_AttributeValue_complex; + elements[0]->value.complex = (Z_ComplexAttribute *) + odr_malloc(o, sizeof(Z_ComplexAttribute)); + elements[0]->value.complex->num_list = 1; + elements[0]->value.complex->list = (Z_StringOrNumeric **) + odr_malloc(o, 1 * sizeof(Z_StringOrNumeric *)); + elements[0]->value.complex->list[0] = (Z_StringOrNumeric *) + odr_malloc(o, sizeof(Z_StringOrNumeric)); + elements[0]->value.complex->list[0]->which = Z_StringOrNumeric_string; + elements[0]->value.complex->list[0]->u.string = odr_strdup(o, name); + elements[0]->value.complex->semanticAction = 0; + elements[0]->value.complex->num_semanticAction = 0; + attributes->attributes = elements; + return attributes; +} - *out = '\0'; - return olen; +#if YAZ_HAVE_XML2 +const char *yaz_element_attribute_value_get(xmlNodePtr ptr, + const char *node_name, + const char *attribute_name) +{ + struct _xmlAttr *attr; + // check if the node name matches + if (strcmp((const char*) ptr->name, node_name)) + return 0; + // check if the attribute name and return the value + for (attr = ptr->properties; attr; attr = attr->next) + if (attr->children && attr->children->type == XML_TEXT_NODE) + { + if (!strcmp((const char *) attr->name, attribute_name)) + return (const char *) attr->children->content; + } + return 0; } #endif @@ -102,7 +104,6 @@ int yaz_srw_check_content_type(Z_HTTP_Response *hres) * Look for authentication tokens in HTTP Basic parameters or in x-username/x-password * parameters. Added by SH. */ -#if YAZ_HAVE_XML2 static void yaz_srw_decodeauth(Z_SRW_PDU *sr, Z_HTTP_Request *hreq, char *username, char *password, ODR decode) { @@ -113,8 +114,9 @@ static void yaz_srw_decodeauth(Z_SRW_PDU *sr, Z_HTTP_Request *hreq, if (password) sr->password = password; - if (basic) { - int len, olen; + if (basic) + { + int len; char out[256]; char ubuf[256] = "", pbuf[256] = "", *p; if (strncmp(basic, "Basic ", 6)) @@ -123,10 +125,11 @@ static void yaz_srw_decodeauth(Z_SRW_PDU *sr, Z_HTTP_Request *hreq, len = strlen(basic); if (!len || len > 256) return; - olen = yaz_base64decode(basic, out); + yaz_base64decode(basic, out); /* Format of out should be username:password at this point */ strcpy(ubuf, out); - if ((p = strchr(ubuf, ':'))) { + if ((p = strchr(ubuf, ':'))) + { *(p++) = '\0'; if (*p) strcpy(pbuf, p); @@ -137,7 +140,6 @@ static void yaz_srw_decodeauth(Z_SRW_PDU *sr, Z_HTTP_Request *hreq, sr->password = odr_strdup(decode, pbuf); } } -#endif void yaz_uri_val_int(const char *path, const char *name, ODR o, Odr_int **intp) { @@ -291,6 +293,7 @@ int yaz_srw_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, if (ret == 0 && (*soap_package)->which == Z_SOAP_generic) { *srw_pdu = (Z_SRW_PDU*) (*soap_package)->u.generic->p; + yaz_srw_decodeauth(*srw_pdu, hreq, 0, 0, decode); if ((*srw_pdu)->which == Z_SRW_searchRetrieve_request && (*srw_pdu)->u.request->database == 0) @@ -389,7 +392,6 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, char *startRecord = 0; char *maximumTerms = 0; char *responsePosition = 0; - char *extraRequestData = 0; Z_SRW_extra_arg *extra_args = 0; #endif char **uri_name; @@ -452,7 +454,7 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, else if (!strcmp(n, "responsePosition")) responsePosition = v; else if (!strcmp(n, "extraRequestData")) - extraRequestData = v; + ; /* ignoring extraRequestData */ else if (n[0] == 'x' && n[1] == '-') { Z_SRW_extra_arg **l = &extra_args; @@ -1177,13 +1179,13 @@ static int yaz_get_sru_parms(const Z_SRW_PDU *srw_pdu, ODR encode, int yaz_sru_get_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, ODR encode, const char *charset) { - char *name[30], *value[30]; /* definite upper limit for SRU params */ + char *name[MAX_SRU_PARAMETERS], *value[MAX_SRU_PARAMETERS]; /* definite upper limit for SRU params */ char *uri_args; char *path; z_HTTP_header_add_basic_auth(encode, &hreq->headers, srw_pdu->username, srw_pdu->password); - if (yaz_get_sru_parms(srw_pdu, encode, name, value, 30)) + if (yaz_get_sru_parms(srw_pdu, encode, name, value, MAX_SRU_PARAMETERS)) return -1; yaz_array_to_uri(&uri_args, encode, name, value); @@ -1193,6 +1195,7 @@ int yaz_sru_get_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, 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, @@ -1203,12 +1206,12 @@ int yaz_sru_get_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, int yaz_sru_post_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, ODR encode, const char *charset) { - char *name[30], *value[30]; /* definite upper limit for SRU params */ + char *name[MAX_SRU_PARAMETERS], *value[MAX_SRU_PARAMETERS]; /* definite upper limit for SRU params */ char *uri_args; z_HTTP_header_add_basic_auth(encode, &hreq->headers, srw_pdu->username, srw_pdu->password); - if (yaz_get_sru_parms(srw_pdu, encode, name, value, 30)) + if (yaz_get_sru_parms(srw_pdu, encode, name, value, MAX_SRU_PARAMETERS)) return -1; yaz_array_to_uri(&uri_args, encode, name, value); @@ -1262,12 +1265,13 @@ int yaz_sru_soap_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, charset); } -Z_SRW_recordVersion *yaz_srw_get_record_versions(ODR odr, int num ) +Z_SRW_recordVersion *yaz_srw_get_record_versions(ODR odr, int num) { Z_SRW_recordVersion *ver - = (Z_SRW_recordVersion *) odr_malloc( odr, num * sizeof(*ver) ); + = (Z_SRW_recordVersion *) odr_malloc(odr,num * sizeof(*ver)); int i; - for ( i=0; i < num; ++i ){ + for (i = 0; i < num; ++i) + { ver[i].versionType = 0; ver[i].versionValue = 0; }