X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fsrwutil.c;h=560976be9216899bd53cf693a995135d3ea428e3;hb=19ceaa7b25280fbcdfb4e2d5eb94d3483f7d5d66;hp=25f2fca55aed95d814453e3e084352c68c9d4f12;hpb=f7a54be570c51522047f42daf147f7739c557065;p=yaz-moved-to-github.git diff --git a/src/srwutil.c b/src/srwutil.c index 25f2fca..560976b 100644 --- a/src/srwutil.c +++ b/src/srwutil.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2006, Index Data ApS * See the file LICENSE for details. * - * $Id: srwutil.c,v 1.51 2006-10-05 15:19:33 adam Exp $ + * $Id: srwutil.c,v 1.53 2006-10-27 11:22:09 adam Exp $ */ /** * \file srwutil.c @@ -328,6 +328,36 @@ void yaz_add_srw_diagnostic(ODR o, Z_SRW_diagnostic **d, yaz_add_srw_diagnostic_uri(o, d, num, uri, 0, addinfo); } + +void yaz_add_sru_update_diagnostic(ODR o, Z_SRW_diagnostic **d, + int *num, int code, const char *addinfo) +{ + char uri[40]; + + sprintf(uri, "info:srw/diagnostic/12/%d", code); + yaz_add_srw_diagnostic_uri(o, d, num, uri, 0, addinfo); +} + + +static void grab_charset(ODR o, const char *content_type, char **charset) +{ + if (charset) + { + 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 yaz_srw_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, Z_SOAP **soap_package, ODR decode, char **charset) { @@ -343,7 +373,6 @@ int yaz_srw_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, char *db = "Default"; const char *p0 = hreq->path, *p1; int ret = -1; - const char *charset_p = 0; static Z_SOAP_Handler soap_handlers[4] = { #if YAZ_HAVE_XML2 @@ -369,17 +398,8 @@ int yaz_srw_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, db[p1 - p0] = '\0'; } - if (charset && (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(decode, i+1); - memcpy(*charset, charset_p, i); - (*charset)[i] = '\0'; - } + grab_charset(decode, content_type, charset); + ret = z_soap_codec(decode, soap_package, &hreq->content_buf, &hreq->content_len, soap_handlers); @@ -450,20 +470,18 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, }; #endif const char *content_type = z_HTTP_header_lookup(hreq->headers, - "Content-Type"); + "Content-Type"); + /* - SRU GET: allow any content type. + SRU GET: ignore content type. SRU POST: we support "application/x-www-form-urlencoded"; not "multipart/form-data" . */ - if (!strcmp(hreq->method, "GET") - || - (!strcmp(hreq->method, "POST") - && content_type && - !yaz_strcmp_del("application/x-www-form-urlencoded", - content_type, "; ") - ) - ) + if (!strcmp(hreq->method, "GET") + || + (!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; @@ -490,8 +508,10 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, char **uri_name; char **uri_val; - if (charset) - *charset = 0; + grab_charset(decode, content_type, charset); + if (charset && *charset == 0 && !strcmp(hreq->method, "GET")) + *charset = "UTF-8"; + if (*p0 == '/') p0++; p1 = strchr(p0, '?');