Refactor HTTP chunk decoding to separate func
[yaz-moved-to-github.git] / client / client.c
index 0cf0cad..2be21dc 100644 (file)
@@ -286,14 +286,14 @@ int send_apdu(Z_APDU *a)
     return 1;
 }
 
-static void print_stringn(const unsigned char *buf, size_t len)
+static void print_stringn(const char *buf, size_t len)
 {
     size_t i;
-    for (i = 0; i<len; i++)
+    for (i = 0; i < len; i++)
         if ((buf[i] <= 126 && buf[i] >= 32) || strchr("\n\r\t\f", buf[i]))
             printf("%c", buf[i]);
         else
-            printf("\\X%02X", buf[i]);
+            printf("\\X%02X", ((const unsigned char *)buf)[i]);
 }
 
 static void print_refid(Z_ReferenceId *id)
@@ -301,7 +301,7 @@ static void print_refid(Z_ReferenceId *id)
     if (id)
     {
         printf("Reference Id: ");
-        print_stringn(id->buf, id->len);
+        print_stringn((const char *) id->buf, id->len);
         printf("\n");
     }
 }
@@ -435,8 +435,8 @@ static int process_initResponse(Z_InitResponse *res)
                 else
                 {
                     /* Peek at any private Init-diagnostic APDUs */
-                    printf("### NAUGHTY: External is '%.*s'\n",
-                           sat->len, sat->buf);
+                    printf("yaz-client ignoring unrecognised userInformationField: %d-octet External '%.*s'\n",
+                           (int) sat->len, sat->len, sat->buf);
                 }
             }
             odr_reset(print);
@@ -706,10 +706,6 @@ int session_connect(const char *arg)
     }
 #endif
     protocol = conn->protocol;
-    if (conn->protocol == PROTO_HTTP)
-        set_base("");
-    else
-        set_base("Default");
     printf("Connecting...");
     fflush(stdout);
     if (cs_connect(conn, add) < 0)
@@ -722,7 +718,10 @@ int session_connect(const char *arg)
     printf("OK.\n");
     cs_print_session_info(conn);
     if (basep && *basep)
-        set_base (basep);
+        set_base(basep);
+    else if (protocol == PROTO_Z3950)
+        set_base("Default");
+
     if (protocol == PROTO_Z3950)
     {
         send_initRequest(type_and_host);
@@ -739,9 +738,13 @@ int cmd_open(const char *arg)
         strncpy(cur_host, arg, sizeof(cur_host)-1);
         cur_host[sizeof(cur_host)-1] = 0;
     }
+
+    set_base("");
     r = session_connect(cur_host);
     if (conn && conn->protocol == PROTO_HTTP)
         queryType = QueryType_CQL;
+
+
     return r;
 }
 
@@ -760,7 +763,7 @@ int cmd_authentication(const char *arg)
     }
     else if (r == 1)
     {
-        auth = nmem_malloc(nmem_auth, sizeof(*auth));
+        auth = (Z_IdAuthentication *) nmem_malloc(nmem_auth, sizeof(*auth));
         if (!strcmp(args[0], "-"))
         {
             auth->which = Z_IdAuthentication_anonymous;
@@ -776,9 +779,10 @@ int cmd_authentication(const char *arg)
     }
     else if (r == 2)
     {
-        auth = nmem_malloc(nmem_auth, sizeof(*auth));
+        auth = (Z_IdAuthentication *) nmem_malloc(nmem_auth, sizeof(*auth));
         auth->which = Z_IdAuthentication_idPass;
-        auth->u.idPass = nmem_malloc(nmem_auth, sizeof(*auth->u.idPass));
+        auth->u.idPass = (Z_IdPass *)
+            nmem_malloc(nmem_auth, sizeof(*auth->u.idPass));
         auth->u.idPass->groupId = NULL;
         auth->u.idPass->userId = !strcmp(args[0], "-") ? 0 : args[0];
         auth->u.idPass->password = !strcmp(args[1], "-") ? 0 : args[1];
@@ -787,9 +791,10 @@ int cmd_authentication(const char *arg)
     }
     else if (r == 3)
     {
-        auth = nmem_malloc(nmem_auth, sizeof(*auth));
+        auth = (Z_IdAuthentication*) nmem_malloc(nmem_auth, sizeof(*auth));
         auth->which = Z_IdAuthentication_idPass;
-        auth->u.idPass = nmem_malloc(nmem_auth, sizeof(*auth->u.idPass));
+        auth->u.idPass = (Z_IdPass *)
+            nmem_malloc(nmem_auth, sizeof(*auth->u.idPass));
         auth->u.idPass->groupId = args[1];
         auth->u.idPass->userId = args[0];
         auth->u.idPass->password = args[2];
@@ -808,7 +813,7 @@ int cmd_authentication(const char *arg)
 /* SEARCH SERVICE ------------------------------ */
 static void display_record(Z_External *r);
 
-static void print_record(const unsigned char *buf, size_t len)
+static void print_record(const char *buf, size_t len)
 {
     size_t i = len;
     print_stringn(buf, len);
@@ -868,91 +873,72 @@ static void display_record(Z_External *r)
             }
         }
     }
