Implemented yaz_sru_post_encode which builds a SRU POST requeste.
authorAdam Dickmeiss <adam@indexdata.dk>
Fri, 2 Jun 2006 13:08:27 +0000 (13:08 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Fri, 2 Jun 2006 13:08:27 +0000 (13:08 +0000)
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
include/yaz/zgdu.h
src/srwutil.c
src/zgdu.c
src/zoom-c.c

index b8dd77d..17f4890 100644 (file)
@@ -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
index daa9d4a..dbe336b 100644 (file)
@@ -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
 
index 9a54e23..45b5785 100644 (file)
@@ -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
index 0dfdbaf..37f9820 100644 (file)
@@ -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));
index 780bf10..5ca5e65 100644 (file)
@@ -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);