sru_z3950: fix facet response (memory corruption) MP-532
[metaproxy-moved-to-github.git] / src / filter_sru_to_z3950.cpp
index fa12345..a4f7ebe 100644 (file)
@@ -30,6 +30,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #include <yaz/pquery.h>
 #include <yaz/oid_db.h>
 #include <yaz/log.h>
+#include <yaz/otherinfo.h>
 #if YAZ_VERSIONL >= 0x50000
 #include <yaz/facet.h>
 #endif
@@ -94,6 +95,7 @@ namespace metaproxy_1 {
 
             bool z3950_search_request(
                 mp::Package &package,
+                mp::Package &z3950_package,
                 mp::odr &odr_en,
                 Z_SRW_PDU *sru_pdu_res,
                 Z_SRW_searchRetrieveRequest const *sr_req,
@@ -277,6 +279,9 @@ void yf::SRUtoZ3950::Impl::sru(mp::Package &package, Z_GDU *zgdu_req)
 
     assert(sru_pdu_req);
 
+    Package z3950_package(package.session(), package.origin());
+    z3950_package.copy_filter(package);
+
     // filter acts as sink for SRU explain requests
     if (sru_pdu_req->which == Z_SRW_explain_request)
     {
@@ -302,7 +307,7 @@ void yf::SRUtoZ3950::Impl::sru(mp::Package &package, Z_GDU *zgdu_req)
         if (ok && z3950_init_request(package, odr_en,
                                      zurl, sru_pdu_res, sru_pdu_req))
         {
-            ok = z3950_search_request(package, odr_en,
+            ok = z3950_search_request(package, z3950_package, odr_en,
                                       sru_pdu_res, sr_req, zurl, dbargs);
 
             if (ok
@@ -518,6 +523,19 @@ yf::SRUtoZ3950::Impl::z3950_init_request(mp::Package &package,
         mp_util::set_vhost_otherinfo(&init_req->otherInfo, odr_en, host, 1);
     }
 
+    Z_GDU *zgdu_req = package.request().get();
+    if (zgdu_req->which == Z_GDU_HTTP_Request)
+    {
+        Z_HTTP_Request *hreq = zgdu_req->u.HTTP_Request;
+        const char *peer_name =
+            z_HTTP_header_lookup(hreq->headers, "X-Forwarded-For");
+        if (peer_name)
+        {
+            yaz_oi_set_string_oid(&init_req->otherInfo, odr_en,
+                                  yaz_oid_userinfo_client_ip, 1, peer_name);
+        }
+    }
+
     z3950_package.request() = apdu;
 
     // send Z3950 package
@@ -579,6 +597,7 @@ bool yf::SRUtoZ3950::Impl::z3950_close_request(mp::Package &package) const
 }
 
 bool yf::SRUtoZ3950::Impl::z3950_search_request(mp::Package &package,
+                                                mp::Package &z3950_package,
                                                 mp::odr &odr_en,
                                                 Z_SRW_PDU *sru_pdu_res,
                                                 Z_SRW_searchRetrieveRequest
@@ -589,9 +608,6 @@ bool yf::SRUtoZ3950::Impl::z3950_search_request(mp::Package &package,
 
     assert(sru_pdu_res->u.response);
 
-    Package z3950_package(package.session(), package.origin());
-    z3950_package.copy_filter(package);
-
     Z_APDU *apdu = zget_APDU(odr_en, Z_APDU_searchRequest);
     Z_SearchRequest *z_searchRequest = apdu->u.searchRequest;