From d58b3c28b5efc7106f6ed65cd52c8ad56de7b6b9 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Fri, 2 Jun 2006 13:08:27 +0000 Subject: [PATCH 1/1] Implemented yaz_sru_post_encode which builds a SRU POST requeste. Implemented z_get_HTTP_Request_host_path which builds a HTTP request using host, path. Updated ZOOM C to use these. --- include/yaz/srw.h | 9 ++++++--- include/yaz/zgdu.h | 5 ++++- src/srwutil.c | 33 +++++++++++++++++++++++++++--- src/zgdu.c | 37 +++++++++++++++++++++++++++++++++- src/zoom-c.c | 57 ++++------------------------------------------------ 5 files changed, 80 insertions(+), 61 deletions(-) diff --git a/include/yaz/srw.h b/include/yaz/srw.h index b8dd77d..17f4890 100644 --- a/include/yaz/srw.h +++ b/include/yaz/srw.h @@ -2,7 +2,7 @@ * Copyright (C) 1995-2005, Index Data ApS * See the file LICENSE for details. * - * $Id: srw.h,v 1.26 2006-05-05 20:02:22 quinn Exp $ + * $Id: srw.h,v 1.27 2006-06-02 13:08:27 adam Exp $ */ /** * \file srw.h @@ -223,9 +223,12 @@ YAZ_EXPORT void yaz_mk_srw_diagnostic(ODR o, Z_SRW_diagnostic *d, const char *details); YAZ_EXPORT int yaz_sru_get_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, - ODR encode, char *charset); + ODR encode, const char *charset); YAZ_EXPORT int yaz_sru_post_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, - ODR encode, char *charset); + ODR encode, const char *charset); +YAZ_EXPORT int yaz_sru_soap_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, + ODR odr, const char *charset); + YAZ_END_CDECL #endif diff --git a/include/yaz/zgdu.h b/include/yaz/zgdu.h index daa9d4a..dbe336b 100644 --- a/include/yaz/zgdu.h +++ b/include/yaz/zgdu.h @@ -2,7 +2,7 @@ * Copyright (C) 1995-2005, Index Data ApS * See the file LICENSE for details. * - * $Id: zgdu.h,v 1.6 2006-03-01 23:24:25 adam Exp $ + * $Id: zgdu.h,v 1.7 2006-06-02 13:08:27 adam Exp $ */ /** @@ -66,6 +66,9 @@ YAZ_EXPORT const char *z_HTTP_errmsg(int code); YAZ_EXPORT Z_GDU *z_get_HTTP_Response(ODR o, int code); YAZ_EXPORT Z_GDU *z_get_HTTP_Request(ODR o); +YAZ_EXPORT Z_GDU *z_get_HTTP_Request_host_path(ODR odr, + const char *host, + const char *path); YAZ_END_CDECL diff --git a/src/srwutil.c b/src/srwutil.c index 9a54e23..45b5785 100644 --- a/src/srwutil.c +++ b/src/srwutil.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2005, Index Data ApS * See the file LICENSE for details. * - * $Id: srwutil.c,v 1.40 2006-05-07 18:35:47 adam Exp $ + * $Id: srwutil.c,v 1.41 2006-06-02 13:08:27 adam Exp $ */ /** * \file srwutil.c @@ -1129,7 +1129,7 @@ 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, char *charset) + ODR encode, const char *charset) { char *name[30], *value[30]; /* definite upper limit for SRU params */ char *uri_args; @@ -1151,7 +1151,7 @@ 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, char *charset) + ODR encode, const char *charset) { char *name[30], *value[30]; /* definite upper limit for SRU params */ char *uri_args; @@ -1172,6 +1172,33 @@ int yaz_sru_post_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, return 0; } +int yaz_sru_soap_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, + ODR odr, const char *charset) +{ + Z_SOAP_Handler handlers[2] = { + {"http://www.loc.gov/zing/srw/", 0, (Z_SOAP_fun) yaz_srw_codec}, + {0, 0, 0} + }; + Z_SOAP *p = (Z_SOAP*) odr_malloc(odr, sizeof(*p)); + z_HTTP_header_add_content_type(odr, + &hreq->headers, + "text/xml", charset); + + z_HTTP_header_add(odr, &hreq->headers, + "SOAPAction", "\"\""); + p->which = Z_SOAP_generic; + p->u.generic = (Z_SOAP_Generic *) odr_malloc(odr, sizeof(*p->u.generic)); + p->u.generic->no = 0; + p->u.generic->ns = 0; + p->u.generic->p = srw_pdu; + p->ns = "http://schemas.xmlsoap.org/soap/envelope/"; + + return z_soap_codec_enc(odr, &p, + &hreq->content_buf, + &hreq->content_len, handlers, + charset); +} + /* * Local variables: * c-basic-offset: 4 diff --git a/src/zgdu.c b/src/zgdu.c index 0dfdbaf..37f9820 100644 --- a/src/zgdu.c +++ b/src/zgdu.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2005, Index Data ApS * See the file LICENSE for details. * - * $Id: zgdu.c,v 1.14 2006-03-01 23:24:25 adam Exp $ + * $Id: zgdu.c,v 1.15 2006-06-02 13:08:27 adam Exp $ */ /** @@ -207,6 +207,41 @@ Z_GDU *z_get_HTTP_Request(ODR o) return p; } + +Z_GDU *z_get_HTTP_Request_host_path(ODR odr, + const char *host, + const char *path) +{ + Z_GDU *p = z_get_HTTP_Request(odr); + + p->u.HTTP_Request->path = odr_strdup(odr, path); + + if (host) + { + const char *cp0 = strstr(host, "://"); + const char *cp1 = 0; + if (cp0) + cp0 = cp0+3; + else + cp0 = host; + + cp1 = strchr(cp0, '/'); + if (!cp1) + cp1 = cp0+strlen(cp0); + + if (cp0 && cp1) + { + char *h = (char*) odr_malloc(odr, cp1 - cp0 + 1); + memcpy (h, cp0, cp1 - cp0); + h[cp1-cp0] = '\0'; + z_HTTP_header_add(odr, &p->u.HTTP_Request->headers, + "Host", h); + } + } + return p; +} + + Z_GDU *z_get_HTTP_Response(ODR o, int code) { Z_GDU *p = (Z_GDU *) odr_malloc(o, sizeof(*p)); diff --git a/src/zoom-c.c b/src/zoom-c.c index 780bf10..5ca5e65 100644 --- a/src/zoom-c.c +++ b/src/zoom-c.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2005, Index Data ApS * See the file LICENSE for details. * - * $Id: zoom-c.c,v 1.73 2006-05-31 15:32:43 adam Exp $ + * $Id: zoom-c.c,v 1.74 2006-06-02 13:08:27 adam Exp $ */ /** * \file zoom-c.c @@ -1155,7 +1155,7 @@ static zoom_ret ZOOM_connection_send_init (ZOOM_connection c) ZOOM_options_get(c->options, "implementationName"), odr_prepend(c->odr_out, "ZOOM-C", ireq->implementationName)); - version = odr_strdup(c->odr_out, "$Revision: 1.73 $"); + version = odr_strdup(c->odr_out, "$Revision: 1.74 $"); if (strlen(version) > 10) /* check for unexpanded CVS strings */ version[strlen(version)-2] = '\0'; ireq->implementationVersion = odr_prepend(c->odr_out, @@ -1236,41 +1236,10 @@ static zoom_ret ZOOM_connection_send_init (ZOOM_connection c) #if HAVE_XML2 static zoom_ret send_srw (ZOOM_connection c, Z_SRW_PDU *sr) { - Z_SOAP_Handler h[2] = { - {"http://www.loc.gov/zing/srw/", 0, (Z_SOAP_fun) yaz_srw_codec}, - {0, 0, 0} - }; - ODR o = odr_createmem(ODR_ENCODE); - int ret; - Z_SOAP *p = (Z_SOAP*) odr_malloc(o, sizeof(*p)); Z_GDU *gdu; ZOOM_Event event; - gdu = z_get_HTTP_Request(c->odr_out); - gdu->u.HTTP_Request->path = c->path; - - if (c->host_port) - { - const char *cp0 = strstr(c->host_port, "://"); - const char *cp1 = 0; - if (cp0) - cp0 = cp0+3; - else - cp0 = c->host_port; - - cp1 = strchr(cp0, '/'); - if (!cp1) - cp1 = cp0+strlen(cp0); - - if (cp0 && cp1) - { - char *h = (char*) odr_malloc(c->odr_out, cp1 - cp0 + 1); - memcpy (h, cp0, cp1 - cp0); - h[cp1-cp0] = '\0'; - z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers, - "Host", h); - } - } + gdu = z_get_HTTP_Request_host_path(c->odr_out, c->host_port, c->path); if (c->sru_mode == zoom_sru_get) { @@ -1282,29 +1251,11 @@ static zoom_ret send_srw (ZOOM_connection c, Z_SRW_PDU *sr) } else if (c->sru_mode == zoom_sru_soap) { - z_HTTP_header_add_content_type(c->odr_out, - &gdu->u.HTTP_Request->headers, - "text/xml", c->charset); - - z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers, - "SOAPAction", "\"\""); - p->which = Z_SOAP_generic; - p->u.generic = (Z_SOAP_Generic *) odr_malloc(o, sizeof(*p->u.generic)); - p->u.generic->no = 0; - p->u.generic->ns = 0; - p->u.generic->p = sr; - p->ns = "http://schemas.xmlsoap.org/soap/envelope/"; - - ret = z_soap_codec_enc(o, &p, - &gdu->u.HTTP_Request->content_buf, - &gdu->u.HTTP_Request->content_len, h, - c->charset); - + yaz_sru_post_encode(gdu->u.HTTP_Request, sr, c->odr_out, c->charset); } if (!z_GDU(c->odr_out, &gdu, 0, 0)) return zoom_complete; c->buf_out = odr_getbuf(c->odr_out, &c->len_out, 0); - odr_destroy(o); event = ZOOM_Event_create (ZOOM_EVENT_SEND_APDU); ZOOM_connection_put_event (c, event); -- 1.7.10.4