X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fcomstack.c;h=cec2fd3dd6f40f75f74ef128146698ae8768e029;hp=c0516341c3f77453d0935f08f9519ba1a7f83dbb;hb=fe42f72dc30321041420cf2d1a83867b1c450f38;hpb=0b4aa2a134665d7161782db8e24f19e911178b1c diff --git a/src/comstack.c b/src/comstack.c index c051634..cec2fd3 100644 --- a/src/comstack.c +++ b/src/comstack.c @@ -1,17 +1,19 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2009 Index Data + * Copyright (C) 1995-2012 Index Data * See the file LICENSE for details. */ - -/** +/** * \file comstack.c * \brief Implements Generic COMSTACK functions */ +#if HAVE_CONFIG_H +#include +#endif #include -#include #include +#include #include #include #include @@ -64,9 +66,17 @@ 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)) + if (!strncmp(type_and_host, "unix:", 5)) + { + const char *cp = strchr(type_and_host + 5, ':'); + if (cp) + type_and_host = cp + 1; + else + type_and_host += strlen(type_and_host); /* empty string */ + } + if (*type_and_host) { const char *cp; cp = strstr(type_and_host, "://"); @@ -85,22 +95,51 @@ static int cs_parse_host(const char *uri, const char **host, char **connect_host) { *connect_host = 0; + + *t = tcpip_type; if (strncmp(uri, "connect:", 8) == 0) { const char *cp = strchr(uri, ','); if (cp) { - size_t len = cp - (uri + 8); - *connect_host = (char *) xmalloc(len+1); - memcpy(*connect_host, uri + 8, len); + size_t len; + + uri += 8; + len = cp - uri; + *connect_host = (char *) xmalloc(len + 1); + memcpy(*connect_host, uri, len); (*connect_host)[len] = '\0'; - uri = cp+1; + uri = cp + 1; } } + else if (strncmp(uri, "unix:", 5) == 0) + { + const char *cp; + + uri += 5; + cp = strchr(uri, ':'); + if (cp) + { + size_t len = cp - uri; + *connect_host = (char *) xmalloc(len + 1); + memcpy(*connect_host, uri, len); + (*connect_host)[len] = '\0'; + uri = cp + 1; + } + else + { + *connect_host = xstrdup(uri); + uri += strlen(uri); /* set to "" */ + } +#ifdef WIN32 + return 0; +#else + *t = unix_type; +#endif + } if (strncmp (uri, "tcp:", 4) == 0) { - *t = tcpip_type; *host = uri + 4; *proto = PROTO_Z3950; } @@ -114,19 +153,8 @@ static int cs_parse_host(const char *uri, const char **host, return 0; #endif } - else if (strncmp (uri, "unix:", 5) == 0) - { -#ifndef WIN32 - *t = unix_type; - *host = uri + 5; - *proto = PROTO_Z3950; -#else - return 0; -#endif - } else if (strncmp(uri, "http:", 5) == 0) { - *t = tcpip_type; *host = uri + 5; while (**host == '/') (*host)++; @@ -146,22 +174,28 @@ static int cs_parse_host(const char *uri, const char **host, } else { - *proto = PROTO_Z3950; - *t = tcpip_type; *host = uri; + *proto = PROTO_Z3950; } return 1; } 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) { @@ -173,11 +207,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; @@ -232,14 +268,14 @@ static int cs_read_chunk(const char *buf, int i, int len) printf ("i=%d len=%d\n", i, len); #endif return 0; - } else if (isdigit(buf[i])) - chunk_len = chunk_len * 16 + + } else if (yaz_isdigit(buf[i])) + chunk_len = chunk_len * 16 + (buf[i++] - '0'); - else if (isupper(buf[i])) - chunk_len = chunk_len * 16 + + else if (yaz_isupper(buf[i])) + chunk_len = chunk_len * 16 + (buf[i++] - ('A'-10)); - else if (islower(buf[i])) - chunk_len = chunk_len * 16 + + else if (yaz_islower(buf[i])) + chunk_len = chunk_len * 16 + (buf[i++] - ('a'-10)); else break; @@ -247,7 +283,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) @@ -259,7 +295,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; @@ -295,7 +331,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); @@ -326,7 +362,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; @@ -343,7 +379,7 @@ static int cs_complete_http(const char *buf, int len, int head_only) while (buf[i] == ' ') i++; content_len = 0; - while (i <= len-4 && isdigit(buf[i])) + while (i <= len-4 && yaz_isdigit(buf[i])) content_len = content_len*10 + (buf[i++] - '0'); if (content_len < 0) /* prevent negative offsets */ content_len = 0;