Added cs_get_SSL. yaz-client-ssl prints peer info
[yaz-moved-to-github.git] / client / client.c
index 2cf6792..cacc274 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) 1995-2004, Index Data
  * See the file LICENSE for details.
  *
- * $Id: client.c,v 1.230 2004-02-14 15:58:42 adam Exp $
+ * $Id: client.c,v 1.239 2004-04-28 12:10:51 adam Exp $
  */
 
 #include <stdio.h>
 #include <langinfo.h>
 #endif
 
+#if HAVE_OPENSSL_SSL_H
+#include <openssl/crypto.h>
+#include <openssl/x509.h>
+#include <openssl/pem.h>
+#include <openssl/ssl.h>
+#include <openssl/err.h>
+#endif
+
 #include <time.h>
 #include <ctype.h>
 
@@ -97,6 +105,7 @@ static char *negotiationCharset = 0;
 static char *outputCharset = 0;
 static char *marcCharset = 0;
 static char* yazLang = 0;
+static char* http_version = "1.1";
 
 static char last_cmd[32] = "?";
 static FILE *marc_file = 0;
@@ -307,15 +316,15 @@ static void send_initRequest(const char* type_and_host)
        yaz_oi_APDU(apdu, &p);
        
        if ((p0=yaz_oi_update(p, out, NULL, 0, 0))) {
-               ODR_MASK_SET(req->options, Z_Options_negotiationModel);
-               
-               p0->which = Z_OtherInfo_externallyDefinedInfo;
-               p0->information.externallyDefinedInfo =
-                       yaz_set_proposal_charneg(
-                            out,
-                            (const char**)&negotiationCharset, 
-                            negotiationCharset ? 1 : 0,
-                            (const char**)&yazLang, yazLang ? 1 : 0, 1);
+           ODR_MASK_SET(req->options, Z_Options_negotiationModel);
+           
+           p0->which = Z_OtherInfo_externallyDefinedInfo;
+           p0->information.externallyDefinedInfo =
+               yaz_set_proposal_charneg(
+                   out,
+                   (const char**)&negotiationCharset, 
+                   negotiationCharset ? 1 : 0,
+                   (const char**)&yazLang, yazLang ? 1 : 0, 1);
        }
     }
     
@@ -528,6 +537,9 @@ int session_connect(const char *arg)
     void *add;
     char type_and_host[101];
     const char *basep = 0;
+#if HAVE_OPENSSL_SSL_H
+    SSL *ssl;
+#endif
     if (conn)
     {
         cs_close (conn);
@@ -585,6 +597,31 @@ int session_connect(const char *arg)
         return 0;
     }
     printf("OK.\n");
+#if HAVE_OPENSSL_SSL_H
+    if ((ssl = (SSL *) cs_get_ssl(conn)))
+    {
+       X509 *server_cert = SSL_get_peer_certificate (ssl);
+       char *str;
+       if (server_cert)
+       {
+           printf ("Server certificate:\n");
+           
+           str = X509_NAME_oneline (X509_get_subject_name (server_cert),0,0);
+           if (str)
+           {
+               printf ("\t subject: %s\n", str);
+               free (str);
+           }
+           str = X509_NAME_oneline (X509_get_issuer_name  (server_cert),0,0);
+           if (str)
+           {
+               printf ("\t issuer: %s\n", str);
+               free (str);
+           }
+           X509_free (server_cert);
+       }
+    }
+#endif
     if (basep && *basep)
         set_base (basep);
     if (protocol == PROTO_Z3950)
@@ -711,7 +748,7 @@ static void display_record(Z_External *r)
     if (ent && r->which == Z_External_octet)
     {
         Z_ext_typeent *type = z_ext_getentbyref(ent->value);
-        void *rr;
+        char *rr;
 
         if (type)
         {
@@ -720,7 +757,7 @@ static void display_record(Z_External *r)
              */
             odr_setbuf(in, (char*)r->u.octet_aligned->buf,
                 r->u.octet_aligned->len, 0);
-            if (!(*type->fun)(in, (char **)&rr, 0, 0))
+            if (!(*type->fun)(in, &rr, 0, 0))
             {
                 odr_perror(in, "Decoding constructed record.");
                 fprintf(stdout, "[Near %d]\n", odr_offset(in));
@@ -740,16 +777,16 @@ static void display_record(Z_External *r)
             }
         }
     }
-    if (ent && ent->oclass != CLASS_RECSYN) 
-        return;
     if (ent && ent->value == VAL_SOIF)
         print_record((const unsigned char *) r->u.octet_aligned->buf,
                      r->u.octet_aligned->len);
     else if (r->which == Z_External_octet)
     {
         const char *octet_buf = (char*)r->u.octet_aligned->buf;
-        if (ent->value == VAL_TEXT_XML || ent->value == VAL_APPLICATION_XML ||
-            ent->value == VAL_HTML)
+        if (ent->oclass == CLASS_RECSYN && 
+               (ent->value == VAL_TEXT_XML || 
+                ent->value == VAL_APPLICATION_XML ||
+                ent->value == VAL_HTML))
         {
             print_record((const unsigned char *) octet_buf,
                          r->u.octet_aligned->len);
@@ -915,6 +952,8 @@ static void display_record(Z_External *r)
                    printf ("shelvingLocation: %s\n", data->shelvingLocation);
                if (data->callNumber)
                    printf ("callNumber: %s\n", data->callNumber);
+               if (data->shelvingData)
+                   printf ("shelvingData: %s\n", data->shelvingData);
                if (data->copyNumber)
                    printf ("copyNumber: %s\n", data->copyNumber);
                if (data->publicNote)
@@ -1110,6 +1149,7 @@ static int send_srw(Z_SRW_PDU *sr)
     strcpy(path+1, databaseNames[0]);
 
     gdu = z_get_HTTP_Request(out);
+    gdu->u.HTTP_Request->version = http_version;
     gdu->u.HTTP_Request->path = odr_strdup(out, path);
 
     if (host_port)
@@ -1213,6 +1253,8 @@ static int send_SRW_searchRequest(const char *arg)
 
     if (record_schema)
         sr->u.request->recordSchema = record_schema;
+    if (recordsyntax == VAL_TEXT_XML)
+        sr->u.explain_request->recordPacking = "xml";
     return send_srw(sr);
 }
 #endif
@@ -2151,6 +2193,8 @@ static int cmd_explain(const char *arg)
        
        /* save this for later .. when fetching individual records */
        sr = yaz_srw_get(out, Z_SRW_explain_request);
+       if (recordsyntax == VAL_TEXT_XML)
+            sr->u.explain_request->recordPacking = "xml";
        send_srw(sr);
        return 2;
     }
@@ -2387,6 +2431,8 @@ static int send_SRW_presentRequest(const char *arg)
     sr->u.request->maximumRecords = odr_intdup(out, nos);
     if (record_schema)
         sr->u.request->recordSchema = record_schema;
+    if (recordsyntax == VAL_TEXT_XML)
+        sr->u.request->recordPacking = "xml";
     return send_srw(sr);
 }
 #endif