factorizing http utils and sru utild code out of SRUtoZ3959 filter and into util...
[metaproxy-moved-to-github.git] / src / filter_sru_to_z3950.cpp
index 76c5df8..f1a18a2 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: filter_sru_to_z3950.cpp,v 1.15 2006-09-29 08:42:47 marc Exp $
+/* $Id: filter_sru_to_z3950.cpp,v 1.19 2006-10-02 13:44:48 marc Exp $
    Copyright (c) 2005-2006, Index Data.
 
    See the LICENSE file for details
@@ -31,15 +31,15 @@ namespace yf = mp::filter;
 
 namespace metaproxy_1 {
     namespace filter {
-        class SRUtoZ3950::Rep {
-        private:
-            union SRW_query {char * cql; char * xcql; char * pqf;};
-            typedef const int& SRW_query_type;
+        class SRUtoZ3950::Impl {
         public:
             void configure(const xmlNode *xmlnode);
             void process(metaproxy_1::Package &package) const;
         private:
-            std::string sru_protocol(const Z_HTTP_Request &http_req) const;
+            union SRW_query {char * cql; char * xcql; char * pqf;};
+            typedef const int& SRW_query_type;
+        private:
+            //std::string sru_protocol(const Z_HTTP_Request &http_req) const;
             std::string debug_http(const Z_HTTP_Request &http_req) const;
             void http_response(mp::Package &package, 
                                const std::string &content, 
@@ -90,14 +90,17 @@ namespace metaproxy_1 {
                                     Z_SRW_PDU *sru_pdu_res,
                                     Z_SRW_scanRequest 
                                     const *sr_req) const;
-            Z_ElementSetNames * build_esn_from_schema(mp::odr &odr_en, const char *schema) const;
-            int z3950_to_srw_diag(mp::odr &odr_en, Z_SRW_searchRetrieveResponse *srw_res,
+            Z_ElementSetNames * build_esn_from_schema(mp::odr &odr_en, 
+                                                      const char *schema) 
+                const;
+            int z3950_to_srw_diag(mp::odr &odr_en, 
+                                  Z_SRW_searchRetrieveResponse *srw_res,
                                   Z_DefaultDiagFormat *ddf) const;
         };
     }
 }
 
-yf::SRUtoZ3950::SRUtoZ3950() : m_p(new Rep)
+yf::SRUtoZ3950::SRUtoZ3950() : m_p(new Impl)
 {
 }
 
@@ -115,11 +118,11 @@ void yf::SRUtoZ3950::process(mp::Package &package) const
     m_p->process(package);
 }
 
-void yf::SRUtoZ3950::Rep::configure(const xmlNode *xmlnode)
+void yf::SRUtoZ3950::Impl::configure(const xmlNode *xmlnode)
 {
 }
 
-void yf::SRUtoZ3950::Rep::process(mp::Package &package) const
+void yf::SRUtoZ3950::Impl::process(mp::Package &package) const
 {
     Z_GDU *zgdu_req = package.request().get();
 
@@ -150,6 +153,7 @@ void yf::SRUtoZ3950::Rep::process(mp::Package &package) const
                                             sru_pdu_res, soap,
                                             charset, stylesheet)))
     {
+        build_simple_explain(package, odr_en, sru_pdu_res, 0);
         build_sru_response(package, odr_en, soap, 
                            sru_pdu_res, charset, stylesheet);
         package.session().close();
@@ -234,43 +238,58 @@ void yf::SRUtoZ3950::Rep::process(mp::Package &package) const
     build_sru_response(package, odr_en, soap, 
                        sru_pdu_res, charset, stylesheet);
     return;
-
-
-
-
-
-
-
 }
 
 
-bool yf::SRUtoZ3950::Rep::build_simple_explain(mp::Package &package, 
+bool yf::SRUtoZ3950::Impl::build_simple_explain(mp::Package &package, 
                                                mp::odr &odr_en,
                                                Z_SRW_PDU *sru_pdu_res,
                                                Z_SRW_explainRequest 
                                                const *er_req) const
 {
-
     // z3950'fy recordPacking
     int record_packing = Z_SRW_recordPacking_XML;
-    if (er_req->recordPacking && 's' == *(er_req->recordPacking))
+    if (er_req && er_req->recordPacking && 's' == *(er_req->recordPacking))
         record_packing = Z_SRW_recordPacking_string;
 
     // getting database info
     std::string database("Default");
-    if (er_req->database)
+    if (er_req && er_req->database)
         database = er_req->database;
 
+    // getting host and port info
+    std::string host = package.origin().listen_host();
+    std::string port = mp_util::to_string(package.origin().listen_port());
+
+    // overwriting host and port info if set from HTTP Host header
+    Z_GDU *zgdu_req = package.request().get();
+    if  (zgdu_req && zgdu_req->which == Z_GDU_HTTP_Request)
+    {
+        Z_HTTP_Request* http_req =  zgdu_req->u.HTTP_Request;
+        if (http_req)
+        {
+            std::string http_host_address
+                = mp_util::http_header_value(http_req->headers, "Host");
+
+            std::string::size_type i = http_host_address.rfind(":");
+            if (i != std::string::npos)
+            {
+                host.assign(http_host_address, 0, i);
+                port.assign(http_host_address, i + 1, std::string::npos);
+            }
+        }
+    }
+
     // building SRU explain record
     std::string explain_xml 
         = mp_util::to_string(
             "<explain>\n"
             "  <serverInfo protocol='SRU'>\n"
             "  <host>")
-        + package.origin().server_host()
+        + host
         + mp_util::to_string("</host>\n"
             "  <port>")
-        + mp_util::to_string(package.origin().server_port())
+        + port
         + mp_util::to_string("</port>\n"
             "  <database>")
         + database
@@ -298,13 +317,13 @@ bool yf::SRUtoZ3950::Rep::build_simple_explain(mp::Package &package,
 };
 
 
-bool yf::SRUtoZ3950::Rep::build_sru_debug_package(mp::Package &package) const
+bool yf::SRUtoZ3950::Impl::build_sru_debug_package(mp::Package &package) const
 {
     Z_GDU *zgdu_req = package.request().get();
     if  (zgdu_req && zgdu_req->which == Z_GDU_HTTP_Request)
     {    
         Z_HTTP_Request* http_req =  zgdu_req->u.HTTP_Request;
-        std::string content = debug_http(*http_req);
+        std::string content = mp_util::http_headers_debug(*http_req);
         int http_code = 400;    
         http_response(package, content, http_code);
         return true;
@@ -314,7 +333,7 @@ bool yf::SRUtoZ3950::Rep::build_sru_debug_package(mp::Package &package) const
 }
 
 
-bool yf::SRUtoZ3950::Rep::build_sru_response(mp::Package &package, 
+bool yf::SRUtoZ3950::Impl::build_sru_response(mp::Package &package, 
                                              mp::odr &odr_en,
                                              Z_SOAP *soap,
                                              const Z_SRW_PDU *sru_pdu_res,
@@ -385,7 +404,7 @@ bool yf::SRUtoZ3950::Rep::build_sru_response(mp::Package &package,
 
 
 
- Z_SRW_PDU * yf::SRUtoZ3950::Rep::decode_sru_request(mp::Package &package,
+ Z_SRW_PDU * yf::SRUtoZ3950::Impl::decode_sru_request(mp::Package &package,
                                                      mp::odr &odr_de,
                                                      mp::odr &odr_en,
                                                      Z_SRW_PDU *sru_pdu_res,
@@ -436,7 +455,7 @@ bool yf::SRUtoZ3950::Rep::build_sru_response(mp::Package &package,
 }
 
 bool 
-yf::SRUtoZ3950::Rep::check_sru_query_exists(mp::Package &package, 
+yf::SRUtoZ3950::Impl::check_sru_query_exists(mp::Package &package, 
                                             mp::odr &odr_en,
                                             Z_SRW_PDU *sru_pdu_res, 
                                             Z_SRW_searchRetrieveRequest 
@@ -477,7 +496,7 @@ yf::SRUtoZ3950::Rep::check_sru_query_exists(mp::Package &package,
 
 
 bool 
-yf::SRUtoZ3950::Rep::z3950_init_request(mp::Package &package, 
+yf::SRUtoZ3950::Impl::z3950_init_request(mp::Package &package, 
                                              const std::string &database) const
 {
     // prepare Z3950 package
@@ -529,7 +548,7 @@ yf::SRUtoZ3950::Rep::z3950_init_request(mp::Package &package,
 }
 
 bool 
-yf::SRUtoZ3950::Rep::z3950_close_request(mp::Package &package) const
+yf::SRUtoZ3950::Impl::z3950_close_request(mp::Package &package) const
 {
     // close SRU package
     package.session().close();
@@ -559,7 +578,7 @@ yf::SRUtoZ3950::Rep::z3950_close_request(mp::Package &package) const
 }
 
 bool 
-yf::SRUtoZ3950::Rep::z3950_search_request(mp::Package &package,  
+yf::SRUtoZ3950::Impl::z3950_search_request(mp::Package &package,  
                                           mp::odr &odr_en,
                                           Z_SRW_PDU *sru_pdu_res,
                                           Z_SRW_searchRetrieveRequest 
@@ -639,7 +658,7 @@ yf::SRUtoZ3950::Rep::z3950_search_request(mp::Package &package,
 }
 
 bool 
-yf::SRUtoZ3950::Rep::z3950_present_request(mp::Package &package, 
+yf::SRUtoZ3950::Impl::z3950_present_request(mp::Package &package, 
                                            mp::odr &odr_en,
                                            Z_SRW_PDU *sru_pdu_res,
                                            Z_SRW_searchRetrieveRequest 
@@ -849,7 +868,7 @@ yf::SRUtoZ3950::Rep::z3950_present_request(mp::Package &package,
 }
 
 bool 
-yf::SRUtoZ3950::Rep::z3950_scan_request(mp::Package &package,
+yf::SRUtoZ3950::Impl::z3950_scan_request(mp::Package &package,
                                         mp::odr &odr_en,
                                         Z_SRW_PDU *sru_pdu_res,
                                         Z_SRW_scanRequest const *sr_req) const 
@@ -910,7 +929,7 @@ yf::SRUtoZ3950::Rep::z3950_scan_request(mp::Package &package,
     return false;
 }
 
-bool yf::SRUtoZ3950::Rep::z3950_build_query(mp::odr &odr_en, Z_Query *z_query, 
+bool yf::SRUtoZ3950::Impl::z3950_build_query(mp::odr &odr_en, Z_Query *z_query, 
                                             const SRW_query &query, 
                                             SRW_query_type query_type) const
 {        
@@ -953,68 +972,68 @@ bool yf::SRUtoZ3950::Rep::z3950_build_query(mp::odr &odr_en, Z_Query *z_query,
 }
 
 
-std::string 
-yf::SRUtoZ3950::Rep::sru_protocol(const Z_HTTP_Request &http_req) const
-{
-    const std::string mime_urlencoded("application/x-www-form-urlencoded");
-    const std::string mime_text_xml("text/xml");
-    const std::string mime_soap_xml("application/soap+xml");
+// std::string 
+// yf::SRUtoZ3950::Impl::sru_protocol(const Z_HTTP_Request &http_req) const
+// {
+//     const std::string mime_urlencoded("application/x-www-form-urlencoded");
+//     const std::string mime_text_xml("text/xml");
+//     const std::string mime_soap_xml("application/soap+xml");
 
-    const std::string http_method(http_req.method);
-    const std::string http_type 
-        =  mp_util::http_header_value(http_req.headers, "Content-Type");
+//     const std::string http_method(http_req.method);
+//     const std::string http_type 
+//         =  mp_util::http_header_value(http_req.headers, "Content-Type");
 
-    if (http_method == "GET")
-        return "SRU GET";
+//     if (http_method == "GET")
+//         return "SRU GET";
 
-    if (http_method == "POST"
-              && http_type  == mime_urlencoded)
-        return "SRU POST";
+//     if (http_method == "POST"
+//               && http_type  == mime_urlencoded)
+//         return "SRU POST";
     
-    if ( http_method == "POST"
-         && (http_type  == mime_text_xml
-             || http_type  == mime_soap_xml))
-        return "SRU SOAP";
-
-    return "HTTP";
-}
-
-std::string 
-yf::SRUtoZ3950::Rep::debug_http(const Z_HTTP_Request &http_req) const
-{
-    std::string message("<html>\n<body>\n<h1>"
-                        "Metaproxy SRUtoZ3950 filter"
-                        "</h1>\n");
+//     if ( http_method == "POST"
+//          && (http_type  == mime_text_xml
+//              || http_type  == mime_soap_xml))
+//         return "SRU SOAP";
+
+//     return "HTTP";
+// }
+
+// std::string 
+// yf::SRUtoZ3950::Impl::debug_http(const Z_HTTP_Request &http_req) const
+// {
+//     std::string message("<html>\n<body>\n<h1>"
+//                         "Metaproxy SRUtoZ3950 filter"
+//                         "</h1>\n");
     
-    message += "<h3>HTTP Info</h3><br/>\n";
-    message += "<p>\n";
-    message += "<b>Method: </b> " + std::string(http_req.method) + "<br/>\n";
-    message += "<b>Version:</b> " + std::string(http_req.version) + "<br/>\n";
-    message += "<b>Path:   </b> " + std::string(http_req.path) + "<br/>\n";
-
-    message += "<b>Content-Type:</b>"
-        + mp_util::http_header_value(http_req.headers, "Content-Type")
-        + "<br/>\n";
-    message += "<b>Content-Length:</b>"
-        + mp_util::http_header_value(http_req.headers, "Content-Length")
-        + "<br/>\n";
-    message += "</p>\n";    
+//     message += "<h3>HTTP Info</h3><br/>\n";
+//     message += "<p>\n";
+//     message += "<b>Method: </b> " + std::string(http_req.method) + "<br/>\n";
+//     message += "<b>Version:</b> " + std::string(http_req.version) + "<br/>\n";
+//     message += "<b>Path:   </b> " + std::string(http_req.path) + "<br/>\n";
+
+//     message += "<b>Content-Type:</b>"
+//         + mp_util::http_header_value(http_req.headers, "Content-Type")
+//         + "<br/>\n";
+//     message += "<b>Content-Length:</b>"
+//         + mp_util::http_header_value(http_req.headers, "Content-Length")
+//         + "<br/>\n";
+//     message += "</p>\n";    
     
-    message += "<h3>Headers</h3><br/>\n";
-    message += "<p>\n";    
-    Z_HTTP_Header* header = http_req.headers;
-    while (header){
-        message += "<b>Header: </b> <i>" 
-            + std::string(header->name) + ":</i> "
-            + std::string(header->value) + "<br/>\n";
-        header = header->next;
-    }
-    message += "</p>\n";    
-    message += "</body>\n</html>\n";
-    return message;
-}
-
-void yf::SRUtoZ3950::Rep::http_response(metaproxy_1::Package &package, 
+//     message += "<h3>Headers</h3><br/>\n";
+//     message += "<p>\n";    
+//     Z_HTTP_Header* header = http_req.headers;
+//     while (header){
+//         message += "<b>Header: </b> <i>" 
+//             + std::string(header->name) + ":</i> "
+//             + std::string(header->value) + "<br/>\n";
+//         header = header->next;
+//     }
+//     message += "</p>\n";    
+//     message += "</body>\n</html>\n";
+//     return message;
+// }
+
+void yf::SRUtoZ3950::Impl::http_response(metaproxy_1::Package &package, 
                                         const std::string &content, 
                                         int http_code) const
 {
@@ -1041,7 +1060,7 @@ void yf::SRUtoZ3950::Rep::http_response(metaproxy_1::Package &package,
 
 
 Z_ElementSetNames * 
-yf::SRUtoZ3950::Rep::build_esn_from_schema(mp::odr &odr_en, 
+yf::SRUtoZ3950::Impl::build_esn_from_schema(mp::odr &odr_en, 
                                            const char *schema) const
 {
   if (!schema)
@@ -1055,7 +1074,7 @@ yf::SRUtoZ3950::Rep::build_esn_from_schema(mp::odr &odr_en,
 }
 
 int 
-yf::SRUtoZ3950::Rep::z3950_to_srw_diag(mp::odr &odr_en, 
+yf::SRUtoZ3950::Impl::z3950_to_srw_diag(mp::odr &odr_en, 
                                        Z_SRW_searchRetrieveResponse *sru_res,
                                        Z_DefaultDiagFormat *ddf) const
 {