Filter multi: relay init sz parameters
[metaproxy-moved-to-github.git] / src / filter_multi.cpp
index 53912ee..263160d 100644 (file)
@@ -417,18 +417,22 @@ void yf::Multi::Frontend::init(mp::Package &package, Z_GDU *gdu)
         mp::util::set_vhost_otherinfo(&init_apdu->u.initRequest->otherInfo,
                                        odr, vhost_one);
 
-        init_apdu->u.initRequest->idAuthentication = req->idAuthentication;
 
-        Z_InitRequest *req = init_apdu->u.initRequest;
+        Z_InitRequest *breq = init_apdu->u.initRequest;
+
+        breq->idAuthentication = req->idAuthentication;
         
-        ODR_MASK_SET(req->options, Z_Options_search);
-        ODR_MASK_SET(req->options, Z_Options_present);
-        ODR_MASK_SET(req->options, Z_Options_namedResultSets);
-        ODR_MASK_SET(req->options, Z_Options_scan);
+        *breq->preferredMessageSize = *req->preferredMessageSize;
+        *breq->maximumRecordSize = *req->maximumRecordSize;
+
+        ODR_MASK_SET(breq->options, Z_Options_search);
+        ODR_MASK_SET(breq->options, Z_Options_present);
+        ODR_MASK_SET(breq->options, Z_Options_namedResultSets);
+        ODR_MASK_SET(breq->options, Z_Options_scan);
         
-        ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_1);
-        ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_2);
-        ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_3);
+        ODR_MASK_SET(breq->protocolVersion, Z_ProtocolVersion_1);
+        ODR_MASK_SET(breq->protocolVersion, Z_ProtocolVersion_2);
+        ODR_MASK_SET(breq->protocolVersion, Z_ProtocolVersion_3);
         
         b->m_package->request() = init_apdu;
 
@@ -445,6 +449,7 @@ void yf::Multi::Frontend::init(mp::Package &package, Z_GDU *gdu)
     ODR_MASK_SET(f_resp->options, Z_Options_search);
     ODR_MASK_SET(f_resp->options, Z_Options_present);
     ODR_MASK_SET(f_resp->options, Z_Options_namedResultSets);
+    ODR_MASK_SET(f_resp->options, Z_Options_scan);
     
     ODR_MASK_SET(f_resp->protocolVersion, Z_ProtocolVersion_1);
     ODR_MASK_SET(f_resp->protocolVersion, Z_ProtocolVersion_2);
@@ -452,6 +457,9 @@ void yf::Multi::Frontend::init(mp::Package &package, Z_GDU *gdu)
 
     int no_failed = 0;
     int no_succeeded = 0;
+
+    Odr_int preferredMessageSize = *req->preferredMessageSize;
+    Odr_int maximumRecordSize = *req->maximumRecordSize;
     for (bit = m_backend_list.begin(); bit != m_backend_list.end(); )
     {
         PackagePtr p = (*bit)->m_package;
@@ -482,7 +490,13 @@ void yf::Multi::Frontend::init(mp::Package &package, Z_GDU *gdu)
                 if (!ODR_MASK_GET(b_resp->protocolVersion, i))
                     ODR_MASK_CLEAR(f_resp->protocolVersion, i);
             if (*b_resp->result)
+            {
                 no_succeeded++;
+                if (preferredMessageSize > *b_resp->preferredMessageSize)
+                    preferredMessageSize = *b_resp->preferredMessageSize;
+                if (maximumRecordSize > *b_resp->maximumRecordSize)
+                    maximumRecordSize = *b_resp->maximumRecordSize;
+            }
             else
                 no_failed++;
         }
@@ -490,6 +504,9 @@ void yf::Multi::Frontend::init(mp::Package &package, Z_GDU *gdu)
             no_failed++;
         bit++;
     }
+    *f_resp->preferredMessageSize = preferredMessageSize;
+    *f_resp->maximumRecordSize = maximumRecordSize;
+
     if (m_p->m_hide_unavailable)
     {
         if (no_succeeded == 0)