Fix HTTP Close
[yazpp-moved-to-github.git] / src / yaz-proxy.cpp
index 76489f2..33a2e25 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) 1998-2004, Index Data.
  * See the file LICENSE for details.
  * 
- * $Id: yaz-proxy.cpp,v 1.90 2004-01-15 15:47:52 adam Exp $
+ * $Id: yaz-proxy.cpp,v 1.93 2004-01-30 00:38:28 adam Exp $
  */
 
 #include <assert.h>
@@ -108,6 +108,7 @@ Yaz_Proxy::Yaz_Proxy(IYaz_PDU_Observable *the_PDU_Observable,
     m_marcxml_flag = 0;
     m_stylesheet_schema = 0;
     m_s2z_stylesheet = 0;
+    m_s2z_database = 0;
     m_schema = 0;
     m_initRequest_apdu = 0;
     m_initRequest_mem = 0;
@@ -705,7 +706,11 @@ int Yaz_Proxy::send_http_response(int code)
     Z_HTTP_Response *hres = gdu->u.HTTP_Response;
     if (m_http_version)
        hres->version = odr_strdup(o, m_http_version);
-    m_http_keepalive = 0;
+    if (m_http_keepalive)
+        z_HTTP_header_add(o, &hres->headers, "Connection", "Keep-Alive");
+    else
+       timeout(0);
+    
     if (m_log_mask & PROXY_LOG_REQ_CLIENT)
     {
        yaz_log (LOG_LOG, "%sSending %s to client", m_session_str,
@@ -728,6 +733,8 @@ int Yaz_Proxy::send_srw_response(Z_SRW_PDU *srw_pdu)
     z_HTTP_header_add(o, &hres->headers, "Content-Type", ctype);
     if (m_http_keepalive)
         z_HTTP_header_add(o, &hres->headers, "Connection", "Keep-Alive");
+    else
+       timeout(0);
 
     static Z_SOAP_Handler soap_handlers[2] = {
 #if HAVE_XSLT
@@ -768,8 +775,7 @@ int Yaz_Proxy::send_to_srw_client_error(int srw_error, const char *add)
     srw_res->num_diagnostics = 1;
     srw_res->diagnostics = (Z_SRW_diagnostic *)
        odr_malloc(o, sizeof(*srw_res->diagnostics));
-    srw_res->diagnostics[0].code =  odr_intdup(o, srw_error);
-    srw_res->diagnostics[0].details = add ? odr_strdup(o, add) : 0;
+    yaz_mk_std_diagnostic(o, srw_res->diagnostics, srw_error, add);
     return send_srw_response(srw_pdu);
 }
 
@@ -782,9 +788,9 @@ int Yaz_Proxy::z_to_srw_diag(ODR o, Z_SRW_searchRetrieveResponse *srw_res,
     srw_res->num_diagnostics = 1;
     srw_res->diagnostics = (Z_SRW_diagnostic *)
        odr_malloc(o, sizeof(*srw_res->diagnostics));
-    srw_res->diagnostics[0].code = 
-       odr_intdup(o, yaz_diag_bib1_to_srw(*ddf->condition));
-    srw_res->diagnostics[0].details = ddf->u.v2Addinfo;
+    yaz_mk_std_diagnostic(o, srw_res->diagnostics,
+                         yaz_diag_bib1_to_srw(*ddf->condition), 
+                         ddf->u.v2Addinfo);
     return 0;
 }
 
@@ -850,25 +856,27 @@ int Yaz_Proxy::send_to_srw_client_ok(int hits, Z_Records *records, int start)
 int Yaz_Proxy::send_srw_explain_response(Z_SRW_diagnostic *diagnostics,
                                        int num_diagnostics)
 {
-    Z_SRW_PDU *res = yaz_srw_get(odr_encode(), Z_SRW_explain_response);
-    Z_SRW_explainResponse *er = res->u.explain_response;
-    
     Yaz_ProxyConfig *cfg = check_reconfigure();
     if (cfg)
     {
        int len;
        char *b = cfg->get_explain(odr_encode(), 0 /* target */,
-                                  0 /* db */, &len);
+                                  m_s2z_database, &len);
        if (b)
        {
+           Z_SRW_PDU *res = yaz_srw_get(odr_encode(), Z_SRW_explain_response);
+           Z_SRW_explainResponse *er = res->u.explain_response;
+
            er->record.recordData_buf = b;
            er->record.recordData_len = len;
            er->record.recordPacking = m_s2z_packing;
+
+           er->diagnostics = diagnostics;
+           er->num_diagnostics = num_diagnostics;
+           return send_srw_response(res);
        }
     }
-    er->diagnostics = diagnostics;
-    er->num_diagnostics = num_diagnostics;
-    return send_srw_response(res);
+    return send_http_response(404);
 }
 
 int Yaz_Proxy::send_PDU_convert(Z_APDU *apdu, int *len)
@@ -1046,18 +1054,6 @@ int Yaz_Proxy::send_to_client(Z_APDU *apdu)
        m_client = 0;
        m_parent->pre_init();
     }
-    if (m_http_version)
-    {
-       if (!m_http_keepalive)
-       {
-#if 1
-           timeout(1);
-#else
-           shutdown();
-           return -1;
-#endif
-       }
-    }
     return r;
 }
 
@@ -1565,7 +1561,6 @@ Z_ElementSetNames *Yaz_Proxy::mk_esn_from_schema(ODR o, const char *schema)
 
 void Yaz_Proxy::handle_incoming_HTTP(Z_HTTP_Request *hreq)
 {
-
     if (m_s2z_odr_init)
     {
        odr_destroy(m_s2z_odr_init);
@@ -1621,6 +1616,7 @@ void Yaz_Proxy::handle_incoming_HTTP(Z_HTTP_Request *hreq)
        {
            Z_SRW_searchRetrieveRequest *srw_req = srw_pdu->u.request;
 
+           m_s2z_database = odr_strdup(m_s2z_odr_init, srw_req->database);
            // recordXPath unsupported.
            if (srw_req->recordXPath)
             {
@@ -1804,6 +1800,8 @@ void Yaz_Proxy::handle_incoming_HTTP(Z_HTTP_Request *hreq)
        {
            Z_SRW_explainRequest *srw_req = srw_pdu->u.explain_request;
 
+           m_s2z_database = odr_strdup(m_s2z_odr_init, srw_req->database);
+
            // save stylesheet
            if (srw_req->stylesheet)
                m_s2z_stylesheet =
@@ -1837,6 +1835,9 @@ void Yaz_Proxy::handle_incoming_HTTP(Z_HTTP_Request *hreq)
        }
        else if (srw_pdu->which == Z_SRW_scan_request)
         {
+           m_s2z_database = odr_strdup(m_s2z_odr_init,
+                                       srw_pdu->u.scan_request->database);
+
            yaz_add_srw_diagnostic(odr_decode(),
                                   &diagnostic, &num_diagnostic,
                                   4, "scan");
@@ -1852,13 +1853,15 @@ void Yaz_Proxy::handle_incoming_HTTP(Z_HTTP_Request *hreq)
         }
        else
         {
+           m_s2z_database = 0;
+
            send_to_srw_client_error(4, 0);
         }
     }
     int len = 0;
     Z_GDU *p = z_get_HTTP_Response(odr_encode(), 400);
+    timeout(0);
     send_GDU(p, &len);
-    timeout(1);
 }
 
 void Yaz_Proxy::handle_incoming_Z_PDU(Z_APDU *apdu)