-    if (oid && !oid_oidcmp(oid, yaz_oid_recsyn_soif))
-    {
-        print_record((const unsigned char *) r->u.octet_aligned->buf,
-                     r->u.octet_aligned->len);
-        marc_file_write((const char *) r->u.octet_aligned->buf,
-                        r->u.octet_aligned->len);
-    }
-    else if (oid && r->which == Z_External_octet)
+    if (oid && r->which == Z_External_octet)
     {
-        const char *octet_buf = (char*)r->u.octet_aligned->buf;
-        if (oid && (!oid_oidcmp(oid, yaz_oid_recsyn_xml)
-                    || !oid_oidcmp(oid, yaz_oid_recsyn_xml)
-                    || !oid_oidcmp(oid, yaz_oid_recsyn_html)))
+        const char *octet_buf = (const char*)r->u.octet_aligned->buf;
+        size_t octet_len = r->u.octet_aligned->len;
+        if (!oid_oidcmp(oid, yaz_oid_recsyn_xml)
+            || !oid_oidcmp(oid, yaz_oid_recsyn_xml)
+            || !oid_oidcmp(oid, yaz_oid_recsyn_html))
         {
-            print_record((const unsigned char *) octet_buf,
-                         r->u.octet_aligned->len);
+            fwrite(octet_buf, 1, octet_len, stdout);
         }
-        else if (oid && !oid_oidcmp(oid, yaz_oid_recsyn_postscript))
-        {
-            int size = r->u.octet_aligned->len;
-            if (size > 100)
-                size = 100;
-            print_record((const unsigned char *) octet_buf, size);
-        }
-        else
+        else if (yaz_oid_is_iso2709(oid))
         {
-            if (oid && yaz_oid_is_iso2709(oid))
+            const char *result;
+            size_t rlen;
+            yaz_iconv_t cd = 0;
+            yaz_marc_t mt = yaz_marc_create();
+            const char *from = 0;
+            
+            if (marcCharset && !strcmp(marcCharset, "auto"))
             {
-                const char *result;
-                size_t rlen;
-                yaz_iconv_t cd = 0;
-                yaz_marc_t mt = yaz_marc_create();
-                const char *from = 0;
-
-                if (marcCharset && !strcmp(marcCharset, "auto"))
+                if (!oid_oidcmp(oid, yaz_oid_recsyn_usmarc))
                 {
-                    if (!oid_oidcmp(oid, yaz_oid_recsyn_usmarc))
-                    {
-                        if (octet_buf[9] == 'a')
-                            from = "UTF-8";
-                        else
-                            from = "MARC-8";
-                    }
+                    if (octet_buf[9] == 'a')
+                        from = "UTF-8";
                     else
-                        from = "ISO-8859-1";
+                        from = "MARC-8";
                 }
-                else if (marcCharset)
-                    from = marcCharset;
-                if (outputCharset && from)
-                {
-                    cd = yaz_iconv_open(outputCharset, from);
-                    printf("convert from %s to %s", from,
-                            outputCharset);
-                    if (!cd)
-                        printf(" unsupported\n");
-                    else
-                    {
-                        yaz_marc_iconv(mt, cd);
-                        printf("\n");
-                    }
-                }
-
-                if (yaz_marc_decode_buf(mt, octet_buf, r->u.octet_aligned->len,
-                                        &result, &rlen)> 0)
+                else
+                    from = "ISO-8859-1";
+            }
+            else if (marcCharset)
+                from = marcCharset;
+            if (outputCharset && from)
+            {
+                cd = yaz_iconv_open(outputCharset, from);
+                printf("convert from %s to %s", from,
+                       outputCharset);
+                if (!cd)
+                    printf(" unsupported\n");
+                else
                 {
-                    if (fwrite(result, rlen, 1, stdout) != 1)
-                    {
-                        printf("write to stdout failed\n");
-                    }
+                    yaz_marc_iconv(mt, cd);
+                    printf("\n");
                 }
-                else
+            }
+            
+            if (yaz_marc_decode_buf(mt, octet_buf, octet_len,
+                                    &result, &rlen)> 0)
+            {
+                if (fwrite(result, rlen, 1, stdout) != 1)
                 {
-                    printf("bad MARC. Dumping as it is:\n");
-                    print_record((const unsigned char*) octet_buf,
-                                  r->u.octet_aligned->len);
+                    printf("write to stdout failed\n");
                 }
-                yaz_marc_destroy(mt);
-                if (cd)
-                    yaz_iconv_close(cd);
             }
             else
             {
-                print_record((const unsigned char*) octet_buf,
-                             r->u.octet_aligned->len);
+                printf("bad MARC. Dumping as it is:\n");
+                print_record(octet_buf, octet_len);
             }
+            yaz_marc_destroy(mt);
+            if (cd)
+                yaz_iconv_close(cd);
+        }
+        else
+        {
+            print_record(octet_buf, octet_len);
         }
         marc_file_write(octet_buf, r->u.octet_aligned->len);
     }
