/* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2013 Index Data
+ * Copyright (C) Index Data
* See the file LICENSE for details.
*/
/** \file client.c
#include <yaz/cql.h>
#include <yaz/log.h>
#include <yaz/facet.h>
+#include <yaz/cookie.h>
#if HAVE_READLINE_READLINE_H
#include <readline/readline.h>
static int scan_stepSize = 0;
static char scan_position[64];
static int scan_size = 20;
-static char cur_host[200];
+static WRBUF cur_host = 0;
static Odr_int last_hit_count = 0;
static int pretty_xml = 0;
static Odr_int sru_maximumRecords = 0;
+static yaz_cookies_t yaz_cookies = 0;
typedef enum {
QueryType_Prefix,
return 0;
}
-static int session_connect(const char *arg)
+static int session_connect(void)
{
int r;
const char *basep = 0;
- r = session_connect_base(arg, &basep);
+ yaz_cookies_destroy(yaz_cookies);
+ yaz_cookies = yaz_cookies_create();
+
+ r = session_connect_base(wrbuf_cstr(cur_host), &basep);
if (basep && *basep)
set_base(basep);
else if (protocol == PROTO_Z3950)
int r;
if (arg)
{
- strncpy(cur_host, arg, sizeof(cur_host)-1);
- cur_host[sizeof(cur_host)-1] = 0;
+ wrbuf_rewind(cur_host);
+ if (!strstr(arg, "://") && strcmp(sru_method, "soap"))
+ wrbuf_puts(cur_host, "http://");
+ wrbuf_puts(cur_host, arg);
}
set_base("");
- r = session_connect(cur_host);
+ r = session_connect();
if (conn && conn->protocol == PROTO_HTTP)
queryType = QueryType_CQL;
-
return r;
}
static int send_srw(Z_SRW_PDU *sr)
{
char *path = yaz_encode_sru_dbpath_odr(out, databaseNames[0]);
- return send_srw_host_path(sr, cur_host, path);
+ return send_srw_host_path(sr, wrbuf_cstr(cur_host), path);
}
-static int send_SRW_redirect(const char *uri, Z_HTTP_Response *cookie_hres)
+static int send_SRW_redirect(const char *uri)
{
const char *username = 0;
const char *password = 0;
- struct Z_HTTP_Header *h;
- char *combined_cookies = 0;
- int combined_cookies_len = 0;
Z_GDU *gdu = get_HTTP_Request_url(out, uri);
gdu->u.HTTP_Request->method = odr_strdup(out, "GET");
z_HTTP_header_add(out, &gdu->u.HTTP_Request->headers, "Accept",
"text/xml");
- for (h = cookie_hres->headers; h; h = h->next)
- {
- if (!strcmp(h->name, "Set-Cookie"))
- {
- char *cp;
-
- if (!(cp = strchr(h->value, ';')))
- cp = h->value + strlen(h->value);
- if (cp - h->value >= 1)
- {
- combined_cookies = xrealloc(combined_cookies, combined_cookies_len + cp - h->value + 3);
- memcpy(combined_cookies+combined_cookies_len, h->value, cp - h->value);
- combined_cookies[combined_cookies_len + cp - h->value] = '\0';
- strcat(combined_cookies,"; ");
- combined_cookies_len = strlen(combined_cookies);
- }
- }
- }
- if (combined_cookies_len)
- {
- z_HTTP_header_add(out, &gdu->u.HTTP_Request->headers, "Cookie", combined_cookies);
- xfree(combined_cookies);
- }
-
+ yaz_cookies_request(yaz_cookies, out, gdu->u.HTTP_Request);
if (auth)
{
if (auth->which == Z_IdAuthentication_open)
char *rec_buf, int rec_len)
{
if (!conn)
- session_connect(cur_host);
+ session_connect();
if (!conn)
return 0;
else
return 0;
#if YAZ_HAVE_XML2
if (!conn)
- session_connect(cur_host);
+ session_connect();
if (conn)
{
Z_SRW_PDU *sr = 0;
{
if (*arg)
{
- strncpy(cur_host, arg, sizeof(cur_host)-1);
- cur_host[sizeof(cur_host)-1] = 0;
+ wrbuf_rewind(cur_host);
+ if (!strstr(arg, "://") && strcmp(sru_method, "soap"))
+ wrbuf_puts(cur_host, "http://");
+ wrbuf_puts(cur_host, arg);
}
if (only_z3950())
return 1;
- send_Z3950_initRequest(cur_host);
+ send_Z3950_initRequest(wrbuf_cstr(cur_host));
return 2;
}
{
#if YAZ_HAVE_XML2
if (!conn)
- session_connect(cur_host);
+ session_connect();
if (!conn)
return 0;
if (!send_SRW_searchRequest(arg))
}
else
{
- if (*cur_host && auto_reconnect)
+ if (wrbuf_len(cur_host) && auto_reconnect)
{
int i = 0;
for (;;)
printf("Unable to reconnect\n");
break;
}
- session_connect(cur_host);
+ session_connect();
wait_and_handle_response(0);
}
return 0;
{
#if YAZ_HAVE_XML2
if (!conn)
- session_connect(cur_host);
+ session_connect();
if (!conn)
return 0;
if (!send_SRW_presentRequest(arg))
static void exit_client(int code)
{
+ odr_destroy(in);
+ odr_destroy(out);
+ odr_destroy(print);
+ ccl_qual_rm(&bibset);
+ yaz_cookies_destroy(yaz_cookies);
file_history_save(file_history);
file_history_destroy(&file_history);
nmem_destroy(nmem_auth);
+ wrbuf_destroy(cur_host);
exit(code);
}
{
#if YAZ_HAVE_XML2
if (!conn)
- session_connect(cur_host);
+ session_connect();
if (!conn)
return 0;
if (send_SRW_scanRequest(scan_query, pos_p, scan_size) < 0)
}
else
{
- if (*cur_host && !conn && auto_reconnect)
+ if (wrbuf_len(cur_host) && !conn && auto_reconnect)
{
- session_connect(cur_host);
+ session_connect();
wait_and_handle_response(0);
}
if (!conn)
FILE *inf;
int i;
+ cur_host = wrbuf_alloc();
+
if (!(out = odr_createmem(ODR_ENCODE)) ||
!(in = odr_createmem(ODR_DECODE)) ||
!(print = odr_createmem(ODR_PRINT)))
static void handle_srw_record(Z_SRW_record *rec)
{
if (rec->recordPosition)
- {
printf("pos=" ODR_INT_PRINTF, *rec->recordPosition);
- setno = *rec->recordPosition + 1;
- }
if (rec->recordSchema)
printf(" schema=%s", rec->recordSchema);
printf("\n");
}
handle_srw_record(res->records + i);
}
+ setno += res->num_records;
}
static void handle_srw_scan_term(Z_SRW_scanTerm *term)
{YAZ_XMLNS_SRU_v2_mask, 0, (Z_SOAP_fun) yaz_srw_codec},
{YAZ_XMLNS_UPDATE_v0_9, 0, (Z_SOAP_fun) yaz_ucp_codec},
{YAZ_XMLNS_SRU_v1_response, 0, (Z_SOAP_fun) yaz_srw_codec},
+ {"searchRetrieveResponse", 0, (Z_SOAP_fun) yaz_srw_codec},
{0, 0, 0}
};
ret = z_soap_codec(o, &soap_package,
}
#endif
-#define max_HTTP_redirects 2
+#define max_HTTP_redirects 3
static void wait_and_handle_response(int one_response_only)
{
{
cs_close(conn);
conn = 0;
- session_connect(cur_host);
+ session_connect();
reconnect_ok = 0;
if (conn)
{
Z_HTTP_Response *hres = gdu->u.HTTP_Response;
int code = hres->code;
const char *location = 0;
+
+ yaz_cookies_response(yaz_cookies, hres);
if ((code == 301 || code == 302)
&& no_redirects < max_HTTP_redirects
&& !yaz_matchstr(sru_method, "get")
&& (location = z_HTTP_header_lookup(hres->headers, "Location")))
{
const char *base_tmp;
- session_connect_base(location, &base_tmp);
+ int host_change = 0;
+ location = yaz_check_location(in, wrbuf_cstr(cur_host),
+ location, &host_change);
+ if (host_change)
+ session_connect_base(location, &base_tmp);
no_redirects++;
if (conn)
{
- if (send_SRW_redirect(location, hres) == 2)
+ if (send_SRW_redirect(location) == 2)
continue;
}
printf("Redirect failed\n");
/* connection options */
if (conn)
- printf("Connected to : %s\n", cur_host);
- else if (*cur_host)
- printf("Not connected to : %s\n", cur_host);
+ printf("Connected to : %s\n", wrbuf_cstr(cur_host));
+ else if (cur_host && wrbuf_len(cur_host))
+ printf("Not connected to : %s\n", wrbuf_cstr(cur_host));
else
printf("Not connected : \n");
if (yazProxy) printf("using proxy : %s\n",yazProxy);