X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fcomstack.c;h=cf1d4b69829412e58079938b1a354b17d07f6f1d;hb=00537b483d646bd04a204708ecbde708861f044e;hp=669117dc2ef080d8790888978af8c18e509a3bc4;hpb=4f3bcae93d51a26709c12b51261c3d95af610cb2;p=yaz-moved-to-github.git diff --git a/src/comstack.c b/src/comstack.c index 669117d..cf1d4b6 100644 --- a/src/comstack.c +++ b/src/comstack.c @@ -1,8 +1,8 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2011 Index Data + * Copyright (C) 1995-2012 Index Data * See the file LICENSE for details. */ -/** +/** * \file comstack.c * \brief Implements Generic COMSTACK functions */ @@ -66,7 +66,7 @@ const char *cs_strerror(COMSTACK h) void cs_get_host_args(const char *type_and_host, const char **args) { - + *args = ""; if (*type_and_host && strncmp(type_and_host, "unix:", 5)) { @@ -157,13 +157,20 @@ static int cs_parse_host(const char *uri, const char **host, COMSTACK cs_create_host(const char *vhost, int blocking, void **vp) { + return cs_create_host_proxy(vhost, blocking, vp, 0); +} + +COMSTACK cs_create_host_proxy(const char *vhost, int blocking, void **vp, + const char *proxy_host) +{ enum oid_proto proto = PROTO_Z3950; const char *host = 0; COMSTACK cs; CS_TYPE t; char *connect_host = 0; - cs_parse_host(vhost, &host, &t, &proto, &connect_host); + if (!cs_parse_host(vhost, &host, &t, &proto, &connect_host)) + return 0; if (t == tcpip_type) { @@ -175,11 +182,13 @@ COMSTACK cs_create_host(const char *vhost, int blocking, void **vp) } if (cs) { + if (proxy_host) + host = proxy_host; if (!(*vp = cs_straddr(cs, connect_host ? connect_host : host))) { cs_close (cs); cs = 0; - } + } } xfree(connect_host); return cs; @@ -235,13 +244,13 @@ static int cs_read_chunk(const char *buf, int i, int len) #endif return 0; } else if (yaz_isdigit(buf[i])) - chunk_len = chunk_len * 16 + + chunk_len = chunk_len * 16 + (buf[i++] - '0'); else if (yaz_isupper(buf[i])) - chunk_len = chunk_len * 16 + + chunk_len = chunk_len * 16 + (buf[i++] - ('A'-10)); else if (yaz_islower(buf[i])) - chunk_len = chunk_len * 16 + + chunk_len = chunk_len * 16 + (buf[i++] - ('a'-10)); else break; @@ -249,7 +258,7 @@ static int cs_read_chunk(const char *buf, int i, int len) break; if (chunk_len < 0) return i; - + while (1) { if (i >= len -1) @@ -261,7 +270,7 @@ static int cs_read_chunk(const char *buf, int i, int len) /* got CRLF */ #if CHUNK_DEBUG printf ("chunk_len=%d\n", chunk_len); -#endif +#endif i += chunk_len; if (i >= len-2) return 0; @@ -297,7 +306,7 @@ static int cs_complete_http(const char *buf, int len, int head_only) /* if dealing with HTTP responses - then default content length is unlimited (socket close) */ if (!head_only && !memcmp(buf, "HTTP/", 5)) - content_len = -1; + content_len = -1; #if 0 printf("len = %d\n", len); @@ -328,7 +337,7 @@ static int cs_complete_http(const char *buf, int len, int head_only) } break; } - else if (i < len - 20 && + else if (i < len - 20 && !strncasecmp((const char *) buf+i, "Transfer-Encoding:", 18)) { i+=18;