@@ -963,7 +949,7 @@ static void display_record(Z_External *r)
             printf("Expecting single SUTRS type for SUTRS.\n");
             return;
         }
-        print_record(r->u.sutrs->buf, r->u.sutrs->len);
+        print_record((const char *) r->u.sutrs->buf, r->u.sutrs->len);
         marc_file_write((const char *) r->u.sutrs->buf, r->u.sutrs->len);
     }
     else if (oid && !oid_oidcmp(oid, yaz_oid_recsyn_grs_1))
@@ -1210,11 +1196,7 @@ static int send_srw(Z_SRW_PDU *sr)
     const char *charset = negotiationCharset;
     const char *host_port = cur_host;
     Z_GDU *gdu;
-    char *path = 0;
-
-    path = (char *) odr_malloc(out, 2+strlen(databaseNames[0]));
-    *path = '/';
-    strcpy(path+1, databaseNames[0]);
+    char *path = yaz_encode_sru_dbpath_odr(out, databaseNames[0]);
 
     gdu = z_get_HTTP_Request_host_path(out, host_port, path);
 
@@ -1843,7 +1825,7 @@ void process_ESResponse(Z_ExtendedServicesResponse *res)
         if (id)
         {
             printf("Target Reference: ");
-            print_stringn (id->buf, id->len);
+            print_stringn((const char *) id->buf, id->len);
             printf("\n");
         }
         if (ext->which == Z_External_update)
@@ -3897,9 +3879,10 @@ static void initialize(const char *rc_file)
 
     cmd_format("usmarc");
 
+    file_history = file_history_new();
+
     source_rc_file(rc_file);
 
-    file_history = file_history_new();
     file_history_load(file_history);
     file_history_trav(file_history, 0, add_to_readline_history);
 }
@@ -4006,6 +3989,12 @@ static void http_response(Z_HTTP_Response *hres)
     int ret = -1;
     const char *connection_head = z_HTTP_header_lookup(hres->headers,
                                                        "Connection");
+
+    if (hres->code != 200)
+    {
+        printf("HTTP Error Status=%d\n", hres->code);
+    }
+
     if (!yaz_srw_check_content_type(hres))
         printf("Content type does not appear to be XML\n");
     else
@@ -4033,12 +4022,14 @@ static void http_response(Z_HTTP_Response *hres)
                 printf("Got update response. Status: %s\n",
                        sr->u.update_response->operationStatus);
             else
+            {
+                printf("Decoding of SRW package failed\n");
                 ret = -1;
+            }
         }
         else if (soap_package && (soap_package->which == Z_SOAP_fault
                                   || soap_package->which == Z_SOAP_error))
         {
-            printf("HTTP Error Status=%d\n", hres->code);
             printf("SOAP Fault code %s\n",
                     soap_package->u.fault->fault_code);
             printf("SOAP Fault string %s\n",
@@ -4055,17 +4046,7 @@ static void http_response(Z_HTTP_Response *hres)
         odr_destroy(o);
     }
     if (ret)
-    {
-        if (hres->code != 200)
-        {
-            printf("HTTP Error Status=%d\n", hres->code);
-        }
-        else
-        {
-            printf("Decoding of SRW package failed\n");
-        }
-        close_session();
-    }
+        close_session(); /* close session on error */
     else
     {
         if (!strcmp(hres->version, "1.0"))