X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=client%2Fclient.c;h=1230cdb8bc41e77a8c3227dd664b22a29fc45b08;hp=2be21dcca745724721630c3aa1d4b6ef8cf11cf1;hb=46f5205bdb8e837ab305644839451949916e40cb;hpb=b4dbbd7c2fa1a6ca687f589f895e1fe1e7addeed diff --git a/client/client.c b/client/client.c index 2be21dc..1230cdb 100644 --- a/client/client.c +++ b/client/client.c @@ -1,5 +1,5 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2009 Index Data + * Copyright (C) 1995-2010 Index Data * See the file LICENSE for details. */ /** \file client.c @@ -141,7 +141,7 @@ static int scan_stepSize = 0; static int scan_position = 1; static int scan_size = 20; static char cur_host[200]; -static int last_hit_count = 0; +static Odr_int last_hit_count = 0; typedef enum { QueryType_Prefix, @@ -1200,6 +1200,25 @@ static int send_srw(Z_SRW_PDU *sr) gdu = z_get_HTTP_Request_host_path(out, host_port, path); + if (auth) + { + if (auth->which == Z_IdAuthentication_open) + { + char **darray; + int num; + nmem_strsplit(out->mem, "/", auth->u.open, &darray, &num); + if (num >= 1) + sr->username = darray[0]; + if (num >= 2) + sr->password = darray[1]; + } + else if (auth->which == Z_IdAuthentication_idPass) + { + sr->username = auth->u.idPass->userId; + sr->password = auth->u.idPass->password; + } + } + if (!yaz_matchstr(sru_method, "get")) { yaz_sru_get_encode(gdu->u.HTTP_Request, sr, out, charset); @@ -1945,7 +1964,7 @@ static Z_External *create_external_itemRequest(void) return r; } -static Z_External *create_external_ILL_APDU(int which) +static Z_External *create_external_ILL_APDU(void) { struct ill_get_ctl ctl; ILL_APDU *ill_apdu; @@ -2047,7 +2066,7 @@ static Z_External *create_ItemOrderExternal(const char *type, int itemno, { printf("using ILL-request\n"); r->u.itemOrder->u.esRequest->notToKeep->itemRequest = - create_external_ILL_APDU(ILL_APDU_ILL_Request); + create_external_ILL_APDU(); } else if (!strcmp(type, "xml") || !strcmp(type, "3")) { @@ -2493,6 +2512,130 @@ static int cmd_init(const char *arg) return 2; } +static Z_GDU *get_HTTP_Request_url(ODR odr, const char *url) +{ + Z_GDU *p = z_get_HTTP_Request(odr); + const char *host = url; + const char *cp0 = strstr(host, "://"); + const char *cp1 = 0; + if (cp0) + cp0 = cp0+3; + else + cp0 = host; + + cp1 = strchr(cp0, '/'); + if (!cp1) + cp1 = cp0 + strlen(cp0); + + if (cp0 && cp1) + { + char *h = (char*) odr_malloc(odr, cp1 - cp0 + 1); + memcpy (h, cp0, cp1 - cp0); + h[cp1-cp0] = '\0'; + z_HTTP_header_add(odr, &p->u.HTTP_Request->headers, "Host", h); + } + p->u.HTTP_Request->path = odr_strdup(odr, *cp1 ? cp1 : "/"); + return p; +} + +static WRBUF get_url(const char *uri, WRBUF username, WRBUF password, + int *code, int show_headers) +{ + WRBUF result = 0; + ODR out = odr_createmem(ODR_ENCODE); + ODR in = odr_createmem(ODR_DECODE); + Z_GDU *gdu = get_HTTP_Request_url(out, uri); + + gdu->u.HTTP_Request->method = odr_strdup(out, "GET"); + if (username && password) + { + z_HTTP_header_add_basic_auth(out, &gdu->u.HTTP_Request->headers, + wrbuf_cstr(username), + wrbuf_cstr(password)); + } + z_HTTP_header_add(out, &gdu->u.HTTP_Request->headers, "Accept", + "text/xml"); + if (!z_GDU(out, &gdu, 0, 0)) + { + yaz_log(YLOG_WARN, "Can not encode HTTP request URL:%s", uri); + } + else + { + void *add; + COMSTACK conn = cs_create_host(uri, 1, &add); + if (cs_connect(conn, add) < 0) + yaz_log(YLOG_WARN, "Can not connect to URL:%s", uri); + else + { + int len; + char *buf = odr_getbuf(out, &len, 0); + + if (cs_put(conn, buf, len) < 0) + yaz_log(YLOG_WARN, "cs_put failed URL:%s", uri); + else + { + char *netbuffer = 0; + int netlen = 0; + int res = cs_get(conn, &netbuffer, &netlen); + if (res <= 0) + { + yaz_log(YLOG_WARN, "cs_get failed URL:%s", uri); + } + else + { + Z_GDU *gdu; + odr_setbuf(in, netbuffer, res, 0); + if (!z_GDU(in, &gdu, 0, 0) + || gdu->which != Z_GDU_HTTP_Response) + { + yaz_log(YLOG_WARN, "decode failed URL: %s", uri); + } + else + { + Z_HTTP_Response *res = gdu->u.HTTP_Response; + struct Z_HTTP_Header *h; + result = wrbuf_alloc(); + if (show_headers) + { + + wrbuf_printf(result, "HTTP %d\n", res->code); + for (h = res->headers; h; h = h->next) + wrbuf_printf(result, "%s: %s\n", + h->name, h->value); + } + *code = res->code; + wrbuf_write(result, res->content_buf, res->content_len); + } + } + xfree(netbuffer); + } + cs_close(conn); + } + } + odr_destroy(out); + odr_destroy(in); + return result; +} + + +static int cmd_url(const char *arg) +{ + int code = 0; + WRBUF res = get_url(arg, 0, 0, &code, 1); + if (res) + { + if (wrbuf_len(res) > 1200) + { + fwrite(wrbuf_buf(res), 1, 1200, stdout); + printf(".. out of %lld\n", (long long) wrbuf_len(res)); + } + else + puts(wrbuf_cstr(res)); + wrbuf_destroy(res); + } + return 0; +} + static int cmd_sru(const char *arg) { if (!*arg) @@ -2640,36 +2783,50 @@ static int cmd_setnames(const char *arg) /* PRESENT SERVICE ----------------------------- */ -static void parse_show_args(const char *arg_c, char *setstring, - Odr_int *start, Odr_int *number) +static int parse_show_args(const char *arg_c, char *setstring, + Odr_int *start, Odr_int *number) { - char arg[40]; - char *p; + char *end_ptr; - strncpy(arg, arg_c, sizeof(arg)-1); - arg[sizeof(arg)-1] = '\0'; + if (setnumber >= 0) + sprintf(setstring, "%d", setnumber); + else + *setstring = '\0'; - if ((p = strchr(arg, '+'))) + if (!strcmp(arg_c, "all")) { - *number = atoi(p + 1); - *p = '\0'; + *number = last_hit_count; + *start = 1; } - if (*arg) + *start = odr_strtol(arg_c, &end_ptr, 10); + if (end_ptr == arg_c || *end_ptr == '\0') + return 1; + while (isspace(*(unsigned char *)end_ptr)) + end_ptr++; + if (*end_ptr != '+') { - if (!strcmp(arg, "all")) - { - *number = last_hit_count; - *start = 1; - } - else - *start = atoi(arg); + printf("Bad show arg: expected +. Got %s\n", end_ptr); + return 0; } - if (p && (p=strchr(p+1, '+'))) - strcpy(setstring, p+1); - else if (setnumber >= 0) - sprintf(setstring, "%d", setnumber); - else - *setstring = '\0'; + end_ptr++; + arg_c = end_ptr; + *number = odr_strtol(arg_c, &end_ptr, 10); + if (end_ptr == arg_c) + { + printf("Bad show arg: expected number after +\n"); + return 0; + } + if (*end_ptr == '\0') + return 1; + while (isspace(*(unsigned char *)end_ptr)) + end_ptr++; + if (*end_ptr != '+') + { + printf("Bad show arg: + expected. Got %s\n", end_ptr); + return 0; + } + strcpy(setstring, end_ptr+1); + return 1; } static int send_presentRequest(const char *arg) @@ -2682,7 +2839,8 @@ static int send_presentRequest(const char *arg) req->referenceId = set_refid(out); - parse_show_args(arg, setstring, &setno, &nos); + if (!parse_show_args(arg, setstring, &setno, &nos)) + return 0; if (*setstring) req->resultSetId = setstring; @@ -2773,7 +2931,8 @@ static int send_SRW_presentRequest(const char *arg) if (!sr) return 0; - parse_show_args(arg, setstring, &setno, &nos); + if (!parse_show_args(arg, setstring, &setno, &nos)) + return 0; sr->u.request->startRecord = odr_intdup(out, setno); sr->u.request->maximumRecords = odr_intdup(out, nos); if (record_schema) @@ -4559,6 +4718,7 @@ static struct { {"help", cmd_help, "", NULL,0,NULL}, {"init", cmd_init, "", NULL,0,NULL}, {"sru", cmd_sru, " ", NULL,0,NULL}, + {"url", cmd_url, "", NULL,0,NULL}, {"exit", cmd_quit, "",NULL,0,NULL}, {0,0,0,0,0,0} }; @@ -4840,7 +5000,10 @@ static void client(void) { line_in=readline(C_PROMPT); if (!line_in) + { + putchar('\n'); break; + } #if HAVE_READLINE_HISTORY_H if (*line_in) add_history(line_in);