Year 2007.
[metaproxy-moved-to-github.git] / src / util.cpp
index e177410..cf9a6a0 100644 (file)
-/* $Id: util.cpp,v 1.19 2006-08-30 12:27:34 adam Exp $
-   Copyright (c) 2005-2006, Index Data.
+/* $Id: util.cpp,v 1.25 2007-01-25 14:05:54 adam Exp $
+   Copyright (c) 2005-2007, Index Data.
 
    See the LICENSE file for details
  */
 
 #include "config.hpp"
+#include "util.hpp"
 
 #include <yaz/odr.h>
 #include <yaz/pquery.h>
 #include <yaz/otherinfo.h>
 #include <yaz/querytowrbuf.h> // for yaz_query_to_wrbuf()
-#include "util.hpp"
 
-//#include <iostream>
+#include <iostream>
 
 namespace mp = metaproxy_1;
 
 // Doxygen doesn't like mp::util, so we use this instead
 namespace mp_util = metaproxy_1::util;
 
+const char * 
+mp_util::record_composition_to_esn(Z_RecordComposition *comp)
+{
+    if (comp && comp->which == Z_RecordComp_complex)
+    {
+        if (comp->u.complex->generic 
+            && comp->u.complex->generic->elementSpec
+            && (comp->u.complex->generic->elementSpec->which == 
+                Z_ElementSpec_elementSetName))
+            return comp->u.complex->generic->elementSpec->u.elementSetName;
+    }
+    else if (comp && comp->which == Z_RecordComp_simple &&
+             comp->u.simple->which == Z_ElementSetNames_generic)
+        return comp->u.simple->u.generic;
+    return 0;
+}
+
+
+
+std::string mp_util::http_header_value(const Z_HTTP_Header* header, 
+                                       const std::string name)
+{
+    while (header && header->name
+           && std::string(header->name) !=  name)
+        header = header->next;
+    
+    if (header && header->name && std::string(header->name) == name
+        && header->value)
+        return std::string(header->value);
+    
+    return std::string();
+}
+    
+std::string mp_util::http_headers_debug(const Z_HTTP_Request &http_req)
+{
+    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>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 mp_util::http_response(metaproxy_1::Package &package, 
+                     const std::string &content, 
+                     int http_code)
+{
+
+    Z_GDU *zgdu_req = package.request().get(); 
+    Z_GDU *zgdu_res = 0; 
+    mp::odr odr;
+    zgdu_res 
+       = odr.create_HTTP_Response(package.session(), 
+                                  zgdu_req->u.HTTP_Request, 
+                                  http_code);
+        
+    zgdu_res->u.HTTP_Response->content_len = content.size();
+    zgdu_res->u.HTTP_Response->content_buf 
+        = (char*) odr_malloc(odr, zgdu_res->u.HTTP_Response->content_len);
+    
+    strncpy(zgdu_res->u.HTTP_Response->content_buf, 
+            content.c_str(),  zgdu_res->u.HTTP_Response->content_len);
+    
+    //z_HTTP_header_add(odr, &hres->headers,
+    //                  "Content-Type", content_type.c_str());
+    package.response() = zgdu_res;
+}
+
+
 int mp_util::memcmp2(const void *buf1, int len1,
                      const void *buf2, int len2)
 {
@@ -240,6 +334,14 @@ void mp_util::set_vhost_otherinfo(
     }
 }
 
+void mp_util::set_vhost_otherinfo(
+    Z_OtherInformation **otherInformation, ODR odr,
+    const std::string vhost, const int cat)
+{
+        yaz_oi_set_string_oidval(otherInformation, odr,
+                                 VAL_PROXY, cat, vhost.c_str());
+}
+
 void mp_util::split_zurl(std::string zurl, std::string &host,
                                    std::list<std::string> &db)
 {