Working configuable HTTP File filter.. This will allows us to refer to
[metaproxy-moved-to-github.git] / src / filter_z3950_client.cpp
index 21f20b3..13e25d7 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: filter_z3950_client.cpp,v 1.17 2006-01-09 18:19:09 adam Exp $
+/* $Id: filter_z3950_client.cpp,v 1.23 2006-01-17 17:55:18 adam Exp $
    Copyright (c) 2005, Index Data.
 
 %LICENSE%
@@ -6,9 +6,7 @@
 
 #include "config.hpp"
 
-#include "xmlutil.hpp"
 #include "filter.hpp"
-#include "router.hpp"
 #include "package.hpp"
 #include "util.hpp"
 #include "filter_z3950_client.hpp"
@@ -110,7 +108,12 @@ void yf::Z3950Client::Assoc::failNotify()
 
     if (m_package)
     {
-        m_package->response() = odr.create_close(Z_Close_peerAbort, 0);
+        Z_GDU *gdu = m_package->request().get();
+        Z_APDU *apdu = 0;
+        if (gdu && gdu->which == Z_GDU_Z3950)
+            apdu = gdu->u.z3950;
+        
+        m_package->response() = odr.create_close(apdu, Z_Close_peerAbort, 0);
         m_package->session().close();
     }
 }
@@ -126,10 +129,17 @@ void yf::Z3950Client::Assoc::timeoutNotify()
         
         if (m_package)
         {
+            Z_GDU *gdu = m_package->request().get();
+            Z_APDU *apdu = 0;
+            if (gdu && gdu->which == Z_GDU_Z3950)
+                apdu = gdu->u.z3950;
+        
             if (m_connected)
-                m_package->response() = odr.create_close(Z_Close_lackOfActivity, 0);
+                m_package->response() =
+                    odr.create_close(apdu, Z_Close_lackOfActivity, 0);
             else
-                m_package->response() = odr.create_close(Z_Close_peerAbort, 0);
+                m_package->response() = 
+                    odr.create_close(apdu, Z_Close_peerAbort, 0);
                 
             m_package->session().close();
         }
@@ -206,31 +216,52 @@ yf::Z3950Client::Assoc *yf::Z3950Client::Rep::get_assoc(Package &package)
     {
         yp2::odr odr;
         
-        package.response() = odr.create_close(Z_Close_protocolError,
+        package.response() = odr.create_close(apdu,
+                                              Z_Close_protocolError,
                                               "First PDU was not an "
                                               "Initialize Request");
         package.session().close();
         return 0;
     }
-    // check virtual host
-    const char *vhost =
-        yaz_oi_get_string_oidval(&apdu->u.initRequest->otherInfo,
-                                 VAL_PROXY, 
-                                 /* categoryValue */ 1, /* delete */ 1);
-    if (!vhost)
+    std::list<std::string> vhosts;
+    yp2::util::get_vhost_otherinfo(&apdu->u.initRequest->otherInfo,
+                                   true, vhosts);
+    size_t no_vhosts = vhosts.size();
+    if (no_vhosts == 0)
     {
         yp2::odr odr;
         package.response() = odr.create_initResponse(
+            apdu,
             YAZ_BIB1_INIT_NEGOTIATION_OPTION_REQUIRED,
-            "Virtual host not given");
+            "z3950_client: No virtal host given");
         
         package.session().close();
         return 0;
     }
-                      
+    if (no_vhosts > 1)
+    {
+        yp2::odr odr;
+        package.response() = odr.create_initResponse(
+            apdu,
+            YAZ_BIB1_COMBI_OF_SPECIFIED_DATABASES_UNSUPP,
+            "z3950_client: Can not cope with multiple vhosts");
+        package.session().close();
+        return 0;
+    }
+    std::list<std::string>::const_iterator v_it = vhosts.begin();
+    std::list<std::string> dblist;
+    std::string host;
+    yp2::util::split_zurl(*v_it, host, dblist);
+    
+    if (dblist.size())
+    {
+        ; // z3950_client: Databases in vhost ignored
+    }
+
     yazpp_1::SocketManager *sm = new yazpp_1::SocketManager;
     yazpp_1::PDU_Assoc *pdu_as = new yazpp_1::PDU_Assoc(sm);
-    yf::Z3950Client::Assoc *as = new yf::Z3950Client::Assoc(sm, pdu_as, vhost,
+    yf::Z3950Client::Assoc *as = new yf::Z3950Client::Assoc(sm, pdu_as,
+                                                            host.c_str(),
                                                             m_timeout_sec);
     m_clients[package.session()] = as;
     return as;