X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fcomstack.c;h=066fafd48d3be517053641411765f716764962b6;hp=6e72e2595efd1496151524e87768471cf8672f47;hb=4f75f882c49b802a366ef0b8c528c7e688c53b4b;hpb=90636015fbde45fc0c2d35368ab7a32b23041cd5 diff --git a/src/comstack.c b/src/comstack.c index 6e72e25..066fafd 100644 --- a/src/comstack.c +++ b/src/comstack.c @@ -1,5 +1,5 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2013 Index Data + * Copyright (C) Index Data * See the file LICENSE for details. */ /** @@ -21,14 +21,6 @@ #include #include -#if HAVE_GNUTLS_H -#define ENABLE_SSL 1 -#endif - -#if HAVE_OPENSSL_SSL_H -#define ENABLE_SSL 1 -#endif - static const char *cs_errlist[] = { "No error or unspecified error", @@ -63,7 +55,6 @@ const char *cs_strerror(COMSTACK h) void cs_get_host_args(const char *type_and_host, const char **args) { - *args = ""; if (!strncmp(type_and_host, "unix:", 5)) { @@ -75,13 +66,12 @@ void cs_get_host_args(const char *type_and_host, const char **args) } if (*type_and_host) { - const char *cp; - cp = strstr(type_and_host, "://"); + const char *cp = strchr(type_and_host, '/'); if (cp) - cp = cp+3; - else - cp = type_and_host; - cp = strchr(cp, '/'); + { + if (cp > type_and_host && !memcmp(cp - 1, "://", 3)) + cp = strchr(cp + 2, '/'); + } if (cp) *args = cp+1; } @@ -124,6 +114,8 @@ int cs_parse_host(const char *uri, const char **host, uri = cp + 1; } #ifdef WIN32 + xfree(*connect_host); + *connect_host = 0; return 0; #else *t = unix_type; @@ -137,11 +129,13 @@ int cs_parse_host(const char *uri, const char **host, } else if (strncmp (uri, "ssl:", 4) == 0) { -#if ENABLE_SSL +#if HAVE_GNUTLS_H *t = ssl_type; *host = uri + 4; *proto = PROTO_Z3950; #else + xfree(*connect_host); + *connect_host = 0; return 0; #endif } @@ -154,13 +148,15 @@ int cs_parse_host(const char *uri, const char **host, } else if (strncmp(uri, "https:", 6) == 0) { -#if ENABLE_SSL +#if HAVE_GNUTLS_H *t = ssl_type; *host = uri + 6; while (**host == '/') (*host)++; *proto = PROTO_HTTP; #else + xfree(*connect_host); + *connect_host = 0; return 0; #endif } @@ -180,33 +176,71 @@ COMSTACK cs_create_host(const char *vhost, int blocking, void **vp) COMSTACK cs_create_host_proxy(const char *vhost, int blocking, void **vp, const char *proxy_host) { + int proxy_mode; + return cs_create_host2(vhost, blocking, vp, proxy_host, &proxy_mode); +} + +COMSTACK cs_create_host2(const char *vhost, int blocking, void **vp, + const char *proxy_host, int *proxy_mode) +{ enum oid_proto proto = PROTO_Z3950; const char *host = 0; COMSTACK cs; CS_TYPE t; char *connect_host = 0; + const char *bind_host = strchr(vhost, ' '); + if (bind_host && bind_host[1]) + bind_host++; + else + bind_host = 0; + + *proxy_mode = 0; if (!cs_parse_host(vhost, &host, &t, &proto, &connect_host)) - { - xfree(connect_host); return 0; - } - if (proxy_host) + /* vhost proxy proxy method proxy-flag */ + /* TCP+Z3950 TCP+Z3950 TCP+Z3950 1 */ + /* TCP+Z3950 TCP+HTTP CONNECT 0 */ + /* TCP+HTTP TCP+Z3950 TCP+HTTP 1 */ + /* TCP+HTTP TCP+HTTP TCP+HTTP 1 */ + /* SSL+* TCP+* CONNECT 0 */ + /* ? SSL error */ + + if (proxy_host && !connect_host) { enum oid_proto proto1; + CS_TYPE t1; + const char *host1 = 0; - xfree(connect_host); - if (!cs_parse_host(proxy_host, &host, &t, &proto1, &connect_host)) + if (!cs_parse_host(proxy_host, &host1, &t1, &proto1, &connect_host)) + return 0; + if (connect_host) { xfree(connect_host); return 0; } + if (t1 != tcpip_type) + return 0; + + if (t == ssl_type || (proto == PROTO_Z3950 && proto1 == PROTO_HTTP)) + connect_host = xstrdup(host1); + else + { + *proxy_mode = 1; + host = host1; + } } if (t == tcpip_type) { - cs = yaz_tcpip_create(-1, blocking, proto, connect_host ? host : 0); + cs = yaz_tcpip_create3(-1, blocking, proto, connect_host ? host : 0, + 0 /* user:pass */, bind_host); + } + else if (t == ssl_type) + { + cs = yaz_ssl_create(-1, blocking, proto, connect_host ? host : 0, + 0 /* user:pass */, bind_host); } else {